雨中磐石 9 месяцев назад
Родитель
Сommit
d41bd27082
100 измененных файлов с 1882 добавлено и 3896 удалено
  1. 4 4
      README.md
  2. 2 2
      config/version.php
  3. 33 3
      include/chajian/JPushChajian.php
  4. 44 0
      include/chajian/checkChajian.php
  5. 2 2
      include/chajian/curlChajian.php
  6. 1 0
      include/chajian/dateChajian.php
  7. 36 2
      include/chajian/downChajian.php
  8. 6 5
      include/chajian/imageChajian.php
  9. 4 2
      include/chajian/inputChajian.php
  10. 2 1
      include/chajian/mapqqChajian.php
  11. 27 0
      include/chajian/qcloudCosChajian.php
  12. 16 41
      include/chajian/rockfileChajian.php
  13. 131 0
      include/chajian/rockwxqyChajian.php
  14. 1 1
      include/chajian/upfileChajian.php
  15. 0 0
      include/chajian/xinhuapiChajian.php
  16. 49 3
      include/class/mysql.php
  17. 3 3
      include/class/rockClass.php
  18. 38 25
      js/dingwei.js
  19. 30 4
      js/js.js
  20. 2 1
      js/jswx.js
  21. 27 7
      js/reim_xina.js
  22. 7 0
      mode/bootstrapplugin/jquery-bootstable.js
  23. 15 5
      mode/kindeditor/themes/default/default.css
  24. 1 1
      mode/plugin/jquery-rockdoupull.js
  25. 199 0
      mode/plugin/jquery-rockselect.js
  26. 0 0
      mode/plugin/trtc.js
  27. 6 1
      web/res/js/jquery-imgview.js
  28. 10 0
      web/res/js/notify.js
  29. 15 4
      web/res/js/strformat.js
  30. 1 1
      web/res/mode/menu/jquery-rockmenu.js
  31. 54 4
      webmain/css/cssm.css
  32. 6 2
      webmain/css/rock.css
  33. 15 0
      webmain/css/rui.css
  34. 39 16
      webmain/flow/input/inputAction.php
  35. 35 67
      webmain/flow/input/inputjs/input_two.js
  36. 5 3
      webmain/flow/input/inputjs/mode_customer.js
  37. 1 1
      webmain/flow/input/mode_flowelementAction.php
  38. 1 0
      webmain/flow/input/mode_flowmenuAction.php
  39. 3 0
      webmain/flow/input/mode_flowsetAction.php
  40. 5 0
      webmain/flow/input/mode_goodsAction.php
  41. 12 8
      webmain/flow/input/tpl_input_lu.html
  42. 11 9
      webmain/flow/input/tpl_input_lum.html
  43. 1 1
      webmain/flow/page/input_caigou.html
  44. 0 0
      webmain/flow/page/input_demo.html
  45. 0 0
      webmain/flow/page/input_flowset.html
  46. 0 0
      webmain/flow/page/input_gong.html
  47. 11 17
      webmain/flow/page/rock_page_flowelement_script.php
  48. 26 4
      webmain/flow/page/rock_page_flowset_script.php
  49. 104 0
      webmain/flow/page/rock_page_goods.php
  50. 5 0
      webmain/index/indexAction.php
  51. 26 0
      webmain/index/indexpublic.js
  52. 6 2
      webmain/index/indexscript.js
  53. 1 1
      webmain/index/tpl_index.html
  54. 0 3415
      webmain/install/rockxinhu.sql
  55. 1 0
      webmain/login/loginscript.js
  56. 13 4
      webmain/main/flow/flowAction.php
  57. 2 2
      webmain/main/flow/rock_flow_todoedit.php
  58. 13 17
      webmain/main/flow/rock_flow_view.php
  59. 4 1
      webmain/main/flow/tpl_flow_input.html
  60. 4 1
      webmain/main/flow/tpl_flow_inputzs.html
  61. 14 1
      webmain/main/fwork/fworkAction.php
  62. 1 1
      webmain/main/goods/rock_goods_pandian.php
  63. 4 4
      webmain/main/kaoqin/kaoqinAction.php
  64. 10 20
      webmain/main/view/rock_view.php
  65. 1 1
      webmain/main/view/viewAction.php
  66. 34 2
      webmain/main/xinhu/rock_xinhu_cog.php
  67. 42 1
      webmain/main/xinhu/xinhuAction.php
  68. 0 2
      webmain/main/yingyong/rock_yingyong.php
  69. 6 4
      webmain/model/adminModel.php
  70. 7 4
      webmain/model/beifenModel.php
  71. 5 1
      webmain/model/crmModel.php
  72. 8 6
      webmain/model/fileModel.php
  73. 1 1
      webmain/model/flow/carmreseModel.php
  74. 0 0
      webmain/model/flow/flow.php
  75. 25 1
      webmain/model/flow/goodsModel.php
  76. 18 12
      webmain/model/flow/meetModel.php
  77. 1 1
      webmain/model/flow/subscribeinfoModel.php
  78. 2 2
      webmain/model/flowbillModel.php
  79. 1 1
      webmain/model/inputModel.php
  80. 4 0
      webmain/model/kqjcmdModel.php
  81. 2 2
      webmain/model/logModel.php
  82. 3 3
      webmain/model/loginModel.php
  83. 35 23
      webmain/model/reimModel.php
  84. 1 1
      webmain/public/fileopen_mp4.html
  85. 5 2
      webmain/public/publicAction.php
  86. 4 3
      webmain/reim/index/tpl_index_xina.html
  87. 1 1
      webmain/reim/record/recordAction.php
  88. 50 54
      webmain/reim/tonghua/tpl_tonghua.html
  89. 91 1
      webmain/system/beifen/beifenAction.php
  90. 22 0
      webmain/system/beifen/rock_beifen.php
  91. 0 1
      webmain/system/cog/cogAction.php
  92. 5 0
      webmain/system/cog/rock_cog_login.php
  93. 18 40
      webmain/system/cog/rock_cog_set.php
  94. 2 1
      webmain/system/geren/gerenAction.php
  95. 1 0
      webmain/system/menu/menuAction.php
  96. 246 0
      webmain/system/qywxplat/qywxplatAction.php
  97. 52 4
      webmain/system/table/rock_table_list.php
  98. 43 1
      webmain/system/table/tableAction.php
  99. 0 0
      webmain/system/upgrade/upgradeAction.php
  100. 1 1
      webmain/system/word/wordAction.php

+ 4 - 4
README.md

@@ -5,12 +5,12 @@
 公司团队:信呼开发团队  
 官网网站:http://www.rockoa.com/  
 源码仅供学习二次开发使用,禁止二次发布,禁止用于商业用途出售等(违者必究)  
-版权:Copyright @2016-2024 信呼开发团队  
-版本整理时间:2024-10-18 23:59:59  
-版本号:V2.6.6  
+版权:Copyright @2016-2025 信呼开发团队  
+版本整理时间:2025-03-31 23:59:59  
+版本号:V2.6.8  
 
 
-### V2.6.6更新说明
+### V2.6.8更新说明
 1、完善系统安全性。  
 2、更多升级日志详见:http://www.rockoa.com/view_core.html  
 

+ 2 - 2
config/version.php

@@ -1,3 +1,3 @@
 <?php
-//版本20241022
-return '2.6.7';
+//版本2025
+return '2.6.8';

+ 33 - 3
include/chajian/JPushChajian.php

@@ -7,13 +7,20 @@
 class JPushChajian extends Chajian{
 
 
-	//-------------最新原生app推送app是1.2.3版本 和 最新app+---------------
+	/**
+	*	-------------最新原生app推送app是1.2.3版本 和 最新app+---------------
+	*	title 没有base64的标题
+	*	desc 已经base64了
+	*	cont 原始的内容json
+	*	palias 可推送信息
+	*/
 	public function push($title, $desc, $cont, $palias)
 	{
 
 		$uids		= $palias['uids'];
 		$alias2019	= $palias['alias2019'];
-		$pushuids	= $palias['pushuids']; //可以推送的用户ID
+		$pushuids	= $palias['pushuids']; //可以推送的用户ID 就是ispush=1
+		$jparr		= $palias['jparr']; //应用内消息
 		$xmpush		= c('xmpush');
 		$hwpush		= c('hwpush');
 		$getui		= c('getui');
@@ -33,8 +40,8 @@ class JPushChajian extends Chajian{
 		$xharr = array(
 			'uids'  => $uids,
 			'title' => $this->rock->jm->base64encode($title),
-			//'cont'  => $this->rock->jm->base64encode($cont),
 			'desc'  => $desc,
+			'jpreg'  => arrvalue($palias, 'jpreg'),
 			'systype'=> getconfig('systype')
 		);
 		
@@ -162,4 +169,27 @@ class JPushChajian extends Chajian{
 		}
 		return $stv;
 	}
+	
+	/**
+	*	极光自定义消息发送20250105
+	*/
+	public function sendJpush($arr)
+	{
+		$receid = $arr['receid'];
+		if(isempt($receid))return;
+		$toregid= array();
+		//$this->rock->debugs($arr,'sendJpush');
+		$rows 	= m('logintoken')->getall('`uid` in('.$receid.') AND `online`=1 AND `ispush`=1');
+		foreach($rows as $k=>$rs){
+			$regid = arrvalue($rs,'regid');
+			if(!isempt($regid))$toregid[] = $regid;
+		}
+		if(!$toregid)return;
+		$runurl = c('xinhu')->geturlstr('jpushmess', array(
+			'msgcont' => $this->rock->jm->base64encode(json_encode($arr)),
+			'toregid' => join(',', $toregid)
+		));
+		$str  = c('curl')->getcurl($runurl);
+		return 'ok';
+	}
 }

+ 44 - 0
include/chajian/checkChajian.php

@@ -110,6 +110,18 @@ class checkChajian extends Chajian{
 		return preg_replace('/[a-zA-Z]/','', $str);
 	}
 	
+	/**
+	*	仅支持0-9A-Za-z - |
+	*	return boolean
+	*/
+	public function onlynoen($str)
+	{
+		$str1 = ''.$str.'';
+		$bobg = preg_replace("/[a-zA-Z0-9_]/",'', $str1);
+		$bobg = str_replace(array('-','|'),'', $bobg);
+		return $bobg;
+	}
+	
 	/**
 	*	替换空格
 	*/
@@ -133,4 +145,36 @@ class checkChajian extends Chajian{
 		}
 		return implode('', $strArr);
 	}
+	
+		
+	/**
+	*	判断是不是内网地址
+	*/
+	public function isneiurl($str)
+	{
+		$strt = strtolower($str);
+		$strt = str_replace($strt, 'https:', 'http:');
+		$nearr= array('localhost','127.0.0','192.','10.','172.');
+		$bool = false;
+		foreach($nearr as $ip){
+			if(contain($str, 'http://'.$ip.'')){
+				$bool = true;
+				break;
+			}
+		}
+		return $bool;
+	}
+	
+	/**
+	*	过滤sql的
+	*/
+	public function onlysql($str)
+	{
+		$str 	= $this->rock->iconvsql($str);
+		$str 	= str_replace('(','(', $str);
+		$str 	= str_replace(')',')', $str);
+		$str 	= str_replace(',',',', $str);
+		return $str;
+	}
+	
 }

+ 2 - 2
include/chajian/curlChajian.php

@@ -76,7 +76,7 @@ class curlChajian extends Chajian{
 		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 		curl_setopt($ch, CURLOPT_HEADER, 0);
 		if($this->rock->HTTPweb)curl_setopt($ch, CURLOPT_USERAGENT, $this->rock->HTTPweb);
-		if($this->rock->ip)$headarr['X-FORWARDED-FOR'] = $this->rock->ip;
+		//if($this->rock->ip)$headarr['X-FORWARDED-FOR'] = $this->rock->ip;
 		if($ishttps==1){
 			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 		}
@@ -114,7 +114,7 @@ class curlChajian extends Chajian{
 			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 			//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  false);
 		}
-		if($this->rock->ip)$headarr['X-FORWARDED-FOR'] = $this->rock->ip;
+		//if($this->rock->ip)$headarr['X-FORWARDED-FOR'] = $this->rock->ip;
 		//设置head
 		if($headarr){
 			$heads = array();

+ 1 - 0
include/chajian/dateChajian.php

@@ -197,6 +197,7 @@ class dateChajian extends Chajian
 	
 	public function cnweek($date)
 	{
+		if(isempt($date))return '';
 		$arr = array('日','一','二','三','四','五','六');
 		return $arr[date('w', strtotime($date))];
 	}

+ 36 - 2
include/chajian/downChajian.php

@@ -117,7 +117,7 @@ class downChajian extends Chajian{
 		$msg 		= '';
 		$data 		= array();
 		if(is_array($upses)){
-			$noasyn = $this->rock->get('noasyn'); //=yes就不同步到文件平台
+			$noasyn = $this->rock->get('noasyn');$noasyn = ''; //=yes就不同步到文件平台
 			$noyaso = $this->rock->get('noyaso'); //=yes就不压缩
 			$fileext= substr($upses['fileext'],0,10);
 			$arrs	= array(
@@ -162,14 +162,28 @@ class downChajian extends Chajian{
 				}
 			}
 			
+			$shuiyin = $this->rock->get('shuiyin');
 			if($upses['picw']>$lw || $upses['pich']>$lh){
 				$imgaa	= c('image', true);
 				$imgaa->createimg($thumbpath);
 				$thumbpath 	= $imgaa->thumbnail($lw, $lh, 1);
+				if(contain($thumbpath, 'reimchat'))$shuiyin = 'size';
+				if($shuiyin=='size'){
+					$imgaa->createimg($thumbpath);
+					$imgaa->addwater($arrs['filesizecn']);
+				}
 			}
+			
+			
+			
 			if($upses['picw'] == 0 && $upses['pich']==0)$thumbpath = '';
 			$arrs['thumbpath'] = $thumbpath;
 			
+			//有缩略图先上传到云里 && $this->rock->get('sysuptype')=='img'
+			if($thumbpath){
+				$tarr = $this->uploadBase($thumbpath);
+				if($tarr['success'] && isset($tarr['url']))$arrs['thumbplat'] = $tarr['url'];
+			}
 			
 			$bo = $this->db->record('[Q]file',$arrs);
 			if(!$bo)$this->reutnmsg($this->db->error());
@@ -194,18 +208,38 @@ class downChajian extends Chajian{
 				c('rockqueue')->sendfile($id, $stime);
 			}
 			
+			if(arrvalue($arrs, 'thumbplat')){
+				$data['filepath']  = $arrs['thumbplat'];
+				$data['thumbpath'] = $arrs['thumbplat'];
+			}
 		}else{
 			$data['msg'] = $upses;
 		}
 		return $data;
 	}
 	
+	/**
+	*	简单上传要调用
+	*/
+	private function uploadBase($path)
+	{
+		if(getconfig('qcloudCos_autoup')){
+			return c('qcloudCos')->uploadFile($path);
+		}else{
+			if(getconfig('alioss_autoup')){
+				$obj = c('alioss');
+				if(method_exists($obj, 'uploadFile'))return $obj->uploadFile($path);
+			}
+		}
+		return returnerror();
+	}
+	
 	//过滤特殊文件名
 	private function replacefile($str)
 	{
 		$s 			= strtolower($str);
 		$s2			= $s.'';
-		$lvlaraa  	= explode(',','user(),found_rows,(),select*from,select*,%20,<,>');
+		$lvlaraa  	= explode(',','user(),found_rows,(),select*from,select*,%20,<,>,\,');
 		$s = str_replace($lvlaraa, '', $s);
 		if($s!=$s2)$str = $s;
 		return $str;

+ 6 - 5
include/chajian/imageChajian.php

@@ -104,12 +104,12 @@ class imageChajian extends Chajian
 		添加文字水印
 		$str	添加文字
 	*/
-	public function addwater($str,$color='#000000',$size=20,$align='rb')
+	public function addwater($str,$color='#000000',$size=5,$align='lt')
 	{
 		if(!$this->bool)return;
-		$font	= '../fonts/FZZHYJW.TTF';	//方正稚艺简体
-		$lw 	= strlen($str)*($size/2);
-		$lh		= $size*0.5;
+		$font	= 'arial.ttf';	
+		$lw 	= strlen($str)*($size);
+		$lh		= $size*1.5;
 		$color	= $this->color($color,$this->img);
 		$x		= 2;
 		$y		= 2;
@@ -129,7 +129,8 @@ class imageChajian extends Chajian
 				$y		= ($this->h - $lh) * 0.5;
 			break;
 		}
-		imagettftext($this->img, $size,0, $x, $y, $color, $font, $str);
+		//imagettftext($this->img, $size,0, $x, $y, $color, $font, $str);
+		imagestring($this->img, $size, $x, $y, $str, $color);
 		$sapath	= str_replace('.'.$this->ext.'', '_water.'.$this->ext.'', $this->path);
 		$sapath	= $this->path;
 		$this->saveas($sapath, $this->img);//另存为

+ 4 - 2
include/chajian/inputChajian.php

@@ -63,7 +63,7 @@ class inputChajian extends Chajian
 			$str = '<input class="inputs" style="border:none;background:none" name="base_sericnum" value="'.$this->flow->createnum().'" readonly>';
 		}
 		if($fid=='file_content'){
-			$str = '<input name="fileid" type="hidden" id="fileidview-inputEl"><div id="view_fileidview" style="width:98%;flex:1;height:auto;min-height:60px;border:1px #cccccc solid;border:var(--border); background:white;background:var(--main-bgcolor);border-radius:5px;;overflow:auto"></div><div id="fileupaddbtn"><a href="javascript:;" class="blue" onclick="c.upload()"><u>+添加文件</u></a></div>';
+			$str = '<input name="fileid" type="hidden" id="fileidview-inputEl"><div id="view_fileidview" style="height:auto;min-height:60px;border:1px #cccccc solid;border:var(--border); background:white;background:var(--main-bgcolor);border-radius:5px;;overflow:auto"></div><div id="fileupaddbtn"><a href="javascript:;" class="blue" onclick="c.upload()"><u>+添加文件</u></a></div>';
 		}
 
 		if($fid=='删'){
@@ -127,7 +127,7 @@ class inputChajian extends Chajian
 		$onblue = ' onblur="c.inputblur(this, '.$iszb.')"';
 		$iszhang= false;
 		if($type=='text' && !isempt($data)){
-			$attr.=' onkeyup="c.autocomplete(this,\''.$data.'\','.$a['id'].', '.$iszb.',event)" onclick="this.onkeyup()"';
+			$attr.=' onclick="c.autocomplete(this,\''.$data.'\','.$a['id'].', '.$iszb.',event)"';
 		}
 		$str 	= '<input class="inputs" type="text" value="'.$val.'" '.$attr.''.$onblue.''.$styles.''.$lenstr.' name="'.$fname.'">';
 		
@@ -211,6 +211,7 @@ class inputChajian extends Chajian
 			if($iszb>0)$zbnae = ''.($iszb-1).''.$leox.'';
 			$str 	= '<div class="btn-group"><input '.$attr.''.$onblue.''.$styles.''.$lenstr.' class="inputs" style="flex:1" value="'.$val.'" type="text" name="'.$fname.'">';
 			if($isbt=='0')$str   .= '<button onclick="c.selectmapclear(\''.$fname.'\',\''.$zbnae.'\','.$iszb.')" class="webbtn" type="button">x</button>';
+			if(contain($this->rock->HTTPweb, 'XINHUOAAPP'))$str .= '<button onclick="c.selectlocation(\''.$fname.'\',\''.$zbnae.'\','.$iszb.')" class="webbtn" type="button">定位</button>';
 			$str   .= '<button type="button" onclick="c.selectmap(\''.$fname.'\',\''.$zbnae.'\',\''.$fieldname.'\','.$iszb.')" class="webbtn">选</button></div>';
 		}
 		if($type=='htmlediter'){
@@ -384,6 +385,7 @@ class inputChajian extends Chajian
 				$barr[] = array(
 					'name'	=> $rs[1],
 					'value' => $rs[0],
+					'color' => $rs[2]
 				);
 			}
 			$fopt = $barr;

+ 2 - 1
include/chajian/mapqqChajian.php

@@ -1,4 +1,5 @@
 <?php 
+//腾讯地图的。
 class mapqqChajian extends Chajian{
 	
 	private $mapqq_key 		= '';
@@ -12,7 +13,7 @@ class mapqqChajian extends Chajian{
 	{
 		$key = getconfig('qqmapkey');
 		if(!$key){
-			$key = $this->rock->jm->base64decode('NTVRQlotSkdZTE8tQkFMV1gtU1pFNEgtNVNWNUstSkNGVjc:');
+			$key = $this->rock->jm->base64decode('T0I0QlotRDRXM1UtQjdWVk8tNFBKV1ctNlRLREotV1BCNzc:');
 		}else{
 			$this->mapqq_key = $key;
 		}

+ 27 - 0
include/chajian/qcloudCosChajian.php

@@ -48,6 +48,33 @@ class qcloudCosChajian extends Chajian{
 		return $ret;
 	}
 	
+	//上传
+	public function uploadFile($path)
+	{
+		$ret = $this->upload(ROOT_PATH.'/'.$path,'', $path);
+		if(!$ret)return returnerror();
+		if(!isset($ret['url']))return returnerror();
+		$barr = returnsuccess();
+		$barr['url'] = $ret['url'];
+		return $barr;
+	}
+	
+	/**
+	*	简单上传要调用
+	*/
+	public function uploadBase($path)
+	{
+		if(getconfig('qcloudCos_autoup')){
+			return $this->uploadFile($path);
+		}else{
+			if(getconfig('alioss_autoup')){
+				$obj = c('alioss');
+				if(method_exists($obj, 'uploadFile'))return $obj->uploadFile($path);
+			}
+		}
+		return returnerror();
+	}
+	
 	/**
 	*	创建文件夹
 	*/

+ 16 - 41
include/chajian/rockfileChajian.php

@@ -98,58 +98,33 @@ class rockfileChajian extends Chajian{
 	*/
 	public function uploadfile($fileid)
 	{
-		$frs  = m('file')->getone($fileid);
+		$fobj = m('file');
+		$frs  = $fobj->getone($fileid);
 		if(!$frs)return returnerror('1');
 		$path = ROOT_PATH.'/'.$frs['filepath'];
 		if(!file_exists($path))return returnerror('404');
-		$barr = $this->upload($path, array(
+		
+		$url 	= $this->geturlstr('upload','upfile', array(
 			'optid' 	=> $frs['optid'],
-			'noasyn' 	=> 'no', //no和yes
-			'fileexs' 	=> $frs['fileext'],
-			'optname' 	=> $this->rock->jm->base64encode($frs['optname']),
-			'filename' 	=> $this->rock->jm->base64encode($frs['filename']),
+			'optname' 	=> $this->rock->jm->base64encode($frs['optname'])
 		));
-		if(!$barr['success'])return $barr;
-		$data 	 = $barr['data'];
+		
+		$result 	= c('curl')->postcurl($url, array('file' => new CURLFile($path, '', $frs['filename'])), 1);
+		if(!$result)return returnerror('errors');
+		
+		if(substr($result,0,1)!='{')return returnerror($result);
+		$data = json_decode($result, true);
+		
 		$filenum 	= arrvalue($data, 'filenum');
 		$thumbpath 	= arrvalue($data, 'thumbpath');
 		if($filenum){
-			$guar['filenum'] = $filenum;
-			if($thumbpath)$guar['thumbplat'] = $thumbpath;
-			m('file')->update($guar,$fileid);
+			$guar['filenum'] 	= $filenum;
+			if($fobj->isimg($frs['fileext']))$guar['thumbplat'] = $thumbpath;
+			$fobj->update($guar,$fileid);
 			unlink($path);
 			$path = ROOT_PATH.'/'.$frs['thumbpath'];
 			if($path && file_exists($path))unlink($path);
 		}
-		return $barr;
-	}
-	
-	/**
-	*	上传文件(分割发送)
-	*/
-	public function upload($path,$upcs=array(), $fcs=0.5)
-	{
-		if(!file_exists($path))return returnerror('404');
-		$oi 	 = 0;
-		$fp 	 = fopen($path,'rb');
-		$filesize= filesize($path);
-		$fileext = c('upfile')->getext($path);
-		$size 	 = $fcs*1024*1024;
-		$zong	 = ceil($filesize/$size);
-		if($zong<=0)$zong = 1;
-		$barr 	 = false;
-		$biaoshi = rand(100000,999999);
-		while(!feof($fp)){
-			$cont = fread($fp, $size);
-			$conts= base64_encode($cont);
-			$upcan= array('ci'=>$oi,'biaoshi'=>$biaoshi,'zong'=>$zong,'filesize' => $filesize,'fileext'=>$fileext);
-			foreach($upcs as $k=>$v)$upcan[$k] = $v;
-			$barr = $this->postdata('upfile','index', $conts, $upcan);
-			if(!$barr['success'])break;
-			$oi++;
-		}
-		fclose ($fp);
-		if($barr)return $barr;
-		return returnerror('无效文件');
+		return returnsuccess();
 	}
 }

+ 131 - 0
include/chajian/rockwxqyChajian.php

@@ -0,0 +1,131 @@
+<?php
+/**
+*	信呼企业微信平台
+*	2024-11-09
+*/
+
+class rockwxqyChajian extends Chajian
+{
+	private $platurl 	= '',$cnum = '';
+	private $optionobj;
+	
+	protected function initChajian()
+	{
+		$this->platurl = getconfig('rockwxqy_url');
+		if(!$this->platurl){
+			$this->platurl = $this->rock->jm->base64decode('aHR0cHM6Ly93eHF5LnJvY2tvYS5jb20v');
+		}
+		$this->optionobj = m('option');
+		$this->cnum 	 = $this->optionobj->getval('wxqyplat_cnum');
+	}
+	
+	public function isconfig()
+	{
+		if($this->cnum)return true;
+		return false;
+	}
+	
+	public function geturlstr($act, $can=array(),$mact='')
+	{
+		$url = $this->platurl;
+		$mode= 'wxqyopen';
+		if($mact)$mode = $mact;
+		$url.= 'index.php?a='.$act.'&m='.$mode.'';
+		$url.= '&cnum='.$this->cnum.'&xinhukey='.getconfig('xinhukey').'';
+		if(is_array($can))foreach($can as $k=>$v)$url.='&'.$k.'='.$v.'';
+		return $url;
+	}
+	
+	public function getdata($act, $can=array(), $data=array())
+	{
+		if(!$this->cnum)return returnerror('未设置单位编号');
+		$url 	= $this->geturlstr($act, $can);
+		if($data){
+			$cont 	= c('curl')->postcurl($url, $data);
+		}else{
+			$cont 	= c('curl')->getcurl($url);
+		}
+		$data  	= array('code'=>201,'success'=>false,'msg'=>'出错了返回:'.htmlspecialchars($cont).'');
+		if($cont!='' && substr($cont,0,1)=='{'){
+			$data  	= json_decode($cont, true);
+		}
+		return $data;
+	}
+	
+	public function postdata($act, $data=array(), $can=array())
+	{
+		return $this->getdata($act, $can, $data);
+	}
+	
+	/**
+	*	发消息
+	*/
+	public function sendmess($id, $title, $mess, $url='',$picurl='')
+	{
+		$where 		= '`uid` in('.$id.')';
+		if($id=='all')$where = '1=1';
+		$rows 		= m('zwxqy_user')->getall(''.$where.' AND `state`=1','userid,agentid,cnum');
+		if(!$rows)return returnerror('nouser');
+		$sdata = array(
+			'touser' => $rows,
+			'title'  => $this->rock->jm->base64encode($title),
+			'mess'   => $this->rock->jm->base64encode($mess),
+			'url'    => $this->rock->jm->base64encode($url),
+			'picurl' => $this->rock->jm->base64encode($picurl),
+		);
+		return $this->postdata('sendmess', json_encode($sdata));
+	}
+	
+	/**
+	*	快捷登录
+	*/
+	public function authlogin()
+	{
+		$backurl = $this->rock->get('backurl');
+		$rs 	 = m('zwxqy_user')->getone('`state`=1');
+		if(!$rs){
+			$url = '?d=we&m=login&errmsg='.$this->rock->jm->base64encode('没有激活的用户').'';
+		}else{
+			$url 	 = $this->platurl.'?m=main&yyid='.$rs['agentid'].'';
+		}
+		if($backurl)$url.='&backurl='.$backurl.'';
+		$this->rock->location($url);
+	}
+	
+	/**
+	*	获取打卡记录(需要用异步)
+	*/
+	public function getcheckindata($uids='', $startdt='', $enddt='', $page=1)
+	{
+		$obj 		= m('weixinqy:daka');
+		if(!method_exists($obj, 'savecheckindata'))return returnerror('未安装企业微信插件');
+		
+		$where 		= '`uid` in('.$uids.') AND ';
+		if($uids=='')$where = '';
+		$rows 		= m('zwxqy_user')->getall(''.$where.'`state`=1','userid,uid');
+		if(!$rows)return returnerror('没有激活的用户');
+		$userids	= $uids = $uarrs = array();
+		foreach($rows as $k=>$rs){
+			$userids[] = $rs['userid'];
+			$uids[] = $rs['uid'];
+			$uarrs[$rs['userid']] = $rs['uid'];
+		}
+		$sdata = array(
+			'userids' 	=> $userids,
+			'uids' 		=> $uids,
+			'startdt' 	=> $startdt,
+			'enddt' 	=> $enddt,
+		);
+		$barr 		= $this->postdata('checkindata', json_encode($sdata));
+		if(!$barr['success'])return $barr;
+		$this->rock->debugs($barr['data'],'djcheckdata');
+		$data 		= $barr['data'];
+		if(isset($data['checkindata'])){
+			$obj->savecheckindata($data, $uarrs);
+		}
+		if(isset($data['hardwaredata'])){
+			$obj->hardwaredata($data['hardwaredata'], $uarrs);
+		}
+		return $barr;
+	}
+}

+ 1 - 1
include/chajian/upfileChajian.php

@@ -15,7 +15,7 @@ class upfileChajian extends Chajian{
 	private $jpgallext		= '|jpg|png|gif|bmp|jpeg|';	//图片格式
 	
 	//可上传文件类型,也就是不保存为uptemp的文件
-	private $upallfile		= '|doc|docx|xls|xlsx|ppt|pptx|pdf|swf|rar|zip|txt|gz|wav|mp3|avi|mp4|flv|wma|chm|apk|amr|log|json|cdr|psd|';
+	private $upallfile		= '|doc|docx|xls|xlsx|ppt|pptx|pdf|swf|rar|zip|txt|gz|wav|mp3|avi|mp4|flv|wma|chm|apk|amr|log|json|cdr|psd|caf|wps|';
 	
 	/**
 		初始化

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
include/chajian/xinhuapiChajian.php


+ 49 - 3
include/class/mysql.php

@@ -634,9 +634,25 @@ abstract class mysql{
 	{
 		if($base=='')$base = $this->db_base;
 		$sql	= "select COLUMN_NAME as `name`,DATA_TYPE as `type`,COLUMN_COMMENT as `explain`,COLUMN_TYPE as `types`,`COLUMN_DEFAULT` as dev,`IS_NULLABLE` as isnull,`CHARACTER_MAXIMUM_LENGTH` as lens,`NUMERIC_PRECISION` as xslen1,`NUMERIC_SCALE` as xslen2 from information_schema.COLUMNS where  `TABLE_SCHEMA` ='$base' AND `TABLE_NAME`='$table' $whe order by `ORDINAL_POSITION`";
-		//SHOW FULL COLUMNS FROM table_name
-		
-		return $this->getall($sql);
+		if($whe)return $this->getall($sql);
+		$sql 	= 'SHOW FULL COLUMNS FROM '.$base.'.`'.$table.'`;';
+		return $this->getall($sql, function($row){
+			$len  = null;$dbtype = strtolower($row['Type']);
+			$arrs = explode('(',$dbtype);
+			$type = $arrs[0]; 
+			if(isset($arrs[1]))$len = (int)str_replace(')','', $arrs[1]);
+			return array(
+				'name' 	=> $row['Field'],
+				'types' 	=> $row['Type'],
+				'explain' 	=> $row['Comment'],
+				'type'   	=> $type,
+				'dev'   	=> $row['Default'],
+				'isnull'   => $row['Null'],
+				'lens'   	=> $len,
+				'xslen1'   => 0,
+				'xslen2'   => 0,
+			);
+		});
 	}
 	
 	/**
@@ -773,6 +789,36 @@ abstract class mysql{
 			if($pid!=$afid)if($this->rows($table,"`$afield`='$pid'")>0)$this->getpvala($table,$pfields,$jfield,$pid,$afield,$maxlen);
 		}
 	}
+	
+	/**
+	*	添加字段
+	*/
+	public function addFields($table, $fields, $types, $dev=null, $name='')
+	{
+		$sql = "ALTER TABLE `$table` ADD `$fields` ".$types."";
+		if($dev===null){
+			$sql.=' DEFAULT NULL';
+		}else if(!isempt($dev)){
+			$sql.=" DEFAULT '$dev'";
+		}
+		if(!isempt($name))$sql.=" COMMENT '$name'";
+		return $this->query($sql);
+	}
+	
+	/**
+	*	编辑字段
+	*/
+	public function editFields($table, $fields, $types, $dev=null, $name='')
+	{
+		$sql = "ALTER TABLE `$table` MODIFY `$fields` ".$types."";
+		if($dev===null){
+			$sql.=' DEFAULT NULL';
+		}else if(!isempt($dev)){
+			$sql.=" DEFAULT '$dev'";
+		}
+		if(!isempt($name))$sql.=" COMMENT '$name'";
+		return $this->query($sql);
+	}
 }
 class DB{
 	

+ 3 - 3
include/class/rockClass.php

@@ -66,11 +66,11 @@ final class rockClass
 	{
 		$ip = '';
 		if(isset($_SERVER['HTTP_CLIENT_IP'])){
-			$ip = $_SERVER['HTTP_CLIENT_IP'];
-		}else if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
-			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
+			$ip = $_SERVER['HTTP_CLIENT_IP']; //这个会被模拟
 		}else if(isset($_SERVER['REMOTE_ADDR'])){
 			$ip = $_SERVER['REMOTE_ADDR'];
+		}else if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
+			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
 		}
 		$ip= htmlspecialchars($this->xssrepstr($ip));
 		if($ip){$ipar = explode('.', $ip);foreach($ipar as $ip1)if(!is_numeric($ip1))$ip='';}

+ 38 - 25
js/dingwei.js

@@ -15,8 +15,9 @@ js.dw = {
 	
 	//开始定位
 	init:function(isgzh){
-		var dws = navigator.userAgent;
-		if(dws.indexOf('REIMPLAT')>0)return;
+		var dws 	= navigator.userAgent;
+		this.ISAPP 	= dws.indexOf('XINHUOA')>0;
+		if(dws.indexOf('REIMPLAT')>0 || this.ISAPP)return;
 		if(openfrom=='nppandroid' || openfrom=='nppios')return;
 		if(isgzh==1){
 			js.jssdkwxgzh();
@@ -36,10 +37,9 @@ js.dw = {
 	start:function(){
 		if(this.dwbool)return;
 		this.successbo = false;
-		this.dwbool = true;
 		this.chaoshi();
 		this.ondwstart(js.jssdkstate);
-		if(js.jssdkstate != 1){
+		if(js.jssdkstate != 1 || this.ISAPP){
 			this.htmldingw(0);
 		}else{
 			this.wxdingw();
@@ -72,17 +72,19 @@ js.dw = {
 		var msg;
 		if(appobj1('startLocation','appbacklocation')){
 			this.wait('原生app定位中...');
+			this.dwbool = true;
 			return;
 		}
 		if(window['api'] && api.startLocation){
 			js.msg();
+			this.dwbool = true;
 			if(api.systemType=='ios'){
 				this.wait(''+api.systemType+'APP定位中...');
 				api.startLocation({},function(ret,err){
 					js.dw.appLocationSuc(ret,err);
 				});
 				return;
-			}else if(lx==0){
+			}else if(lx==0){ //这个是旧版的app里弃用了
 				this.wait(''+api.systemType+'百度地图定位中...');
 				if(!this.baiduLocation)this.baiduLocation = api.require('baiduLocation');
 				if(this.baiduLocation){
@@ -113,7 +115,7 @@ js.dw = {
 				return;
 			}
 		}
-		
+		if(this.ISAPP)return;
 		if(!navigator.geolocation){
 			msg = '不支持浏览器定位';
 			js.msg('msg',msg);
@@ -137,11 +139,11 @@ js.dw = {
 					if(ret.success && ret.data){
 						js.dw.showPosition({coords:ret.data});
 					}else{
-						js.dw.showErrors('跳转定位错误:'+ret.msg);
+						js.dw.showcuowu('跳转定位错误:'+ret.msg);
 					}
 				},
 				error:function(){
-					js.dw.showErrors('跳转定位错误');
+					js.dw.showcuowu('跳转定位错误');
 				}
 			});
 			return;
@@ -201,7 +203,17 @@ js.dw = {
 		var lat 	= parseFloat(res.latitude); // 纬度,浮点数,范围为90 ~ -90
         var lng 	= parseFloat(res.longitude); // 经度,浮点数,范围为180 ~ -180。
         var jid 	= parseFloat(res.accuracy); // 位置精度
-		this.geocoder(lat,lng, jid);
+		var address = res.address;
+		if(address){
+			js.msg('none');
+			res.addressinfo = address+'(精确'+js.float(jid,1)+'米)';
+			res.latitude    = lat;
+			res.longitude   = lng;
+			res.accuracy    = jid;
+			this.ondwcall(res);
+		}else{
+			this.geocoder(lat,lng, jid);
+		}
 	},
 		
 	showError:function (error){
@@ -222,29 +234,29 @@ js.dw = {
 			msg="未知错误。"
 			break;
 		}
-		if(NOWURL.substr(0,5)!='https'){
-			msg+='必须使用https访问';
-			js.confirm('点确定继续去定位', function(jg){
-				if(jg=='yes'){
-					setTimeout('js.dw.gotodingw()',100);
-				}else{
-					js.dw.showErrors(msg);
-				}
-			});
-		}else{
-			js.dw.showErrors(msg);
-		}
-	},
-	showErrors:function(msg){
+		clearTimeout(js.dw.timeerrbo)
+		if(NOWURL.substr(0,5)!='https')msg+='必须使用https访问';
 		js.dw.timeerrbo = setTimeout(function(){
 			if(!js.dw.successbo){
-				js.msg('msg', msg);
-				js.dw.ondwerr(msg);	
+				js.dw.showErrorss(msg);
 			}else{
 				js.msg();
 			}
 		},1000);
 	},
+	showcuowu:function(msg){
+		js.msg('msg', msg);
+		js.dw.ondwerr(msg);
+	},
+	showErrorss:function(msg){
+		js.confirm('点确定继续去定位('+msg+')', function(jg){
+			if(jg=='yes'){
+				setTimeout('js.dw.gotodingw()',100);
+			}else{
+				js.dw.showcuowu(msg);
+			}
+		});
+	},
 	gotodingw:function(){
 		js.alert('跳转在定位中,可点确定读取定位内容。','', function(){
 			js.reload();
@@ -262,6 +274,7 @@ js.dw = {
 	},
 	showPosition:function(position){
 		js.dw.successbo = true;
+		js.tanclose('confirm');
 		clearTimeout(js.dw.timeerrbo);
 		js.msg();
 		var res 		= position.coords;

+ 30 - 4
js/js.js

@@ -1,5 +1,5 @@
 var MODE	= '',ACTION = '',DIR='',PROJECT='',HOST='',PARAMS='',QOM='xinhu_',apiurl='',token='',device='',CFROM='pc',ISDEMO=false,NOWURL='',nwjsgui=false,apicloud=false,isapp=false,homestyle=0,maincolor='#1389D3';
-var windows	= null,ismobile=0;
+var windows	= null,ismobile=0,clientbool = false;;
 function initbody(){}
 function bodyunload(){}
 function globalbody(){}
@@ -21,6 +21,8 @@ $(document).ready(function(){
 		if(nwjsgui)window.focus=function(){nw.Window.get().focus()}
 		if(winobj!='')opener.js.openarr[winobj]=window;
 	}catch(e){}
+	var llq = navigator.userAgent;
+	if(llq.indexOf('REIMCLIENT')>0)clientbool = true;
 	globalbody();
 	initbody();
 	$('body').click(function(e){
@@ -37,7 +39,7 @@ $(document).ready(function(){
 		var msg = '文件:'+e.filename+'\n行:'+e.lineno+'\n错误:<font color=red>'+e.message+'</font>';
 		js.alert(msg,'js错误');
 	});
-	if(navigator.userAgent.indexOf('XINHUOA')<0){
+	if(llq.indexOf('XINHUOA')<0){
 		if(typeof(api)=='undefined')api={};
 	}
 	setTimeout(function(){
@@ -204,7 +206,14 @@ js.open=function(url,w,h,wina,can,wjcan){
 	for(var o1 in a1)s+=','+o1+'='+a1[o1]+'';
 	var ja=(url.indexOf('?')>=0)?'&':'?';
 	if(wina)url+=''+ja+'winobj='+wina+'';
-	if(typeof(nw)=='undefined'){
+	 if(clientbool){
+		if(url.substr(0,4)!='http')url=NOWURL+url;
+		rockclient.rockFun("openWin",{
+			url:url,
+			width:w,
+			height:h
+		});
+	}else if(typeof(nw)=='undefined'){
 		var opar=window.open(url,'',s);
 	}else{
 		var ocsn=js.apply({'frame':true,width:w,height:h,x:l,y:t,icon:'images/logo.png'},wjcan);
@@ -775,7 +784,7 @@ js.alertclose=function(){
 }
 js.tanstyle = 0;
 js.confirm	= function(txt,fun, tcls, tis, lx,ostr,bstr){
-	if(!lx)lx=0;
+	if(!lx)lx=0;js.alertclose();
 	var h = '<div style="padding:20px;line-height:30px" align="center">',w=320;
 	if(lx==1)w= 350;
 	if(w>winWb())w=winWb()-10;
@@ -1234,4 +1243,21 @@ js.ling = function(w){
 	var sve = 'style="height:'+w+'px;width:'+w+'px"';
 	if(!w)sve='';
 	return '<i '+sve+' class="rock-loading"></i>';
+}
+
+js.chajian = function(type, cans){
+	if(!$[type]){
+		js.importjs('mode/plugin/jquery-'+type+'.js?'+js.getrand()+'', function(){$[type](cans);});
+	}else{
+		$[type](cans);
+	}
+}
+
+function showDebug(strv,col){
+	var obj = $('div[temp="divt"]'),hei=50;
+	for(var i=0;i<obj.length;i++)hei+=$(obj[i]).height()+11;
+	if(!col)col='red';
+	if(typeof(strv)!='string')strv = JSON.stringify(strv);
+	var str = '<div temp="divt" onclick="$(\'div[temp=divt]\').remove()" style="background:rgba(0,0,0,0.8);font-size:12px;position:fixed;right:0px;top:'+hei+'px;padding:5px;z-index:99;word-wrap:break-word;word-break:break-all;white-space:normal;color:'+col+'">['+js.now('now')+']'+strv+'</div>';
+	$('body').append(str);
 }

+ 2 - 1
js/jswx.js

@@ -1,13 +1,14 @@
 QOM='xinhuwx_'
 js.wx={};
 js.wx.alert=function(msg,fun,tit, cof1){
+	js.alertclose();
 	js.alert(msg,tit, fun);
 }
 js.wx.confirm=function(msg,fun,tit){
 	js.confirm(msg,fun,tit);
 }
 js.wx.prompt=function(tit,msg,fun,nr){
-	js.prompt(tit,msg,fun,nr);
+	js.prompt(tit,msg,function(jg,txt){if(jg=='yes')fun(txt)},nr);
 }
 js.apiurl = function(m,a,cans){
 	var url=''+apiurl+'api.php?m='+m+'&a='+a+'';

+ 27 - 7
js/reim_xina.js

@@ -10,6 +10,7 @@ var agentarr={},userarr={},grouparr={},cnum='',windowfocus=true,jietubool=false;
 var reim={
 	chatobj:{},
 	maindata:{},
+	nowtabs:'home',
 	initci:0,
 	timeloads:0,
 	ruloadtime:5*60, //5分钟
@@ -31,7 +32,7 @@ var reim={
 		//if(sw)$('#centlist').css('width',''+sw+'px');
 		
 		$(window).resize(this.resize);
-		$(window).focus(function(){windowfocus=true;im.windowfocus()});
+		$(window).focus(function(){windowfocus=true;im.windowfocus();reim.lastload();});
 		$(window).blur(function(){windowfocus=false});
 		//数秒
 		setInterval('reim.timeload()', 1000);
@@ -56,7 +57,7 @@ var reim={
 			inputfile:'allfileinput',
 			initpdbool:false,
 			updir:'reimchat',
-			urlparams:{noasyn:'yes'}, //不需要同步到文件平台上
+			urlparams:{noasyn:'no',shuiyin:'size'}, //不需要同步到文件平台上
 			onchange:function(d){
 				im.sendfileshow(d);
 			},
@@ -208,7 +209,7 @@ var reim={
 	getapiurl:function(m,a,lx){
 		if(lx=='gout')return this.outgroup.geturl(a);
 		if(lx=='zixun' || lx=='wait')m='rockkefu';
-		var dzs = 'api.php?m='+m+'&a='+a+'&cfrom=reim';
+		var dzs = 'api.php?m='+m+'&a='+a+'&cfrom=reim&adminid='+adminid+'&token='+token+'';
 		if(companynum)dzs+='&dwnum='+companynum+'';
 		return dzs;
 	},
@@ -235,6 +236,20 @@ var reim={
 		$('#mainreload').html(''+js.ling(12)+' 刷新中...');
 		this.initload(true);
 	},
+	lastload:function(){
+		if(!this.loadtime)this.loadtime = parseInt(js.now('time') * 0.001);
+		this.ajax(this.getapiurl('indexreim','loadhit'),{'time':this.loadtime}, function(ret){
+			var da = ret.data;
+			reim.lastloads(da);
+		});
+	},
+	lastloads:function(da){
+		this.loadtime = da.loadtime;
+		var i,ds=da.rows;
+		for(i=0;i<ds.length;i++){
+			this.showhistorys(ds[i], true);
+		}
+	},
 	//初始加载数据
 	initload:function(bo){
 		this.initbool = true;
@@ -248,6 +263,7 @@ var reim={
 	firstpid:0,
 	showdata:function(ret){
 		if(!ret.userjson)return;
+		this.loadtime		= ret.loadtime;
 		this.lastloaddt		= ret.loaddt;
 		this.maindata.darr 	= js.decode(ret.deptjson);
 		this.maindata.uarr 	= js.decode(ret.userjson);
@@ -339,7 +355,7 @@ var reim={
 			return;
 		}
 		this.searchright.setData(d);
-		this.searchright.showAt(off.left+1,off.top+25,$('#reim_headercenter').width()-2);
+		this.searchright.showAt(off.left+1,off.top+30);
 	},
 	websocketlink:function(a){
 		if(this.connectbool){
@@ -476,7 +492,10 @@ var reim={
 			this.otherlogins();
 			return;
 		}
-	
+		if(d.optdt){
+			var time = parseInt(js.now('time', d.optdt) * 0.001);
+			this.loadtime = time;
+		}
 		if(lx=='user' || lx=='group'){
 			if(sendid!=adminid)this.receivechat(d);
 		}
@@ -640,7 +659,7 @@ var reim={
 	showhistorydata:{},
 	showhistorys:function(d,pad, lex, glx){
 		var s,ty,o=$('#historylist'),d1,st,nas=d.names,qz=d.qian;
-		var num = ''+d.type+'_'+d.receid+'';
+		var num = ''+d.type+'_'+d.receid+'';if(num==this.nowtabs)lex=true;
 		this.showhistorydata[num]=d;
 		$('#history_'+num+'').remove();
 		st	= d.stotal;if(st=='0')st='';
@@ -1189,7 +1208,7 @@ var reim={
 			});
 			return;
 		}
-		if(nwjsgui){
+		if(nwjsgui || 1==1){
 			js.loading('退出中...');
 			js.ajax(this.getapiurl('login','loginexit'),{},function(ret){
 				js.setoption('autologin', '0');
@@ -1234,6 +1253,7 @@ var reim={
 		js.setoption('setchatlistw', ''+kg+'');
 	},
 	cogshow:function(){
+		//nw.Window.open('file:///F:/IIS/demo/webrtc_v5_latest/quick-demo-js/index.html');return;
 		var chs= (this.getsound())?'checked':'';
 		var ch1= (this.getzhuom())?'checked':'';
 		var num = 'userinfo_cogshow';

+ 7 - 0
mode/bootstrapplugin/jquery-bootstable.js

@@ -205,7 +205,9 @@
 					s1 = '<img height="20" width="20" src="images/checkbox'+val+'.png">';
 				}else{
 					s1 = val;
+					if(ov[na+'_textcn'])s1 = ov[na+'_textcn'];
 				}
+				
 				if(typeof(a[i].renderer)=='function'){
 					s3 = a[i].renderer(val, ov, j);
 					if(!isempt(s3))s1=s3;
@@ -227,6 +229,11 @@
 					s3 = a[i].renderattr(val, ov, j);
 					if(!isempt(s3))attr+=' '+s3+'';
 				}
+				
+				if(ov[''+na+'_color'])sty+='color:'+ov[''+na+'_color']+';';
+				if(ov[''+na+'_style'])sty+=''+ov[''+na+'_style']+';';
+				if(ov[''+na+'_title'])attr+=' title="'+ov[''+na+'_title']+'"';
+				
 				s+='<td class="rock-table-td" align="'+a[i].align+'" '+attr+' style="'+sty+'" row="'+j+'" cell="'+i+'">'+s2+''+s1+'</td>';
 			}
 			s+='</tr>';

+ 15 - 5
mode/kindeditor/themes/default/default.css

@@ -416,17 +416,19 @@
 /* container */
 .ke-container {
 	display: block;
-	border: 1px solid #CCCCCC;
+	border: var(--border);
 	background-color: #FFF;
+	border-radius:5px;
 	overflow: hidden;
 	margin: 0;
 	padding: 0;
 }
 /* toolbar */
 .ke-toolbar {
-	border-bottom: 1px solid #CCC;
+	border-bottom: var(--border);
 	background-color: #F0F0EE;
-	padding: 2px 5px;
+	background-color: var(--main-vgcolor);
+	padding: 5px 5px;
 	text-align: left;
 	overflow: hidden;
 	zoom: 1;
@@ -442,7 +444,7 @@
 	background-image: url(default.png);
 }
 .ke-toolbar .ke-outline {
-	border: 1px solid #F0F0EE;
+	border: 1px solid transparent;
 	margin: 1px;
 	padding: 1px 2px;
 	font-size: 0;
@@ -454,9 +456,11 @@
 }
 .ke-toolbar .ke-on {
 	border: 1px solid #5690D2;
+	border: 1px solid var(--main-color);
 }
 .ke-toolbar .ke-selected {
 	border: 1px solid #5690D2;
+	border: 1px solid var(--main-color);
 	background-color: #E9EFF6;
 }
 .ke-toolbar .ke-disabled {
@@ -505,7 +509,8 @@
 .ke-statusbar {
 	position: relative;
 	background-color: #F0F0EE;
-	border-top: 1px solid #CCCCCC;
+	background-color: var(--main-vgcolor);
+	border-top: var(--border);
 	font-size: 0;
 	line-height: 0;
 	*height: 12px;
@@ -1147,3 +1152,8 @@
 	text-align: center;
 }
 
+.ke-icon-word {
+	background-position: 0px -720px;
+	width: 16px;
+	height: 16px;
+}

+ 1 - 1
mode/plugin/jquery-rockdoupull.js

@@ -152,7 +152,7 @@
 				if(this.upheight>50){
 					this.reloadbo = true;
 					o1.animate({'height':'50px'},200,function(){
-						o1.html('<img src="images/loading.gif" align="absmiddle"> 刷新中...');
+						o1.html(''+js.ling(14)+' 刷新中...');
 						me.ondownsuccess ? me.ondownsuccess(e) : me.ondownok();
 					});
 				}else{

+ 199 - 0
mode/plugin/jquery-rockselect.js

@@ -0,0 +1,199 @@
+/**
+	edittable 单击选择插件
+	caratename:chenxihu
+	caratetime:214-04-06 21:40:00
+	email:qqqq2900@126.com
+	homepage:www.xh829.com
+*/
+
+(function ($) {
+	rockselectdata = {};
+	function rockselect(cans){
+		var me 		= this;
+		var defv = js.applyIf(cans,{
+			rand:js.getrand(),
+			limit:10,
+			maxheight:400,
+			num:''
+		});
+		for(var i in defv)this[i] = defv[i];
+		
+		this.init = function(){
+			if(!this.num)this.num 	 	= this.rand;
+			if(!rockselectdata[this.num])rockselectdata[this.num] = {};
+			this.showView();
+			if(rockselectdata[this.num].alldata){
+				this.loaddatashow(rockselectdata[this.num].alldata);
+			}else{
+				this.loaddata();
+			}
+			rockselectdata[this.num]  	= this;
+		}
+		
+		this.clickstr = function(act,val){
+			return 'rockselectdata.'+this.num+'.'+act+'('+val+')';
+		}
+	
+		
+		this.showView = function(){
+			this.hide();
+			var o2    = $(this.viewobj);
+			var lefta =o2.offset();
+			this.top  = lefta.top+o2.height();
+			var s = '<div id="rockselectdiv" class="box" style="position:absolute;z-index:999;left:'+lefta.left+'px;top:'+this.top+'px;background:white;border:1px var(--main-color) solid;border-radius:5px;"><div style="background:var(--main-bgcolor);border-radius:5px">';
+			s+='<div style="display:flex;border-bottom:var(--border)"><select style="width:100px;border:none;background:none;display:none"  id="rockselect_select"><option value="">-选择-</option></select><input type="input" style="background:none;border:none;border-radius:0;;flex:1" placeholder="输入关键词搜索" onkeydown="'+this.clickstr('keydown','this')+'" class="input"></div>';
+			s+='<div id="rockselectdivs" style="max-height:'+this.maxheight+'px;overflow:auto"><div style="padding:50px;" align="center">'+js.ling(30)+'</div></div>';
+			s+='</div></div>';
+			$('body').append(s);
+		}
+		
+		this.loaddata = function(key){
+			if(!key)key='';
+			$.ajax({
+				type:'get',data:{key:jm.base64encode(key)},
+				url:this.url,dataType:'json',
+				success:function(ret){
+					me.loaddatashow(ret);
+				},
+				error:function(){
+					$('#rockselectdivs').html('加载错误');
+				}
+			});
+		}
+		
+		this.loaddatashow=function(ret){
+			this.alldata = ret;
+			var rows = ret;
+			if(ret.rows)rows = ret.rows;
+			if(ret.data)rows = ret.data;
+			if(this.ondatachuli)rows = this.ondatachuli(rows, ret);
+			this.yuandata = rows;
+			this.firstdata(rows);
+		}
+		this.pageload=function(zl,p){
+			$('#rockselectdivpage').remove();
+			var ds = this.autodata;
+			var str='',i,len=ds.length,j=0,sty,d,cls,str1='';
+			for(i=(p-1)*zl;i<len;i++){
+				d = ds[i];sty= '';cls='list-itemv';
+				if(d.style)sty+=''+d.style+';';
+				if(d.padding)sty+='padding-left:'+d.padding+'px;';
+				if(d.disabled)cls='';
+				str+='<div class="'+cls+'"';
+				if(!d.disabled)str+=' onclick="'+this.clickstr('itemclick',''+i+'')+'"';
+				str+= ' style="padding:7px 10px;'+sty+'">'+d.name+'';
+				if(d.subname)str+='&nbsp;<span style="font-size:12px">('+d.subname+')</span>';
+				str+='</div>';
+				j++;
+				if(j>=zl)break;
+			}
+			if(len>zl){
+				str1='<div id="rockselectdivpage" style="padding:8px 10px;background:rgba(0,0,0,0.1)">总记录'+len+'条('+Math.ceil(len/zl)+'/'+p+')';
+				if(p>1)str1+='&nbsp;<span class="zhu cursor" onclick="'+this.clickstr('pageload',''+zl+','+(p-1)+'')+'">&lt;上页</span>';
+				if(j==zl && ds[p*zl])str1+='&nbsp;<span class="zhu cursor" onclick="'+this.clickstr('pageload',''+zl+','+(p+1)+'')+'">下页&gt;</span>';
+				str1+='</div>';
+			}
+			if(!str)str='<div align="center" style="padding:30px">无记录</div>';
+			setTimeout(function(){
+				$('#rockselectdivs').html(str).after(str1);
+				if(p==1)me.setweizhi();
+			},10);
+		}
+		
+		//点击
+		this.itemclick = function(i){
+			var d = this.autodata[i];
+			if(d.disabled)return;
+			var nav = d.name;
+			if(this.nameobj)this.nameobj.value = nav;
+			var val = d.value;
+			if(typeof(val)=='undefined')val = d.id;
+			if(typeof(val)=='undefined')val = d.name;
+			if(this.idobj)this.idobj.value = val;
+			if(this.onitemclick)this.onitemclick(nav,val,d);
+			this.hide();
+		}
+		
+		this.keydown = function(o1){
+			if(!this.yuandata)return;
+			clearTimeout(this.autoctime);
+			this.autoctime = setTimeout(function(){me.sousouval(o1);},10);
+		}
+		
+		this.sousouval = function(o1){
+			var ds=[],val= strreplace(o1.value);
+			var da = this.yuandata,len=da.length,j=0,zl=this.limit;
+			if(val){
+				for(i=0;i<len;i++)if(da[i].name.indexOf(val)>-1 || (da[i].subname && da[i].subname.indexOf(val)>-1)){
+					ds.push(da[i]);j++;if(j>=zl*3)break;
+				}
+			}else{
+				ds=da;
+			}
+			this.firstdata(ds);
+			this.nowinpvle= val;
+		}
+		
+		this.firstdata = function(ds){
+			this.autodata = ds;
+			this.pageload(this.limit,1);
+		}
+		
+		this.hide = function(){
+			$('#rockselectdiv').remove();
+		}
+		
+		//设置位置
+		this.setweizhi = function(){
+			var obj = $('#rockselectdiv');
+			var hei = obj.height() + this.top;
+			var khe = winHb() + $(document).scrollTop();
+			var dhe = hei - khe,min=200;
+			if(dhe > 0){
+				var o2 = $('#rockselectdivs');
+				var nhei= o2.height()-dhe-5;
+				if(nhei < min){
+					var ntop = this.top - (min-nhei);
+					if(ntop < 0){
+						min  = min + ntop - 5;
+						ntop = 5;
+					}
+					obj.css('top',''+ntop+'px');
+					nhei = min;
+				}
+				o2.css('height',''+nhei+'px');
+			}
+		}
+		
+		
+		this.setSelectData = function(dt,na, fid){
+			if(!dt || dt.length==0)return;
+			var o = get('rockselect_select');
+			o.length = 0;
+			$(o).show();
+			dt.unshift({value:'',name:na});
+			js.setselectdata(o, dt, 'value');
+			$(o).change(function(){
+				me.changeselect(this, fid);
+			});
+		}
+		this.changeselect = function(o, fid){
+			var val = o.value;
+			var da  = this.yuandata,len=da.length,ds=[],i;
+			if(val){
+				for(i=0;i<len;i++)if(val==da[i][fid])ds.push(da[i]);
+			}else{
+				ds=da;
+			}
+			this.firstdata(ds);
+		}
+		
+	}
+	js.addbody('rockselectdiv', 'remove','rockselectdiv');
+	$.rockselect	= function(cans){
+		var funcls = new rockselect(cans);
+		setTimeout(function(){funcls.init()},5);
+		return funcls;
+	};
+	
+})(jQuery);

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
mode/plugin/trtc.js


+ 6 - 1
web/res/js/jquery-imgview.js

@@ -18,6 +18,7 @@
 		this.dushu	  = 0;
 		this.onloadsuccess=function(){};
 		this.init=function(){
+			if(get('imgview_main'))return;
 			for(var i in opts)this[i]=opts[i];
 			if(obj)this.url=obj.attr('src');
 			this.mheiht = document.body.scrollHeight,sed=$(window).height();
@@ -35,7 +36,7 @@
 			s+='	<div id="imgview_spanmask"  style="position:absolute;z-index:1;left:0px;top:0px;background-color:rgba(0,0,0,0);width:100%;height:100%;cursor:move;user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;"></div>';
 			s+='	<img style="position:absolute;z-index:0;left:0px;top:0px" id="imgview_spanimg" width="100%" height="100%" src="images/mloading.gif" >';
 			s+='</div>';
-			s+='<div style="position:fixed;z-index:2;left:0px;bottom:0px;text-align:center;color:white;width:100%;font-size:20px;background-color:rgba(0,0,0,0.2);height:40px;line-height:40px;overflow:hidden"><i style="cursor:pointer" id="imgview_zoom-out" class="icon-zoom-out" title="缩小"></i> &nbsp; <span id="imgview_nowbili" style="font-size:14px">100%</span> &nbsp; <i style="cursor:pointer" class="icon-zoom-in" title="放大" id="imgview_zoom-in"></i>';
+			s+='<div style="position:fixed;z-index:2;left:0px;bottom:0px;text-align:center;color:white;width:100%;font-size:20px;background-color:rgba(0,0,0,0.2);height:40px;line-height:40px;overflow:hidden;user-select:none"><i style="cursor:pointer" id="imgview_zoom-out" class="icon-zoom-out" title="缩小"></i> &nbsp; <span id="imgview_nowbili" style="font-size:14px">100%</span> &nbsp; <i style="cursor:pointer" class="icon-zoom-in" title="放大" id="imgview_zoom-in"></i>';
 			s+='  &nbsp; <i style="cursor:pointer" class="icon-move" title="原始大小" id="imgview_zoom-move"></i>';
 			if(!this.ismobile && this.downbool)s+='  &nbsp; <a target="_blank" download="" style="color:white;font-size:20px" href="'+this.url+'"><i style="cursor:pointer" class="icon-download-alt" title="下载"></i></a>';
 			s+='  &nbsp; <i style="cursor:pointer" class="icon-refresh" title="旋转90度" id="imgview_zoom-refresh"></i>';
@@ -182,6 +183,10 @@
 				}
 			}); 
 		}
+		
+		this.loadimg=function(){
+			return "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='80px' height='80px' viewBox='0 0 80 80' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3Eloading%3C/title%3E%3Cdefs%3E%3ClinearGradient x1='94.0869141%25' y1='0%25' x2='94.0869141%25' y2='90.559082%25' id='linearGradient-1'%3E%3Cstop stop-color='%23606060' stop-opacity='0' offset='0%25'%3E%3C/stop%3E%3Cstop stop-color='%23606060' stop-opacity='0.3' offset='100%25'%3E%3C/stop%3E%3C/linearGradient%3E%3ClinearGradient x1='100%25' y1='8.67370605%25' x2='100%25' y2='90.6286621%25' id='linearGradient-2'%3E%3Cstop stop-color='%23606060' offset='0%25'%3E%3C/stop%3E%3Cstop stop-color='%23606060' stop-opacity='0.3' offset='100%25'%3E%3C/stop%3E%3C/linearGradient%3E%3C/defs%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' opacity='0.9'%3E%3Cg%3E%3Cpath d='M40,0 C62.09139,0 80,17.90861 80,40 C80,62.09139 62.09139,80 40,80 L40,73 C58.2253967,73 73,58.2253967 73,40 C73,21.7746033 58.2253967,7 40,7 L40,0 Z' fill='url(%23linearGradient-1)'%3E%3C/path%3E%3Cpath d='M40,0 L40,7 C21.7746033,7 7,21.7746033 7,40 C7,58.2253967 21.7746033,73 40,73 L40,80 C17.90861,80 0,62.09139 0,40 C0,17.90861 17.90861,0 40,0 Z' fill='url(%23linearGradient-2)'%3E%3C/path%3E%3Ccircle id='Oval' fill='%23606060' cx='40.5' cy='3.5' r='3.5'%3E%3C/circle%3E%3C/g%3E%3CanimateTransform attributeName='transform' begin='0s' dur='1s' type='rotate' values='0 40 40;360 40 40' repeatCount='indefinite'/%3E%3C/g%3E%3C/svg%3E%0A";
+		}
 	}
 	
 	

+ 10 - 0
web/res/js/notify.js

@@ -22,6 +22,7 @@ function notifyClass(opts){
 	this.sounderr= '';
 	this.soundbo = true;
 	this.showbool= false;
+	this.macos	 = false;
 	this._init=function(){
 		if(opts)for(var o1 in opts)this[o1]=opts[o1];
 		var strsr = '';
@@ -32,6 +33,8 @@ function notifyClass(opts){
 			strsr = '<audio id="notify_sound_audio" src="web/res/sound/wu.mp3" autoplay="autoplay" hidden="true"></audio>';
 		}
 		if(this.sound)$('body').append(strsr);
+		var llq = navigator.userAgent.toLowerCase();
+		if(llq.indexOf('reimclient')>0)this.macos = true;
 	};
 	this.setsound	= function(bo){
 		this.soundbo=bo;
@@ -90,6 +93,13 @@ function notifyClass(opts){
 					me.notification=false;
 				});
 			});
+		}else if(this.macos){
+			rockclient.rockFun("Notification",{
+				title:can.title,
+				msg:can.body
+			}, function(ret){
+				
+			});
 		}else{
 			var notification= new Notification(title, can);
 			notification.onclick = function(){

+ 15 - 4
web/res/js/strformat.js

@@ -268,13 +268,13 @@ var strformat = {
 				}
 				s='<img src="'+d.filepath+'"  onclick="strformat.clickimg(this)" '+sttr+' fid="'+d.fileid+'">';
 			}
-		}else if(d.fileext=='amr'){
-			s+='<i class="icon-volume-up"></i> '+(parseInt(d.filesize/1000))+'"';
-			s+='&nbsp;<a href="javascript:;" style="font-size:12px" onclick="js.fileopt('+d.fileid+',1)">下载</a>';
+		}else if(d.filename.indexOf('rockyuyin')==0 && d.fileext=='mp3'){ 
+			var miao= this.getmiao(d.filename);
+			if(!miao)miao = parseInt(d.filesize/1500);
+			s+='<div class="cursor" onclick="strformat.playmp3(\''+d.filepath+'\',0)"><i class="icon-volume-up"></i> '+miao+'"</div>';
 		}else{
 			slx = d.fileext;if(!lj)lj='';
 			if(js.fileall.indexOf(','+slx+',')<0)slx='wz';
-			//s=''+d.filename+'<br><a href="javascript:;" onclick="js.fileopt('+d.fileid+',1)">下载</a>&nbsp;&nbsp;<a href="javascript:;" onclick="js.fileopt('+d.fileid+',0)">预览</a>&nbsp;'+d.filesizecn+'';
 			s='<table><tr><td><div class="qipaofile">'+d.fileext.toUpperCase()+'</div></td><td>'+d.filename+'<br><span style="font-size:12px;color:#888888">('+d.filesizecn+')&nbsp;&nbsp;<a href="javascript:;" onclick="strformat.clickfile(\''+d.fileid+'\',1)">下载</a>&nbsp;&nbsp;<a href="javascript:;" onclick="strformat.clickfile(\''+d.fileid+'\',0)">预览</a></span></td></tr></table>';
 		}
 		return s;
@@ -284,6 +284,17 @@ var strformat = {
 	},
 	clickimg:function(){
 		
+	},
+	getmiao:function(name){
+		var arr = name.split('_')
+		if (!arr[1])return 0;
+		arr =  arr[1].split('.')
+		return arr[0];
+	},
+	playmp3:function(path){
+		js.tanbody('play','播放', 300, 50, {
+			html:'<div style="padding:10px"><video src="'+path+'?'+js.getrand()+'" width="100%" height="60" controls autoplay></video></div>'
+		});
 	}
 }
 strformat.init();

+ 1 - 1
web/res/mode/menu/jquery-rockmenu.js

@@ -75,7 +75,7 @@ var rockmenuobj	= null;
 			oac.find('li').mouseout(function(){this.className='';});
 			oac.find('li').click(function(){me.itemsclick(this);});
 			if(can.width!=0){
-				$('#rockmenuli_'+rand+'').css('width',''+can.width+'px');
+				oac.css('width',''+can.width+'px');
 			};
 			js.addbody(rand, 'remove', 'rockmenu_'+rand+''); 
 			this.mdivobj = oac;

+ 54 - 4
webmain/css/cssm.css

@@ -23,6 +23,8 @@ td,button{ font-size:var(--font-size)}
 a,.cursor{cursor:pointer;}
 p{text-indent:24pt; margin:12px 0px;line-height:25px}
 input,textarea,select,button{resize: none;outline:none;font-size:var(--font-size);}
+input[type=button], input[type=submit], input[type=file], button {-webkit-appearance: none;}
+
 .zhu{ color:#1389D3;color:var(--main-color)}
 .hui{ color:#888888}
 .red{ color:#ff0000}
@@ -59,7 +61,8 @@ ul,li,a{ list-style-type:none}
 .h1{ font-size:24px;font-weight:bold;}
 .h2{ font-size:20px;font-weight:bold;}
 
-.input,.inputs,.textarea{height:34px;line-height:25px;background-color:white;padding:5px;width:94%;border:var(--border);border-radius:5px}
+.input,.inputs,.textarea{height:30px;line-height:25px;background-color:white;padding:5px;width:94%;border:var(--border);border-radius:5px;}
+select.inputs{height:40px}
 
 .inputb{height:34px;line-height:20px;background-color:white;padding:5px;border:var(--border);border-radius:5px}
 .inputb:focus,.inputs:focus,.textarea:focus{border:0.5px var(--main-color) solid;}
@@ -88,9 +91,9 @@ a.btn{padding:5px 8px}
 .tdinput{padding:8px 5px}
 .inborder{border:var(--border);}
 
-a.webbtn:link,a.webbtn:visited,.webbtn{color:#ffffff;opacity:1; background-color:var(--main-color); padding:8px 10px; border:none; cursor:pointer;font-size:var(--font-size)}
+a.webbtn:link,a.webbtn:visited,.webbtn{color:#ffffff;opacity:1; background-color:var(--main-color); padding:8px 10px; border:none; cursor:pointer;font-size:var(--font-size);border-radius:5px}
 .webbtn:disabled{background-color:#aaaaaa; color:#eeeeee}
-.webbtn:hover{box-shadow:0px 0px 5px rgba(0,0,0,0.3);opacity:0.8}
+.webbtn:hover,.webbtn:active{box-shadow:0px 0px 5px rgba(0,0,0,0.3);opacity:0.8}
 .radius5{border-radius:5px;}
 
 .upload_items{border:var(--border);height:60px;overflow:hidden;float:left;margin-top:5px;margin-bottom:5px;margin-right:10px;cursor:pointer;position:relative}
@@ -99,4 +102,51 @@ a.webbtn:link,a.webbtn:visited,.webbtn{color:#ffffff;opacity:1; background-color
 .upload_items_items{padding:5px;text-align:center}
 .upload_items_meng{ background:rgba(0,0,0,0.5);position:absolute;left:0px;top:0px;height:60px;overflow:hidden;line-height:60px;text-align:center;width:100%;color:white}
 
-.list-itemv:active{color:var(--main-color);cursor:pointer}
+.list-itemv:active{color:var(--main-color);cursor:pointer}
+
+
+.btn-group{display: flex;align-items: stretch;}
+.btn-group .btn{float:left}
+.btn-group>.active{box-shadow: inset 0 3px 5px rgba(var(--rgb-r),var(--rgb-g),var(--rgb-b), .125);}
+
+.btn-group :first-child:not(:last-child){
+	border-top-right-radius:0px;
+	border-bottom-right-radius:0px;
+}
+.btn-group :last-child:not(:first-child){
+	border-top-left-radius:0px;
+	border-bottom-left-radius:0px;
+}
+.btn-group :not(:last-child):not(:first-child){
+	border-radius:0px;
+}
+.btn-group :not(:first-child){
+	border-left-width:0px;
+}
+
+.rock-loading {
+  display: inline-block;
+  height:16px;
+  width:16px;
+  vertical-align: middle;
+  -webkit-mask: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='80px' height='80px' viewBox='0 0 80 80' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3Eloading%3C/title%3E%3Cdefs%3E%3ClinearGradient x1='94.0869141%25' y1='0%25' x2='94.0869141%25' y2='90.559082%25' id='linearGradient-1'%3E%3Cstop stop-color='%23606060' stop-opacity='0' offset='0%25'%3E%3C/stop%3E%3Cstop stop-color='%23606060' stop-opacity='0.3' offset='100%25'%3E%3C/stop%3E%3C/linearGradient%3E%3ClinearGradient x1='100%25' y1='8.67370605%25' x2='100%25' y2='90.6286621%25' id='linearGradient-2'%3E%3Cstop stop-color='%23606060' offset='0%25'%3E%3C/stop%3E%3Cstop stop-color='%23606060' stop-opacity='0.3' offset='100%25'%3E%3C/stop%3E%3C/linearGradient%3E%3C/defs%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' opacity='0.9'%3E%3Cg%3E%3Cpath d='M40,0 C62.09139,0 80,17.90861 80,40 C80,62.09139 62.09139,80 40,80 L40,73 C58.2253967,73 73,58.2253967 73,40 C73,21.7746033 58.2253967,7 40,7 L40,0 Z' fill='url(%23linearGradient-1)'%3E%3C/path%3E%3Cpath d='M40,0 L40,7 C21.7746033,7 7,21.7746033 7,40 C7,58.2253967 21.7746033,73 40,73 L40,80 C17.90861,80 0,62.09139 0,40 C0,17.90861 17.90861,0 40,0 Z' fill='url(%23linearGradient-2)'%3E%3C/path%3E%3Ccircle id='Oval' fill='%23606060' cx='40.5' cy='3.5' r='3.5'%3E%3C/circle%3E%3C/g%3E%3CanimateTransform attributeName='transform' begin='0s' dur='1s' type='rotate' values='0 40 40;360 40 40' repeatCount='indefinite'/%3E%3C/g%3E%3C/svg%3E%0A") 0 0 no-repeat;
+  mask-size: cover;
+  -webkit-mask-size: cover;
+  mask-size: cover;
+  background-color: currentColor;
+}
+
+::-webkit-scrollbar{
+  width: 8px;
+  height: 8px;
+  background-color: transparent;
+}
+::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+  background-color: rgba(0, 0, 0, 0.2);
+}
+
+::-webkit-scrollbar-track:hover {
+  background-color: rgba(0, 0, 0, 0.1);
+  border-radius: 5px;
+}

+ 6 - 2
webmain/css/rock.css

@@ -27,7 +27,8 @@ table{border-spacing:0;border-collapse: collapse;}
 button,.cursor,a{cursor:pointer}
 a:link,a:visited{color:var(--main-color);TEXT-DECORATION:none;font-size:var(--font-size)}
 a:hover{TEXT-DECORATION:underline;color:red;}
-input,button,textarea,select{resize:none;outline:none;font-size:var(--font-size)}
+input,button,textarea,select,div{resize:none;outline:none;font-size:var(--font-size);}
+input[type=button], input[type=submit], input[type=file], button {-webkit-appearance: none;}
 
 ::placeholder{color:#999999;}
 .wrap{word-wrap:break-word;word-break:break-all;white-space:normal;}
@@ -237,4 +238,7 @@ textarea.form-control{overflow:auto;padding-top:5px;padding-bottom:5px}
 .select-list .div01{padding:8px 10px;border-bottom:var(--border)}
 .select-list .div01:hover{background-color:rgba(var(--rgb-r), var(--rgb-g), var(--rgb-b), 0.1);}
 .select-list .div02{padding:8px 10px;border-bottom:var(--border);background-color:rgba(var(--rgb-r), var(--rgb-g), var(--rgb-b), 0.1)}
-.list-itemv:hover{color:var(--main-color);cursor:pointer;background-color:rgba(var(--rgb-r), var(--rgb-g), var(--rgb-b), 0.1)}
+.list-itemv:hover{color:var(--main-color);cursor:pointer;background-color:rgba(var(--rgb-r), var(--rgb-g), var(--rgb-b), 0.1)}
+
+.editortools div{width:26px;height:26px;overflow:hidden;margin-left:8px;line-height:26px;border-radius:5px;cursor:pointer;}
+.editortools div:hover{background-color:rgba(0,0,0,0.1);}

+ 15 - 0
webmain/css/rui.css

@@ -183,4 +183,19 @@ a:link,a:visited{TEXT-DECORATION:none;color:var(--main-color)}
   -webkit-mask-size: cover;
   mask-size: cover;
   background-color: currentColor;
+}
+
+::-webkit-scrollbar{
+  width: 8px;
+  height: 8px;
+  background-color: transparent;
+}
+::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+  background-color: rgba(0, 0, 0, 0.2);
+}
+
+::-webkit-scrollbar-track:hover {
+  background-color: rgba(0, 0, 0, 0.1);
+  border-radius: 5px;
 }

+ 39 - 16
webmain/flow/input/inputAction.php

@@ -4,7 +4,7 @@ class inputAction extends Action
 	public $mid = 0;
 	public $flow;
 	public $rs 	= array();
-	public $gongsiarr,$actclss,$fieldarrall,$inputobj,$subfielsa,$checkobj,$mdb;
+	public $gongsiarr,$actclss,$fieldarrall,$inputobj,$subfielsa,$checkobj,$mdb,$mallfields;
 	
 	public function initAction()
 	{
@@ -70,8 +70,8 @@ class inputAction extends Action
 		if(!$fieldsarr)$this->backmsg('没有录入元素');
 		
 		$db	   = m($table);$subna = '提交';$addbo = false;$where = "`id`='$id'"; $oldrs = false;
-		$this->mdb = $db;
-		
+		$this->mdb  = $db;
+		$filelx		= (int)arrvalue($this->moders,'filelx','0');
 		if($id==0){
 			$where = '';
 			$addbo = true;
@@ -140,6 +140,7 @@ class inputAction extends Action
 		
 		//默认字段保存
 		$allfields = $this->db->getallfields('[Q]'.$table.'');
+		$this->mallfields = $allfields;
 		if(in_array('optdt', $allfields))$uaarr['optdt'] = $this->now;
 		if(in_array('optid', $allfields))$uaarr['optid'] = $this->adminid;
 		if(in_array('optname', $allfields))$uaarr['optname'] = $this->adminname;
@@ -185,6 +186,8 @@ class inputAction extends Action
 			if(isset($uaarr[$rs['fields']]))$ss = $this->flow->savedatastr($uaarr[$rs['fields']], $rs, $uaarr);
 			if($ss!='')$this->backmsg($ss);
 		}
+		$fileid	= $this->post('fileid');
+		if($filelx==1 && isempt($fileid))$this->backmsg('必须添加“相关文件”');
 		
 		//判断保存前的
 		$ss 	= '';
@@ -243,7 +246,8 @@ class inputAction extends Action
 		
 		if($id==0)$id = $this->db->insert_id();
 		$fobj = m('file');
-		$fobj->addfile($this->post('fileid'), $table, $id, $modenum);
+		
+		$fobj->addfile($fileid, $table, $id, $modenum);
 		if($this->otherfileid!=''){
 			$ofid1 = substr($this->otherfileid,1);
 			$fobj->addxuan($ofid1,$this->post('sxuanfileid'),''.$modenum.'|'.$id.'');
@@ -366,8 +370,16 @@ class inputAction extends Action
 		$len 		= count($data);
 		$idss		= '0';
 		$whes 		= '';
-
-		$allfields 	= $this->db->getallfields('[Q]'.$tables.'');
+		$allfields 	= array();
+		$ischuli	= false;
+		
+		$allfielda  = $this->db->gettablefields('[Q]'.$tables.'');
+		foreach($allfielda as $k1=>$rs1){
+			$allfields[] = $rs1['name'];
+			if($rs1['name']=='mid' && contain($rs1['types'],'int(11)'))$ischuli = true;
+		}
+		
+		//$allfields 	= $this->db->getallfields('[Q]'.$tables.'');
 		$oarray 	= array();
 		if(in_array('optdt', $allfields))$oarray['optdt'] 		= $this->now;
 		if(in_array('optid', $allfields))$oarray['optid'] 		= $this->adminid;
@@ -382,6 +394,12 @@ class inputAction extends Action
 		
 		if(in_array('comid', $allfields))$oarray['comid'] 		= $this->companyid;
 		
+		if(!$ischuli){
+			$usql = 'alter table `[Q]'.$tables.'` MODIFY `mid` int(11) DEFAULT 0 COMMENT \'对应主表'.$this->flow->mtable.'.id\';';
+			$this->db->query($usql, false);
+		}
+		
+		
 		if($data)foreach($data as $k=>$uaarr){
 			$sid 			= $uaarr['id'];
 			$where			= "`id`='$sid'";
@@ -571,6 +589,8 @@ class inputAction extends Action
 		
 		if($content=='')exit('未设置录入页面,请到[流程模块→表单元素管理]下设置');
 		
+		$filelx			= (int)arrvalue($moders,'filelx','0');
+		
 		$content		= $this->flow->flowinputtpl($content, $this->ismobile);
 		
 		$this->actclss	= $this;
@@ -593,13 +613,14 @@ class inputAction extends Action
 		$this->inputobj->flow 		= $this->flow;
 		$this->inputobj->mid 		= $this->mid;
 		$this->inputobj->initUser($this->adminid);
+		$redfont 	= '<font color=red>*</font>';
 		
-		$chufarr= array();
+		$chufarr	= array();
 		if(method_exists($this->flow, 'flowxiangfields'))$chufarr = $this->flow->flowxiangfields($chufarr);
 		$this->fieldarrall['base_sericnum'] = array('name'=>arrvalue($chufarr,'base_sericnum','单号'));
 		$this->fieldarrall['base_name'] 	= array('name'=>arrvalue($chufarr,'base_name','申请人'));
 		$this->fieldarrall['base_deptname'] = array('name'=>arrvalue($chufarr,'base_deptname','申请人部门'));
-		$this->fieldarrall['file_content']  = array('name'=>arrvalue($chufarr,'file_content','相关文件'));
+		$this->fieldarrall['file_content']  = array('name'=>arrvalue($chufarr,'file_content',''.(($filelx==1)? $redfont:'').'相关文件'));
 		
 		preg_match_all('/\{(.*?)\}/', $content, $list);
 		foreach($list[1] as $k=>$nrs){
@@ -608,7 +629,7 @@ class inputAction extends Action
 		}
 		$this->subfielsa = array();
 		$content 	 	= $this->pisubduolie($content, $modeid, $nameaas);//多列子表匹配的是[]
-		$content		= str_replace('*','<font color=red>*</font>', $content);
+		$content		= str_replace('*',$redfont, $content);
 		
 		//替换字段名^^
 		preg_match_all('/\^(.*?)\^/', $content, $list);
@@ -674,6 +695,7 @@ class inputAction extends Action
 		$this->smartydata['zbnamearr']	= $nameaas;
 		$this->smartydata['zbshu']		= $zbshu;//子表数
 		$this->smartydata['isupfile']	= $isupfile;//是否有上传
+		$this->smartydata['isupfiles']	= $this->fieldarrall['file_content']['name'];
 		$this->assign('inputobj', c('input'));
 		
 		
@@ -762,11 +784,12 @@ class inputAction extends Action
 		$rows 	= array();
 		$act	= $this->get('act');
 		$modenum= $this->get('sysmodenum');
-		$actstr = $this->get('actstr');
+		$actstr = $this->jm->base64decode($this->get('actstr'));
+		$acta 	= explode(',', $actstr);
+		$where  = arrvalue($acta, 2);
 		if(isempt($act)){
 			if($actstr){
-				$actstr1 = $this->jm->base64decode($actstr);
-				$rows 	 = c('input')->sqlstore($actstr1);
+				$rows 	 = c('input')->sqlstore($actstr);
 			}
 			return $rows;
 		}
@@ -776,23 +799,23 @@ class inputAction extends Action
 			$objs = m($acta[0]);
 			$tacs = $acta[1];
 			if(method_exists($objs, $tacs)){
-				$rows = $objs->$tacs();
+				$rows = $objs->$tacs($where);
 			}
 		}
 		
 		if(!$rows && !isempt($act) && method_exists($this, $act)){
-			$rows = $this->$act();
+			$rows = $this->$act($where);
 		}
 		//从Model上读取
 		if(!$rows && !isempt($modenum)){
 			$this->flow = m('flow')->initflow($modenum);
 			if(method_exists($this->flow, $act)){
-				$rows = $this->flow->$act();
+				$rows = $this->flow->$act($where);
 			}
 		}
 		//从数据选项读取
 		if(!$rows && $actstr){
-			$acta = explode(',', $this->jm->base64decode($actstr));
+			$acta = explode(',', $actstr);
 			if(count($acta)<=3){
 				$sarr = m('option')->getmnum($acta[0]);
 				if($sarr){

+ 35 - 67
webmain/flow/input/inputjs/input_two.js

@@ -146,7 +146,7 @@ var inputtwo={
 		this.initupssa[sna]=$.rockupload({
 			'inputfile':'filed_'+sna+'_inp',
 			'initremove':false,'uptype':uptp,'formming':sna,
-			'urlparams':{'sysmodenum':modenum,'sysmid':mid},
+			'urlparams':{'sysmodenum':modenum,'sysmid':mid,'sysuptype':tsye},
 			'oparams':{sname:sna,snape:tsye},
 			'onsuccess':function(f,gstr){
 				var sna= f.sname,tsye=f.snape,d=js.decode(gstr);
@@ -313,9 +313,24 @@ var inputtwo={
 	},
 	
 	//2020-09-02新增地图上选择位置
+	selectlocation:function(sna,snall,iszb){
+		js.msg('wait','定位中...');
+		this.selectmapdata={sna:sna,snall:snall};
+		js.importjs('js/dingwei.js?'+js.getrand()+'', function(){
+			js.dw.dwsuccess = function(ret){
+				this.clearchao();
+				c.selectmapdata.lat=ret.latitude;
+				c.selectmapdata.lng=ret.longitude;
+				c.selectmapdata.zoom=12;
+				c.geocoder(ret.latitude,ret.longitude,ret.accuracy);
+			}
+			js.dw.init();
+			js.dw.start();
+		});
+	},
 	selectmap:function(sna,snall,fna,iszb){
 		var hei = winHb()-150;
-		var url = 'https://map.qq.com/api/js?v=2.exp&key=55QBZ-JGYLO-BALWX-SZE4H-5SV5K-JCFV7&callback=c.showmap';
+		var url = 'https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&callback=c.showmap';
 		js.tanbody('selectmap','选择['+fna+']',winWb()-((ismobile==1)?5:80),hei,{
 			html:'<div style="padding:5px"><input onkeyup="if(event.keyCode==13)c.selectmapsou(this)" type="text" placeholder="请输入格式(地址 城市)如:鼓浪屿 厦门" class="inputs"></div><div id="selectmap" style="height:'+(hei-20)+'px;overflow:hidden"></div>',
 			btn:[{text:'确定'}]
@@ -378,18 +393,18 @@ var inputtwo={
 		this.selectmapdata.lat=x;
 		this.selectmapdata.lng=y;
 		this.selectmapdata.zoom=zoom;
-		js.msg('wait','确定搜索地址...');
 		this.geocoder(x,y);
 	},
 	//搜索位置
 	geocoder:function(lat,lng, jid){
+		js.msg('wait','确定搜索地址...');
 		js.ajax('api.php?m=kaoqin&a=gcoder',{lat:lat,lng:lng},function(ret){
 			js.msg();
 			if(ret.status==0){
 				var result = ret.result;
-				var address= result.formatted_addresses.recommend;
 				var d1 = c.selectmapdata;
-				d1.address = address;
+				d1.address = result.address;
+				if(!result.address_component)result.address_component={province:'',city:'未知',district:'',street_number:'',street:''}
 				var info = result.address_component;
 				d1.addressinfo = {
 					province:info.province,
@@ -398,7 +413,6 @@ var inputtwo={
 					streetNumber:info.street_number,
 					street:info.street
 				};
-				js.msg();
 				var sna = d1.sna;
 				if(form(sna))form(sna).value=d1.address+'|'+d1.lat+','+d1.lng+'';
 				var sna1 = d1.snall;
@@ -450,68 +464,22 @@ var inputtwo={
 		if(lx==1)obj.imports();
 		if(lx==2)obj.clear();
 	},
-	//自动完成2022-10-30添加
-	autocompletearr:{},
+	
+	
+	//自动完成2024-11-20添加
 	autocomplete:function(o1,s1,id1,zb){
-		clearTimeout(this.autoctime);
-		this.autocompletea=[o1,s1,id1,zb];
-		if(this.nowinpvle == o1.value && get('completelist'))return;
-		if(this.autocompletearr[id1]){
-			this.autoctime = setTimeout(function(){c.autocompleteshow(o1,c.autocompletearr[id1]);},10);
-			return;
-		}
-		var a1 = s1.split(',');
+		var a1 	= s1.split(',');
 		var gcan = {'act':a1[0],'actstr':jm.base64encode(s1),'acttyle':'act','sysmodenum':modenum,'sysmid':mid};
-		js.ajax(geturlact('getselectdata', gcan),{key:jm.base64encode(o1.value)}, function(ret){
-			c.autocompletearr[id1] = ret;
-			c.autocompleteshow(o1,ret);
-		},'get,json')
-	},
-	autocompleteshow:function(o1,da){
-		if(!da || da.length==0)return;
-		var o2 = $(o1),lefta=o2.offset(),i,len=da.length,ds=[],zl=10,j=0;
-		$('#completelist').remove();
-		var str= '<div id="completelist" style="position:absolute;z-index:9;left:'+lefta.left+'px;top:'+(lefta.top+29)+'px;background:white;border:1px var(--main-color) solid;border-radius:5px;box-shadow: 0px 0px 5px rgb(0,0,0,0.3)"></div>';
-		var val= strreplace(o1.value);
-		if(val){
-			for(i=0;i<len;i++)if(da[i].name.indexOf(val)>-1 || (da[i].subname && da[i].subname.indexOf(val)>-1)){
-				ds.push(da[i]);j++;if(j>=zl*3)break;
-			}
-		}else{
-			ds=da;
-		}
-		this.autodata = ds;
-		this.nowinpvle= o1.value;
-		$('body').append(str);
-		this.autocompleteshows(zl,1)
-		js.addbody('completelist', 'remove','completelist');
-	},
-	autocompleteshows:function(zl,p){
-		var ds = this.autodata;
-		var str='',i,len=ds.length,j=0;
-		for(i=(p-1)*zl;i<len;i++){
-			str+='<div class="list-itemv" onclick="c.autocompleteclick('+i+')" value="'+i+'" style="padding:5px 10px">'+ds[i].name+'';
-			if(ds[i].subname)str+='&nbsp;<span style="font-size:12px">('+ds[i].subname+')</span>';
-			str+='</div>';
-			j++;
-			if(j>=zl)break;
-		}
-		if(len>zl){
-			str+='<div style="padding:5px 10px;background:rgba(0,0,0,0.1)">总记录'+len+'条';
-			if(p>1)str+='&nbsp;<a href="javascript:;" class="zhu" onclick="c.autocompleteshows(\''+zl+'\','+(p-1)+')">&lt;上页</a>';
-			if(j==zl)str+='&nbsp;<a href="javascript:;" class="zhu" onclick="c.autocompleteshows(\''+zl+'\','+(p+1)+')">下页&gt;</a>';
-			str+='</div>';
-		}
-		setTimeout(function(){$('#completelist').html(str)},10);
-	},
-	autocompleteclick:function(i){
-		var d = this.autodata[i],o1=this.autocompletea[0];
-		o1.value=d.name;
-		var a1 = this.autocompletea[1].split(',');
-		if(a1[1]){
-			if(form(a1[1]))form(a1[1]).value = d.value;
-		}
-		this.onselectdataall(o1.name,d);
-		$('#completelist').remove();
+		var url = geturlact('getselectdata', gcan);
+		js.chajian('rockselect', {
+			viewobj:o1,num:o1.name,limit:10,url:url,zb:zb,strsss:s1,
+			onitemclick:function(sna,val, d){
+				var fid= this.nameobj.name;
+				var a1 = this.strsss.split(',');
+				if(a1[1])if(form(a1[1]))form(a1[1]).value = val
+				c.onselectdataall(fid,d);
+			},
+			nameobj:o1
+		});
 	}
 }

+ 5 - 3
webmain/flow/input/inputjs/mode_customer.js

@@ -13,7 +13,9 @@ c.onselectmap=function(sna,res){
 	var info = res.addressinfo;
 	if(form('sheng'))form('sheng').value = info.province;
 	if(form('shi'))form('shi').value = info.city;
-	var dz = info.town;
-	dz+=(info.streetNumber)?info.streetNumber:info.street;
-	form(sna).value=dz;
+	if(!res.address){
+		var dz = info.town;
+		dz+=(info.streetNumber)?info.streetNumber:info.street;
+		form(sna).value=dz;
+	}
 }

+ 1 - 1
webmain/flow/input/mode_flowelementAction.php

@@ -87,7 +87,7 @@ class mode_flowelementClassAction extends inputAction{
 		
 		return array(
 			'rows' 		=> $rows,
-			'modearr' 	=> m('mode')->getmodearr(),
+			//'modearr' 	=> m('mode')->getmodearr(),
 			'mkrs' => $mkrs,
 		);
 	}

+ 1 - 0
webmain/flow/input/mode_flowmenuAction.php

@@ -17,6 +17,7 @@ class mode_flowmenuClassAction extends inputAction{
 	public $alldata = array();
 	protected function storeafter($table, $rows)
 	{
+		$this->db->update('[Q]menu', '`status`=1' , '`id` in(1,2) and `status`=0');//总有一些人把系统菜单给停用了
 		$pid = (int)$this->post('pid','0');
 		if($pid>0){
 			$this->showgetmenu($rows,0,1,1);

+ 3 - 0
webmain/flow/input/mode_flowsetAction.php

@@ -6,6 +6,9 @@ class mode_flowsetClassAction extends inputAction{
 	
 	public $pobj;
 	protected function savebefore($table, $arr, $id, $addbo){
+		if(!in_array('filelx', $this->mallfields)){
+			$this->db->addFields('[Q]'.$table.'','filelx','tinyint(1)','0','录入页相应文件0选上传,1必须上传');
+		}
 		include_once('webmain/main/flow/flowAction.php');
 		$this->pobj = new flowClassAction();
 		return $this->pobj->flowsetsavebefore($table, $arr);

+ 5 - 0
webmain/flow/input/mode_goodsAction.php

@@ -14,5 +14,10 @@ class mode_goodsClassAction extends inputAction{
 	}
 	
 	
+	public function reloadstockAjax()
+	{
+		m('goods')->setstock();
+		return 'ok';
+	}
 }	
 			

+ 12 - 8
webmain/flow/input/tpl_input_lu.html

@@ -27,23 +27,27 @@ $maincolors= $colarr['colors'];
 .ys1{padding:5px 5px;color:#666666}
 .ys2{padding:5px 5px;}
 
-.inputs,.textarea{flex:1;width:95%;margin:3px 0px}
+.inputs,.textarea{flex:1;width:95%;margin:3px 0px;width:-webkit-fill-available}
 .cionsss{padding:4px; background-color:#dddddd}
 .datesss{background:url(mode/icons/date.png) no-repeat right;cursor:pointer}
 
 .status{position: absolute;right:5px;top:10px;display:none;width:80px;height:80px;overflow:hidden; border:3px red solid;border-radius:50%;font-size:20px;text-align:center;line-height:80px;color:red;transform:rotate(-45deg);-o-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);filter:progid:DXImagetransform.Microsoft.Matrix(M11=0.707,M12=-0.707,M21=0.707,M22=0.707,SizingMethod='auto expand');}
 
-.tablesub td{height:25px;text-align:center;border:var(--border);}
-.tablesub .inputs,.tablesub .textarea{border:none;background:none;border-radius:0;margin:0;width:100%;padding:0;}
-.tablesub .inputs[readonly]{background-color:rgba(0,0,0,0.1);}
+.tablesub{width:-webkit-fill-available}
+.tablesub td{height:30px;text-align:center;border:var(--border)}
+.tablesub .inputs,.tablesub .textarea{border:none;background:none;border-radius:0;margin:0;width:95%;}
+.tablesub .inputs[readonly]{background-color:rgba(0,0,0,0.05);}
 
 .course{padding:8px; background-color:rgba(<?=$maincolors?>,0.2);border:1px rgba(<?=$maincolors?>,0.3) solid;margin-right:10px;text-align:center;border-radius:5px}
 .coursejt{height:8px;overflow:hidden;width:30px;background-color:rgba(<?=$maincolors?>,0.2)}
 .coursejts{width:0px;  height:0px; overflow:hidden;border-width:8px;border-style:solid;border-color:transparent transparent transparent rgba(<?=$maincolors?>,0.2);}
 .tishi{color:#888888;font-size:12px;padding:3px}
 .ke-icon-crop{background-image: url(mode/icons/crop.png);width: 16px;height: 16px;}
-.xuhao{text-align:center;}
-.xuhao[readonly]{background:none}
+.tablesub .xuhao{text-align:center;width:100%;padding:0;min-width:35px}
+.tablesub .xuhao[readonly]{background:none}
+.tablesub tr:first-child{background:var(--main-vgcolor)}
+.zbtitle{}
+.addys{}
 </style>
 </head>
 <body>
@@ -93,8 +97,8 @@ $maincolors= $colarr['colors'];
 						$firstrs['isbt'] = 1;
 					}
 					$stsp.= ''.$firstrs['name'].':</td>';
-					$stsp.= '<td width="100%"><input  class="inputs" style="width:99%" id="sysnextchange" value="'.$firstrs['sysnextopt'].'" placeholder="'.$placeholder.'" readonly type="text" name="sysnextopt"><input name="sysnextoptid" value="'.$firstrs['sysnextoptid'].'" id="sysnextchange_id" type="hidden"><input name="sysnextcustidid" value="'.$firstrs['id'].'" type="hidden"></td>';
-					$stsp.= '<td nowrap><a href="javascript:;" onclick="js.changeclear(\'sysnextchange\')" class="webbtn">×</a><a href="javascript:;" id="btnchange_recename" onclick="js.changeuser(\'sysnextchange\',\'changeusercheck\',\'选择'.$firstrs['name'].'\',{changerange:\''.$firstrs['checktypeid'].'\'})" class="webbtn">选择</a></td>';
+					$stsp.= '<td width="100%"><div class="btn-group"><input  class="inputs" style="width:99%" id="sysnextchange" value="'.$firstrs['sysnextopt'].'" placeholder="'.$placeholder.'" readonly type="text" name="sysnextopt"><input name="sysnextoptid" value="'.$firstrs['sysnextoptid'].'" id="sysnextchange_id" type="hidden"><input name="sysnextcustidid" value="'.$firstrs['id'].'" type="hidden">';
+					$stsp.= '<button type="button" onclick="js.changeclear(\'sysnextchange\')" class="webbtn">×</button><button type="button" id="btnchange_recename" onclick="js.changeuser(\'sysnextchange\',\'changeusercheck\',\'选择'.$firstrs['name'].'\',{changerange:\''.$firstrs['checktypeid'].'\'})" class="webbtn">选择</button></div></td>';
 					$stsp.= '</tr></table></div>';
 					echo $stsp;
 				}

+ 11 - 9
webmain/flow/input/tpl_input_lum.html

@@ -7,7 +7,7 @@
 <meta name="apple-mobile-web-app-status-bar-style" content="yes" />
 <title><?=$da['title']?></title>
 <link rel="shortcut icon" href="favicon.ico" />
-<link rel="stylesheet" type="text/css" href="<?=$da['p']?>/css/cssm.css">
+<link rel="stylesheet" type="text/css" href="<?=$da['p']?>/css/cssm.css?<?=$nowtime?>">
 <link rel="stylesheet" type="text/css" href="mode/plugin/css/jquery-rockdatepicker.css"/>
 <script type="text/javascript" src="js/jquery.js"></script>
 <script type="text/javascript" src="js/js.js?<?=$nowtime?>"></script>
@@ -62,13 +62,13 @@ function initApp(){
 <?php
 $maincolora= c('image')->colorTorgb($maincolor);
 $maincolors= ''.$maincolora[0].','.$maincolora[1].','.$maincolora[2].'';
-echo 'body{--main-color:'.$maincolor.';}';
+echo 'body{--main-color:'.$maincolor.';--font-size:16px;}';
 ?>
 .datesss{background:url(mode/icons/date.png) no-repeat right;cursor:pointer}
 input,textarea,select,*,td, button{font-size:16px}
 .lurim{text-align:right;padding-left:5px}
 .tablesub td{height:25px;text-align:left;border:0px #888888 solid;}
-.tablesub .inputs{width:100%}
+.tablesub .inputs{width:-webkit-fill-available}
 
 .status{position: absolute;right:15px;top:2px;display:none;width:70px;height:70px;overflow:hidden; border:2px red solid;border-radius:50%;font-size:16px;text-align:center;line-height:70px;color:red;transform:rotate(-45deg);-o-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg)}
 
@@ -78,15 +78,17 @@ input,textarea,select,*,td, button{font-size:16px}
 .btn:hover{opacity:1;color:#ffffff}
 .lumtr{background-color:white}
 .tablelum{}
-.inputs{border-bottom:0.5px #cccccc solid;border-top:0px;border-left:0px;border-right:0px}
-.inputs:focus{border:none;box-shadow:none;border-bottom:0.5px <?=$maincolor?> solid;}
+.inputs1{border-bottom:0.5px #cccccc solid;border-top:0px;border-left:0px;border-right:0px}
+.inputs1:focus{border:none;box-shadow:none;border-bottom:0.5px <?=$maincolor?> solid;}
+
 
 .divzb0{display:inline-block;width:100%;margin:5px 0px}
 .divzb1{float:left;width:25%;overflow:auto;text-align:right;line-height:20px;margin-top:8px}
 .divzb2{float:left;width:73%}
-.xuhao{border:none;font-size:12px;text-align:left;color:#888888}
+.xuhao{border:none;font-size:12px;text-align:left;color:#888888;padding:0;margin:0;margin-left:2px;padding-top:2px}
 .xuhao:focus{border:none;}
 .xuantitle{text-align:left;font-size:12px;padding-left:8px;line-height:30px;margin-top:10px;color:#888888;}
+.divinput .btn-group{width:98%}
 </style>
 </head>
 
@@ -116,7 +118,7 @@ if($showheader==1)echo '<div id="header_title" style="padding-top:'.$cenghei.'px
 		if($da['isupfile']==1){
 		?>
 		<tr class="lumtr">
-		<td class="lurim" nowrap>相关文件</td>
+		<td class="lurim" nowrap><?=$da['isupfiles']?></td>
 		<td><div class="divinput">
 			<input name="fileid" id="fileidview-inputEl" type="hidden">
 			<div id="view_fileidview" style="height:auto;min-height:60px" class="inputs"></div>
@@ -156,8 +158,8 @@ if($showheader==1)echo '<div id="header_title" style="padding-top:'.$cenghei.'px
 					$firstrs['isbt'] = 1;
 				}
 				$stsp.= ''.$firstrs['name'].':</td>';
-				$stsp.= '<td><div class="divinput"><table width="98%" cellpadding="0" border="0"><tr><td width="100%"><input  class="inputs" style="width:99%" id="sysnextchange" value="'.$firstrs['sysnextopt'].'" placeholder="'.$placeholder.'" readonly type="text" name="sysnextopt"><input name="sysnextoptid" value="'.$firstrs['sysnextoptid'].'" id="sysnextchange_id" type="hidden"><input name="sysnextcustidid" value="'.$firstrs['id'].'" type="hidden"></td>';
-				$stsp.= '<td nowrap><a href="javascript:;" onclick="js.changeclear(\'sysnextchange\')" class="webbtn">×</a><a href="javascript:;" id="btnchange_recename" onclick="js.changeuser(\'sysnextchange\',\'changeusercheck\',\'\',{changerange:\''.$firstrs['checktypeid'].'\'})" class="webbtn">选择</a></td></tr></table></div></td>';
+				$stsp.= '<td><div class="divinput"><table width="98%" cellpadding="0" border="0"><tr><td width="100%"><div class="btn-group"><input class="inputs" style="flex:1" id="sysnextchange" value="'.$firstrs['sysnextopt'].'" placeholder="'.$placeholder.'" readonly type="text" name="sysnextopt"><input name="sysnextoptid" value="'.$firstrs['sysnextoptid'].'" id="sysnextchange_id" type="hidden"><input name="sysnextcustidid" value="'.$firstrs['id'].'" type="hidden">';
+				$stsp.= '<button type="button" onclick="js.changeclear(\'sysnextchange\')" class="webbtn">×</button><button type="button" id="btnchange_recename" onclick="js.changeuser(\'sysnextchange\',\'changeusercheck\',\'\',{changerange:\''.$firstrs['checktypeid'].'\'})" class="webbtn">选择</button></div></td></tr></table></div></td>';
 				$stsp.= '</tr>';
 				echo $stsp;
 			}

+ 1 - 1
webmain/flow/page/input_caigou.html

@@ -1 +1 @@
-<table width="100%" bordercolor="#000000" border="0" class="ke-zeroborder"><tbody><tr><td height="34" width="15%" align="right" class="ys1">*申请日期</td><td class="ys2" width="35%">{applydt}{type}</td><td align="right" class="ys1" width="15%">*供应商</td><td class="ys2" width="35%">{custname}{custid}</td></tr><tr><td class="ys2" style="background-color:#CCCCCC;" colspan="4"><strong>采购物品</strong> </td></tr><tr><td class="ys0" colspan="4"><table class="tablesub ke-zeroborder" id="tablesub0" style="width:100%;" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td width="10%">序号</td><td>*物品</td><td>*采购数量</td><td>单位</td><td>单价</td><td width="5%">操作</td></tr><tr><td>[xuhao0,0]</td><td>[temp_aid0,0][aid0,0]</td><td>[count0,0]</td><td>[unit0,0]</td><td>[price0,0]</td><td>{删,0}</td></tr></tbody></table><div style="background-color:#F1F1F1;">{新增,0}</div></td></tr><tr><td height="34" align="right" class="ys1">优惠价格</td><td class="ys2">{discount}</td><td class="ys1" align="right">*采购金额</td><td class="ys2">{money}</td></tr><tr><td height="34" align="right" class="ys1">说明</td><td colspan="3" class="ys2">{explain}</td></tr><tr><td height="34" align="right" class="ys1">相关文件</td><td colspan="3" class="ys2">{file_content}</td></tr><tr><td height="34" align="right" class="ys1">申请人</td><td class="ys2">{base_name}</td><td class="ys1" align="right">申请人部门</td><td class="ys2">{base_deptname}</td></tr></tbody></table>
+<table width="100%" bordercolor="#000000" border="0" class="ke-zeroborder"><tbody><tr><td height="34" width="15%" align="right" class="ys1">*申请日期</td><td class="ys2" width="35%">{applydt}{type}</td><td align="right" class="ys1" width="15%">*供应商</td><td class="ys2" width="35%">{custname}{custid}</td></tr><tr><td class="ys2 zbtitle" colspan="4"><strong>采购物品</strong> </td></tr><tr><td class="ys0" colspan="4"><table class="tablesub ke-zeroborder" id="tablesub0" style="width:100%;" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td width="10%">序号</td><td>*物品</td><td>*采购数量</td><td>单位</td><td>单价</td><td width="5%">操作</td></tr><tr><td>[xuhao0,0]</td><td>[temp_aid0,0][aid0,0]</td><td>[count0,0]</td><td>[unit0,0]</td><td>[price0,0]</td><td>{删,0}</td></tr></tbody></table><div class="addys">{新增,0}</div></td></tr><tr><td height="34" align="right" class="ys1">优惠价格</td><td class="ys2">{discount}</td><td class="ys1" align="right">*采购金额</td><td class="ys2">{money}</td></tr><tr><td height="34" align="right" class="ys1">说明</td><td colspan="3" class="ys2">{explain}</td></tr><tr><td height="34" align="right" class="ys1">相关文件</td><td colspan="3" class="ys2">{file_content}</td></tr><tr><td height="34" align="right" class="ys1">申请人</td><td class="ys2">{base_name}</td><td class="ys1" align="right">申请人部门</td><td class="ys2">{base_deptname}</td></tr></tbody></table>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
webmain/flow/page/input_demo.html


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
webmain/flow/page/input_flowset.html


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
webmain/flow/page/input_gong.html


+ 11 - 17
webmain/flow/page/rock_page_flowelement_script.php

@@ -7,27 +7,17 @@ for(var i=0;i<editarr.length;i++)c.setcolumns(editarr[i],{type:'checkbox'});
 bootparams.fanye = false;
 
 c.initpage=function(){
-	$('#tdleft_{rand}').after('<td ><select style="width:180px;"  class="form-control" id="modeid_{rand}" ></select></td>');
-	$('#modeid_{rand}').change(function(){
-		c.changemodeid(this);
+	$('#tdleft_{rand}').after('<td ><input class="input" click="xuanmode" placeholder="-选择模块-" style="width:180px;background:url(images/xiangyou1.png) no-repeat right" id="modes_{rand}" readonly></td>');
+}
+
+c.xuanmode = function(o1){
+	js.selectmode(o1, get('modes_{rand}'), function(sna,val,d){
+		c.changemodes(val);
 	});
 }
 
+
 c.onloadbefore=function(d){
-	if(d.modearr){
-		var s = '<option value="0">-选择模块-</option>',len=d.modearr.length,i,csd,types='';
-		for(i=0;i<len;i++){
-			csd = d.modearr[i];
-			if(types!=csd.type){
-				if(types!='')s+='</optgroup>';
-				s+='<optgroup label="'+csd.type+'">';
-			}
-			s+='<option value="'+csd.id+'">'+csd.name+'</option>';
-			types = csd.type;
-		}
-		s+='</optgroup>';
-		$('#modeid_{rand}').html(s);
-	}
 	if(d.mkrs)mknum = d.mkrs.num;
 }
 c.changemodeid=function(o1){
@@ -36,6 +26,10 @@ c.changemodeid=function(o1){
 	mkid = val;
 	a.setparams({mkid:mkid},true);
 }
+c.changemodes=function(val){
+	mkid = val;
+	a.setparams({mkid:mkid},true);
+}
 c.xuanmoxbo = function(){
 	if(mkid=='0'){
 		js.msgerror('请先选择模块');

+ 26 - 4
webmain/flow/page/rock_page_flowset_script.php

@@ -71,24 +71,46 @@ c.allcreate=function(){
 	},'get',false,'生成中...');
 }
 
+c.opentixing=function(fid, val){
+	js.ajax(js.getajaxurl('opentixing','flow','main'),{fields:fid,value:val},function(s){
+		js.msg('success', s);
+		a.reload();
+	},'get',false,'处理中...');
+}
+
 $('#btndownbtn_{rand}').rockmenu({
-	width:170,top:35,donghua:false,
+	width:190,top:35,donghua:false,
 	data:[{
 		name:'主表管理',lx:0
-	},{
-		name:'清空此模块数据',lx:2
 	},{
 		name:'同步到单位数据',lx:3
 	},{
 		name:'同步菜单到单位数据',lx:4
+	},{
+		name:'☑全部模块开启PC提醒',lx:5,'fields':'pctx','value':1
+	},{
+		name:'☐全部模块关闭PC提醒',lx:5,'fields':'pctx','value':0
+	},{
+		name:'☑全部模块开启APP提醒',lx:5,'fields':'mctx','value':1
+	},{
+		name:'☐全部模块关闭APP提醒',lx:5,'fields':'mctx','value':0
+	},{
+		name:'☑全部模块开启微信提醒',lx:5,'fields':'wxtx','value':1
+	},{
+		name:'☐全部模块关闭微信提醒',lx:5,'fields':'wxtx','value':0
+	},{
+		name:'☑全部模块开启钉钉提醒',lx:5,'fields':'ddtx','value':1
+	},{
+		name:'☐全部模块关闭钉钉提醒',lx:5,'fields':'ddtx','value':0
 	}],
 	itemsclick:function(d, i){
 		var id = a.changedata.id;
 		if(!id)return;
 		if(d.lx==0)c.biaoge();
-		if(d.lx==2)c.clearalldata(id);
+		//if(d.lx==2)js.alert('已弃用,防止删除数据不可逆的操作');
 		if(d.lx==3)c.tongbudanwu();
 		if(d.lx==4)c.tongbumenu();
+		if(d.lx==5)c.opentixing(d.fields,d.value);
 	}
 });
 

+ 104 - 0
webmain/flow/page/rock_page_goods.php

@@ -0,0 +1,104 @@
+<?php
+/**
+*	模块:goods.物品
+*	说明:自定义区域内可写你想要的代码
+*	来源:流程模块→表单元素管理→[模块.物品]→生成列表页
+*/
+defined('HOST') or die ('not access');
+?>
+<script>
+$(document).ready(function(){
+	{params}
+	var modenum = 'goods',modename='物品',isflow=0,modeid='9',atype = params.atype,pnum=params.pnum,modenames='',listname='Z29vZHM:';
+	if(!atype)atype='';if(!pnum)pnum='';
+	var fieldsarr = [],fieldsselarr= [],chufarr= {"stock":"\u603b\u5e93\u5b58","stock_1":"\u9ed8\u8ba4\u4ed3\u5e93","stock_3":"\u6cc9\u5dde\u4ed3\u5e93","stock_2":"\u4ed3\u5e932"};
+	
+	<?php
+	include_once('webmain/flow/page/rock_page.php');
+	?>
+	
+//[自定义区域start]
+
+if(pnum=='all'){
+	bootparams.checked=true;
+	bootparams.autoLoad=false;
+	bootparams.celleditor=true;
+
+	var shtm = '<table width="100%"><tr valign="top"><td><div style="border:var(--border);width:220px"><div id="optionview_{rand}" style="height:400px;overflow:auto;"></div></div></td><td width="8" nowrap><div style="width:8px;overflow:hidden"></div></td><td width="95%"><div id="viewgoods_{rand}"></div></td></tr></table>';
+	$('#viewgoods_{rand}').after(shtm).remove();
+	c.stable = 'goods';
+	c.optionview = 'optionview_{rand}';
+	c.optionnum = 'goodstype';
+	c.title = '物品分类';
+	c.rand = '{rand}';
+
+	var c = new optionclass(c);
+
+	$('#'+c.optionview+'').css('height',''+(viewheight-130)+'px');
+	$('#tdright_{rand}').prepend(c.getbtnstr('刷新库存','kuncus')+'&nbsp;&nbsp;');
+	$('#tdright_{rand}').prepend(c.getbtnstr('所有物品','allshow')+'&nbsp;&nbsp;');
+	$('#tdright_{rand}').prepend(c.getbtnstr('入库','rukuchu,0')+'&nbsp;&nbsp;');
+	$('#tdright_{rand}').prepend(c.getbtnstr('出库','rukuchu,1')+'&nbsp;&nbsp;');
+	$('#tdright_{rand}').prepend(c.getbtnstr('打印二维码','prinwem,1')+'&nbsp;&nbsp;');
+	$('#tdright_{rand}').prepend('<span id="megss{rand}"></span>&nbsp;&nbsp;');
+	setTimeout(function(){c.mobj=a},5);//延迟设置,不然不能双击分类搜索
+	
+	c.rukuchu=function(o1, lx){
+		var s='物品入库';
+		if(lx==1)s='物品出库';
+		addtabs({num:'rukuchugood'+lx+'',url:'main,goods,churuku,type='+lx+'',icons:'plus',name:s});
+	}
+	
+	c.prinwem=function(){
+		var sid = a.getchecked();
+		if(sid==''){
+			js.msg('msg','没有选中记录');
+			return;
+		}
+		var url = '?a=printewm&m=goods&d=main&sid='+sid+'';
+		window.open(url);
+	}
+}
+
+c.kuncus=function(){
+	js.ajax(publicmodeurl('goods','reloadstock'),{},function(){
+		a.reload();
+	},'get','','刷新中...,刷新完成');
+}
+
+//[自定义区域end]
+	c.initpagebefore();
+	js.initbtn(c);
+	var a = $('#view'+modenum+'_{rand}').bootstable(bootparams);
+	c.init();
+	
+});
+</script>
+<!--SCRIPTend-->
+<!--HTMLstart-->
+<div>
+	<table width="100%">
+	<tr>
+		<td style="padding-right:10px;" id="tdleft_{rand}" nowrap><button id="addbtn_{rand}" class="btn btn-primary" click="clickwin,0" disabled type="button"><i class="icon-plus"></i> <?=lang('新增')?></button></td>
+		
+		<td><select class="form-control" style="width:110px;border-top-right-radius:0;border-bottom-right-radius:0;padding:0 2px" id="fields_{rand}"></select></td>
+		<td><select class="form-control" style="width:60px;border-radius:0px;border-left:0;padding:0 2px" id="like_{rand}"><option value="0"><?=lang('包含')?></option><option value="1"><?=lang('等于')?></option><option value="2"><?=lang('大于')?><?=lang('等于')?></option><option value="3"><?=lang('小于')?><?=lang('等于')?></option><option value="4"><?=lang('不包含')?></option></select></td>
+		<td><select class="form-control" style="width:130px;border-radius:0;border-left:0;display:none;padding:0 5px" id="selkey_{rand}"><option value="">-<?=lang('请选择')?>-</option></select><input class="form-control" style="width:130px;border-radius:0;border-left:0;padding:0 5px" id="keygj_{rand}" placeholder="<?=lang('关键字')?>"><input class="form-control" style="width:130px;border-radius:0;border-left:0;padding:0 5px;display:none;" id="key_{rand}" placeholder="<?=lang('关键字')?>">
+		</td>
+		
+		<td>
+			<div style="white-space:nowrap">
+			<button style="border-right:0;border-radius:0;border-left:0" class="btn btn-default" click="searchbtn" type="button"><?=lang('搜索')?></button><button class="btn btn-default" id="downbtn_{rand}" type="button" style="padding-left:8px;padding-right:8px;border-top-left-radius:0;border-bottom-left-radius:0"><i class="icon-angle-down"></i></button> 
+			</div>
+		</td>
+		<td  width="90%" style="padding-left:10px"><div id="changatype{rand}" class="btn-group"></div></td>
+	
+		<td align="right" id="tdright_{rand}" nowrap>
+			<span style="display:none" id="daoruspan_{rand}"><button class="btn btn-default" click="daoru,1" type="button"><?=lang('导入')?></button>&nbsp;&nbsp;&nbsp;</span><button class="btn btn-default" style="display:none" id="daobtn_{rand}" disabled click="daochu" type="button"><?=lang('导出')?> <i class="icon-angle-down"></i></button> 
+		</td>
+	</tr>
+	</table>
+</div>
+<div class="blank10"></div>
+<div id="viewgoods_{rand}"></div>
+<!--HTMLend-->

+ 5 - 0
webmain/index/indexAction.php

@@ -319,6 +319,11 @@ class indexClassAction extends Action{
 		echo $this->get('abc');
 	}
 	
+	public function testAction()
+	{
+		
+	}
+	
 	public function getxings($str)
 	{
 		if(!isempt($str))$str = substr($str,0,5).'*****'.substr($str,-5);

+ 26 - 0
webmain/index/indexpublic.js

@@ -745,4 +745,30 @@ function pirnttablelist(d,na){
 		d.printrnd = rnd;
 	}
 	window.open('?d=public&m=print&table='+rnd+'&modename='+jm.base64encode(na)+'');
+}
+
+//选择模块
+js.selectmode = function(obj, naobj, fun){
+	this.chajian('rockselect', {
+		viewobj:obj,
+		num:'getmodearr',limit:20,
+		url:js.getajaxurl('getmodearr','flow','main'),
+		onitemclick:function(sna,val,d){fun(sna,val,d)},
+		ondatachuli:function(da){
+			var len=da.length,i,csd,types='',ds=[],dt=[];
+			for(i=0;i<len;i++){
+				csd = da[i];
+				if(types!=csd.type){
+					ds.push({name:csd.type,style:'font-weight:bold',disabled:true});
+					dt.push({name:csd.type,value:csd.type,type:csd.type});
+				}
+				types = csd.type;
+				csd.padding='24';
+				ds.push(csd);
+			}
+			this.setSelectData(dt,'所有分类', 'type');
+			return ds;
+		},
+		nameobj:naobj
+	});
 }

+ 6 - 2
webmain/index/indexscript.js

@@ -153,9 +153,10 @@ function showmenula(a){
 		s+='</div>';
 		if(o.stotal>0){
 			child = o.children;
+			s+='<div downmenu="'+i+'_0" style="display:none;background:rgba(var(--rgb-r),var(--rgb-g),var(--rgb-b),0.05)">'
 			for(j=0; j<child.length; j++){
 				o = child[j];
-				s+='<div downmenu="'+i+'_'+j+'" class="hover" style="'+css1+';padding-left:30px;background:rgba(0,0,0,0.05);background:rgba(var(--rgb-r),var(--rgb-g),var(--rgb-b),0.05);display:none" id="menu_list_'+o.num+'" onClick="clickmenu(this,'+i+','+j+',-1)"><i class="icon-'+o.icons+'"></i> '+o.name+'';
+				s+='<div class="hover" style="'+css1+';padding-left:30px;" id="menu_list_'+o.num+'" onClick="clickmenu(this,'+i+','+j+',-1)"><i class="icon-'+o.icons+'"></i> '+o.name+'';
 				if(o.bh){
 					hongbadge[o.bh]=a[i].num;
 					s+=' <span class="badge" badge="'+o.bh+'" style="float:none;display:none;background:red;color:white"></span>';
@@ -164,12 +165,15 @@ function showmenula(a){
 				s+='</div>';
 				if(o.stotal>0){
 					hhild = o.children;
+					s+='<div downmenu="'+i+'_'+j+'_0" style="display:none;background:rgba(var(--rgb-r),var(--rgb-g),var(--rgb-b),0.02)">'
 					for(k=0; k<hhild.length; k++){
 						o = hhild[k];
-						s+='<div downmenu="'+i+'_'+j+'_'+k+'" class="hover" style="'+css1+';padding-left:60px;background:rgba(0,0,0,0.02);background:rgba(var(--rgb-r),var(--rgb-g),var(--rgb-b),0.02);display:none" id="menu_list_'+o.num+'" onClick="clickmenu(this,'+i+','+j+','+k+')"><i class="icon-'+o.icons+'"></i> '+o.name+'</div>';
+						s+='<div class="hover" style="'+css1+';padding-left:60px;" id="menu_list_'+o.num+'" onClick="clickmenu(this,'+i+','+j+','+k+')"><i class="icon-'+o.icons+'"></i> '+o.name+'</div>';
 					}
+					s+='</div>';
 				}	
 			}
+			s+='</div>';
 		}
 	}
 	if(s=='')s='<div style="padding:30px;color:#cccccc" align="center">暂无</div>';

+ 1 - 1
webmain/index/tpl_index.html

@@ -12,7 +12,7 @@
 <script type="text/javascript" src="js/js.js?<?=$nowtime?>"></script>
 <script type="text/javascript" src="js/worker.js"></script>
 <script type="text/javascript" src="js/base64-min.js"></script>
-<script type="text/javascript" src="<?=$da['p']?>/<?=$da['d']?><?=$da['m']?>/<?=$da['m']?>public.js"></script>
+<script type="text/javascript" src="<?=$da['p']?>/<?=$da['d']?><?=$da['m']?>/<?=$da['m']?>public.js?<?=$nowtime?>"></script>
 <script type="text/javascript" src="<?=$da['p']?>/<?=$da['d']?><?=$da['m']?>/<?=$da['m']?>script.js?<?=$nowtime?>"></script>
 <script type="text/javascript" src="web/res/mode/menu/jquery-rockmenu.js"></script>
 <script type="text/javascript">

Разница между файлами не показана из-за своего большого размера
+ 0 - 3415
webmain/install/rockxinhu.sql


+ 1 - 0
webmain/login/loginscript.js

@@ -99,6 +99,7 @@ function loginsubmit(){
 	js.ajax(url,data,function(a){
 		abcpass = '';
 		if(a.success){
+			js.setoption('admintoken', a.token);
 			get('imglogo').src=a.face;
 			js.setoption('loginface', a.face);
 			var burl = js.request('backurl');

+ 13 - 4
webmain/main/flow/flowAction.php

@@ -720,7 +720,7 @@ class mode_'.$modenum.'ClassAction extends inputAction{
 			$tablesn = explode(',', $mrs['names']);
 			foreach($tablesa as $k=>$tab){
 				$str 	= m('input')->getsubtable($modeid, $k+1, 1);
-				$s.='<tr ><td class="ys2" style="background-color:#CCCCCC;" colspan="4"><strong>'.arrvalue($tablesn, $k).'</strong></td></tr>';
+				$s.='<tr ><td class="ys2 zbtitle" colspan="4"><strong>'.arrvalue($tablesn, $k).'</strong></td></tr>';
 				$s.='<tr><td class="ys0" colspan="4">'.$str.'</td></tr>';
 			}
 		}
@@ -808,7 +808,7 @@ class mode_'.$modenum.'ClassAction extends inputAction{
 				$narr['modename'] 	= $this->moders['name'];
 				$narr['table'] 		= $this->moders['table'];
 				$narr['optdt'] 		= arrvalue($rs,'optdt');
-				$nors 	= $flow->flowrsreplace($rs, 2);
+				$nors 	= $flow->rsreplace($rs, 2, null, 1);
 				$narr['summary'] 	= $this->rock->reparr($this->moders['summary'], $nors);
 				$otehsr = '';
 				if($flow->isflow>0){
@@ -911,7 +911,7 @@ class mode_'.$modenum.'ClassAction extends inputAction{
 		$fiesss = substr($fields,0,5);
 		if($fiesss == 'base_' || $fiesss == 'temp_')return;
 		if(!isempt($tables) && $cans['islu']==1){
-			$_fieldsa = $this->db->gettablefields('[Q]'.$tables.'');$allfields = array();
+			$_fieldsa = $this->db->gettablefields('[Q]'.$tables.'');$allfields = array();$this->rock->debugs($_fieldsa,'fields');
 			foreach($_fieldsa as $k2=>$rs2)$allfields[$rs2['name']] =  $rs2;
 			$this->createfields($allfields, $tables, $fields, $type, $lens, $dev, $name);
 			if(substr($type,0,6)=='change' && !isempt($data)){
@@ -1087,7 +1087,7 @@ class mode_'.$modenum.'ClassAction extends inputAction{
 			m('log')->addlog('模块','清空模块['.$name.']的数据');
 		}
 		
-		$this->db->query("alter table `[Q]$table` AUTO_INCREMENT=1");
+		//$this->db->query("alter table `[Q]$table` AUTO_INCREMENT=1");
 		return 'ok';
 	}
 	
@@ -1645,4 +1645,13 @@ return array(
 		}
 		return $arr;
 	}
+	
+	public function opentixingAjax()
+	{
+		$fields = $this->get('fields');
+		if(c('check')->onlynumber($fields))return '错误';
+		$value 	= (int)$this->get('value');
+		m('flow_set')->update("`$fields`='$value'", 'id>0');
+		return '处理成功';
+	}
 }

+ 2 - 2
webmain/main/flow/rock_flow_todoedit.php

@@ -138,11 +138,11 @@ $(document).ready(function(){
 		
 		<tr id="changefields{rand}" style="display:none">
 			<td  align="right" nowrap >变化字段(可多选):<br><font color="#888888">来自[表单元素管理]</font><font color=white>:</font></td>
-			<td class="tdinput"><select multiple name="changefields" size="8" class="form-control"></select></td>
+			<td class="tdinput"><select multiple style="height:100px;overflow:auto" name="changefields" size="8" class="form-control"></select></td>
 		</tr>
 		<tr id="changecourse{rand}" style="display:none">
 			<td  align="right" nowrap >处理的步骤(可多选):<br><font color="#888888">来自[流程审核步骤]</font><font color=white>:</font></td>
-			<td class="tdinput"><select multiple name="changecourse" size="5" class="form-control"></select></td>
+			<td class="tdinput"><select multiple style="height:100px;overflow:auto" name="changecourse" size="5" class="form-control"></select></td>
 		</tr>
 		
 		<tr>

+ 13 - 17
webmain/main/flow/rock_flow_view.php

@@ -46,6 +46,10 @@ $(document).ready(function(){
 			modeid=v;
 			a.setparams({modeid:v},true);
 		},
+		changemodes:function(v){
+			modeid=v;
+			a.setparams({modeid:v},true);
+		},
 		del:function(){
 			a.del({
 				url:js.getajaxurl('delmodeshuju','{mode}','{dir}'),
@@ -59,24 +63,13 @@ $(document).ready(function(){
 		openviewlog:function(id){
 			var d = a.getData(id);
 			addtabs({name:'['+d.id+'.'+d.modename+']操作记录','num':''+d.modenum+''+d.id+'',url:'main,flow,viewlog,modenum='+d.table+',mid='+d.id+''});
+		},
+		xuanmode:function(o1){
+			js.selectmode(o1, get('modes_{rand}'), function(sna,val,d){
+				c.changemodes(val);
+			});
 		}
 	};
-	$('#mode_{rand}').change(c.changemode);
-	$.get(js.getajaxurl('getmodearr','{mode}','{dir}'),function(str){
-		var d=js.decode(str);
-		
-		var s = '<option value="0">-选择模块-</option>',len=d.data.length,i,csd,types='';
-		for(i=0;i<len;i++){
-			csd = d.data[i];
-			if(types!=csd.type){
-				if(types!='')s+='</optgroup>';
-				s+='<optgroup label="'+csd.type+'">';
-			}
-			s+='<option value="'+csd.id+'">'+csd.name+'</option>';
-			types = csd.type;
-		}
-		$('#mode_{rand}').html(s);
-	});
 	js.initbtn(c);
 	openlogs{rand}=function(id){
 		c.openviewlog(id);
@@ -88,7 +81,10 @@ $(document).ready(function(){
 	<table width="100%">
 	<tr>
 	<td align="left">
-		<select style="width:180px" id="mode_{rand}" class="form-control" ><option value="0">-选择模块-</option></select>
+		<div class="btn-group"  style="width:260px;" click="xuanmode">
+		<input class="input" placeholder="-选择模块-" style="flex:1" id="modes_{rand}" readonly>
+		<button class="webbtn webbtn-default">v</button>
+		</div>
 	</td>
 	<td align="left"  style="padding:0px 10px;">
 		

+ 4 - 1
webmain/main/flow/tpl_flow_input.html

@@ -3,7 +3,7 @@
 <head>
 <meta charset="utf-8">
 <title><?=$da['title']?>-<?=TITLE?></title>
-<link rel="stylesheet" href="webmain/css/css.css" />
+<link rel="stylesheet" href="webmain/css/rock.css?<?=time()?>" />
 <link rel="stylesheet" href="mode/kindeditor/themes/default/default.css" />
 <link rel="shortcut icon" href="favicon.ico" />
 <script type="text/javascript" src="js/jquery.js"></script>
@@ -139,6 +139,9 @@ select{font-size:12px}
 #page_left div{text-align:left;padding:5px 10px;cursor:pointer}
 #page_left div:hover{ background-color:#f1f1f1;color:#225DE8}
 </style>
+<?php
+echo c('color')->getApptheme(false);
+?>
 </head>
 <body>
 <div align="center">

+ 4 - 1
webmain/main/flow/tpl_flow_inputzs.html

@@ -3,7 +3,7 @@
 <head>
 <meta charset="utf-8">
 <title><?=$da['title']?>-<?=TITLE?></title>
-<link rel="stylesheet" href="webmain/css/css.css" />
+<link rel="stylesheet" href="webmain/css/rock.css?<?=time()?>" />
 <link rel="stylesheet" href="mode/kindeditor/themes/default/default.css" />
 <link rel="shortcut icon" href="favicon.ico" />
 <script type="text/javascript" src="js/jquery.js"></script>
@@ -115,6 +115,9 @@ select{font-size:12px}
 #page_left div{text-align:left;padding:5px 10px;cursor:pointer}
 #page_left div:hover{ background-color:#f1f1f1;color:#225DE8}
 </style>
+<?php
+echo c('color')->getApptheme(false);
+?>
 </head>
 <body>
 <div align="center">

+ 14 - 1
webmain/main/fwork/fworkAction.php

@@ -283,7 +283,7 @@ class fworkClassAction extends Action
 		if($enddt=='')$enddt = $dtobj->adddate($startdt,'d',7);
 		$jg 		= $dtobj->datediff('d',$startdt, $enddt);
 		if($jg>30)$jg = 30;
-		$flow 		= m('flow:meet');
+		$flow 		= m('flow')->initflow('meet');
 		$data 		= m('meet')->getall("`status`=1 and `type`=0 and `startdt`<='$enddt 23:59:59' and `enddt`>='$startdt' order by `startdt` asc",'hyname,title,startdt,enddt,state,joinname,optname,id');
 		$datss 		= array();
 		foreach($data as $k=>$rs){
@@ -297,8 +297,21 @@ class fworkClassAction extends Action
 		$columns	= $rows;
 		$barr 		= array();
 		$dt 		= $startdt;
+		$gdrows 	= $flow->getall('`type`=1 and `status`=1');
 		for($i=0; $i<=$jg; $i++){
 			if($i>0)$dt = $dtobj->adddate($dt,'d',1);
+			
+			//固定会议
+			if($gdrows && $dt > $this->rock->date){
+				$srows  = $flow->createmeet($gdrows, $dt, true);
+				if($srows)foreach($srows as $k1=>$rs){
+					$key 	= substr($rs['startdt'],0,10).$rs['hyname'];
+					if(!isset($datss[$key]))$datss[$key] = array();
+					$str 	= '['.substr($rs['startdt'],11,5).'→'.substr($rs['enddt'],11,5).']'.$rs['title'].'('.$rs['joinname'].') <font color=blue>固定会议</font>';
+					$datss[$key][] = $str;
+				}
+			}
+			
 			$w 		= $dtobj->cnweek($dt);
 			$status	= 1;
 			if($w=='六'||$w=='日')$status	= 0;

+ 1 - 1
webmain/main/goods/rock_goods_pandian.php

@@ -80,7 +80,7 @@ $(document).ready(function(){
 
 	js.initbtn(c);
 	
-	$('#optionview_{rand}').css('height',''+(viewheight-25)+'px');
+	$('#optionview_{rand}').css('height',''+(viewheight-45)+'px');
 });
 </script>
 

+ 4 - 4
webmain/main/kaoqin/kaoqinAction.php

@@ -22,15 +22,15 @@ class kaoqinClassAction extends Action
 		$dt1	= $this->post('dt1');
 		$dt2	= $this->post('dt2');
 		$msg 	= '获取成功';
-		$daka 	= $this->option->getval('qywxplat_daka');
+		$daka 	= $this->option->getval('wxqyplat_daka');
 		if($daka=='1'){
-			$barr = c('rockqywx')->getcheckindata($uids, $dt1, $dt2, 1);
+			$barr = c('rockwxqy')->getcheckindata($uids, $dt1, $dt2, 1);
 			if(!$barr['success']){
 				$msg = $barr['msg'];
 			}else{
 				$data = $barr['data'];
-				$msg .= ',从代建中应用获取打卡(共'.$data['zongts'].'条,新增'.$data['okload'].'条)';
-				if($data['maxpage']>1)$msg.=',并发送异步请求1条';
+				//$msg .= ',从代建中应用获取打卡(共'.$data['zongts'].'条,新增'.$data['okload'].'条)';
+				//if($data['maxpage']>1)$msg.=',并发送异步请求1条';
 			}
 		}else{
 			if($reimbo->installwx(1)){

+ 10 - 20
webmain/main/view/rock_view.php

@@ -33,22 +33,6 @@ $(document).ready(function(){
 		},
 		beforeload:function(){
 			btn(true);
-		},
-		load:function(a){
-			if(!bools){
-				var s = '<option value="0">-选择模块-</option>',len=a.modearr.length,i,csd,types='';
-				for(i=0;i<len;i++){
-					csd = a.modearr[i];
-					if(types!=csd.type){
-						if(types!='')s+='</optgroup>';
-						s+='<optgroup label="'+csd.type+'">';
-					}
-					s+='<option value="'+csd.id+'">'+csd.name+'</option>';
-					types = csd.type;
-				}
-				$('#mode_{rand}').html(s);
-			}
-			bools=true;
 		}
 	});
 	function btn(bo, d){
@@ -76,14 +60,17 @@ $(document).ready(function(){
 			guanflowviewlist = a;
 			addtabs({num:'flowview'+id+'',url:'main,view,edit,id='+id+',mid='+mid+'',icons:icon,name:name});
 		},
-		changemode:function(){
-			var v=this.value;
+		changemodes:function(v){
 			mid=v;
 			a.search('and modeid='+v+'');
+		},
+		xuanmode:function(o1){
+			js.selectmode(o1, get('modes_{rand}'), function(sna,val,d){
+				c.changemodes(val);
+			});
 		}
 	};
 	js.initbtn(c);
-	$('#mode_{rand}').change(c.changemode);
 });
 </script>
 
@@ -94,7 +81,10 @@ $(document).ready(function(){
 		<button class="btn btn-warning" click="clickwin,0" type="button"><i class="icon-plus"></i> 新增</button>
 	</td>
 	<td style="padding-left:10px">
-		<select style="width:230px" id="mode_{rand}" class="form-control" ><option value="0">-选择模块-</option></select>
+		<div class="btn-group"  style="width:260px;" click="xuanmode">
+		<input class="input" placeholder="-选择模块-" style="flex:1" id="modes_{rand}" readonly>
+		<button class="webbtn webbtn-default">v</button>
+		</div>
 	</td>
 	<td width="90%">
 		

+ 1 - 1
webmain/main/view/viewAction.php

@@ -19,7 +19,7 @@ class viewClassAction extends Action
 		}
 		return array(
 			'rows'=>$rows,
-			'modearr' => m('mode')->getmodearr(),
+			//'modearr' => m('mode')->getmodearr(),
 		);
 	}
 	

+ 34 - 2
webmain/main/xinhu/rock_xinhu_cog.php

@@ -95,6 +95,37 @@ $(document).ready(function(){
 			js.ajax(js.getajaxurl('tongbudw','{mode}','{dir}'),false, function(ret){
 				js.msgok(ret);
 			},'get');
+		},
+		onlinev:function(){
+			var url = get('push_{rand}').value;
+			if(!url){js.msgerror('没配置服务端');return;}
+			js.loading('加载中...');
+			js.ajax(js.getajaxurl('getonline','{mode}','{dir}'),false, function(ret){
+				if(ret.success){
+					js.unloading();
+					c.onlinevs(ret.data);
+				}else{
+					js.msgerror(ret.msg);
+					js.tanclose('online');
+				}
+			},'get,json');
+		},
+		onlinevs:function(da){
+			var s = '',i,j,d;
+			for(i=0;i<da.rows.length;i++){
+				d = da.rows[i];
+				s+='<div style="margin:5px;float:left;padding:5px" class="hover" align="center">';
+				s+='	<div><img width="30" style="border-radius:50%" height="30" src="'+d.face+'"></div>';
+				s+='	<div>'+d.name+'';
+				if(d.pconline)s+='<span class="zhu"><i class="icon-laptop"></i></span>';
+				if(d.apponline)s+='<span class="zhu"><i class="icon-mobile-phone"></i></span>';
+				s+='	</div>';
+				s+='</div>';
+			}
+			js.tanbody('online','服务端在线人员', 450, 300, {
+				html:'<div style="height:350px;overflow:auto;display:inline-block">'+s+'</div>'
+			});
+			$('#msgview_online').html(da.msg);
 		}
 	};
 	
@@ -115,7 +146,8 @@ $(document).ready(function(){
 			<td  align="right"></td>
 			<td class="tdinput">
 			<button click="kuanshu1" class="btn btn-info" type="button">快速设置(推荐)</button>&nbsp;&nbsp;
-			<button click="kuanshu2" class="btn btn-default" type="button">自定义设置</button>
+			<button click="kuanshu2" class="btn btn-default" type="button">自定义设置</button>&nbsp;&nbsp;
+			<button click="onlinev" class="btn btn-default" type="button">在线人员</button>
 			</td>
 		</tr>
 	
@@ -147,7 +179,7 @@ $(document).ready(function(){
 		
 		<tr>
 			<td></td>
-			<td class="tdinput"><font color="#888888">不知道地址?请先安装并运行服务端,</font><a href="<?=URLY?>view_server.html" target="_blank">[去下载安装,看帮助]</a></td>
+			<td class="tdinput"><font color="#888888">不知道地址?请先安装并运行服务端,配置wss请看帮助,</font><a href="<?=URLY?>view_server.html" target="_blank">[去下载安装,看帮助]</a></td>
 		</tr>
 		
 		<tr>

+ 42 - 1
webmain/main/xinhu/xinhuAction.php

@@ -27,6 +27,7 @@ class xinhuClassAction extends Action
 		foreach($rows as $k=>$rs){
 			$base = ''.DB_BASE.'_company_'.$rs['num'].'';
 			$this->sevessee($base, 'reimhostsystem');
+			$this->sevessee($base, 'reimpushurlsystem');
 			$this->sevessee($base, 'reimrecidsystem', $rs['num']);
 			$this->sevessee($base, 'reimchehuisystem');
 			$this->sevessee($base, 'reimservertype');
@@ -38,7 +39,14 @@ class xinhuClassAction extends Action
 	{
 		$val = $this->option->getval($key);
 		if($key=='reimrecidsystem')$val.='_'.$bh.'';
-		$sql = "update ".$base.".`[Q]option` set `value`='$val',`optdt`='{$this->now}' where `num`='$key'";
+		$table = "".$base.".`[Q]option`";
+		$where = "`num`='$key'";
+		$ors 	= $this->db->getone($table, $where);
+		if($ors){
+			$sql 	= "update $table set `value`='$val',`optdt`='{$this->now}' where $where";
+		}else{
+			$sql 	= "insert into $table set `value`='$val',`optdt`='{$this->now}',`num`='$key'";
+		}
 		$this->db->query($sql, false);
 	}
 	
@@ -141,4 +149,37 @@ class xinhuClassAction extends Action
 		));
 		return $barr;
 	}
+	
+	public function getonlineAjax()
+	{
+		
+		$barr = m('reim')->pushserver('getonline');
+		if(!$barr['success'])return $barr;
+		$data = $barr['data'];
+		if(!$data)return returnerror('无人员在线');
+		$ondats = json_decode($data, true);
+		$pc  = $ondats['pc'];
+		$app = $ondats['app'];
+		$uar1= explode(',', $pc);
+		$uar2= explode(',', $app);
+		$str = $pc;
+		$on1 = count($uar1);
+		$on2 = count($uar2);
+		if($app){
+			if($str)$str.=',';
+			$str.=$app;
+		}
+		if(!$str)return returnerror('无人员在线');
+		if(!$app)$on2 = 0;
+		if(!$pc)$on1 = 0;
+		$rows = m('admin')->getall('id in('.$str.') and `status`=1','id,name,face','sort asc');
+		foreach($rows as $k=>$rs){
+			$rows[$k]['pconline']  = in_array($rs['id'], $uar1);
+			$rows[$k]['apponline'] = in_array($rs['id'], $uar2);
+		}
+		return returnsuccess(array(
+			'rows' => $rows,
+			'msg'	=> 'PC在线'.$on1.'人,APP在线'.$on2.'人',
+		));
+	}
 }

+ 0 - 2
webmain/main/yingyong/rock_yingyong.php

@@ -15,8 +15,6 @@ $(document).ready(function(){
 			}
 		},{
 			text:'分类',dataIndex:'types',editor:true,sortable:true
-		},{
-			text:'图标颜色',dataIndex:'iconcolor',editor:true
 		},{
 			text:'编号',dataIndex:'num'
 		},{

+ 6 - 4
webmain/model/adminModel.php

@@ -112,10 +112,12 @@ class adminClassModel extends Model
 		$tj[]	= $this->rock->dbinstr($fids, 'all');
 		$tj[]	= $this->rock->dbinstr($fids, 'u'.$uid);
 		if($us){
-			$dep = explode(',', $us['deptpath']);
-			foreach($dep as $deps){
-				$_deps 	= str_replace(array('[',']'), array('',''), $deps);
-				$tj[]	= $this->rock->dbinstr($fids, 'd'.$_deps);
+			if(!isempt($us['deptpath'])){
+				$dep = explode(',', $us['deptpath']);
+				foreach($dep as $deps){
+					$_deps 	= str_replace(array('[',']'), array('',''), $deps);
+					$tj[]	= $this->rock->dbinstr($fids, 'd'.$_deps);
+				}
 			}
 			//所在组Id
 			$gids 		= m('sjoin')->getgroupid($uid);

+ 7 - 4
webmain/model/beifenModel.php

@@ -91,18 +91,21 @@ class beifenClassModel extends Model
 				foreach($fields as $k=>$frs){
 					$fname = $frs['name'];
 					if($fname=='id')continue;
-					$nstr  = $this->getfielstr($frs);
+					$nstr   = $this->getfielstr($frs);
+					$frs['explain'] = '';
+					$nstr1  = $this->getfielstr($frs);
 					if(!isset($nowfiel[$fname])){
 						$str.=',add '.$nstr.'';
 					}else{
 						$ofrs = $nowfiel[$fname]; //系统上字段类型
-						$ostr = $this->getfielstr($ofrs);
+						//$ostr = $this->getfielstr($ofrs);
+						$ofrs['explain'] = '';
+						$ostr1 = $this->getfielstr($ofrs);
 						$lxarr= array('text','mediumtext','bigint');
-						
 						//如果自己字段长度大于官网就不更新
 						if($frs['type']==$ofrs['type']  && !isempt($ofrs['lens']) && $ofrs['lens']>$frs['lens']){
 							
-						}else if($nstr != $ostr && !in_array($ofrs['type'], $lxarr) ){
+						}else if($nstr1 != $ostr1 && !in_array($ofrs['type'], $lxarr) ){
 							$str.=',MODIFY '.$nstr.'';
 						}
 					}

+ 5 - 1
webmain/model/crmModel.php

@@ -31,7 +31,7 @@ class crmClassModel extends Model
 	}
 	
 	//读取所有客户
-	public function custdata()
+	public function custdata($whe='')
 	{
 		$limit  = (int)$this->rock->get('limit', '10');
 		$page   = (int)$this->rock->get('page', '1');
@@ -41,6 +41,10 @@ class crmClassModel extends Model
 			$key= $this->rock->jm->base64decode($key);
 			$where.= " and (`name` like '%$key%' or `unitname` like '%$key%')";
 		}
+		if($whe){
+			$whe	= str_replace('{uid}', $this->adminid, $whe);
+			$where .= " AND $whe";
+		}
 		$rows 	= $this->getrows("`status`=1 ".$where."",'SQL_CALC_FOUND_ROWS id as value,name,id,unitname as subname','`optdt` desc',''.(($page-1)*$limit).','.$limit.'');
 		$totalCount = $this->db->found_rows();
 		return array(

+ 8 - 6
webmain/model/fileModel.php

@@ -120,12 +120,11 @@ class fileClassModel extends Model
 			if(!file_exists($thumbpath))$thumbpath='';
 		}
 		
-		if(isempt($thumbpath))$thumbpath = arrvalue($rs, 'thumbplat');
-		if(!isempt($thumbpath)){
-			$thumbpath = str_replace('{FILEURL}', getconfig('rockfile_url'), $thumbpath);
-			$thumbpath = $this->rock->gethttppath($thumbpath);
+		$thumbplat = arrvalue($rs, 'thumbplat');
+		if(!isempt($thumbplat)){
+			$thumbpath = str_replace('{FILEURL}', getconfig('rockfile_url'), $thumbplat);
 		}
-		return $thumbpath;
+		return $this->rock->gethttppath($thumbpath);
 	}
 	
 	
@@ -339,7 +338,10 @@ class fileClassModel extends Model
 					header('location:'.$filepath.'');
 					return;
 				}
-				
+				if($this->rock->get('openfrom')=='iosapp'){
+					header('location:'.$filepath.'');
+					return;
+				}
 				if($filesize > 10*1024*1024 && 1==1 && $fileext!='pdf'){
 					header('location:'.$filepath.'');
 				}else{

+ 1 - 1
webmain/model/flow/carmreseModel.php

@@ -37,7 +37,7 @@ class flow_carmreseClassModel extends flowModel
 		$db 	= m('carmrese');
 		//读取车辆最后公里数
 		foreach($rows as $k=>$rs){
-			$onrs = $db->getone("`status`=1 and `carid`=".$rs['value']." and ifnull(`kmend`,'')<>''", '`kmend`,`kmstart`','`kmend` desc');
+			$onrs = $db->getone("`status`=1 and `carid`=".$rs['value']." and ifnull(`kmend`,0)<>0", '`kmend`,`kmstart`','`kmend` desc');
 			$km   = '';
 			if($onrs){
 				$km = $onrs['kmend'];

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
webmain/model/flow/flow.php


+ 25 - 1
webmain/model/flow/goodsModel.php

@@ -3,8 +3,14 @@
 class flow_goodsClassModel extends flowModel
 {
 	
+	public $base;
+	public function initModel()
+	{
+		$this->base		= m('goods');
+	}
+	
 	protected function flowchangedata(){
-		$this->rs['typeid']	 = m('goods')->gettypename($this->rs['typeid']);
+		$this->rs['typeid']	 = $this->base->gettypename($this->rs['typeid']);
 	}
 
 	//导入数据的测试显示
@@ -40,6 +46,10 @@ class flow_goodsClassModel extends flowModel
 	//
 	public function flowrsreplace($rs, $lx=0)
 	{
+		
+		if(isset($rs['typeid']) && is_numeric($rs['typeid']))
+			$rs['typeid'] = $this->base->gettypename($rs['typeid']);
+		
 		//详情页下显示对应仓库库存
 		if($lx==1){
 			$drows = $this->db->getall("SELECT `depotid`,sum(count)count FROM `[Q]goodss` where aid=".$rs['id']." and `status`=1 GROUP BY `depotid`");
@@ -84,4 +94,18 @@ class flow_goodsClassModel extends flowModel
 		m('goodss')->delete('`aid`='.$this->id.'');
 		m('goods')->setstock();
 	}
+	
+	protected function flowbillwhere($uid, $lx)
+	{
+		$where  = '';
+		$typeid = $this->rock->post('typeid','0');
+		if($typeid!='0'){
+			$alltpeid = m('option')->getalldownid($typeid);
+			$where .= ' and `typeid` in('.$alltpeid.')';
+		}
+		return array(
+			'where' => $where,
+			'order' => 'optdt desc',
+		);
+	}
 }

+ 18 - 12
webmain/model/flow/meetModel.php

@@ -51,15 +51,17 @@ class flow_meetClassModel extends flowModel
 		$nzt 		 = $zt;
 		$time 		 = time();
 		
-		$stime 	= strtotime($rs['startdt']);
-		$etime 	= strtotime($rs['enddt']);
-		if($zt < 2){
-			if($etime<$time){
-				$nzt = 2;
-			}else if($stime>$time){
-				$nzt = 0;
-			}else{
-				$nzt = 1;
+		if(!isempt($rs['startdt']) && !isempt($rs['enddt'])){
+			$stime 	= strtotime($rs['startdt']);
+			$etime 	= strtotime($rs['enddt']);
+			if($zt < 2){
+				if($etime<$time){
+					$nzt = 2;
+				}else if($stime>$time){
+					$nzt = 0;
+				}else{
+					$nzt = 1;
+				}
 			}
 		}
 		
@@ -231,9 +233,13 @@ class flow_meetClassModel extends flowModel
 	//每天运行计划任务将固定会议生成普通会议通知对应人
 	public function createmeet($id=0, $nowdt='', $gbrr=false)
 	{
-		$owhe 	= '';
-		if($id>0)$owhe='`id`='.$id.' and ';
-		$narr 	= $this->getall(''.$owhe.'`type`=1 and `status`=1');
+		if(is_array($id)){
+			$narr = $id;
+		}else{
+			$owhe 	= '';
+			if($id>0)$owhe='`id`='.$id.' and ';
+			$narr 	= $this->getall(''.$owhe.'`type`=1 and `status`=1');
+		}
 		$dtobj	= c('date');
 		$jlarr 	= array();
 		foreach($narr as $k=>$rs){

+ 1 - 1
webmain/model/flow/subscribeinfoModel.php

@@ -87,7 +87,7 @@ class flow_subscribeinfoClassModel extends flowModel
 			$newid = $this->insert(array(
 				'mid' 		=> $id,
 				'receid' 	=> $receid,
-				'recename' 	=> $recename,
+				'recename' 	=> $this->rock->xssrepstr($recename),
 				'title' 	=> $title,
 				'cont' 		=> $cont,
 				'optdt' 	=> $this->rock->now,

+ 2 - 2
webmain/model/flowbillModel.php

@@ -154,7 +154,7 @@ class flowbillClassModel extends Model
 				$modename 	= $mors['name'];
 				$rers 		= $this->db->getone('[Q]'.$rs['table'].'', $rs['mid']);
 				if($rers){
-					$tihsrs  = $flow->flowrsreplace($rers, 2);
+					$tihsrs  = $flow->rsreplace($rers, 2, null, 1);
 					$summary = $this->rock->reparr($mors['summary'], $tihsrs);
 					$summarx = $this->rock->reparr($mors['summarx'], $tihsrs);
 	
@@ -316,7 +316,7 @@ class flowbillClassModel extends Model
 				$rers 		= $this->db->getone('[Q]'.$rs['table'].'', $rs['mid']);
 				$summary	= $this->rock->reparr($summary, $rers);
 				if($rers){
-					$tihsrs  = $flow->flowrsreplace($rers, 2);
+					$tihsrs  = $flow->rsreplace($rers, 2, null, 1);
 					$summary = $this->rock->reparr($mors['summary'], $tihsrs);
 					
 					$nowsets	 = $rs['nowcheckname']; //当前审核人

+ 1 - 1
webmain/model/inputModel.php

@@ -66,7 +66,7 @@ class inputClassModel extends Model
 		$strm.= '&nbsp;&nbsp;&nbsp;{删,'.$xu.'}';
 		$strm.= '</td></tr></table>';
 		
-		if($ism==0)$str.='<div style="background-color:#F1F1F1;">{新增,'.$xu.'}</div>';
+		if($ism==0)$str.='<div class="addys">{新增,'.$xu.'}</div>';
 		if($ism==1){
 			$str.='<div>{新增,'.$xu.'}</div>';
 			$strm.='<div style="margin:8px">{新增,'.$xu.'}</div>';

+ 4 - 0
webmain/model/kqjcmdModel.php

@@ -468,6 +468,8 @@ class kqjcmdClassModel extends Model
 	//保存指纹
 	public function savefingerprint($snid, $uid, $finge)
 	{
+		$snid  = (int)$snid;
+		$uid   = (int)$uid;
 		$where = "`snid`='$snid' and `uid`='$uid'";
 		$arr['fingerprint1'] = str_replace("\n",'', arrvalue($finge, 0));
 		$arr['fingerprint2'] = str_replace("\n",'', arrvalue($finge, 1));
@@ -483,6 +485,8 @@ class kqjcmdClassModel extends Model
 	//保存设备头像
 	private function saveheadpic($snid, $uid, $headpic, $face='')
 	{
+		$snid  = (int)$snid;
+		$uid   = (int)$uid;
 		$where = "`snid`='$snid' and `uid`='$uid'";
 		if(isempt($face)){
 			if(isempt($headpic))return;

+ 2 - 2
webmain/model/logModel.php

@@ -48,8 +48,8 @@ class logClassModel extends Model
 		}else{
 			$arr['stotal']	= (int)$onrs['stotal']+1;
 		}
-		$arr['ip']		= $this->rock->ip;
-		$arr['web']		= $this->rock->web;
+		//$arr['ip']		= $this->rock->ip;//存这个没用,不在存储
+		//$arr['web']		= $this->rock->web;
 		$arr['optdt']	= $this->rock->now();
 		$dbs->record($arr, $where);
 	}

+ 3 - 3
webmain/model/loginModel.php

@@ -66,6 +66,7 @@ class loginClassModel extends Model
 		
 		if(getconfig('systype')=='demo')$this->db->update('[Q]admin', '`status`=1' , '`id`=1 and `status`=0');
 		
+		
 		//1.先用用户名判断
 		$arrs 	= array(
 			'user' 			=> $user,	
@@ -122,9 +123,8 @@ class loginClassModel extends Model
 			if($us)$loginx = '姓名';
 		}
 		
-		
 		if($msg=='' && !$us){
-			$msg = '用户不存在';
+			$msg = '用户或密码不对'; //用户不存在时提示
 		}else if($msg==''){
 			$uid 	= $us['id'];
 			$user 	= $us['user'];
@@ -142,7 +142,7 @@ class loginClassModel extends Model
 				}
 			}else{
 	
-				if(md5($pass)!=$us['pass'])$msg='密码不对';
+				if(md5($pass)!=$us['pass'])$msg='用户或密码不对'; //密码不对提示
 				
 				if($msg!='' && $pass==md5($us['pass']) && c('cache')->get('login'.$user.'')==$uid){
 					$msg='';

+ 35 - 23
webmain/model/reimModel.php

@@ -675,14 +675,16 @@ class reimClassModel extends Model
 				if($frs){
 					$type = $frs['fileext'];
 					$path = $frs['filepath'];
+					$isimg= $this->contain($imgext, ','.$type.',');
 					$boc  = false;
 					if(substr($path,0,4)=='http' || !isempt($frs['filenum'])){
 						$boc = true;
 					}else{
 						if(file_exists($path))$boc = true;
 					}
+					if($isimg && !isempt($frs['thumbplat']))$boc = true;
 					if($boc){
-						if($this->contain($imgext, ','.$type.',')){
+						if($isimg){
 							$frs['thumbpath'] = $fobj->getthumbpath($frs);
 							//$cont = '<img fid="'.$fid.'" src="'.$frs['thumbpath'].'">';
 							//$rows[$k]['cont'] = $this->rock->jm->base64encode($cont);
@@ -858,6 +860,7 @@ class reimClassModel extends Model
 		if(isset($cans['fileid']))$fileid=$cans['fileid'];
 		if(isset($cans['msgid']))$msgid=$cans['msgid'];
 		$pushcont	= arrvalue($cans, 'pushcont');
+		$ispushapp	= arrvalue($cans, 'ispushapp');//是否推送app
 		$arr = array(
 			'cont'		=> $cont,
 			'sendid'	=> $sendid,
@@ -900,20 +903,21 @@ class reimClassModel extends Model
 		if($sendid!=$receid)$this->addhistory('user', $sendid, $receid, $optdt, $cont, $sendid,'','', $arr['id']);
 		
 		//推送的原生App上(使用异步推送哦)
-		$tuicont['sendid'] 		= $arr['sendid'];
-		$tuicont['sendname'] 	= $this->adminname;
-		$tuicont['name'] 		= $this->adminname;
-		$tuicont['cont'] 		= $cont;
-		$tuicont['pushcont'] 	= $pushcont;
-		$tuicont['pushtype'] 	= 'chat'; //推送消息类型
-		$tuicont['receid'] 		= $receid;
-		$tuicont['fileid'] 		= $fileid;
-		$tuicont['type'] 		= 'user';
-		$tuicont['id'] 			= $arr['id'];
-		$tuicont['optdt'] 		= $optdt;
-		$tuicont['optdts'] 		= substr($optdt,11,5);
-		$this->pushapp($receid, '['.$this->adminname.']发来一条消息', $tuicont, $lx);
-		
+		if($ispushapp != 'no'){
+			$tuicont['sendid'] 		= $arr['sendid'];
+			$tuicont['sendname'] 	= $this->adminname;
+			$tuicont['name'] 		= $this->adminname;
+			$tuicont['cont'] 		= $cont;
+			$tuicont['pushcont'] 	= $pushcont;
+			$tuicont['pushtype'] 	= 'chat'; //推送消息类型
+			$tuicont['receid'] 		= $receid;
+			$tuicont['fileid'] 		= $fileid;
+			$tuicont['type'] 		= 'user';
+			$tuicont['id'] 			= $arr['id'];
+			$tuicont['optdt'] 		= $optdt;
+			$tuicont['optdts'] 		= substr($optdt,11,5);
+			$this->pushapp($receid, '['.$this->adminname.']发来一条消息', $tuicont, $lx);
+		}
 		/*
 		$last	= date('Y-m-d H:i:s', time()-15);
 		$where 	= "`uid`='$receid' and `online`=1 and `cfrom` in('appandroid','appios') and `moddt`<'$last'";
@@ -1062,7 +1066,8 @@ class reimClassModel extends Model
 		}
 		$uwhere = "$where `status`=1";
 		$rows 	= m('logintoken')->getrows("`uid` in(select id from `[Q]admin` where $uwhere) and `cfrom` in ('nppandroid','nppios') and `online`=1",'*','id desc');
-		$uida 	= $pushuids = $alias2019 = $uid2019 = array();
+		$jpreg	= '';
+		$uida 	= $pushuids = $alias2019 = $uid2019 = $jparr =  array();
 		$uids	= '0';
 		$times  = date('Y-m-d H:i:s', time()-5*60);//5分钟
 		foreach($rows as $k=>$rs){
@@ -1076,14 +1081,19 @@ class reimClassModel extends Model
 				$nestr.=''.$rs['pushtoken'].''; //个推
 			}else if(contain($_web,'huawei') && !contain($rs['ip'],'.')){
 				$nestr.=''.$rs['ip'].'';
-			}else if(contain($_web,'xiaomi')){
+			}else if(contain($_web,'xiaomi') || !isempt($rs['pushtoken'])){
 				$nestr.=''.$rs['pushtoken'].'';
 			}
+			if(arrvalue($rs,'regid')){
+				$nestr.='|'.$rs['regid'].'';
+				$jpreg = 'yes';
+				$jparr[] = $rs['regid'];
+			}
 			$alias2019[] = $nestr;
 			if(!in_array($_uid, $uid2019))$uid2019[] = $_uid;
 			if($rs['ispush']=='1')$pushuids[] = $_uid;//可以手机推送的用户
 		}
-		return array('uids'=>$uids,'alias2019'=>$alias2019,'uid2019'=>$uid2019,'pushuids'=>$pushuids);
+		return array('uids'=>$uids,'alias2019'=>$alias2019,'uid2019'=>$uid2019,'pushuids'=>$pushuids, 'jpreg'=>$jpreg, 'jparr' => $jparr);
 	}
 	
 	/**
@@ -1118,13 +1128,14 @@ class reimClassModel extends Model
 				));
 				//服务端返回{"zshu":2,"yfuid":"1,8","wfuid":""}
 				if($gbarr && $gbarr['success'] && $bstr = arrvalue($gbarr, 'data')){
-					$data = json_decode($bstr, true);
-					$yfuid= explode(',', arrvalue($data, 'yfuid'));
-					if($yfuid){
+					$data  = json_decode($bstr, true);
+					$yfuid = arrvalue($data, 'yfuid');
+					if(!isempt($yfuid)){//有在线人员用了服务端推送
+						$yfuida = explode(',', $yfuid);
 						$nealas = array();
 						foreach($alias2019 as $alis){
 							$bo = false;
-							foreach($yfuid as $yfid){if(contain($alis,'|'.$yfid.'|'))$bo=true;};
+							foreach($yfuida as $yfid){if(contain($alis,'|'.$yfid.'|'))$bo=true;};
 							if(!$bo)$nealas[] = $alis;
 						}
 						$alias['alias2019'] = $nealas;
@@ -1132,7 +1143,6 @@ class reimClassModel extends Model
 				}
 			}
 		}
-		
 		return c('JPush')->push($title, $pushcont, $contjson, $alias);
 	}
 	
@@ -1227,6 +1237,8 @@ class reimClassModel extends Model
 		foreach($cans as $k=>$v)$carr[$k]=$v;
 		
 		$reimtype = $this->option->getval('reimservertype');
+		
+		//if($carr['atype']=='sendapp')c('JPush')->sendJpush($carr);
 		if($reimtype=='1')return c('rockqueue')->pushdata($carr);
 		
 		$str 			= json_encode($carr);

+ 1 - 1
webmain/public/fileopen_mp4.html

@@ -7,7 +7,7 @@
 <body style="padding:0px;margin:0px;background:#000000">
 <center>
 <div style="margin-top:30px">
-<video src="<?=$da['filepaths']?>" width="100%" style="max-width:1000px" height="550" controls autoplay></video>
+<video src="<?=$da['filepaths']?>" width="100%" style="max-width:1000px" height="450" controls autoplay></video>
 </div>
 </center>
 </body>

+ 5 - 2
webmain/public/publicAction.php

@@ -36,7 +36,7 @@ class publicClassAction extends ActionNot{
 				$exta = substr($filepath, -4);
 				if($exta=='html')$this->rock->location($filepath);
 			}
-		}else if($type=='mp4'){
+		}else if($type=='mp4' || $type=='mp3'){
 			$this->displayfile = ''.P.'/public/fileopen_mp4.html';		
 		}else if($fobj->isyulan($type)){
 			
@@ -73,7 +73,10 @@ class publicClassAction extends ActionNot{
 		
 		$str = 'mode/pdfjs2/viewer.html';
 		//exit($this->rock->HTTPweb);
-		if(!$this->displayfile && file_exists($str) && !contain($this->rock->web,'MSIE') && !contain($this->rock->HTTPweb,'Chrome/5'))$this->displayfile = $str;
+		if(!$this->displayfile && file_exists($str) && !contain($this->rock->web,'MSIE') && !contain($this->rock->HTTPweb,'Chrome/5')){
+			if(contain($this->rock->HTTPweb, 'XINHUOAAPP IOS'))$str='';
+			$this->displayfile = $str;
+		}
 		
 		$fobj->addlogs($id,0);//记录预览记录
 	}

+ 4 - 3
webmain/reim/index/tpl_index_xina.html

@@ -17,12 +17,12 @@
 <link rel="stylesheet" type="text/css" href="web/res/css/chat.css"/>
 <link rel="shortcut icon" id="ico" href="<?=$da['logo']?>" />
 <script type="text/javascript" src="web/res/js/jquery.1.9.1.min.js"></script>
-<script type="text/javascript" src="js/js.js"></script>
+<script type="text/javascript" src="js/js.js?<?=time()?>"></script>
 <script type="text/javascript" src="js/base64-min.js"></script>
 <script type="text/javascript" src="web/res/js/nwjs.js"></script>
 <script type="text/javascript" src="web/res/mode/menu/jquery-rockmenu.js"></script>
-<script type="text/javascript" src="web/res/js/notify.js"></script>
-<script type="text/javascript" src="web/res/js/strformat.js"></script>
+<script type="text/javascript" src="web/res/js/notify.js?<?=time()?>"></script>
+<script type="text/javascript" src="web/res/js/strformat.js?<?=time()?>"></script>
 <script type="text/javascript" src="js/reim_xina.js?<?=time()?>"></script>
 <script type="text/javascript" src="web/res/js/websocket.js"></script>
 <script type="text/javascript" src="web/res/perfectscrollbar/perfect-scrollbar.js"></script>
@@ -53,6 +53,7 @@ systitle		= '<?=$da['title']?>';
 companymode		= <?=(getconfig('companymode')? 'true' : 'false')?>;
 video_bool		= <?=(getconfig('video_bool')? 'true' : 'false')?>;
 function globalbody(){
+	token 		= js.getoption('admintoken', token);
 	adminid		= '<?=$da['adminid']?>';
 	adminface	= '<?=$da['face']?>';
 	adminname	= '<?=$da['adminname']?>';

+ 1 - 1
webmain/reim/record/recordAction.php

@@ -112,7 +112,7 @@ class recordClassAction extends Action
 	//删除聊天记录
 	public function delrecordAjax()
 	{
-		$id 	= $this->post('id');
+		$id 	= c('check')->onlynumber($this->post('id'));
 		$atype  = $this->post('atype');
 		if($atype!='all'){
 			if(!isempt($id)){

+ 50 - 54
webmain/reim/tonghua/tpl_tonghua.html

@@ -10,7 +10,7 @@
 <script type="text/javascript" src="js/jquery.js"></script>
 <script type="text/javascript" src="js/js.js"></script>
 <script type="text/javascript" src="js/base64-min.js"></script>
-<script type="text/javascript" src="mode/agora/AgoraRTC_N-4.7.1.js"></script>
+<script type="text/javascript" src="mode/plugin/trtc.js"></script>
 <script type="text/javascript" src="mode/plugin/jquery-rockmodels.js"></script>
 <script>
 adminid = <?=$da['adminid']?>;
@@ -27,9 +27,11 @@ var c = {
 	callshu:30,
 	id:<?=$ars['id']?>,
 	nwwin:false,
+	isuse:false,
 	init:function(){
+		this.userid  = 'rock'+this.id+'';
 		this.typearr = ['语音','视频'];
-		this.name   = '<?=$ars['name']?>';
+		this.name    = '<?=$ars['name']?>';
 		this.playobj = get('notify_sound_tonghua');
 		js.initbtn(this);
 		//接收端
@@ -46,13 +48,28 @@ var c = {
 				c.bodyunload(this);
 			});
 		}
+		if(window['TRTC']){
+			this.isuse = true;
+		}else{
+			this.stateupdate('未安装插件,无法使用');
+		}
+		if(NOWURL.substr(0,5)!='https'){
+			if(HOST.indexOf('localhost')==0 || HOST.indexOf('127.0.0.1')==0){
+			}else{
+				js.msg('msg','未使用https,功能受限');
+			}
+		}
 	},
 	hujiao:function(o1,lx){
 		if(this.hujiaobo)return;
+		if(!this.isuse){
+			js.msg('msg','未安装插件,无法使用');
+			return;
+		}
 		js.loading('请求中...');
 		this.hujiaobo = true;
 		this.type 	  = lx;
-		js.ajax('tonghua|thinit',{id:this.id,type:lx},function(ret){
+		js.ajax('tonghua|thinit',{id:this.id,type:lx,rtctype:1},function(ret){
 			c.hujiaoback(ret);
 		}, 'get', function(str){
 			js.msgerror(str);
@@ -116,26 +133,12 @@ var c = {
 		this.callmiashuetime = setTimeout(function(){c.callmiashue()},1000);
 	},
 	initagoraRtc:async function(){
-		client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
-		
-		client.on("user-published", async (user, mediaType) => {
-			await client.subscribe(user, mediaType);
-			if (mediaType === "video") {
-				remoteVideoTrack = user.videoTrack;
-				remoteVideoTrack.play('remote_stream');
-			}
-			if (mediaType === "audio") {
-				remoteAudioTrack = user.audioTrack;
-				remoteAudioTrack.play();
-			}
-		});
-		client.on("user-joined", (user) => {
-			//showSuccess('有人来('+JSON.stringify(user)+')');
-		});
-		client.on("user-left", (user, reason) => {
-			//showAlert('有人退出['+reason+']('+JSON.stringify(user)+')');
-			c.guaduanok(false);
+		trtc = TRTC.create();
+		trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
+			const view = `remote_stream`;
+			trtc.startRemoteVideo({ userId, streamType, view });
 		});
+		//trtc.muteRemoteAudio(this.userid, false);
 	},
 	cancelhu:function(){
 		this.cancelhus(3);
@@ -191,18 +194,21 @@ var c = {
 			$('#remote_stream').show();
 		}
 		
-		await client.join(this.thcan.appid, this.thcan.channel, this.thcan.token, this.thcan.uid);
-	
-		// 通过麦克风采集的音频创建本地音频轨道对象。
-		localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack();
-		await client.publish(localAudioTrack);
-		
+		await trtc.startLocalAudio();
 		if(this.type==1){
-			// 通过摄像头采集的视频创建本地视频轨道对象。
-			localVideoTrack = await AgoraRTC.createCameraVideoTrack();
-			// 将这些音视频轨道对象发布到频道中。
-			await client.publish(localVideoTrack);
-			localVideoTrack.play('local_stream'); //播放视频
+			const view = 'local_stream';
+			await trtc.startLocalVideo({ view })
+		}
+		
+		try {
+			const strRoomId = this.thcan.channel;
+			const sdkAppId = this.thcan.appid;
+			const userId = 'rock'+this.thcan.uid;
+			const userSig = this.thcan.token;
+			await trtc.enterRoom({ strRoomId: strRoomId, scene:'rtc', sdkAppId, userId, userSig });
+			console.log('进房成功');
+		} catch (error) {
+			js.msg('msg','接通失败: ' + error);
 		}
 	},
 	showmian:function(){
@@ -243,12 +249,12 @@ var c = {
 			this.guaduanokok();
 		}
 	},
-	guaduanokok:function(){
+	guaduanokok:async function(){
 		clearTimeout(this.showmiantime);
-		if(localAudioTrack)localAudioTrack.close();
-		if(localVideoTrack)localVideoTrack.close();
-		client.unpublish();
-		client.leave();
+		trtc.stopLocalVideo() 
+		trtc.stopLocalAudio();
+		await trtc.exitRoom();
+		trtc.destroy();
 		this.stateupdate('通话已结束', true);
 		$('#canceldiv').remove();
 		this.cancalpayls();
@@ -265,12 +271,12 @@ var c = {
 	},
 	qiehysq:function(){
 		if(!this.yuancjinb){
-			remoteAudioTrack.setVolume(0);
+			trtc.setRemoteAudioVolume(this.userid, 0);
 			this.yuancjinb = true;
 			$('#jingyinclltxt').html('开启声音');
 			get('jingyincll').className='icon-volume-off';
 		}else{
-			remoteAudioTrack.setVolume(100);
+			trtc.setRemoteAudioVolume(this.userid, 100);
 			this.yuancjinb = false;
 			$('#jingyinclltxt').html('静音');
 			get('jingyincll').className='icon-volume-up';
@@ -309,6 +315,10 @@ var c = {
 		}
 	},
 	jiedianha:function(o1,lx){
+		if(!this.isuse && lx==1){
+			js.msg('msg','未安装插件,只能拒绝');
+			return;
+		}
 		clearTimeout(this.jieshoutimesa);
 		this.ismybool = true;
 		this.isyaoqbool = false;
@@ -460,20 +470,6 @@ js.initbtn = function(obj){
 	}
 	o.attr('clickadd','true');
 }
-function showAlert(str,col){
-	var obj = $('div[temp="div"]'),hei=0;
-	for(var i=0;i<obj.length;i++)hei+=$(obj[i]).height()+15;
-	if(!col)col='red';
-	var str = '<div temp="div" onclick="$(this).remove()" style="background:rgba(0,0,0,0.8);position:fixed;left:0px;top:'+hei+'px;padding:5px;color:'+col+'">'+str+'</div>';
-	$('body').append(str);
-}
-
-
-function showSuccess(str){
-	showAlert(str,'white');
-}
-
-
 
 </script>
 </head>

+ 91 - 1
webmain/system/beifen/beifenAction.php

@@ -67,7 +67,7 @@ class beifenClassAction extends Action
 		if(getconfig('systype')=='demo')exit('演示请勿操作');
 		$rows = array();
 		$folder = $this->post('folder');
-		$folder	= str_replace('../','', $folder);
+		$folder	= str_replace(array('..','/'),'', $folder);
 		$path 	= ''.UPDIR.'/data/'.$folder.'';
 		$carr 	= c('file')->getfilerows($path);
 		foreach($carr as $k=>$rs){
@@ -242,4 +242,94 @@ class beifenClassAction extends Action
 		
 		return 'ok';
 	}
+	
+	
+	public function fenbiaoAjax()
+	{
+		$allfields = $this->db->getallfields('[Q]flow_set');
+		if(!in_array('logstr', $allfields)){
+			$bool = $this->db->query("alter table `[Q]flow_set` add `logstr` varchar(500) DEFAULT NULL COMMENT '操作记录分表';", false);
+			if(!$bool)return '无法操作:'.$this->db->error().'';
+		}
+		
+		$obj 	= m('mode');
+		$rows 	= $obj->getall('1=1');
+		$atable = array();
+		$count 	= m('flow_log')->rows('1=1');
+		if($count < 10000)return '操作记录少于1W条,不需要分表';
+		
+		$alltabls 	= $this->db->getalltable();
+		$barr		= $this->createbiao(1, $alltabls);
+		if(!$barr['success'])return $barr['msg'];
+		$biao 		= $barr['data'];
+		if(1==1)foreach($rows as $k=>$rs){
+			$tab = $rs['table'];
+			if(!isset($atable[$tab])){
+				$max = m($tab)->getmou('max(id) as ids', 'id>0');
+				if(!$max)$max = 0;
+				$max++;
+				$atable[$tab] = $max;
+			}
+			$max 	= $atable[$tab];
+			
+			$logstr = $rs['logstr'];
+			if(isempt($logstr)){
+				$logarr = array();
+			}else{
+				$logarr = json_decode($logstr, true);
+			}
+			if(!isset($logarr[$max]))$logarr[$max] = $biao;
+			$logstr = json_encode($logarr);
+			
+			$obj->update(array(
+				'logstr' => $logstr
+			), $rs['id']);
+		}
+		
+		//更新
+		$sql = "update `[Q]file` set `mtype`='flow_log".$biao."' where `mtype`='flow_log'";
+		$bool = $this->db->query($sql, false);
+		
+		return 'ok';
+	}
+	
+	public function createbiao($xu, $alltabls)
+	{
+		$biao 	= 'a'.$xu.'';
+		$lognab = 'flow_log'.$biao.'';
+		if(in_array(''.PREFIX.''.$lognab.'',$alltabls))return $this->createbiao($xu+1, $alltabls);
+		
+		$sql 	= 'ALTER TABLE `[Q]flow_log` RENAME TO `[Q]'.$lognab.'`;';
+		$bool	= $this->db->query($sql, false);
+		if(!$bool)return returnerror('无法操作:'.$this->db->error().'');
+		
+		$sql = "CREATE TABLE `[Q]flow_log` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `table` varchar(50) DEFAULT NULL,
+  `mid` int(11) DEFAULT NULL,
+  `status` tinyint(4) DEFAULT '0' COMMENT '1通过',
+  `statusname` varchar(20) DEFAULT NULL COMMENT '状态名称',
+  `name` varchar(50) DEFAULT NULL COMMENT '进程名称',
+  `courseid` int(11) DEFAULT NULL,
+  `optdt` datetime DEFAULT NULL COMMENT '操作时间',
+  `explain` varchar(500) DEFAULT NULL COMMENT '说明',
+  `ip` varchar(100) DEFAULT NULL,
+  `web` varchar(100) DEFAULT NULL COMMENT '浏览器',
+  `checkname` varchar(50) DEFAULT NULL COMMENT '审核人',
+  `checkid` int(11) DEFAULT '0' COMMENT '审核人id',
+  `modeid` smallint(6) DEFAULT NULL COMMENT '@模块Id',
+  `color` varchar(10) DEFAULT NULL,
+  `valid` tinyint(1) DEFAULT '1',
+  `step` smallint(6) DEFAULT '0' COMMENT '步骤号',
+  `qmimg` text COMMENT '签名的图片base64',
+  `iszb` tinyint(1) DEFAULT '0' COMMENT '是否转办记录',
+  PRIMARY KEY (`id`),
+  KEY `table` (`table`,`mid`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='单据操作记录';
+";
+		$bool	= $this->db->query($sql, false);
+		if(!$bool)return returnerror('无法创建表:'.$this->db->error().'');
+		
+		return returnsuccess($biao);
+	}
 }

+ 22 - 0
webmain/system/beifen/rock_beifen.php

@@ -61,6 +61,24 @@ $(document).ready(function(){
 					o1.disabled=false;
 				}
 			});
+		},
+		fenbiao:function(o){
+			js.confirm('却要现在就分表了吗?',function(jg){
+				if(jg=='yes'){
+					c.fenbiaos(o);
+				}
+			});
+		},
+		fenbiaos:function(o){
+			js.loading('处理中...');
+			js.ajax(js.getajaxurl('fenbiao','{mode}','{dir}'),{}, function(s){
+				js.unloading();
+				if(s=='ok'){
+					js.msgok('处理完成');
+				}else{
+					js.msg('msg', s);
+				}
+			});
 		}
 	}
 	js.initbtn(c);
@@ -86,4 +104,8 @@ $(document).ready(function(){
 	<div><button click="deluser" class="btn btn-danger" type="button">初始化部门和用户</button></div>
 	<div class="tishi">初始化部门和用户,将会删除你创建的用户和部门,为了防止误删只能使用一次,请备份好数据谨慎使用!</div>
 	
+	<div class="blank20"></div>
+	<div><button click="fenbiao" class="btn btn-default" type="button">flow_log单据操作记录分表</button></div>
+	<div class="tishi">单据操作记录表单据越多,数据越大优化做好分表,建议超过5W条记录在分表,当前总记录<?=m('flow_log')->rows('1=1')?>条</div>
+	
 </div>

+ 0 - 1
webmain/system/cog/cogAction.php

@@ -128,7 +128,6 @@ class cogClassAction extends Action
 		$arr['url'] 		= $this->post('url');
 		$arr['outurl'] 		= $this->post('outurl');
 		$arr['reimtitle'] 	= $this->post('reimtitle');
-		$arr['qqmapkey'] 	= $this->post('qqmapkey');
 		$arr['platurl'] 	= $this->post('platurl');
 		
 		$apptitle 			= $this->post('apptitle');

+ 5 - 0
webmain/system/cog/rock_cog_login.php

@@ -24,6 +24,11 @@ $(document).ready(function(){
 			text:'在线状态',dataIndex:'online',type:'checkbox',sortable:true
 		},{
 			text:'最后在线',dataIndex:'moddt',sortable:true
+		},{
+			text:'极光',dataIndex:'regid',renderer:function(v){
+				var str='&nbsp;';if(v)str='<font color=green>已注册</font>';
+				return str;
+			}
 		},{
 			text:'ID',dataIndex:'id',sortable:true
 		}],

+ 18 - 40
webmain/system/cog/rock_cog_set.php

@@ -5,7 +5,6 @@ $(document).ready(function(){
 	var barr = {};
 	var c={
 		init:function(){
-			this.loadys();
 			js.ajax(js.getajaxurl('getinfo','{mode}','{dir}'),{},function(a){
 				barr = a;
 				for(var i in a)$('#'+i+'_{rand}').val(a[i]);
@@ -14,16 +13,6 @@ $(document).ready(function(){
 				if(a.officebj=='1')$('#divofficebj_key').show();
 			},'get,json');
 		},
-		loadys:function(){
-			if(!get('defstype_{rand}'))return;
-			var ysarr = 'cerulean,cosmo,cyborg,darkly,flatly,journal,lumen,paper,readable,sandstone,simplex,slate,spacelab,superhero,united,xinhu,yeti';
-			var sear = ysarr.split(','),i,len=sear.length,das = [];
-			for(i=0;i<len;i++){
-				das.push({name:sear[i],value:i+1});
-				das.push({name:sear[i]+'_def',value:i+1+len});
-			}
-			js.setselectdata(get('defstype_{rand}'),das,'value');
-		},
 		isurl:function(na,dz){
 			if(dz){
 				if(dz.substr(0,4)!='http')return ''+na+'必须http开头';
@@ -154,8 +143,14 @@ $(document).ready(function(){
 			<td class="tdinput"><input id="reimtitle_{rand}" class="form-control"></td>
 			
 			<td  align="right"><a target="_blank" href="<?=URLY?>">信呼官网</a>key:</td>
-			<td class="tdinput"><input id="xinhukey_{rand}" class="form-control">
-			<font color="#888888">用于在线升级使用,看<a target="_blank" href="<?=URLY?>view_xhkey.html">[帮助]</a>获取</font>,<a href="javascript:;" onclick="$.imgview({url:'http://www.rockoa.com/images/keyhelp.png'})">[怎么获取?]</a></td>
+			<td class="tdinput">
+			
+				<div class="btn-group">
+				<input id="xinhukey_{rand}" placeholder="用于在线升级使用"  readonly class="form-control">
+				<button class="webbtn webbtn-default" onclick="$.imgview({url:'http://www.rockoa.com/images/keyhelp.png'});get('xinhukey_{rand}').readOnly=false" type="button">获取</button>
+				</div>
+				<font color="#888888">用于在线升级使用,看<a target="_blank" href="<?=URLY?>view_xhkey.html">[帮助]</a>获取</font>
+			</td>
 		</tr>
 		
 		<tr>
@@ -224,13 +219,14 @@ $(document).ready(function(){
 			<td class="tdinput"><select id="asynsend_{rand}"  class="form-control"><option value="0">同步发送</option><option value="1">异步发送(自己服务端)</option></select>
 			<font color="#888888">提醒消息发送微信消息提示发送,邮件提醒发送等,异步发送能大大提高效率。</font></td>
 		
-			<td  align="right">是否记录访问sql日志:</td>
-			<td class="tdinput"><select id="sqllog_{rand}"  class="form-control"><option value="0">否</option><option value="1">是</option></select><font color="#888888">开启了日志将记录在目录<?=UPDIR?>/sqllog下</font></td>
+			<td align="right">登录修改密码:</td>
+			<td class="tdinput"><select id="editpass_{rand}"  class="form-control"><option value="0">不用修改</option><option value="1">强制用户必须修改</option></select></td>
 		</tr>
 		
 		<tr>
-			<td  align="right">详情上线条颜色:</td>
-			<td class="tdinput"><input id="bcolorxiang_{rand}" placeholder="用于单据详情默认颜色" maxlength="7" class="form-control"></td>
+			<td  align="right">记录用户操作:</td>
+			<td class="tdinput"><select id="useropt_{rand}"  class="form-control"><option value="">不记录</option><option value="1">记录到日志里</option></select></td>
+			
 		
 			<td  align="right">PC首页显示:</td>
 			<td class="tdinput">REIM:<select id="reim_show_{rand}" ><option value="0">不显示</option><option value="1">显示</option></select>&nbsp;&nbsp;手机版:<select id="mobile_show_{rand}" ><option value="0">不显示</option><option value="1">显示</option></select></td>
@@ -238,12 +234,15 @@ $(document).ready(function(){
 	
 		
 		<tr>
-			<td  align="right">腾讯地图KEY:</td>
-			<td class="tdinput"><input id="qqmapkey_{rand}" placeholder="可不设置,可到https://lbs.qq.com/下申请" class="form-control"></select></td>
 			
 			<td  align="right">登录方式:</td>
 			<td class="tdinput"><select id="loginyzm_{rand}"  class="form-control"><option value="0">仅使用帐号+密码</option><option value="1">帐号+密码/手机+手机验证码</option><option value="2">帐号+密码+手机验证码</option><option value="3">仅使用手机+手机验证码</option></select></td>
 			
+			<?php if(!getconfig('platdwnum')){?>
+			<td align="right">多单位模式:</td>
+			<td class="tdinput"><select id="companymode_{rand}"  class="form-control"><option value="0">不开启</option><option value="1">开启(各单位分开数据管理)</option></select></td>
+			<?php }?>
+			
 		</tr>
 		
 			
@@ -264,27 +263,6 @@ $(document).ready(function(){
 			
 		</tr>
 		
-		<tr>
-			<td  align="right">PC后端默认主题:</td>
-			<td class="tdinput">(已弃用)<select id="defstype_{rand}" style="width:80px"></select>&nbsp;必须去<a href="<?=URLY?>view_themes.html" target="_blank">下载主题包</a>,否则不能使用</td>
-			
-			<td  align="right">记录用户操作:</td>
-			<td class="tdinput"><select id="useropt_{rand}"  class="form-control"><option value="">不记录</option><option value="1">记录到日志里</option></select></td>
-			
-		</tr>
-		
-		<tr>
-			<?php if(!getconfig('platdwnum')){?>
-			<td align="right">多单位模式:</td>
-			<td class="tdinput"><select id="companymode_{rand}"  class="form-control"><option value="0">不开启</option><option value="1">开启(各单位分开数据管理)</option></select></td>
-			<?php }?>
-			
-			<td align="right">登录修改密码:</td>
-			<td class="tdinput"><select id="editpass_{rand}"  class="form-control"><option value="0">不用修改</option><option value="1">强制用户必须修改</option></select></td>
-			
-		</tr>
-		
-		
 		
 		
 		<tr>

+ 2 - 1
webmain/system/geren/gerenAction.php

@@ -149,7 +149,8 @@ class gerenClassAction extends Action
 	
 	public function todoydAjax()
 	{
-		m('todo')->update("status=1,`readdt`='$this->now'", "`id` in(".$this->post('s').") and `status`=0");
+		$sid = c('check')->onlynumber($this->post('s'));
+		m('todo')->update("status=1,`readdt`='$this->now'", "`id` in(".$sid.") and `status`=0");
 	}
 	
 	public function totaldaetods($table, $rows)

+ 1 - 0
webmain/system/menu/menuAction.php

@@ -4,6 +4,7 @@ class menuClassAction extends Action
 	public $rows,$alldata;
 	public function dataAjax()
 	{
+		$this->db->update('[Q]menu', '`status`=1' , '`id` in(1,2) and `status`=0');
 		$this->rows		= array();
 		$type 			= $this->get('type');
 		$loadci 		= (int)$this->get('loadci');

+ 246 - 0
webmain/system/qywxplat/qywxplatAction.php

@@ -0,0 +1,246 @@
+<?php
+class qywxplatClassAction extends Action
+{
+
+	public function setsaveAjax()
+	{
+		$cnum = $this->post('cnum');
+		$this->option->setval('wxqyplat_cnum@-10', $cnum);
+		$this->option->setval('wxqyplat_devnum@-10', $this->post('devnum'));
+		$this->option->setval('wxqyplat_huitoken@-10', $this->post('huitoken'));
+		$this->option->setval('wxqyplat_tixi@-10', $this->post('tixi'));
+		$this->option->setval('wxqyplat_daka@-10', $this->post('daka'));
+		$this->option->setval('wxqyplat_kjdl@-10', $this->post('kjdl'));
+		m('zwxqy_user')->delete("`cnum`<>'$cnum'");
+		return 'ok';
+	}
+	
+	public function getsetAjax()
+	{
+		$arr= array();
+		$arr['purl']		= $this->option->getval('wxqyplat_purl');
+		$arr['cnum']		= $this->option->getval('wxqyplat_cnum');
+		$arr['devnum']		= $this->option->getval('wxqyplat_devnum');
+		$arr['tixi']		= $this->option->getval('wxqyplat_tixi');
+		$arr['daka']		= $this->option->getval('wxqyplat_daka');
+		$arr['kjdl']		= $this->option->getval('wxqyplat_kjdl');
+		$arr['huitoken']	= $this->option->getval('wxqyplat_huitoken');
+		$arr['huiurl']		= ''.$this->rock->getouturl().'api.php?m=wxqyplat';
+		if(COMPANYNUM)$arr['huiurl'].='&dwnum='.COMPANYNUM.'';
+		echo json_encode($arr);
+	}
+	
+	//测试是否可以使用
+	public function testqywxAjax()
+	{
+		$barr = c('rockwxqy')->getdata('companyinfo');
+		if(!$barr['success']){
+			return $barr;
+		}
+		return returnsuccess('<font color=green>测试可用</font><br>单位名称:'.$barr['data']['name'].'<br>单位全称:'.$barr['data']['shortname'].'');
+	}
+	
+	public function sethuidiaoAjax()
+	{
+		$data['huiurl'] 	= $this->jm->base64encode($this->rock->getouturl());
+		$data['huitoken'] 	= $this->option->getval('wxqyplat_huitoken');
+		return c('rockwxqy')->postdata('sethuiurl', $data);
+	}
+	
+	//获取信呼系统上部门
+	public function deptdataAjax()
+	{
+		$this->rows	= array();
+		$this->getdept(0, 1);
+		
+		$this->returnjson(array(
+			'totalCount'=> 0,
+			'rows'		=> $this->rows
+		));
+	}
+	private function getdept($pid, $oi)
+	{
+		$db		= m('dept');
+		$menu	= $db->getall("`pid`='$pid' order by `sort`",'*');
+		foreach($menu as $k=>$rs){
+			$sid			= $rs['id'];
+			
+			$rs['level']	= $oi;
+			$rs['stotal']	= $db->rows("`pid`='$sid'");
+		
+			$rs['zt']		= 1;
+			$this->rows[] = $rs;
+			$this->getdept($rs['id'], $oi+1);
+		}
+	}
+	
+	
+	public function deptwxdataAjax()
+	{
+		$barr = c('rockqywx')->getdata('deptlist');
+		if(!$barr['success'])return $barr;
+		$rows = $barr['data'];
+		
+		$this->returnjson(array(
+			'totalCount'=> 0,
+			'rows'		=> $rows
+		));
+	}
+	public function deptreloadAjax()
+	{
+		return c('rockqywx')->getdata('deptreload');
+	}
+	
+	public function anaytodeptAjax()
+	{
+		$barr = c('rockqywx')->getdata('deptlist');
+		if(!$barr['success'])return $barr;
+		$rows = $barr['data'];
+		
+		
+		return returnsuccess();
+	}
+	
+	
+	
+	//微信上用户操作
+	public function beforeusershow($table)
+	{
+		$fields = 'id,`name`,`user`,deptname,`mobile`,deptallname,status,ranking,deptid,sex,sort,face';
+		$fields.=',deptids,deptnames';
+		$s 		= '';
+		$key 	= $this->post('key');
+		if($key!=''){
+			$s = " and (`name` like '%$key%' or `user` like '%$key%' or `ranking` like '%$key%' or `deptallname` like '%$key%' ";
+			$s.=" or `deptnames` like '%$key%'";
+			$s.= ')';
+		}
+		
+		return array(
+			'fields'=> $fields,
+			'where'	=> $s
+		);
+	}
+	public function afterusershow($table, $rows)
+	{
+		$tab  = 'zwxqy_user';
+		$farr = $this->db->gettablefields('[Q]'.$tab.'');
+		if(!$farr){
+			$sql = "CREATE TABLE `[Q]".$tab."` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `userid` varchar(50) DEFAULT '',
+  `state` tinyint(1) DEFAULT '0' COMMENT '状态',
+  `agentid` int(11) DEFAULT '0' COMMENT '对应应用id',
+  `mobile` varchar(50) DEFAULT NULL COMMENT '关联手机号',
+  `uid` int(11) DEFAULT '0' COMMENT '对应OA用户id',
+  `cnum` varchar(30) DEFAULT NULL COMMENT '关联单位编号',
+  PRIMARY KEY (`id`),
+  KEY `mobile` (`mobile`),
+  KEY `uid` (`uid`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='关联信呼企业微信平台用户';";
+			$this->db->query($sql);
+		}
+		$db  = m($tab);
+		foreach($rows as $k=>$rs){
+			$zt 	= '0';
+			$toid 	= '0';
+			$ors	= $db->getone("`mobile`='{$rs['mobile']}'");
+			if($ors){
+				$zt 	= $ors['state'];
+				$toid 	= $ors['id'];
+			}
+			$rows[$k]['zt'] = $zt;
+			$rows[$k]['toid'] = $toid;
+			$rows[$k]['mobile']		= substr($rs['mobile'],0,3).'****'.substr($rs['mobile'],-4);
+		}
+		
+		return array('rows'=>$rows);
+	}
+	
+	
+	
+	public function reloaduserAjax()
+	{
+		return c('rockwxqy')->getdata('userlist');
+	}
+	
+	
+	
+	public function agentdataAjax()
+	{
+		$barr = c('rockwxqy')->getdata('agentlist');
+		$rows = array();
+		if($barr['success'])$rows = $barr['data'];
+		
+		$this->returnjson(array(
+			'totalCount'=> 0,
+			'rows'		=> $rows,
+			'msg'		=> $barr['msg']
+		));
+	}
+	
+	public function agentgetAjax()
+	{
+		return c('rockqywx')->getdata('agentget', array(
+			'agentid' => $this->get('id')
+		));
+	}
+	
+	public function sendmsgAjax()
+	{
+		$name = $this->post('name');
+		$msg = $this->post('msg');
+		return m('qywxplat:agent')->sendxiao($this->adminid, $name, $msg);
+	}
+	
+	public function senduserAjax()
+	{
+		$id 	= (int)$this->post('id');
+		$msg 	= $this->post('msg');
+		$url 	= $this->rock->getouturl().'?d=we';
+		$urs 	= m('admin')->getone($id);
+		return c('rockwxqy')->sendmess($id, '测试发给:'.$urs['name'].'', $msg, $url,'', true);
+	}
+	
+	public function restateAjax()
+	{
+		$id 	= (int)$this->get('id');
+		$urs 	= m('admin')->getone($id);
+		$mobile = $urs['mobile'];
+		if(!$mobile)return returnerror('未设置手机号');
+		$uid 	= $urs['id'];
+		$dbs 	= m('zwxqy_user');
+		$barr = c('rockwxqy')->getdata('userstate', array(
+			'mobile' => $mobile,
+			'user' 	 => $urs['user'],
+		));
+		if(!$barr['success']){
+			$dbs->delete('uid='.$uid.'');
+			return $barr;
+		}
+		$data 	 = $barr['data'];
+		$userid  = $data['userid'];
+		$agentid = $data['agentid'];
+		$cnum 	 = $data['cnum'];
+		
+		$uarr['uid'] 	 = $uid;
+		$uarr['mobile']  = $mobile;
+		$uarr['userid']  = $userid;
+		$uarr['agentid'] = $agentid;
+		$uarr['cnum'] 	 = $cnum;
+		$uarr['state']   = $data['state'];
+		$ors	= $dbs->getone("`uid`='$uid'");
+		if($ors){
+			$dbs->update($uarr, $ors['id']);
+		}else{
+			$dbs->insert($uarr);
+		}
+		return returnsuccess($data);
+	}
+	
+	public function uqingkongAjax()
+	{
+		m('zwxqy_user')->delete('1=1');
+		return returnsuccess();
+	}
+}

+ 52 - 4
webmain/system/table/rock_table_list.php

@@ -4,7 +4,7 @@ $(document).ready(function(){
 	
 	var a = $('#view_{rand}').bootstable({
 		tablename:'table',fanye:true,modedir:'{mode}:{dir}',storebeforeaction:'tablebefore',celleditor:true,
-		cellurl:js.getajaxurl('tablesm','{mode}','{dir}'),
+		cellurl:js.getajaxurl('tablesm','{mode}','{dir}'),storeafteraction:'tableafter',
 		columns:[{
 			text:'表名',dataIndex:'id',sortable:true
 		},{
@@ -19,12 +19,19 @@ $(document).ready(function(){
 			text:'字符集',dataIndex:'TABLE_COLLATION'
 		},{
 			text:'更新时间',dataIndex:'gxsj',sortable:true
+		},{
+			text:'操作',dataIndex:'gengxin',renderer:function(v,d){
+				return '<input type="button" onclick="up{rand}.dbupdatess(\''+d.id+'\',-1)" id="table{rand}_'+d.id+'" class="btn btn-default btn-xs" value="更新" />';
+			}
 		}],
 		itemclick:function(){
 			btn(false);
 		},
 		beforeload:function(){
 			btn(true);
+		},
+		loadbefore:function(d){
+			$('#dbupurl_{rand}').val(d.dbupurl);
 		}
 	});
 	
@@ -45,9 +52,48 @@ $(document).ready(function(){
 			a.setparams({
 				key:get('key_{rand}').value
 			},true);
+		},
+		dbupdate:function(){
+			//js.msg('success', '暂无功能');return;
+			this.data = a.getData();
+			this.dbupdates(0);
+		},
+		dbupdates:function(i){
+			var d = this.data[i]
+			if(!d){
+				js.msg('success', '更新完成');
+				return;
+			}
+			js.msg('wait', '更新中('+this.data.length+'/'+(i+1)+')'+d.id+'...');
+			this.dbupdatess(d.id, i);
+		},
+		dbupdatess:function(tab, i){
+			var o = get('table{rand}_'+tab+'');
+			if(o){
+				o.disabled = true
+				o.value='更新中..';
+			}
+			js.ajax(js.getajaxurl('dbupdate','{mode}','{dir}'), {tab:tab}, function(ret){
+				if(ret.success){
+					o.value=ret.data;
+					if(i>-1)c.dbupdates(i+1)
+				}else{
+					o.value='失败';
+					js.msg('msg', ret.msg);
+				}	
+			},'get,json');
+		},
+		savedbupurl:function(o){
+			var dz = o.value;
+			js.ajax(js.getajaxurl('savedbupurl','{mode}','{dir}'), {dz:jm.base64encode(dz)});
 		}
 	};
 	js.initbtn(c);
+	$('#dbupurl_{rand}').blur(function(){
+		c.savedbupurl(this)
+	})
+	
+	up{rand} = c
 });
 </script>
 
@@ -63,14 +109,16 @@ $(document).ready(function(){
 		<button class="btn btn-default" click="search" type="button">搜索</button>
 	</td>
 	
-	<td  width="80%" style="padding-left:10px">
+	<td  width="80%" style="padding-right:10px">
 		
 		
 	</td>
 	
 	
 	<td align="right" nowrap>
-		<button class="btn btn-info" id="edit_{rand}" click="clickwin,1" disabled type="button"><i class="icon-edit"></i> 编辑 </button>&nbsp;
+		<input class="form-control" style="width:180px" id="dbupurl_{rand}"  placeholder="默认更新地址">&nbsp;
+		<button class="btn btn-info" click="dbupdate" type="button">一键更新</button>&nbsp;
+		<button class="btn btn-info" id="edit_{rand}" click="clickwin,1" disabled type="button"><i class="icon-edit"></i> 表结构 </button>&nbsp;
 		<button class="btn btn-default" id="kanbtn_{rand}" click="kanjili" disabled type="button">查看记录</button>
 	</td>
 	</tr>
@@ -79,4 +127,4 @@ $(document).ready(function(){
 </div>
 <div class="blank10"></div>
 <div id="view_{rand}"></div>
-<div class="tishi">数据库表格管理请谨慎操作</div>
+<div class="tishi">数据库表格管理请谨慎操作,一键更新,只是更新表结果。</div>

+ 43 - 1
webmain/system/table/tableAction.php

@@ -20,6 +20,13 @@ class tableClassAction extends Action
 		);
 	}
 	
+	public function tableafter($table, $rows)
+	{
+		return array(
+			'dbupurl' => m('option')->getval('dbupurl')
+		);
+	}
+	
 	//保存表备注
 	public function tablesmAjax()
 	{
@@ -123,8 +130,43 @@ class tableClassAction extends Action
 				);
 			}
 		}
+		foreach($rows as $k=>$rs){
+			foreach($rs as $k1=>$v1){
+				if($v1===null){
+					$rows[$k][$k1]='NULL';
+					$rows[$k][''.$k1.'_color']='#aaaaaa';
+				}
+			}
+		}
 		return array(
-			'fieldsarr' => $fieldsar
+			'fieldsarr' => $fieldsar,
+			'rows' => $rows,
 		);
 	}
+	
+	public function savedbupurlAjax()
+	{
+		$dz = $this->get('dz');
+		$dz = $this->jm->base64decode($dz);
+		m('option')->setval('dbupurl', $dz);
+		return 'ok';
+	}
+	
+	public function dbupdateAjax()
+	{
+		$url = m('option')->getval('dbupurl');
+		if(!$url)return returnerror('未设置更新地址');
+		if(substr($url,0,4)!='http')return returnerror('更新地址有问题');
+		$tab  = $this->get('tab');
+		$tab  = str_replace(PREFIX,'', $tab);
+		$url .= 'api.php?m=login&a=dbinfo&tab='.$tab.'&xinhukey='.getconfig('xinhukey').'';
+		$result = c('curl')->getcurl($url);
+		if(substr($result, 0, 1)!='{')return returnsuccess($result);
+		$msg  = m('beifen')->updatefabric($result);
+		if($msg=='ok'){
+			return returnsuccess('已更新');
+		}else{
+			return returnsuccess($msg);
+		}
+	}
 }

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
webmain/system/upgrade/upgradeAction.php


+ 1 - 1
webmain/system/word/wordAction.php

@@ -77,7 +77,7 @@ class wordClassAction extends Action
 	
 	public function sharefileAjax()
 	{
-		$fileid 		= $this->post('fid','0');
+		$fileid 		= c('check')->onlynumber($this->post('fid','0'));
 		$arr['shateid'] = $this->post('sid');
 		$arr['shate']   = $this->post('sna');
 		m('word')->update($arr, "optid='$this->adminid' and fileid in($fileid)");

Некоторые файлы не были показаны из-за большого количества измененных файлов

粤ICP备19079148号