Browse Source

1.7.0 版本

likeku 8 years ago
parent
commit
a5fbbaf57c
48 changed files with 4205 additions and 32 deletions
  1. BIN
      global/css/images/ui-icons_444444_256x240.png
  2. BIN
      global/css/images/ui-icons_555555_256x240.png
  3. BIN
      global/css/images/ui-icons_777620_256x240.png
  4. BIN
      global/css/images/ui-icons_777777_256x240.png
  5. BIN
      global/css/images/ui-icons_cc0000_256x240.png
  6. BIN
      global/css/images/ui-icons_ffffff_256x240.png
  7. 7 0
      global/css/jquery-ui.min.css
  8. 13 3
      global/css/style.css
  9. 22 10
      global/js/jl.js
  10. 8 0
      global/js/jquery-ui.min.js
  11. BIN
      global/signpath/signavatar.png
  12. 591 0
      jlweb1.7.0.sql
  13. 27 0
      protected/class/auth.php
  14. 8 0
      protected/class/profile.php
  15. 183 0
      protected/class/sign.php
  16. 1 0
      protected/config/acl.conf.php
  17. 67 0
      protected/config/routes.conf.php
  18. 1 1
      protected/config/ver.conf.php
  19. 311 1
      protected/controller/ClientController.php
  20. 8 2
      protected/controller/ProjectController.php
  21. 7 2
      protected/controller/RProjectController.php
  22. 8 2
      protected/controller/SProjectController.php
  23. 33 1
      protected/controller/ShareController.php
  24. 934 0
      protected/controller/SignController.php
  25. 8 3
      protected/controller/UserController.php
  26. 34 0
      protected/model/sign.php
  27. 24 0
      protected/model/signatt.php
  28. 26 0
      protected/model/signaudit.php
  29. 25 0
      protected/model/signauditatt.php
  30. 3 1
      protected/model/uprofile.php
  31. 11 0
      protected/module/admin/controller/AdminController.php
  32. 2 2
      protected/module/admin/controller/ProController.php
  33. 8 2
      protected/module/admin/model/measureaudit.php
  34. 61 1
      protected/module/admin/view/admin-editUser.html
  35. 1 1
      protected/view/left.html
  36. 125 0
      protected/view/sign-create_sign.html
  37. 39 0
      protected/view/sign-index.html
  38. 127 0
      protected/view/sign-list-all.html
  39. 118 0
      protected/view/sign-list-done_sign.html
  40. 190 0
      protected/view/sign-list-my_create.html
  41. 75 0
      protected/view/sign-list-need_sign.html
  42. 131 0
      protected/view/sign-list-on_sign.html
  43. 46 0
      protected/view/sign-share.html
  44. 117 0
      protected/view/sign-view-page.html
  45. 276 0
      protected/view/sign-view-set_signer.html
  46. 307 0
      protected/view/sign-view-signer_sign.html
  47. 75 0
      protected/viewc/sign-list-need_sign.php
  48. 147 0
      在线签署.sql

BIN
global/css/images/ui-icons_444444_256x240.png


BIN
global/css/images/ui-icons_555555_256x240.png


BIN
global/css/images/ui-icons_777620_256x240.png


BIN
global/css/images/ui-icons_777777_256x240.png


BIN
global/css/images/ui-icons_cc0000_256x240.png


BIN
global/css/images/ui-icons_ffffff_256x240.png


File diff suppressed because it is too large
+ 7 - 0
global/css/jquery-ui.min.css


+ 13 - 3
global/css/style.css

@@ -1043,10 +1043,18 @@ left:5px
   box-sizing: border-box;
   box-sizing: border-box;
 }
 }
 .sign-content .page{
 .sign-content .page{
+  margin:0 auto;
+  width:1085px;
+  border: 9px solid transparent;
+  position: relative;
+  overflow: hidden;
+}
+.warp-printer .page{
+  margin:0 auto;
+  width:1085px;
   border: 9px solid transparent;
   border: 9px solid transparent;
   position: relative;
   position: relative;
   overflow: hidden;
   overflow: hidden;
-  text-align: center
 }
 }
 .sign-side{
 .sign-side{
   width:220px;
   width:220px;
@@ -1103,7 +1111,8 @@ left:5px
   top:10%;
   top:10%;
   left:10%;
   left:10%;
   z-index: 999;
   z-index: 999;
-  width:300px
+  width:300px;
+  height: 150px;
 }
 }
 .user-sign .focus{
 .user-sign .focus{
   background:rgba(255,0,0,0.1);
   background:rgba(255,0,0,0.1);
@@ -1122,7 +1131,8 @@ left:5px
 .user-sign:hover .img-bar{
 .user-sign:hover .img-bar{
   display: block;
   display: block;
 }
 }
-#draggable{
+.draggable{
+  display: none;
   cursor: move;
   cursor: move;
 }
 }
 .user-sign .img-bar a{
 .user-sign .img-bar a{

+ 22 - 10
global/js/jl.js

@@ -1,4 +1,5 @@
 function autoFlashHeight() {
 function autoFlashHeight() {
+    var signSide = $(".sign-side").width();
     $(".body").height($(window).height());
     $(".body").height($(window).height());
     $(".mainContainer").height($(window).height() - 51);
     $(".mainContainer").height($(window).height() - 51);
     $(".adminContent").height($(window).height() - 117);
     $(".adminContent").height($(window).height() - 117);
@@ -6,33 +7,44 @@ function autoFlashHeight() {
     $(".jlTable").height($(window).height() - 101);
     $(".jlTable").height($(window).height() - 101);
     $(".misTable").height($(window).height() - 228);
     $(".misTable").height($(window).height() - 228);
     $(".topBanner").height($(window).height() - 65);
     $(".topBanner").height($(window).height() - 65);
-    if($(this).hasClass('tablelist'))
-    $(".tablelist").tablesorter({widthFixed: true});
-}
+    $(".filesWrap").height($(window).height() - 170);
+    $(".filesList").height($(window).height() - 170);
+    $(".sign-content").height($(window).height() - 112);
+    $(".sign-content").width($(window).width() - signSide - 69);
+    $(".sign-content-warp").height($(window).height() - 30);
+    $(".sign-content-warp").width($(window).width());
+};
 $(window).resize(autoFlashHeight);
 $(window).resize(autoFlashHeight);
 
 
 $(function () {
 $(function () {
+
 //滑动二级页面
 //滑动二级页面
     $("#opensidebar").click(function () {
     $("#opensidebar").click(function () {
-	$(".slidePanel").animate({right: "0"}, "5000")
+        $(".slidePanel").animate({right: "0"}, "5000")
     });
     });
     $(".closePanel").click(function () {
     $(".closePanel").click(function () {
-	$(".slidePanel").animate({right: "-100%"}, "3000")
+        $(".slidePanel").animate({right: "-100%"}, "3000")
     });
     });
     //添加工作组选择工作伙伴
     //添加工作组选择工作伙伴
     $(".partner input").click(function () {
     $(".partner input").click(function () {
-	$(this).parent("li").toggleClass("focus")
+        $(this).parent("li").toggleClass("focus")
     });
     });
     $('*[data-toggle=tooltip]').mouseover(function () {
     $('*[data-toggle=tooltip]').mouseover(function () {
-	$(this).tooltip('show');
+        $(this).tooltip('show');
     });
     });
     function waveloop1() {
     function waveloop1() {
-	$("#banner_bolang_bg_1").css({"left": "-236px"}).animate({"left": "-1233px"}, 25000, 'linear', waveloop1);
+        $("#banner_bolang_bg_1").css({"left": "-236px"}).animate({"left": "-1233px"}, 25000, 'linear', waveloop1);
     }
     }
+
     function waveloop2() {
     function waveloop2() {
-	$("#banner_bolang_bg_2").css({"left": "0px"}).animate({"left": "-1009px"}, 60000, 'linear', waveloop2);
+        $("#banner_bolang_bg_2").css({"left": "0px"}).animate({"left": "-1009px"}, 60000, 'linear', waveloop2);
     }
     }
+
     waveloop1();
     waveloop1();
     waveloop2();
     waveloop2();
-
+    $('*[data-toggle=tooltip]').mouseover(function () {
+        $(this).tooltip('show');
+    });
 });
 });
+
+

File diff suppressed because it is too large
+ 8 - 0
global/js/jquery-ui.min.js


BIN
global/signpath/signavatar.png


+ 591 - 0
jlweb1.7.0.sql

@@ -0,0 +1,591 @@
+-- phpMyAdmin SQL Dump
+-- version 4.7.0
+-- https://www.phpmyadmin.net/
+--
+-- Host: localhost
+-- Generation Time: 2017-04-14 15:35:57
+-- 服务器版本: 5.7.17-13
+-- PHP Version: 7.0.15-0ubuntu0.16.04.4
+
+SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
+SET AUTOCOMMIT = 0;
+START TRANSACTION;
+SET time_zone = "+00:00";
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_attachment`
+--
+
+CREATE TABLE `jl_attachment` (
+  `aid` int(11) NOT NULL,
+  `pid` mediumint(9) NOT NULL,
+  `stid` mediumint(9) NOT NULL,
+  `mpid` mediumint(9) NOT NULL,
+  `pmid` mediumint(9) NOT NULL,
+  `numpname` smallint(6) NOT NULL,
+  `times` smallint(6) NOT NULL DEFAULT '0',
+  `auditoruid` mediumint(9) NOT NULL,
+  `filepath` char(255) NOT NULL,
+  `ziphashcode` char(32) NOT NULL,
+  `filehashcode` char(32) NOT NULL,
+  `isnew` tinyint(4) NOT NULL DEFAULT '1',
+  `intime` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_auser`
+--
+
+CREATE TABLE `jl_auser` (
+  `auid` mediumint(9) NOT NULL,
+  `auname` char(255) NOT NULL,
+  `aupass` char(255) NOT NULL,
+  `aemail` char(255) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- 转存表中的数据 `jl_auser`
+--
+
+INSERT INTO `jl_auser` (`auid`, `auname`, `aupass`, `aemail`) VALUES
+(1, 'madmin', '$2a$08$TbScA7uWG/VGm6KWqMfkiOAuCdC4wqRlSWcafwObi5PS71jJVXXve', '');
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_config`
+--
+
+CREATE TABLE `jl_config` (
+  `conid` tinyint(4) NOT NULL,
+  `proname` char(255) NOT NULL,
+  `onoff` tinyint(2) NOT NULL DEFAULT '0',
+  `upgradeinfo` text NOT NULL,
+  `smsswitch` tinyint(4) NOT NULL DEFAULT '1'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- 转存表中的数据 `jl_config`
+--
+
+INSERT INTO `jl_config` (`conid`, `proname`, `onoff`, `upgradeinfo`, `smsswitch`) VALUES
+(1, '', 0, '', 1);
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_item_attachment`
+--
+
+CREATE TABLE `jl_item_attachment` (
+  `iaid` mediumint(11) NOT NULL,
+  `ownerid` smallint(11) NOT NULL,
+  `pid` int(11) NOT NULL DEFAULT '0',
+  `pmid` int(11) NOT NULL DEFAULT '0',
+  `filename` varchar(255) NOT NULL,
+  `fileext` char(5) NOT NULL,
+  `filesize` char(255) NOT NULL,
+  `filepath` char(255) NOT NULL,
+  `intime` int(11) NOT NULL,
+  `isdel` tinyint(2) NOT NULL DEFAULT '0'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_item_measure_numofper`
+--
+
+CREATE TABLE `jl_item_measure_numofper` (
+  `imnid` int(11) NOT NULL,
+  `iaid` int(11) NOT NULL,
+  `pid` int(11) NOT NULL,
+  `pmid` int(11) NOT NULL,
+  `numpname` smallint(6) NOT NULL,
+  `softwareitemid` int(11) NOT NULL,
+  `isdel` tinyint(4) NOT NULL DEFAULT '0',
+  `intime` int(11) NOT NULL DEFAULT '0',
+  `deltime` int(11) NOT NULL DEFAULT '0',
+  `deluid` mediumint(9) NOT NULL,
+  `ownerid` mediumint(9) NOT NULL DEFAULT '0',
+  `categoryid` mediumint(9) NOT NULL DEFAULT '0',
+  `tips` text NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_measure_audit`
+--
+
+CREATE TABLE `jl_measure_audit` (
+  `maid` smallint(6) NOT NULL,
+  `pid` mediumint(9) NOT NULL,
+  `creatoruid` mediumint(9) NOT NULL,
+  `auditoruid` mediumint(9) NOT NULL DEFAULT '0',
+  `mpid` mediumint(9) NOT NULL DEFAULT '0',
+  `pmid` mediumint(9) NOT NULL,
+  `stid` mediumint(9) NOT NULL,
+  `numpname` mediumint(9) NOT NULL,
+  `times` smallint(6) NOT NULL DEFAULT '0',
+  `mastatus` enum('uncheck','checking','checked','checkno') NOT NULL DEFAULT 'uncheck',
+  `last` tinyint(4) NOT NULL DEFAULT '2',
+  `audittime` int(11) NOT NULL,
+  `auditcontent` text,
+  `intime` int(11) DEFAULT NULL,
+  `onlineaudit` tinyint(4) NOT NULL DEFAULT '0'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_measure_numofper`
+--
+
+CREATE TABLE `jl_measure_numofper` (
+  `mpid` mediumint(9) NOT NULL,
+  `iszero` tinyint(3) UNSIGNED NOT NULL,
+  `uid` mediumint(9) NOT NULL,
+  `pid` smallint(6) UNSIGNED NOT NULL,
+  `pmid` smallint(5) UNSIGNED NOT NULL,
+  `stid` smallint(5) UNSIGNED NOT NULL,
+  `numpname` smallint(5) UNSIGNED NOT NULL,
+  `times` smallint(6) NOT NULL DEFAULT '0',
+  `currcontractval` char(255) NOT NULL COMMENT '本期合同计量',
+  `currchangeval` char(255) NOT NULL COMMENT '本期数量变更计量',
+  `stopnowtotal` char(255) NOT NULL COMMENT '截止上期累计完成',
+  `currdone` char(255) NOT NULL COMMENT '本期完成计量',
+  `curralltotal` char(255) NOT NULL COMMENT '累计完成计量',
+  `currstatus` enum('uncheck','checking','checked','checkno') NOT NULL DEFAULT 'checking',
+  `audittime` int(11) NOT NULL,
+  `intime` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_project`
+--
+
+CREATE TABLE `jl_project` (
+  `pid` int(11) NOT NULL,
+  `uid` mediumint(9) NOT NULL,
+  `pname` char(255) NOT NULL,
+  `intime` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_project_measure`
+--
+
+CREATE TABLE `jl_project_measure` (
+  `pmid` int(11) NOT NULL,
+  `pid` mediumint(8) DEFAULT '0',
+  `stid` mediumint(8) NOT NULL DEFAULT '0',
+  `uid` mediumint(9) NOT NULL,
+  `pmname` char(255) DEFAULT NULL,
+  `contracttotal` char(255) NOT NULL DEFAULT '0',
+  `intime` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_section_type`
+--
+
+CREATE TABLE `jl_section_type` (
+  `stid` int(11) NOT NULL,
+  `pid` mediumint(8) NOT NULL DEFAULT '0',
+  `uid` mediumint(9) NOT NULL,
+  `stname` char(255) NOT NULL,
+  `stkey` char(255) NOT NULL,
+  `intime` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_share`
+--
+
+CREATE TABLE `jl_share` (
+  `sid` mediumint(8) UNSIGNED NOT NULL,
+  `hashcode` char(255) NOT NULL,
+  `ids` int(11) NOT NULL,
+  `idtype` tinyint(3) UNSIGNED NOT NULL,
+  `intime` int(10) UNSIGNED NOT NULL,
+  `endtime` int(10) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign`
+--
+
+CREATE TABLE `jl_sign` (
+  `sid` int(11) NOT NULL COMMENT '主键',
+  `project` int(11) NOT NULL COMMENT '项目主键',
+  `tender` int(11) NOT NULL COMMENT '标段主键',
+  `phaseno` int(11) NOT NULL COMMENT '期数',
+  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '报表名',
+  `ownuid` smallint(6) NOT NULL COMMENT '生成人id',
+  `intime` int(11) NOT NULL COMMENT '生成时间',
+  `pagenum` smallint(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT '共有多少张报表,未解压默认为0',
+  `widhei` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '报表纸张大小 以mm为单位',
+  `audituid` smallint(6) UNSIGNED DEFAULT NULL COMMENT '发起人id',
+  `aintime` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '发起时间',
+  `status` enum('uncheck','checking','checked') NOT NULL DEFAULT 'uncheck' COMMENT '签署状态',
+  `sintime` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '签署完成时间',
+  `ishare` tinyint(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否分享,0不分享(默认),1分享'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='在线签署报表信息表';
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign_attachment`
+--
+
+CREATE TABLE `jl_sign_attachment` (
+  `said` int(11) UNSIGNED NOT NULL COMMENT '主键',
+  `sid` int(11) UNSIGNED NOT NULL COMMENT '报表id主键',
+  `curnum` smallint(5) UNSIGNED NOT NULL COMMENT '编号,第几张',
+  `filepath` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '报表文件路径'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='签署文件信息表';
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign_audit`
+--
+
+CREATE TABLE `jl_sign_audit` (
+  `satid` int(11) UNSIGNED NOT NULL COMMENT '主键',
+  `sid` int(11) UNSIGNED NOT NULL COMMENT '报表id主键',
+  `status` enum('uncheck','checking','checked') NOT NULL DEFAULT 'uncheck' COMMENT '个人签署状态',
+  `audituid` int(11) UNSIGNED NOT NULL COMMENT '签署人id',
+  `aname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '签署人姓名',
+  `intime` int(11) NOT NULL COMMENT '签署时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户签署表';
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign_audit_attachment`
+--
+
+CREATE TABLE `jl_sign_audit_attachment` (
+  `saaid` int(11) NOT NULL COMMENT '主键',
+  `audituid` int(11) NOT NULL COMMENT '签署人id',
+  `said` int(11) NOT NULL COMMENT '报表文件id',
+  `picpath` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '签名图片地址',
+  `position` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '签名所在位置'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户签名关联表' ROW_FORMAT=COMPACT;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_users`
+--
+
+CREATE TABLE `jl_users` (
+  `uid` int(11) NOT NULL,
+  `uemail` char(255) NOT NULL,
+  `upass` char(60) NOT NULL,
+  `intime` int(11) NOT NULL,
+  `isstop` tinyint(1) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_users_auth`
+--
+
+CREATE TABLE `jl_users_auth` (
+  `aid` int(11) NOT NULL,
+  `token` char(255) NOT NULL,
+  `expirestime` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_users_friends`
+--
+
+CREATE TABLE `jl_users_friends` (
+  `uid` int(11) NOT NULL,
+  `fuid` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_user_profiles`
+--
+
+CREATE TABLE `jl_user_profiles` (
+  `userid` int(11) NOT NULL,
+  `name` char(50) NOT NULL,
+  `company` char(255) NOT NULL,
+  `jobs` char(255) NOT NULL,
+  `phone` char(255) NOT NULL,
+  `mobile` char(255) NOT NULL,
+  `qq` char(50) NOT NULL,
+  `groups` enum('vip','anonymous') NOT NULL DEFAULT 'anonymous',
+  `avatar` char(255) NOT NULL DEFAULT 'global/avatar/avtra.jpg',
+  `isnotice` tinyint(4) NOT NULL DEFAULT '0',
+  `signpath` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'global/signpath/signavatar.png' COMMENT '签名图片地址',
+  `remark` varchar(500) NOT NULL COMMENT '备注信息'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_zero_audit`
+--
+
+CREATE TABLE `jl_zero_audit` (
+  `zaid` smallint(6) NOT NULL,
+  `uid` int(11) NOT NULL,
+  `catid` int(11) NOT NULL,
+  `auditstatus` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Indexes for dumped tables
+--
+
+--
+-- Indexes for table `jl_attachment`
+--
+ALTER TABLE `jl_attachment`
+  ADD PRIMARY KEY (`aid`),
+  ADD KEY `isnew` (`isnew`),
+  ADD KEY `numpname` (`numpname`),
+  ADD KEY `times` (`times`);
+
+--
+-- Indexes for table `jl_auser`
+--
+ALTER TABLE `jl_auser`
+  ADD PRIMARY KEY (`auid`);
+
+--
+-- Indexes for table `jl_config`
+--
+ALTER TABLE `jl_config`
+  ADD PRIMARY KEY (`conid`);
+
+--
+-- Indexes for table `jl_item_attachment`
+--
+ALTER TABLE `jl_item_attachment`
+  ADD PRIMARY KEY (`iaid`);
+
+--
+-- Indexes for table `jl_item_measure_numofper`
+--
+ALTER TABLE `jl_item_measure_numofper`
+  ADD PRIMARY KEY (`imnid`);
+
+--
+-- Indexes for table `jl_measure_audit`
+--
+ALTER TABLE `jl_measure_audit`
+  ADD PRIMARY KEY (`maid`),
+  ADD UNIQUE KEY `auditoruid` (`auditoruid`,`pmid`,`numpname`,`times`);
+
+--
+-- Indexes for table `jl_measure_numofper`
+--
+ALTER TABLE `jl_measure_numofper`
+  ADD PRIMARY KEY (`mpid`),
+  ADD UNIQUE KEY `pmid_numpname_times` (`pmid`,`numpname`,`times`),
+  ADD UNIQUE KEY `mpid` (`mpid`);
+
+--
+-- Indexes for table `jl_project`
+--
+ALTER TABLE `jl_project`
+  ADD PRIMARY KEY (`pid`);
+
+--
+-- Indexes for table `jl_project_measure`
+--
+ALTER TABLE `jl_project_measure`
+  ADD PRIMARY KEY (`pmid`);
+
+--
+-- Indexes for table `jl_section_type`
+--
+ALTER TABLE `jl_section_type`
+  ADD PRIMARY KEY (`stid`);
+
+--
+-- Indexes for table `jl_share`
+--
+ALTER TABLE `jl_share`
+  ADD PRIMARY KEY (`sid`);
+
+--
+-- Indexes for table `jl_sign`
+--
+ALTER TABLE `jl_sign`
+  ADD PRIMARY KEY (`sid`);
+
+--
+-- Indexes for table `jl_sign_attachment`
+--
+ALTER TABLE `jl_sign_attachment`
+  ADD PRIMARY KEY (`said`);
+
+--
+-- Indexes for table `jl_sign_audit`
+--
+ALTER TABLE `jl_sign_audit`
+  ADD PRIMARY KEY (`satid`);
+
+--
+-- Indexes for table `jl_sign_audit_attachment`
+--
+ALTER TABLE `jl_sign_audit_attachment`
+  ADD PRIMARY KEY (`saaid`);
+
+--
+-- Indexes for table `jl_users`
+--
+ALTER TABLE `jl_users`
+  ADD PRIMARY KEY (`uid`),
+  ADD UNIQUE KEY `uemail` (`uemail`);
+
+--
+-- Indexes for table `jl_users_auth`
+--
+ALTER TABLE `jl_users_auth`
+  ADD PRIMARY KEY (`aid`);
+
+--
+-- Indexes for table `jl_user_profiles`
+--
+ALTER TABLE `jl_user_profiles`
+  ADD UNIQUE KEY `userid` (`userid`);
+
+--
+-- Indexes for table `jl_zero_audit`
+--
+ALTER TABLE `jl_zero_audit`
+  ADD PRIMARY KEY (`zaid`);
+
+--
+-- 在导出的表使用AUTO_INCREMENT
+--
+
+--
+-- 使用表AUTO_INCREMENT `jl_attachment`
+--
+ALTER TABLE `jl_attachment`
+  MODIFY `aid` int(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_auser`
+--
+ALTER TABLE `jl_auser`
+  MODIFY `auid` mediumint(9) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
+--
+-- 使用表AUTO_INCREMENT `jl_config`
+--
+ALTER TABLE `jl_config`
+  MODIFY `conid` tinyint(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
+--
+-- 使用表AUTO_INCREMENT `jl_item_attachment`
+--
+ALTER TABLE `jl_item_attachment`
+  MODIFY `iaid` mediumint(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_item_measure_numofper`
+--
+ALTER TABLE `jl_item_measure_numofper`
+  MODIFY `imnid` int(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_measure_audit`
+--
+ALTER TABLE `jl_measure_audit`
+  MODIFY `maid` smallint(6) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_measure_numofper`
+--
+ALTER TABLE `jl_measure_numofper`
+  MODIFY `mpid` mediumint(9) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_project`
+--
+ALTER TABLE `jl_project`
+  MODIFY `pid` int(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_project_measure`
+--
+ALTER TABLE `jl_project_measure`
+  MODIFY `pmid` int(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_section_type`
+--
+ALTER TABLE `jl_section_type`
+  MODIFY `stid` int(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_share`
+--
+ALTER TABLE `jl_share`
+  MODIFY `sid` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT;COMMIT;
+--
+-- 使用表AUTO_INCREMENT `jl_sign`
+--
+ALTER TABLE `jl_sign`
+  MODIFY `sid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;
+--
+-- 使用表AUTO_INCREMENT `jl_sign_attachment`
+--
+ALTER TABLE `jl_sign_attachment`
+  MODIFY `said` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;
+--
+-- 使用表AUTO_INCREMENT `jl_sign_audit`
+--
+ALTER TABLE `jl_sign_audit`
+  MODIFY `satid` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;
+--
+-- 使用表AUTO_INCREMENT `jl_sign_audit_attachment`
+--
+ALTER TABLE `jl_sign_audit_attachment`
+  MODIFY `saaid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;COMMIT;
+--
+-- 使用表AUTO_INCREMENT `jl_users`
+--
+ALTER TABLE `jl_users`
+  MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_users_auth`
+--
+ALTER TABLE `jl_users_auth`
+  MODIFY `aid` int(11) NOT NULL AUTO_INCREMENT;
+--
+-- 使用表AUTO_INCREMENT `jl_zero_audit`
+--
+ALTER TABLE `jl_zero_audit`
+  MODIFY `zaid` smallint(6) NOT NULL AUTO_INCREMENT;COMMIT;
+
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

+ 27 - 0
protected/class/auth.php

@@ -113,6 +113,33 @@ class Auth
         return Doo::conf()->APP_URL . $valArray['avatar'];
         return Doo::conf()->APP_URL . $valArray['avatar'];
     }
     }
 
 
+     public function getSignpath($uid)
+    {
+        $valArray = $this->profile->getOne(array('where' => 'userid=?', 'param' => array($uid), 'asArray' => TRUE));
+        return Doo::conf()->APP_URL . $valArray['signpath'];
+    }
+
+    public function getName($uid)
+    {
+        $name = $this->profile->getOne(array('select' => 'name', 'where' => 'userid=?', 'param' => array($uid), 'asArray' => TRUE));
+        return $name['name'];
+    }
+
+    public function getRowByUid($uid)
+    {
+        return $this->profile->getOne(array('where' => 'userid=?', 'param' => array($uid), 'asArray' => TRUE));
+    }
+
+    public function checkUserEmail($email)
+    {
+        $result = $this->users->getOne(array('select' => 'uid', 'where' => 'uemail=?', 'param' => array($email), 'asArray' => TRUE));
+        if(!empty($result)){
+            return $this->profile->getOne(array('where' => 'userid=?', 'param' => array($result['uid']), 'asArray' => TRUE));
+        }else{
+            return '';
+        }
+    }
+
     public function checkLogin($uemail, $upasswd)
     public function checkLogin($uemail, $upasswd)
     {
     {
         return $this->user->login($uemail, $upasswd);
         return $this->user->login($uemail, $upasswd);

+ 8 - 0
protected/class/profile.php

@@ -51,6 +51,14 @@ class Profile
         return $this->uprofile->update(array('where' => 'userid=?', 'param' => array($userid)));
         return $this->uprofile->update(array('where' => 'userid=?', 'param' => array($userid)));
     }
     }
 
 
+    public function setSignPath($userid = 0, $avaurl)
+    {
+        if (!isset($userid))
+            return FALSE;
+        $this->uprofile->signpath = $avaurl;
+        return $this->uprofile->update(array('where' => 'userid=?', 'param' => array($userid)));
+    }
+
     public function upProfile($userid, $proArray)
     public function upProfile($userid, $proArray)
     {
     {
         $this->uprofile->name = $proArray['name'];
         $this->uprofile->name = $proArray['name'];

+ 183 - 0
protected/class/sign.php

@@ -0,0 +1,183 @@
+<?php
+
+Doo::loadModel('sign');
+Doo::loadModel('signatt');
+Doo::loadModel('signaudit');
+Doo::loadModel('signauditatt');
+
+class Signn
+{
+
+    private $_sign,$_signatt,$_signaudit,$_signauditatt;
+
+    function __construct()
+    {
+        $this->_sign = new Sign();
+        $this->_signatt = new SignAtt();
+        $this->_signaudit = new SignAudit();
+        $this->_signauditatt = new SignAuditAtt();
+    }
+
+    public function getNeedSignNumbyUid($uid){
+        return $this->_signaudit->count(array('where' => 'audituid=? and status="checking"', 'param' => array($uid), 'asArray' => TRUE));
+    }
+
+    public function getMySignNumbyUid($uid,$sql =' 1'){
+        return $this->_sign->count(array('where' => $sql.' and audituid=?', 'param' => array($uid), 'asArray' => TRUE));
+    }
+
+    public function getUnSignNum($sql,$uid){
+        return $this->_sign->count(array('where' => $sql.' and status="uncheck" AND (`ownuid`='.$uid.' OR tender IN (SELECT pmid FROM jl_measure_audit WHERE auditoruid='.$uid.' GROUP BY auditoruid))', 'asArray' => TRUE));
+    }
+
+    public function getDoingSignNumbyUid($uid, $sql = ' 1'){
+        return $this->_sign->count(array('where' => $sql.' and status="checking" and sid in(select `jl_sign_audit`.sid from `jl_sign_audit` where `jl_sign_audit`.audituid=?)', 'param' => array($uid), 'asArray' => TRUE));
+    }
+
+    public function getDoneSignNumbyUid($uid, $sql = ' 1'){
+        return $this->_sign->count(array('where' => $sql.' and status="checked" and sid in(select `jl_sign_audit`.sid from `jl_sign_audit` where `jl_sign_audit`.audituid=?)', 'param' => array($uid), 'asArray' => TRUE));
+    }
+
+    public function getSignNum($sql,$uid){
+        return $this->_sign->count(array('where' => $sql.' and (`audituid`='.$uid.' OR sid IN (SELECT sid FROM jl_sign_audit WHERE jl_sign_audit.audituid='.$uid.'))','asArray' => TRUE));
+    }
+
+    public function getNeedSignbyUid($uid){
+        return $this->_signaudit->find(array('where' => 'audituid=? and status="checking"', 'param' => array($uid), 'desc' => 'satid', 'asArray' => TRUE));
+    }
+
+    public function getOneSignbysid($sid){
+        return $this->_sign->getOne(array('where' => 'sid=?', 'param' => array($sid), 'asArray' => TRUE));
+    }
+
+    public function getSignAuditList($sid){
+        return $this->_signaudit->find(array('where' => 'sid=?', 'param' => array($sid), 'asArray' => TRUE));
+    }
+
+    public function getisSignbySidUid($sid,$uid){
+        return $this->_signaudit->getOne(array('where' => 'sid=? and audituid=? and status="checking"', 'param' => array($sid,$uid), 'asArray' => TRUE));
+    }
+
+    public function getSignAttList($sid){
+        return $this->_signatt->find(array('where' => 'sid=?', 'param' => array($sid), 'asArray' => TRUE));
+    }
+
+    public function getSignAuditAttList($said){
+        return $this->_signauditatt->find(array('where' => 'said=?', 'param' => array($said), 'asArray' => TRUE));
+    }
+
+    public function getOneSignAudit($sid,$uid){
+        return $this->_signaudit->getOne(array('where' => 'sid=? and audituid=?', 'param' => array($sid,$uid), 'asArray' => TRUE));
+    }
+
+    public function updateSignAudit($satid,$status){
+        $this->_signaudit->satid = $satid;
+        $this->_signaudit->status = $status;
+        if($status == 'checked'){
+            $this->_signaudit->intime = time();
+        }
+        return $this->_signaudit->update();
+    }
+
+    public function insertSignAuditAtt($uid,$said,$path,$position){
+        $this->_signauditatt->audituid = filter_var($uid, FILTER_VALIDATE_INT);
+        $this->_signauditatt->said = filter_var($said, FILTER_VALIDATE_INT);
+        $this->_signauditatt->picpath = filter_var($path, FILTER_SANITIZE_STRING);
+        $this->_signauditatt->position = filter_var($position, FILTER_SANITIZE_STRING);
+        return $this->_signauditatt->insert();
+    }
+
+    public function updateSignStatus($sid){
+        $this->_sign->sid = $sid;
+        $this->_sign->status = 'checked';
+        $this->_sign->sintime = time();
+        return $this->_sign->update();
+    }
+
+    public function updateSignMsg($sid,$uid){
+        $this->_sign->sid = $sid;
+        $this->_sign->status = 'checking';
+        $this->_sign->audituid = $uid;
+        $this->_sign->aintime = time();
+        return $this->_sign->update();
+    }
+
+    public function getDoneSignListbyUid($uid, $sql = ' 1', $limit){
+        return $this->_sign->find(array('where' => $sql.' and status="checked" and sid in(select `jl_sign_audit`.sid from `jl_sign_audit` where `jl_sign_audit`.audituid=?)', 'param' => array($uid), 'desc' => 'sid', 'limit' => $limit, 'asArray' => TRUE));
+    }
+
+    public function getDoingSignListbyUid($uid,$sql = ' 1', $limit){
+        return $this->_sign->find(array('where' => $sql.' and status="checking" and sid in(select `jl_sign_audit`.sid from `jl_sign_audit` where `jl_sign_audit`.audituid=?)', 'param' => array($uid), 'desc' => 'sid', 'limit' => $limit, 'asArray' => TRUE));
+    }
+
+    public function getMySignListbyUid($uid,$sql = ' 1',$limit){
+        return $this->_sign->find(array('where' => $sql.' and audituid=?', 'param' => array($uid), 'desc' => 'sid', 'limit' => $limit, 'asArray' => TRUE));
+    }
+
+    public function updateSignShareStatus($status,$sid){
+        $this->_sign->sid = $sid;
+        $this->_sign->ishare = $status;
+        return $this->_sign->update();
+    }
+
+    public function getUnSignList($sql, $uid, $limit){
+        return $this->_sign->find(array('where' => $sql.' and status="uncheck" AND (`ownuid`='.$uid.' OR tender IN (SELECT pmid FROM jl_measure_audit WHERE auditoruid='.$uid.' GROUP BY auditoruid))', 'desc' => 'sid', 'limit' => $limit, 'asArray' => TRUE));
+    }
+
+    public function getSignList($sql, $limit){
+        return $this->_sign->find(array('where' => $sql, 'desc' => 'sid', 'limit' => $limit, 'asArray' => TRUE));
+    }
+
+    public function insertSign($pid, $tid, $phaseno, $name, $ownuid,$intime,$widhei){
+        $this->_sign->project = $pid;
+        $this->_sign->tender = $tid;
+        $this->_sign->phaseno = $phaseno;
+        $this->_sign->name = $name;
+        $this->_sign->ownuid = $ownuid;
+        $this->_sign->intime = $intime;
+        $this->_sign->widhei = $widhei;
+        return $this->_sign->insert();
+    }
+
+    public function insertSignAtt($sid, $num, $path){
+        $this->_signatt->sid = $sid;
+        $this->_signatt->curnum = $num;
+        $this->_signatt->filepath = $path;
+        return $this->_signatt->insert();
+    }
+
+    public function updateSignPageNum($sid, $pagenum){
+        $this->_sign->sid = $sid;
+        $this->_sign->pagenum = $pagenum;
+        return $this->_sign->update();
+    }
+
+    public function insertSignAudit($sid,$status,$uid,$name){
+        $this->_signaudit->sid = $sid;
+        $this->_signaudit->status = $status;
+        $this->_signaudit->audituid = $uid;
+        $this->_signaudit->aname = $name;
+        return $this->_signaudit->insert();
+    }
+
+    public function getSignListbyClient($sql){
+        return $this->_sign->find(array('where' => $sql, 'asArray' => TRUE));
+    }
+
+    public function getSignbyName($tender,$phaseno,$name){
+        return $this->_sign->getOne(array('where' => 'tender=? and phaseno=? and name=?', 'param' => array($tender,$phaseno,$name), 'asArray' => TRUE));
+    }
+
+    public function getSignGroupByProject($sql = '1'){
+        return $this->_sign->find(array('select' => 'project', 'where' => $sql, 'groupby' => 'project', 'asArray' => TRUE));
+    }
+
+    public function getSignGroupByTender($pid,$sql = ' 1'){
+        return $this->_sign->find(array('select' => 'tender', 'where' => $sql.' and project=?', 'param' => array($pid), 'groupby' => 'tender', 'asArray' => TRUE));
+    }
+
+    public function getSignGroupByPhaseno($pmid,$sql = ' 1'){
+        return $this->_sign->find(array('select' => 'phaseno', 'where' => $sql.' and tender=?', 'param' => array($pmid), 'groupby' => 'phaseno', 'asArray' => TRUE));
+    }
+
+}

+ 1 - 0
protected/config/acl.conf.php

@@ -24,6 +24,7 @@ $acl['vip']['allow'] = array(
     'RProjectController' => '*',
     'RProjectController' => '*',
     'SProjectController' => '*',
     'SProjectController' => '*',
     'UserController' => '*',
     'UserController' => '*',
+    'SignController' => '*'
 );
 );
 //$acl['audit']['allow'] = array(
 //$acl['audit']['allow'] = array(
 //    'CensorController' => '*',
 //    'CensorController' => '*',

+ 67 - 0
protected/config/routes.conf.php

@@ -247,4 +247,71 @@ $route['*']['/share/set'] = array('ShareController', 'setShare');
 
 
 $route['*']['/share/error'] = array('ShareController', 'error');
 $route['*']['/share/error'] = array('ShareController', 'error');
 
 
+// 在线签章
+$route['*']['/sign/index'] = array('SignController', 'index');
+$route['*']['/sign/needlist'] = array('SignController', 'signNeedList');
+$route['*']['/sign/needview/:sid'] = array('SignController', 'signNeedView');
+$route['*']['/sign/donesign'] = array('SignController', 'signDone');
+
+$route['*']['/sign/mylist'] = array('SignController', 'signMyList');
+$route['*']['/sign/mylist/page/:pindex'] = array('SignController', 'signMyList');
+$route['*']['/sign/mylist/project/:pid'] = array('SignController', 'signMyList');
+$route['*']['/sign/mylist/project/:pid/page/:pindex'] = array('SignController', 'signMyList');
+$route['*']['/sign/mylist/project/:pid/tender/:pmid'] = array('SignController', 'signMyList');
+$route['*']['/sign/mylist/project/:pid/tender/:pmid/page/:pindex'] = array('SignController', 'signMyList');
+$route['*']['/sign/mylist/project/:pid/tender/:pmid/phaseno/:mpid'] = array('SignController', 'signMyList');
+$route['*']['/sign/mylist/project/:pid/tender/:pmid/phaseno/:mpid/page/:pindex'] = array('SignController', 'signMyList');
+$route['*']['/sign/changeshare'] = array('SignController', 'signChangeShare');
+
+$route['*']['/sign/onlist'] = array('SignController', 'signOnList');
+$route['*']['/sign/onlist/page/:pindex'] = array('SignController', 'signOnList');
+$route['*']['/sign/onlist/project/:pid'] = array('SignController', 'signOnList');
+$route['*']['/sign/onlist/project/:pid/page/:pindex'] = array('SignController', 'signOnList');
+$route['*']['/sign/onlist/project/:pid/tender/:pmid'] = array('SignController', 'signOnList');
+$route['*']['/sign/onlist/project/:pid/tender/:pmid/page/:pindex'] = array('SignController', 'signOnList');
+$route['*']['/sign/onlist/project/:pid/tender/:pmid/phaseno/:mpid'] = array('SignController', 'signOnList');
+$route['*']['/sign/onlist/project/:pid/tender/:pmid/phaseno/:mpid/page/:pindex'] = array('SignController', 'signOnList');
+
+$route['*']['/sign/donelist'] = array('SignController', 'signDoneList');
+$route['*']['/sign/donelist/page/:pindex'] = array('SignController', 'signDoneList');
+$route['*']['/sign/donelist/project/:pid'] = array('SignController', 'signDoneList');
+$route['*']['/sign/donelist/project/:pid/page/:pindex'] = array('SignController', 'signDoneList');
+$route['*']['/sign/donelist/project/:pid/tender/:pmid'] = array('SignController', 'signDoneList');
+$route['*']['/sign/donelist/project/:pid/tender/:pmid/page/:pindex'] = array('SignController', 'signDoneList');
+$route['*']['/sign/donelist/project/:pid/tender/:pmid/phaseno/:mpid'] = array('SignController', 'signDoneList');
+$route['*']['/sign/donelist/project/:pid/tender/:pmid/phaseno/:mpid/page/:pindex'] = array('SignController', 'signDoneList');
+
+$route['*']['/share'] = array('ShareController', 'signShare');
+
+$route['*']['/sign/create'] = array('SignController', 'signCreate');
+$route['*']['/sign/create/page/:pindex'] = array('SignController', 'signCreate');
+$route['*']['/sign/create/project/:pid'] = array('SignController', 'signCreate');
+$route['*']['/sign/create/project/:pid/page/:pindex'] = array('SignController', 'signCreate');
+$route['*']['/sign/create/project/:pid/tender/:pmid'] = array('SignController', 'signCreate');
+$route['*']['/sign/create/project/:pid/tender/:pmid/page/:pindex'] = array('SignController', 'signCreate');
+$route['*']['/sign/create/project/:pid/tender/:pmid/phaseno/:mpid'] = array('SignController', 'signCreate');
+$route['*']['/sign/create/project/:pid/tender/:pmid/phaseno/:mpid/page/:pindex'] = array('SignController', 'signCreate');
+
+$route['*']['/sign/list'] = array('SignController', 'signList');
+$route['*']['/sign/list/page/:pindex'] = array('SignController', 'signList');
+$route['*']['/sign/list/project/:pid'] = array('SignController', 'signList');
+$route['*']['/sign/list/project/:pid/page/:pindex'] = array('SignController', 'signList');
+$route['*']['/sign/list/project/:pid/tender/:pmid'] = array('SignController', 'signList');
+$route['*']['/sign/list/project/:pid/tender/:pmid/page/:pindex'] = array('SignController', 'signList');
+$route['*']['/sign/list/project/:pid/tender/:pmid/phaseno/:mpid'] = array('SignController', 'signList');
+$route['*']['/sign/list/project/:pid/tender/:pmid/phaseno/:mpid/page/:pindex'] = array('SignController', 'signList');
+
+$route['*']['/sign/set/:sid'] = array('SignController', 'signSignSet');
+$route['*']['/sign/upsigner'] = array('SignController', 'signUpSigner');
+$route['*']['/sign/view/:sid'] = array('SignController', 'signView');
+$route['*']['/sign/search/user'] = array('SignController', 'signSearchUser');
+/**
+ * 创建签署报表
+ */
+$route['*']['/api/client/sign/create'] = array('ClientController', 'getSignCreate');
+/**
+ * 获取报表列表
+ */
+$route['*']['/api/client/sign/list'] = array('ClientController', 'getSignList');
+
 ?>
 ?>

+ 1 - 1
protected/config/ver.conf.php

@@ -1,5 +1,5 @@
 <?php
 <?php
 
 
 // Version
 // Version
-$config['ver'] = 'v1.6.0';
+$config['ver'] = 'v1.7.0';
 
 

+ 311 - 1
protected/controller/ClientController.php

@@ -17,6 +17,7 @@ Doo::loadModel('users');
 Doo::loadClass('itemmeasurenum');
 Doo::loadClass('itemmeasurenum');
 Doo::loadModelAt('aconfig', 'admin');
 Doo::loadModelAt('aconfig', 'admin');
 Doo::loadClass('sms');
 Doo::loadClass('sms');
+Doo::loadClass('sign');
 
 
 /**
 /**
  * MainController
  * MainController
@@ -27,7 +28,7 @@ Doo::loadClass('sms');
 class ClientController extends DooController
 class ClientController extends DooController
 {
 {
 
 
-    private $data, $client, $auth, $att, $file, $zip, $actmeasure, $contractact, $project, $profile, $numofperact, $measureauditact, $attfile, $users, $itemfile, $modelconfig, $aconfig, $sms, $itemMeasureNum;
+    private $data, $sign, $client, $auth, $att, $file, $zip, $actmeasure, $contractact, $project, $profile, $numofperact, $measureauditact, $attfile, $users, $itemfile, $modelconfig, $aconfig, $sms, $itemMeasureNum;
 
 
     private $statusArray = array('uncheck' => '1', 'checking' => '2', 'checked' => '3', 'checkno' => '4');
     private $statusArray = array('uncheck' => '1', 'checking' => '2', 'checked' => '3', 'checkno' => '4');
     private $fileTypeArray = array('台帐附件');
     private $fileTypeArray = array('台帐附件');
@@ -51,6 +52,7 @@ class ClientController extends DooController
         $this->modelconfig = new AConfig();
         $this->modelconfig = new AConfig();
         $this->itemMeasureNum = new ItemMeasureNumpofper();
         $this->itemMeasureNum = new ItemMeasureNumpofper();
         $this->aconfig = new AConfig();
         $this->aconfig = new AConfig();
+        $this->sign = new signn();
         $this->sms = new Sms(Doo::conf()->SMS_URL, Doo::conf()->SMS_AUTHKEY);
         $this->sms = new Sms(Doo::conf()->SMS_URL, Doo::conf()->SMS_AUTHKEY);
     }
     }
 
 
@@ -1427,6 +1429,21 @@ class ClientController extends DooController
         return is_dir($path);
         return is_dir($path);
     }
     }
 
 
+    function dir_create2($path, $mode = 0777)
+    {
+        if (is_dir($path))
+            return TRUE;
+        $path = $this->dir_path($path);
+        $parent = dirname($path);
+        if (!is_dir($parent)){
+            @mkdir($parent, 0777);
+            @chmod($parent, 0777);
+        }
+        @mkdir($path, 0777);
+        @chmod($path, 0777);
+        return is_dir($path);
+    }
+
     function dir_path($path)
     function dir_path($path)
     {
     {
         $path = str_replace('\\', '/', $path);
         $path = str_replace('\\', '/', $path);
@@ -1451,6 +1468,299 @@ class ClientController extends DooController
 //        preg_match();
 //        preg_match();
 //    }
 //    }
 
 
+//在线签署的接口
+    public function getSignCreate(){
+        // TODO:上报数据
+        if (!empty($_FILES['upspdf']['name']) && !empty($_FILES['upfile']['name']) && isset($_POST['project']) && isset($_POST['tender']) && isset($_POST['phaseno']) && isset($_POST['name']) && isset($_POST['ownuid']) && isset($_POST['widhei'])) {
+            //解压压缩包并把图片存到文件夹中
+            @$_POST['name'] = iconv('GBK', 'UTF-8', $_POST['name']);
+            $upfilename = pathinfo($_FILES['upfile']['name']);
+            if($upfilename['extension'] != 'zip'){
+                $status = array('status' => 'FALSE', 'msg' => '上传的文件格式有误');
+                echo json_encode($status, JSON_UNESCAPED_UNICODE);
+                die();
+            }
+            $res = $this->zip->open($_FILES['upfile']['tmp_name']);
+            if ($res === TRUE) {
+
+                $samesignname = $this->sign->getSignbyName($_POST['name']);
+                if(!empty($samesignname)){
+                    $status = array('status' => 'FALSE', 'msg' => '存在同名报表');
+                    echo json_encode($status, JSON_UNESCAPED_UNICODE);
+                    die();
+                }
+                //添加到签署报表中
+                $intime = time();
+                $signid = $this->sign->insertSign($_POST['project'], $_POST['tender'], $_POST['phaseno'], $_POST['name'], $_POST['ownuid'],$intime,$_POST['widhei']);
+
+                $extPathdir = Doo::conf()->SITE_PATH . 'signs/' . $signid;
+                if ($res === TRUE) {
+                    if (!$this->dir_create2($extPathdir)) {
+                        $status = array('status' => 'FALSE', 'msg' => '期数数据上传失败');
+                        echo json_encode($status, JSON_UNESCAPED_UNICODE);
+                        die();
+                    }
+                    $this->zip->extractTo($extPathdir);
+                    $this->zip->close();
+                    $fileanddir = $this->deepScanDir($extPathdir);
+                    sort($fileanddir['file2']);
+                    $sum = 0;
+                    foreach($fileanddir['file2'] as $k =>$v){
+                        $sum++;
+                        $signatt = new signn();
+                        $path = 'signs/'.$signid.'/' . $v . '.jpg';
+                        @chmod(Doo::conf()->SITE_PATH.$path,0777);
+                        $signatt->insertSignAtt($signid,$v,$path);
+                        $this->compressed_image(Doo::conf()->SITE_PATH.$path,Doo::conf()->SITE_PATH.$path);
+                    }
+                    $sign2 = new signn();
+                    $sign2->updateSignPageNum($signid,$sum);
+
+                    $upspdfname = pathinfo($_FILES['upspdf']['name']);
+                    if($upspdfname['extension'] != 'pdf'){
+                        $status = array('status' => 'FALSE', 'msg' => '上传的文件格式有误');
+                        echo json_encode($status, JSON_UNESCAPED_UNICODE);
+                        die();
+                    }
+                    //上传pdf文件
+                    if(!empty($_FILES["upspdf"]['name'])){
+                        $pdf_name = $intime.'.pdf';
+                        $upload_pdf = $extPathdir.'/'.$pdf_name;
+                        $k = move_uploaded_file($_FILES["upspdf"]["tmp_name"], $upload_pdf);
+                        if($k){
+                            $status = array('status' => 'TRUE');
+                            echo json_encode($status, JSON_UNESCAPED_UNICODE);
+                            die();
+                        }
+                    }
+                }
+            }
+            $status = array('status' => 'FALSE', 'msg' => '文件上传失败,请重试');
+            echo json_encode($status, JSON_UNESCAPED_UNICODE);
+            die();
+        } else {
+            $status = array('status' => 'FALSE', 'msg' => '上传参数错误');
+            echo json_encode($status, JSON_UNESCAPED_UNICODE);
+            die();
+        }
+    }
+
+    public function getSignList(){
+        $wheresql = ' 1';
+        if(isset($_POST['project']) && is_numeric($_POST['project'])){
+            $wheresql .= ' and project='.$_POST['project'];
+        }
+        if(isset($_POST['tender']) && is_numeric($_POST['tender'])) {
+            $wheresql .= ' and tender='.$_POST['tender'];
+        }
+        if(isset($_POST['phaseno']) && is_numeric($_POST['phaseno'])){
+            $wheresql .= ' and phaseno='.$_POST['phaseno'];
+        }
+        $signlist = $this->sign->getSignListbyClient($wheresql);
+        if(!empty($signlist)){
+//            foreach($signlist as $k => $v){
+//                $signlist[$k]['pdfpath'] = 'signs/'.$v['sid'].'/'.$v['intime'].'.pdf';
+//            }
+            echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $signlist), JSON_UNESCAPED_UNICODE);
+            die();
+        }else{
+            $status = array('status' => TRUE, 'msg' => '当前没有签署报表','info' => '');
+            echo json_encode($status, JSON_UNESCAPED_UNICODE);
+            die();
+        }
+    }
+
+    // public function testzip(){
+    //     $this->render('testzip', $this->data);
+    // }
+
+    function deepScanDir($dir) {
+        $fileArr = array ();
+        $fileArr2 = array ();
+        $dirArr = array ();
+        $dir = rtrim($dir, '//');
+        if (is_dir($dir)) {
+            $dirHandle = opendir($dir);
+            while (false !== ($fileName = readdir($dirHandle))) {
+                $subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
+                if (is_file($subFile)) {
+                    $fileArr[] = $subFile;
+                    $fileArr2[] = basename($subFile,'.jpg');
+                }
+                elseif (is_dir($subFile) && str_replace('.', '', $fileName) != '') {
+                    $dirArr[] = $subFile;
+                    $arr = $this->deepScanDir($subFile);
+                    $dirArr = array_merge($dirArr, $arr['dir']);
+                    $fileArr = array_merge($fileArr, $arr['file']);
+                    $fileArr2 = array_merge($fileArr2, $arr['file2']);
+                }
+            }
+            closedir($dirHandle);
+        }
+        return array (
+            'dir' => $dirArr,
+            'file' => $fileArr,
+            'file2' => $fileArr2
+        );
+    }
+
+    /**
+     * desription 判断是否gif动画
+     * @param sting $image_file图片路径
+     * @return boolean t 是 f 否
+     */
+    function check_gifcartoon($image_file){
+        $fp = fopen($image_file,'rb');
+        $image_head = fread($fp,1024);
+        fclose($fp);
+        return preg_match("/".chr(0x21).chr(0xff).chr(0x0b).'NETSCAPE2.0'."/",$image_head)?false:true;
+    }
+
+    /**
+     * desription 压缩图片
+     * @param sting $imgsrc 图片路径
+     * @param string $imgdst 压缩后保存路径
+     */
+    function compressed_image($imgsrc,$imgdst){
+        list($width,$height,$type)=getimagesize($imgsrc);
+        $new_width = $width;
+        $new_height = $height;
+        switch($type){
+            case 1:
+                $giftype=$this->check_gifcartoon($imgsrc);
+                if($giftype){
+                    // header('Content-Type:image/gif');
+                    $image_wp=imagecreatetruecolor($new_width, $new_height);
+                    $image = imagecreatefromgif($imgsrc);
+                    imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
+                    //75代表的是质量、压缩图片容量大小
+                    imagejpeg($image_wp, $imgdst,100);
+                    imagedestroy($image_wp);
+                }
+                break;
+            case 2:
+                // header('Content-Type:image/jpeg');
+                $image_wp=imagecreatetruecolor($new_width, $new_height);
+                $image = imagecreatefromjpeg($imgsrc);
+                imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
+                //75代表的是质量、压缩图片容量大小
+                imagejpeg($image_wp, $imgdst,100);
+                imagedestroy($image_wp);
+                break;
+            case 3:
+                // header('Content-Type:image/png');
+                $image_wp=imagecreatetruecolor($new_width, $new_height);
+                $image = imagecreatefrompng($imgsrc);
+                imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
+                //75代表的是质量、压缩图片容量大小
+                imagejpeg($image_wp, $imgdst,100);
+                imagedestroy($image_wp);
+                break;
+            case 6:
+//                header('Content-Type:image/x-ms-bmp');
+                $image_wp=imagecreatetruecolor($new_width, $new_height);
+                $image = $this->imagecreatefrombmp($imgsrc);
+                imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
+                //75代表的是质量、压缩图片容量大小
+                imagejpeg($image_wp, $imgdst,100);
+                imagedestroy($image_wp);
+                break;
+        }
+    }
+
+    //bmp 转jpg
+    function imagecreatefrombmp( $filename ){
+        if ( !$f1 = fopen( $filename, "rb" ) )
+            return FALSE;
+
+        $FILE = unpack( "vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread( $f1, 14 ) );
+        if ( $FILE['file_type'] != 19778 )
+            return FALSE;
+
+        $BMP = unpack( 'Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel' . '/Vcompression/Vsize_bitmap/Vhoriz_resolution' . '/Vvert_resolution/Vcolors_used/Vcolors_important', fread( $f1, 40 ) );
+        $BMP['colors'] = pow( 2, $BMP['bits_per_pixel'] );
+        if ( $BMP['size_bitmap'] == 0 )
+            $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
+        $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel'] / 8;
+        $BMP['bytes_per_pixel2'] = ceil( $BMP['bytes_per_pixel'] );
+        $BMP['decal'] = ($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
+        $BMP['decal'] -= floor( $BMP['width'] * $BMP['bytes_per_pixel'] / 4 );
+        $BMP['decal'] = 4 - (4 * $BMP['decal']);
+        if ( $BMP['decal'] == 4 )
+            $BMP['decal'] = 0;
+
+        $PALETTE = array();
+        if ( $BMP['colors'] < 16777216 ){
+            $PALETTE = unpack( 'V' . $BMP['colors'], fread( $f1, $BMP['colors'] * 4 ) );
+        }
+
+        $IMG = fread( $f1, $BMP['size_bitmap'] );
+        $VIDE = chr( 0 );
+
+        $res = imagecreatetruecolor( $BMP['width'], $BMP['height'] );
+        $P = 0;
+        $Y = $BMP['height'] - 1;
+        while( $Y >= 0 ){
+            $X = 0;
+            while( $X < $BMP['width'] ){
+                if ( $BMP['bits_per_pixel'] == 32 ){
+                    $COLOR = unpack( "V", substr( $IMG, $P, 4 ) );
+                    $B = ord(substr($IMG, $P,1));
+                    $G = ord(substr($IMG, $P+1,1));
+                    $R = ord(substr($IMG, $P+2,1));
+                    $color = imagecolorexact( $res, $R, $G, $B );
+                    if ( $color == -1 )
+                        $color = imagecolorallocate( $res, $R, $G, $B );
+                    $COLOR[0] = $R*256*256+$G*256+$B;
+                    $COLOR[1] = $color;
+                }elseif ( $BMP['bits_per_pixel'] == 24 )
+                    $COLOR = unpack( "V", substr( $IMG, $P, 3 ) . $VIDE );
+                elseif ( $BMP['bits_per_pixel'] == 16 ){
+                    $COLOR = unpack( "n", substr( $IMG, $P, 2 ) );
+                    $COLOR[1] = $PALETTE[$COLOR[1] + 1];
+                }elseif ( $BMP['bits_per_pixel'] == 8 ){
+                    $COLOR = unpack( "n", $VIDE . substr( $IMG, $P, 1 ) );
+                    $COLOR[1] = $PALETTE[$COLOR[1] + 1];
+                }elseif ( $BMP['bits_per_pixel'] == 4 ){
+                    $COLOR = unpack( "n", $VIDE . substr( $IMG, floor( $P ), 1 ) );
+                    if ( ($P * 2) % 2 == 0 )
+                        $COLOR[1] = ($COLOR[1] >> 4);
+                    else
+                        $COLOR[1] = ($COLOR[1] & 0x0F);
+                    $COLOR[1] = $PALETTE[$COLOR[1] + 1];
+                }elseif ( $BMP['bits_per_pixel'] == 1 ){
+                    $COLOR = unpack( "n", $VIDE . substr( $IMG, floor( $P ), 1 ) );
+                    if ( ($P * 8) % 8 == 0 )
+                        $COLOR[1] = $COLOR[1] >> 7;
+                    elseif ( ($P * 8) % 8 == 1 )
+                        $COLOR[1] = ($COLOR[1] & 0x40) >> 6;
+                    elseif ( ($P * 8) % 8 == 2 )
+                        $COLOR[1] = ($COLOR[1] & 0x20) >> 5;
+                    elseif ( ($P * 8) % 8 == 3 )
+                        $COLOR[1] = ($COLOR[1] & 0x10) >> 4;
+                    elseif ( ($P * 8) % 8 == 4 )
+                        $COLOR[1] = ($COLOR[1] & 0x8) >> 3;
+                    elseif ( ($P * 8) % 8 == 5 )
+                        $COLOR[1] = ($COLOR[1] & 0x4) >> 2;
+                    elseif ( ($P * 8) % 8 == 6 )
+                        $COLOR[1] = ($COLOR[1] & 0x2) >> 1;
+                    elseif ( ($P * 8) % 8 == 7 )
+                        $COLOR[1] = ($COLOR[1] & 0x1);
+                    $COLOR[1] = $PALETTE[$COLOR[1] + 1];
+                }else
+                    return FALSE;
+                imagesetpixel( $res, $X, $Y, $COLOR[1] );
+                $X++;
+                $P += $BMP['bytes_per_pixel'];
+            }
+            $Y--;
+            $P += $BMP['decal'];
+        }
+        fclose( $f1 );
+
+        return $res;
+    }
+
 }
 }
 
 
 ?>
 ?>

+ 8 - 2
protected/controller/ProjectController.php

@@ -11,6 +11,7 @@ Doo::loadClass('itemmeasurenum');
 Doo::loadClass('itemfile');
 Doo::loadClass('itemfile');
 Doo::loadClass('attachment');
 Doo::loadClass('attachment');
 Doo::loadHelper('DooPager');
 Doo::loadHelper('DooPager');
+Doo::loadClass('sign');
 
 
 /* * proDetail
 /* * proDetail
  * MainController
  * MainController
@@ -22,7 +23,7 @@ Doo::loadHelper('DooPager');
 class ProjectController extends DooController
 class ProjectController extends DooController
 {
 {
 
 
-    private $data, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $measureauditact, $numofperact, $statusArray = array('uncheck' => '<span class = "colGray">未审批</span>', 'checking' => '<span class = "colOrange">审批中</span>', 'checked' => '<span class = "colGreen">审批通过</span>', 'checkno' => '<span class = "colRed">审批不通过</span>'), $itemmeasurenum, $itemfle, $att;
+    private $data, $sign, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $measureauditact, $numofperact, $statusArray = array('uncheck' => '<span class = "colGray">未审批</span>', 'checking' => '<span class = "colOrange">审批中</span>', 'checked' => '<span class = "colGreen">审批通过</span>', 'checkno' => '<span class = "colRed">审批不通过</span>'), $itemmeasurenum, $itemfle, $att;
 
 
     public function beforeRun($resource, $action)
     public function beforeRun($resource, $action)
     {
     {
@@ -49,6 +50,7 @@ class ProjectController extends DooController
         $this->itemmeasurenum = new ItemMeasureNumpofper();
         $this->itemmeasurenum = new ItemMeasureNumpofper();
         $this->itemfle = new ItemFile();
         $this->itemfle = new ItemFile();
         $this->att = new attachment();
         $this->att = new attachment();
+        $this->sign = new Signn();
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['currChannle'] = 'p';
         $this->data['currChannle'] = 'p';
         $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
         $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
@@ -59,9 +61,13 @@ class ProjectController extends DooController
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
             }
             }
         }
         }
-        if ($this->data['numofchecking'] == 0) {
+        if (!isset($this->data['numofchecking']) || $this->data['numofchecking'] == 0) {
             $this->data['numofchecking'] = null;
             $this->data['numofchecking'] = null;
         }
         }
+
+        //获取需要您签署的数目
+        $this->data['needSignNum'] = $this->sign->getNeedSignNumbyUid($this->auth->getUid()) != 0 ? $this->sign->getNeedSignNumbyUid($this->auth->getUid()) : '';
+
     }
     }
 
 
     /**
     /**

+ 7 - 2
protected/controller/RProjectController.php

@@ -13,6 +13,7 @@ Doo::loadClass('itemmeasurenum');
 Doo::loadClass('itemfile');
 Doo::loadClass('itemfile');
 Doo::loadClass('attachment');
 Doo::loadClass('attachment');
 Doo::loadHelper('DooPager');
 Doo::loadHelper('DooPager');
+Doo::loadClass('sign');
 
 
 /**
 /**
  * MainController
  * MainController
@@ -24,7 +25,7 @@ class RProjectController extends DooController
 {
 {
 
 
 
 
-    private $data, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $measureauditact, $numofperact, $statusArray = array('uncheck' => '未审批', 'checking' => '审批中', 'checked' => '已审批', 'checkno' => '未通过'), $aconfig, $sms, $itemfile, $itemmeasurenum, $itemfle, $att;
+    private $data, $sign, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $measureauditact, $numofperact, $statusArray = array('uncheck' => '未审批', 'checking' => '审批中', 'checked' => '已审批', 'checkno' => '未通过'), $aconfig, $sms, $itemfile, $itemmeasurenum, $itemfle, $att;
 
 
     public function __construct()
     public function __construct()
     {
     {
@@ -41,6 +42,7 @@ class RProjectController extends DooController
         $this->aconfig = new AConfig();
         $this->aconfig = new AConfig();
         $this->itemfle = new ItemFile();
         $this->itemfle = new ItemFile();
         $this->att = new attachment();
         $this->att = new attachment();
+        $this->sign = new Signn();
         $this->sms = new Sms(Doo::conf()->SMS_URL, Doo::conf()->SMS_AUTHKEY);
         $this->sms = new Sms(Doo::conf()->SMS_URL, Doo::conf()->SMS_AUTHKEY);
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['currChannle'] = 'r';
         $this->data['currChannle'] = 'r';
@@ -53,9 +55,12 @@ class RProjectController extends DooController
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
             }
             }
         }
         }
-        if ($this->data['numofchecking'] == 0) {
+        if (!isset($this->data['numofchecking']) || $this->data['numofchecking'] == 0) {
             $this->data['numofchecking'] = null;
             $this->data['numofchecking'] = null;
         }
         }
+
+        //获取需要您签署的数目
+        $this->data['needSignNum'] = $this->sign->getNeedSignNumbyUid($this->auth->getUid()) != 0 ? $this->sign->getNeedSignNumbyUid($this->auth->getUid()) : '';
     }
     }
 
 
     public function beforeRun($resource, $action)
     public function beforeRun($resource, $action)

+ 8 - 2
protected/controller/SProjectController.php

@@ -11,6 +11,7 @@ Doo::loadClass('itemmeasurenum');
 Doo::loadClass('itemfile');
 Doo::loadClass('itemfile');
 Doo::loadClass('attachment');
 Doo::loadClass('attachment');
 Doo::loadHelper('DooPager');
 Doo::loadHelper('DooPager');
+Doo::loadClass('sign');
 
 
 /**
 /**
  * MainController
  * MainController
@@ -21,7 +22,7 @@ Doo::loadHelper('DooPager');
 class SProjectController extends DooController
 class SProjectController extends DooController
 {
 {
 
 
-    private $data, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $numofperact, $measureauditact, $itemmeasurenum, $itemfle, $att;
+    private $data, $sign, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $numofperact, $measureauditact, $itemmeasurenum, $itemfle, $att;
 
 
     public function beforeRun($resource, $action)
     public function beforeRun($resource, $action)
     {
     {
@@ -52,6 +53,7 @@ class SProjectController extends DooController
         $this->itemmeasurenum = new ItemMeasureNumpofper();
         $this->itemmeasurenum = new ItemMeasureNumpofper();
         $this->itemfle = new ItemFile();
         $this->itemfle = new ItemFile();
         $this->att = new attachment();
         $this->att = new attachment();
+        $this->sign = new Signn();
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['currChannle'] = 's';
         $this->data['currChannle'] = 's';
         $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
         $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
@@ -62,9 +64,13 @@ class SProjectController extends DooController
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
             }
             }
         }
         }
-        if ($this->data['numofchecking'] == 0) {
+        if (!isset($this->data['numofchecking']) || $this->data['numofchecking'] == 0) {
             $this->data['numofchecking'] = null;
             $this->data['numofchecking'] = null;
         }
         }
+
+        //获取需要您签署的数目
+        $this->data['needSignNum'] = $this->sign->getNeedSignNumbyUid($this->auth->getUid()) != 0 ? $this->sign->getNeedSignNumbyUid($this->auth->getUid()) : '';
+
     }
     }
 
 
     public function index()
     public function index()

+ 33 - 1
protected/controller/ShareController.php

@@ -4,6 +4,7 @@ Doo::loadClass('contractact');
 Doo::loadClass('actmeasure');
 Doo::loadClass('actmeasure');
 Doo::loadClass('project');
 Doo::loadClass('project');
 Doo::loadClass('numofperact');
 Doo::loadClass('numofperact');
+Doo::loadClass('sign');
 
 
 /**
 /**
  * MainController
  * MainController
@@ -13,7 +14,7 @@ Doo::loadClass('numofperact');
  */
  */
 class ShareController extends DooController
 class ShareController extends DooController
 {
 {
-    private $__shareact, $__contractact, $__actMeasure, $__pro, $__numofperact, $statusArray = array('uncheck' => '<span class = "colGray">未上报</span>', 'checking' => '<span class = "colOrange">审核中</span>', 'checked' => '<span class = "colGreen">已完成</span>', 'checkno' => '<span class = "colRed">不通过</span>');
+    private $data, $sign, $__shareact, $__contractact, $__actMeasure, $__pro, $__numofperact, $statusArray = array('uncheck' => '<span class = "colGray">未上报</span>', 'checking' => '<span class = "colOrange">审核中</span>', 'checked' => '<span class = "colGreen">已完成</span>', 'checkno' => '<span class = "colRed">不通过</span>');
 
 
 //    public function beforeRun($resource, $action) {
 //    public function beforeRun($resource, $action) {
 //        if ($this->auth->getUid()) {
 //        if ($this->auth->getUid()) {
@@ -33,6 +34,7 @@ class ShareController extends DooController
         $this->__actMeasure = new actMeasure();
         $this->__actMeasure = new actMeasure();
         $this->__pro = new Project();
         $this->__pro = new Project();
         $this->__numofperact = new NumofperAct();
         $this->__numofperact = new NumofperAct();
+        $this->sign = new signn();
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
 //        $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
 //        $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
     }
     }
@@ -664,6 +666,36 @@ class ShareController extends DooController
         die(json_encode($fildArray));
         die(json_encode($fildArray));
     }
     }
 
 
+    public function signShare()
+    {
+        if(isset($_GET['sid']) && is_numeric($_GET['sid'])){
+            $signmsg = $this->sign->getOneSignbysid($_GET['sid']);
+            if(!empty($signmsg) && $signmsg['ishare'] == 1){
+                //获取报表图片
+                $maxwidth = 794; //默认图片最大宽度   a4
+//                $maxheight = 1123; //默认图片最大高度  a4
+                //获取报表图片
+                $signattlist = $this->sign->getSignAttList($_GET['sid']);
+                if(!empty($signattlist)){
+                    foreach($signattlist as $sak => $sav){
+                        $signattlist[$sak]['auditatt'] = $this->sign->getSignAuditAttList($sav['said']);
+                        if($sak == 0){
+                            $imgmsg = getimagesize(Doo::conf()->APP_URL.$sav['filepath']);
+                            $maxwidth = $imgmsg[0];
+//                            $maxheight = $imgmsg[1];
+//                            break;
+                        }
+                    }
+                }
+                $this->data['maxwidth'] = $maxwidth;
+                $this->data['attlist'] = $signattlist;
+                $this->render('sign-share', $this->data, TRUE);
+            }
+            exit('没有权限查看该报表');
+        }
+        exit('不存在该报表');
+    }
+
 }
 }
 
 
 ?>
 ?>

+ 934 - 0
protected/controller/SignController.php

@@ -0,0 +1,934 @@
+<?php
+//ini_set('display_errors', on);
+Doo::loadClass('auth');
+Doo::loadClass('attfile');
+Doo::loadClass('profile');
+Doo::loadClass('project');
+Doo::loadClass('contractact');
+Doo::loadClass('actmeasure');
+Doo::loadClass('numofperact');
+Doo::loadClass('measureauditact');
+Doo::loadClass('sign');
+//define('FPDF_FONTPATH','protected/class/fpdf1.5/font/');
+//Doo::loadClass('fpdf');
+
+/* * proDetail
+ * MainController
+ * Feel free to delete the methods and replace them with your own code.
+ *
+ * @author darkredz
+ */
+
+class SignController extends DooController
+{
+
+    private $data, $sign, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $measureauditact, $numofperact, $statusArray = array('uncheck' => '<span class = "colGray">未审批</span>', 'checking' => '<span class = "colOrange">审批中</span>', 'checked' => '<span class = "colGreen">审批通过</span>', 'checkno' => '<span class = "colRed">审批不通过</span>');
+
+    public function beforeRun($resource, $action)
+    {
+        if ($this->auth->getUid()) {
+            $uGroups = $this->profile->getProWithUid($this->auth->getUid());
+            $falg = Doo::acl()->isAllowed($uGroups['groups'], $resource, $action);
+            if (!$falg)
+                return Doo::acl()->defaultFailedRoute;
+        } else {
+            return Doo::acl()->defaultFailedRoute;
+        }
+    }
+
+    public function __construct()
+    {
+        $this->auth = new Auth();
+        $this->attfile = new attFile();
+        $this->profile = new Profile();
+        $this->project = new Project();
+        $this->contractact = new Contractact();
+        $this->actmeasure = new actMeasure();
+        $this->numofperact = new NumofperAct();
+        $this->measureauditact = new MeasureauditAct();
+        $this->sign = new Signn();
+//        $this->pdf = new FPDF('P','mm','A4');
+        $this->data['rootUrl'] = Doo::conf()->APP_URL;
+        $this->data['currChannle'] = 'sign';
+        $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
+        $mpidArray = $this->measureauditact->getAuditProject2($this->auth->getUid());
+        $this->data['numofchecking'] = 0;
+        if (isset($mpidArray[0]['pid'])) {
+            foreach ($mpidArray as $key => $value) {
+                // 审批操作按照时间排序多标段
+                $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
+            }
+        }
+        if (!isset($this->data['numofchecking']) || $this->data['numofchecking'] == 0) {
+            $this->data['numofchecking'] = null;
+        }
+
+        //获取需要您签署的数目
+        $this->data['needSignNum'] = $this->sign->getNeedSignNumbyUid($this->auth->getUid()) != 0 ? $this->sign->getNeedSignNumbyUid($this->auth->getUid()) : '';
+
+
+    }
+
+    /**
+     *
+     * @return type
+     */
+    public function index()
+    {
+        //获取我发起的签署数目
+        $this->data['mySignNum'] = $this->sign->getMySignNumbyUid($this->auth->getUid());
+
+        //获取关于我的正在签署数目
+        $this->data['doingSignNum'] = $this->sign->getDoingSignNumbyUid($this->auth->getUid());
+
+        //获取关于我的完成签署数目
+        $this->data['doneSignNum'] = $this->sign->getDoneSignNumbyUid($this->auth->getUid());
+
+        $this->render('sign-index', $this->data, TRUE);
+    }
+
+    public function signNeedList(){
+
+        $needlist = array();
+        $searchsql = 'sid in(select `jl_sign_audit`.sid from `jl_sign_audit` where `jl_sign_audit`.status="checking" and `jl_sign_audit`.audituid='.$this->auth->getUid().')';
+        $projectlist = $this->sign->getSignGroupByProject($searchsql);
+        if(!empty($projectlist)){
+            foreach($projectlist as $k => $v){
+                $projectmsg = $this->project->getRowByPid($v['project']);
+                $needlist[$k]['project'] = $projectmsg['pname'];
+                $needlist[$k]['tlist'] = array();
+
+                $tenderlist = $this->sign->getSignGroupByTender($v['project'],$searchsql);
+                if(!empty($tenderlist)) {
+                    foreach ($tenderlist as $tk => $tv) {
+                        $tendermsg = $this->actmeasure->getRowByPmid($tv['tender']);
+                        $needlist[$k]['tlist'][$tk]['tender'] = $tendermsg['pmname'];
+                        $needlist[$k]['tlist'][$tk]['plist'] = array();
+
+                        $phasenolist = $this->sign->getSignGroupByPhaseno($tv['tender'],$searchsql);
+                        if(!empty($phasenolist)) {
+                            foreach ($phasenolist as $pk => $pv) {
+//                                $phasenomsg = $this->numofperact->getCurrStatus($pv['phaseno']);
+                                $needlist[$k]['tlist'][$tk]['plist'][$pk]['phaseno'] = $pv['phaseno'];
+                                $needlist[$k]['tlist'][$tk]['plist'][$pk]['signlist'] = array();
+
+                                $signlist = $this->sign->getSignList($searchsql.' and status="checking" and tender='.$tv['tender'].' and phaseno='.$pv['phaseno'], '0,1000');
+                                if(!empty($signlist)) {
+                                    foreach ($signlist as $sk => $sv) {
+                                        $needlist[$k]['tlist'][$tk]['plist'][$pk]['signlist'][$sk]['sid'] = $sv['sid'];
+                                        $needlist[$k]['tlist'][$tk]['plist'][$pk]['signlist'][$sk]['name'] = $sv['name'];
+                                        $needlist[$k]['tlist'][$tk]['plist'][$pk]['signlist'][$sk]['auditlist'] = $this->sign->getSignAuditlist($sv['sid']);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        $this->data['needlist'] = $needlist;
+        $this->render('sign-list-need_sign',$this->data, TRUE);
+    }
+
+    public function signNeedView(){
+        if(!isset($this->params['sid']) || !is_numeric($this->params['sid'])){
+            exit('没有报表参数');
+        }
+        $issign = $this->sign->getisSignbySidUid($this->params['sid'],$this->auth->getUid());
+        if(empty($issign)){
+            exit('不是当前签署人无法访问本页');
+        }
+
+        //获取报表信息
+        $signmsg = $this->sign->getOneSignbysid($this->params['sid']);
+        //获取项目名,标段名,标段期数
+        $project = $this->project->getRowByPid($signmsg['project']);
+        $tender = $this->actmeasure->getRowByPmid($signmsg['tender']);
+//        $phaseno = $this->numofperact->getCurrStatus($signmsg['phaseno']);
+
+        $signmsg['project'] = $project['pname'];
+        $signmsg['tender'] = $tender['pmname'];
+//        $signmsg['phaseno'] = $phaseno['numpname'];
+
+
+        //获取签署人列表
+        $signauditlist = $this->sign->getSignAuditList($this->params['sid']);
+        if(!empty($signauditlist)){
+            foreach($signauditlist as $k => $v){
+                //获取签署人头像
+                $signauditlist[$k]['index'] = $k+1;
+                $signauditlist[$k]['avatar'] = $this->auth->getAvatar($v['audituid']);
+            }
+        }
+
+        //获取报表图片
+        $maxwidth = 794; //默认图片最大宽度   a4
+        $maxheight = 1123; //默认图片最大高度  a4
+        if(!empty($signmsg['widhei'])){
+            $widhei = explode('_', $signmsg['widhei']);
+            $style = $widhei[0].'mm '.$widhei[1].'mm';
+        }else{
+            $style = '210mm 297mm';
+        }
+        $signattlist = $this->sign->getSignAttList($this->params['sid']);
+        if(!empty($signattlist)){
+            foreach($signattlist as $sak => $sav){
+                $signattlist[$sak]['auditatt'] = $this->sign->getSignAuditAttList($sav['said']);
+                if($sak == 0){
+                    $imgmsg = getimagesize(Doo::conf()->APP_URL.$sav['filepath']);
+                    $maxwidth = $imgmsg[0];
+                    $maxheight = $imgmsg[1];
+                }
+            }
+        }
+
+        $this->data['signmsg'] = $signmsg;
+        $this->data['auditlist'] = $signauditlist;
+        $this->data['attlist'] = $signattlist;
+        $this->data['picpath'] = $this->auth->getSignpath($this->auth->getUid());
+        $this->data['signsid'] = $this->params['sid'];
+        $this->data['maxwidth'] = $maxwidth;
+        $this->data['maxheight'] = $maxheight;
+        $this->data['style'] = $style;
+
+        $this->render('sign-view-signer_sign',$this->data, TRUE);
+    }
+
+    public function signDone(){
+        if(!isset($_POST['sid']) || !is_numeric($_POST['sid'])){
+            echo json_encode(array('code' => 400, 'msg' => '没有报表参数'));
+            exit;
+        }
+
+        if(!isset($_POST['path']) || empty($_POST['path'])){
+            echo json_encode(array('code' => 400, 'msg' => '没有签名图片'));
+            exit;
+        }
+
+        //改变签署状态并判断报表是否签署完成或传到下一个签署人签署
+        $signAudit = $this->sign->getOneSignAudit($_POST['sid'],$this->auth->getUid());
+        $result = $this->sign->updateSignAudit($signAudit['satid'],'checked');
+
+        foreach($_POST['said'] as $satk => $satv){
+            $sign3 = new Signn();
+            $sign3->insertSignAuditAtt($this->auth->getUid(),$satv,$_POST['path'],$_POST['position'][$satk]);
+        }
+        if($result){
+            $sign2 = new Signn();
+            $signAuditList = $sign2->getSignAuditList($_POST['sid']);
+            $flag = true;
+            foreach($signAuditList as $k => $v){
+                if($v['status'] == 'uncheck'){
+                    $sign2->updateSignAudit($v['satid'],'checking');
+                    $flag = false;
+                    break;
+                }
+            }
+            if($flag){
+                $this->sign->updateSignStatus($_POST['sid']);
+                echo json_encode(array('code' => 200, 'url' => '/sign/view/'.$_POST['sid'].'?status=done'));
+                exit;
+            }else{
+                echo json_encode(array('code' => 200, 'url' => '/sign/view/'.$_POST['sid'].'?status=doing'));
+                exit;
+            }
+        }else{
+            echo json_encode(array('code' => 400, 'msg' => '签署失败'));
+            exit;
+        }
+
+    }
+
+    public function signMyList(){
+        Doo::loadHelper('DooPager');
+        $pagestr = '';
+        $sqlstr = ' 1';
+        $this->data['project'] = '';
+        $this->data['tender'] = '';
+        $this->data['phaseno'] = '';
+
+        //获取项目信息
+        $searchsql = 'audituid='.$this->auth->getUid();
+        $itemlist = $this->sign->getSignGroupByProject($searchsql);
+        if(!empty($itemlist)){
+            foreach($itemlist as $ik => $iv){
+                $itemmsg = $this->project->getRowByPid($iv['project']);
+                $itemlist[$ik]['pname'] = $itemmsg['pname'];
+            }
+        }
+
+        if(isset($this->params['pid']) && is_numeric($this->params['pid'])){
+            $this->data['project'] = $this->params['pid'];
+            $pagestr .= '/project/'.$this->params['pid'];
+            $sqlstr .= ' and project='.$this->params['pid'];
+            //获取标段信息
+            $tenderlist = $this->sign->getSignGroupByTender($this->params['pid'],$searchsql);
+            if(!empty($tenderlist)){
+                foreach($tenderlist as $tk => $tv){
+                    $tendermsg = $this->actmeasure->getRowByPmid($tv['tender']);
+                    $tenderlist[$tk]['pmname'] = $tendermsg['pmname'];
+                }
+            }
+
+            if(isset($this->params['pmid']) && is_numeric($this->params['pmid'])){
+                $this->data['tender'] = $this->params['pmid'];
+                $pagestr .= '/tender/'.$this->params['pmid'];
+                $sqlstr .= ' and tender='.$this->params['pmid'];
+                //获取期数信息
+                $phasenolist = $this->sign->getSignGroupByPhaseno($this->params['pmid'],$searchsql);
+                if(!empty($phasenolist)){
+                    foreach($phasenolist as $pk => $pv){
+//                        $phasenomsg = $this->numofperact->getCurrStatus($pv['phaseno']);
+                        $phasenolist[$pk]['numpname'] = $pv['phaseno'];
+                    }
+                }
+
+                if(isset($this->params['mpid']) && is_numeric($this->params['mpid'])){
+                    $this->data['phaseno'] = $this->params['mpid'];
+                    $pagestr .= '/phaseno/'.$this->params['mpid'];
+                    $sqlstr .= ' and phaseno='.$this->params['mpid'];
+                }
+            }
+        }
+
+        $totalArchive = $this->sign->getMySignNumbyUid($this->auth->getUid(),$sqlstr);
+        $pager = new DooPager(Doo::conf()->APP_URL . 'sign/mylist'.$pagestr.'/page', $totalArchive, 10, 100);
+        $pager->setCss('', 'disabled', 'active');
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -10,10')
+            $mylist = $this->sign->getMySignListbyUid($this->auth->getUid(), $sqlstr, $pager->limit);
+        if(isset($mylist) && !empty($mylist)){
+            foreach($mylist as $k => $v){
+                //获取项目名,标段名,标段期数
+                $project = $this->project->getRowByPid($v['project']);
+                $tender = $this->actmeasure->getRowByPmid($v['tender']);
+//                $phaseno = $this->numofperact->getCurrStatus($v['phaseno']);
+
+                $mylist[$k]['project'] = $project['pname'];
+                $mylist[$k]['tender'] = $tender['pmname'];
+//                $mylist[$k]['phaseno'] = $phaseno['numpname'];
+            }
+        }
+        $this->data['mylist'] = isset($mylist) ? $mylist : '';
+        $this->data['itemlist'] = $itemlist;
+        $this->data['tenderlist'] = isset($tenderlist) ? $tenderlist : '';
+        $this->data['phasenolist'] = isset($phasenolist) ? $phasenolist : '';
+        $this->data['pager'] = $pager->output;
+        $this->render('sign-list-my_create',$this->data, TRUE);
+    }
+
+    public function signChangeShare(){
+        if(!isset($_GET['status']) || !isset($_GET['sid'])){
+            echo json_encode(array('code' => '400', 'msg' => '请传递正确的参数'));
+            exit;
+        }
+        $status = $_GET['status'] == "true" ? 1 : 0;
+        $result = $this->sign->updateSignShareStatus($status,$_GET['sid']);
+        if($result){
+            echo json_encode(array('code' => '200', 'status' => $status));
+            exit;
+        }else{
+            echo json_encode(array('code' => '400', 'msg' => '无法分享'));
+            exit;
+        }
+        exit;
+    }
+
+    public function signOnList(){
+        Doo::loadHelper('DooPager');
+        $pagestr = '';
+        $sqlstr = ' 1';
+        $this->data['project'] = '';
+        $this->data['tender'] = '';
+        $this->data['phaseno'] = '';
+
+        //获取项目信息
+        $searchsql = 'status="checking" and sid in(select `jl_sign_audit`.sid from `jl_sign_audit` where `jl_sign_audit`.audituid='.$this->auth->getUid().')';
+        $itemlist = $this->sign->getSignGroupByProject($searchsql);
+        if(!empty($itemlist)){
+            foreach($itemlist as $ik => $iv){
+                $itemmsg = $this->project->getRowByPid($iv['project']);
+                $itemlist[$ik]['pname'] = $itemmsg['pname'];
+            }
+        }
+
+        if(isset($this->params['pid']) && is_numeric($this->params['pid'])){
+            $this->data['project'] = $this->params['pid'];
+            $pagestr .= '/project/'.$this->params['pid'];
+            $sqlstr .= ' and project='.$this->params['pid'];
+            //获取标段信息
+            $tenderlist = $this->sign->getSignGroupByTender($this->params['pid'],$searchsql);
+            if(!empty($tenderlist)){
+                foreach($tenderlist as $tk => $tv){
+                    $tendermsg = $this->actmeasure->getRowByPmid($tv['tender']);
+                    $tenderlist[$tk]['pmname'] = $tendermsg['pmname'];
+                }
+            }
+
+            if(isset($this->params['pmid']) && is_numeric($this->params['pmid'])){
+                $this->data['tender'] = $this->params['pmid'];
+                $pagestr .= '/tender/'.$this->params['pmid'];
+                $sqlstr .= ' and tender='.$this->params['pmid'];
+                //获取期数信息
+                $phasenolist = $this->sign->getSignGroupByPhaseno($this->params['pmid'],$searchsql);
+                if(!empty($phasenolist)){
+                    foreach($phasenolist as $pk => $pv){
+//                        $phasenomsg = $this->numofperact->getCurrStatus($pv['phaseno']);
+                        $phasenolist[$pk]['numpname'] = $pv['phaseno'];
+                    }
+                }
+
+                if(isset($this->params['mpid']) && is_numeric($this->params['mpid'])){
+                    $this->data['phaseno'] = $this->params['mpid'];
+                    $pagestr .= '/phaseno/'.$this->params['mpid'];
+                    $sqlstr .= ' and phaseno='.$this->params['mpid'];
+                }
+            }
+        }
+
+        $totalArchive = $this->sign->getDoingSignNumbyUid($this->auth->getUid(),$sqlstr);
+        $pager = new DooPager(Doo::conf()->APP_URL . 'sign/onlist'.$pagestr.'/page', $totalArchive, 10, 100);
+        $pager->setCss('', 'disabled', 'active');
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -10,10')
+            $onlist = $this->sign->getDoingSignListbyUid($this->auth->getUid(), $sqlstr, $pager->limit);
+        if(isset($onlist) && !empty($onlist)){
+            foreach($onlist as $k => $v){
+                //获取项目名,标段名,标段期数
+                $project = $this->project->getRowByPid($v['project']);
+                $tender = $this->actmeasure->getRowByPmid($v['tender']);
+//                $phaseno = $this->numofperact->getCurrStatus($v['phaseno']);
+
+                $onlist[$k]['project'] = $project['pname'];
+                $onlist[$k]['tender'] = $tender['pmname'];
+//                $onlist[$k]['phaseno'] = $phaseno['numpname'];
+                $onlist[$k]['auditlist'] = $this->sign->getSignAuditList($v['sid']);
+            }
+        }
+        $this->data['onlist'] = isset($onlist) ? $onlist : '';
+        $this->data['itemlist'] = $itemlist;
+        $this->data['tenderlist'] = isset($tenderlist) ? $tenderlist : '';
+        $this->data['phasenolist'] = isset($phasenolist) ? $phasenolist : '';
+        $this->data['pager'] = $pager->output;
+        $this->render('sign-list-on_sign',$this->data, TRUE);
+    }
+
+    public function signDoneList(){
+        Doo::loadHelper('DooPager');
+        $pagestr = '';
+        $sqlstr = ' 1';
+        $this->data['project'] = '';
+        $this->data['tender'] = '';
+        $this->data['phaseno'] = '';
+
+        //获取项目信息
+        $searchsql = 'status="checked" and sid in(select `jl_sign_audit`.sid from `jl_sign_audit` where `jl_sign_audit`.audituid='.$this->auth->getUid().')';
+        $itemlist = $this->sign->getSignGroupByProject($searchsql);
+        if(!empty($itemlist)){
+            foreach($itemlist as $ik => $iv){
+                $itemmsg = $this->project->getRowByPid($iv['project']);
+                $itemlist[$ik]['pname'] = $itemmsg['pname'];
+            }
+        }
+
+        if(isset($this->params['pid']) && is_numeric($this->params['pid'])){
+            $this->data['project'] = $this->params['pid'];
+            $pagestr .= '/project/'.$this->params['pid'];
+            $sqlstr .= ' and project='.$this->params['pid'];
+            //获取标段信息
+            $tenderlist = $this->sign->getSignGroupByTender($this->params['pid'],$searchsql);
+            if(!empty($tenderlist)){
+                foreach($tenderlist as $tk => $tv){
+                    $tendermsg = $this->actmeasure->getRowByPmid($tv['tender']);
+                    $tenderlist[$tk]['pmname'] = $tendermsg['pmname'];
+                }
+            }
+
+            if(isset($this->params['pmid']) && is_numeric($this->params['pmid'])){
+                $this->data['tender'] = $this->params['pmid'];
+                $pagestr .= '/tender/'.$this->params['pmid'];
+                $sqlstr .= ' and tender='.$this->params['pmid'];
+                //获取期数信息
+                $phasenolist = $this->sign->getSignGroupByPhaseno($this->params['pmid'],$searchsql);
+                if(!empty($phasenolist)){
+                    foreach($phasenolist as $pk => $pv){
+//                        $phasenomsg = $this->numofperact->getCurrStatus($pv['phaseno']);
+                        $phasenolist[$pk]['numpname'] = $pv['phaseno'];
+                    }
+                }
+
+                if(isset($this->params['mpid']) && is_numeric($this->params['mpid'])){
+                    $this->data['phaseno'] = $this->params['mpid'];
+                    $pagestr .= '/phaseno/'.$this->params['mpid'];
+                    $sqlstr .= ' and phaseno='.$this->params['mpid'];
+                }
+            }
+        }
+
+        $totalArchive = $this->sign->getDoneSignNumbyUid($this->auth->getUid(),$sqlstr);
+        $pager = new DooPager(Doo::conf()->APP_URL . 'sign/donelist'.$pagestr.'/page', $totalArchive, 10, 100);
+        $pager->setCss('', 'disabled', 'active');
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -10,10')
+            $donelist = $this->sign->getDoneSignListbyUid($this->auth->getUid(), $sqlstr, $pager->limit);
+        if(isset($donelist) && !empty($donelist)){
+            foreach($donelist as $k => $v){
+                //获取项目名,标段名,标段期数
+                $project = $this->project->getRowByPid($v['project']);
+                $tender = $this->actmeasure->getRowByPmid($v['tender']);
+//                $phaseno = $this->numofperact->getCurrStatus($v['phaseno']);
+
+                $donelist[$k]['project'] = $project['pname'];
+                $donelist[$k]['tender'] = $tender['pmname'];
+//                $donelist[$k]['phaseno'] = $phaseno['numpname'];
+            }
+        }
+        $this->data['donelist'] = isset($donelist) ? $donelist : '';
+        $this->data['itemlist'] = $itemlist;
+        $this->data['tenderlist'] = isset($tenderlist) ? $tenderlist : '';
+        $this->data['phasenolist'] = isset($phasenolist) ? $phasenolist : '';
+        $this->data['pager'] = $pager->output;
+        $this->render('sign-list-done_sign',$this->data, TRUE);
+    }
+
+    /**
+     *
+     * @return type
+     */
+    public function signCreate()
+    {
+        Doo::loadHelper('DooPager');
+        $pagestr = '';
+        $sqlstr = ' 1';
+        $this->data['project'] = '';
+        $this->data['tender'] = '';
+        $this->data['phaseno'] = '';
+
+        //获取项目信息
+        $searchsql = 'status="uncheck" AND (`ownuid`='.$this->auth->getUid().' OR tender IN (SELECT pmid FROM jl_measure_audit WHERE auditoruid='.$this->auth->getUid().'))';
+        $itemlist = $this->sign->getSignGroupByProject($searchsql);
+        if(!empty($itemlist)){
+            foreach($itemlist as $ik => $iv){
+                $itemmsg = $this->project->getRowByPid($iv['project']);
+                $itemlist[$ik]['pname'] = $itemmsg['pname'];
+            }
+        }
+
+        if(isset($this->params['pid']) && is_numeric($this->params['pid'])){
+            $this->data['project'] = $this->params['pid'];
+            $pagestr .= '/project/'.$this->params['pid'];
+            $sqlstr .= ' and project='.$this->params['pid'];
+            //获取标段信息
+            $tenderlist = $this->sign->getSignGroupByTender($this->params['pid'], $searchsql);
+            if(!empty($tenderlist)){
+                foreach($tenderlist as $tk => $tv){
+                    $tendermsg = $this->actmeasure->getRowByPmid($tv['tender']);
+                    $tenderlist[$tk]['pmname'] = $tendermsg['pmname'];
+                }
+            }
+
+            if(isset($this->params['pmid']) && is_numeric($this->params['pmid'])){
+                $this->data['tender'] = $this->params['pmid'];
+                $pagestr .= '/tender/'.$this->params['pmid'];
+                $sqlstr .= ' and tender='.$this->params['pmid'];
+                //获取期数信息
+                $phasenolist = $this->sign->getSignGroupByPhaseno($this->params['pmid'], $searchsql);
+                if(!empty($phasenolist)){
+                    foreach($phasenolist as $pk => $pv){
+//                        $phasenomsg = $this->numofperact->getCurrStatus($pv['phaseno']);
+                        $phasenolist[$pk]['numpname'] = $pv['phaseno'];
+                    }
+                }
+
+                if(isset($this->params['mpid']) && is_numeric($this->params['mpid'])){
+                    $this->data['phaseno'] = $this->params['mpid'];
+                    $pagestr .= '/phaseno/'.$this->params['mpid'];
+                    $sqlstr .= ' and phaseno='.$this->params['mpid'];
+                }
+            }
+        }
+
+        $totalArchive = $this->sign->getUnSignNum($sqlstr,$this->auth->getUid());
+        $pager = new DooPager(Doo::conf()->APP_URL . 'sign/create'.$pagestr.'/page', $totalArchive, 10, 100);
+        $pager->setCss('', 'disabled', 'active');
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -10,10')
+            $unlist = $this->sign->getUnSignList($sqlstr, $this->auth->getUid(), $pager->limit);
+        if(isset($unlist) && !empty($unlist)){
+            foreach($unlist as $k => $v){
+                //获取项目名,标段名,标段期数
+                $project = $this->project->getRowByPid($v['project']);
+                $tender = $this->actmeasure->getRowByPmid($v['tender']);
+//                $phaseno = $this->numofperact->getCurrStatus($v['phaseno']);
+
+                $unlist[$k]['project'] = $project['pname'];
+                $unlist[$k]['tender'] = $tender['pmname'];
+//                $unlist[$k]['phaseno'] = $phaseno['numpname'];
+                $unlist[$k]['ownname'] = $this->auth->getName($v['ownuid']);
+            }
+        }
+        $this->data['unlist'] = isset($unlist) ? $unlist : '';
+        $this->data['itemlist'] = $itemlist;
+        $this->data['tenderlist'] = isset($tenderlist) ? $tenderlist : '';
+        $this->data['phasenolist'] = isset($phasenolist) ? $phasenolist : '';
+        $this->data['pager'] = $pager->output;
+        $this->render('sign-create_sign', $this->data, TRUE);
+    }
+
+    /**
+     *
+     * @return type
+     */
+    public function signList()
+    {
+        Doo::loadHelper('DooPager');
+        $pagestr = '';
+        $sqlstr = ' 1';
+        $this->data['project'] = '';
+        $this->data['tender'] = '';
+        $this->data['phaseno'] = '';
+
+        //获取项目信息
+        $searchsql = '(`audituid`='.$this->auth->getUid().' OR sid IN (SELECT sid FROM jl_sign_audit WHERE jl_sign_audit.audituid='.$this->auth->getUid().'))';
+        $itemlist = $this->sign->getSignGroupByProject($searchsql);
+        if(!empty($itemlist)){
+            foreach($itemlist as $ik => $iv){
+                $itemmsg = $this->project->getRowByPid($iv['project']);
+                $itemlist[$ik]['pname'] = $itemmsg['pname'];
+            }
+        }
+
+        if(isset($this->params['pid']) && is_numeric($this->params['pid'])){
+            $this->data['project'] = $this->params['pid'];
+            $pagestr .= '/project/'.$this->params['pid'];
+            $sqlstr .= ' and project='.$this->params['pid'];
+            //获取标段信息
+            $tenderlist = $this->sign->getSignGroupByTender($this->params['pid'],$searchsql);
+            if(!empty($tenderlist)){
+                foreach($tenderlist as $tk => $tv){
+                    $tendermsg = $this->actmeasure->getRowByPmid($tv['tender']);
+                    $tenderlist[$tk]['pmname'] = $tendermsg['pmname'];
+                }
+            }
+
+            if(isset($this->params['pmid']) && is_numeric($this->params['pmid'])){
+                $this->data['tender'] = $this->params['pmid'];
+                $pagestr .= '/tender/'.$this->params['pmid'];
+                $sqlstr .= ' and tender='.$this->params['pmid'];
+                //获取期数信息
+                $phasenolist = $this->sign->getSignGroupByPhaseno($this->params['pmid'],$searchsql);
+                if(!empty($phasenolist)){
+                    foreach($phasenolist as $pk => $pv){
+//                        $phasenomsg = $this->numofperact->getCurrStatus($pv['phaseno']);
+                        $phasenolist[$pk]['numpname'] = $pv['phaseno'];
+                    }
+                }
+
+                if(isset($this->params['mpid']) && is_numeric($this->params['mpid'])){
+                    $this->data['phaseno'] = $this->params['mpid'];
+                    $pagestr .= '/phaseno/'.$this->params['mpid'];
+                    $sqlstr .= ' and phaseno='.$this->params['mpid'];
+                }
+            }
+        }
+
+
+        $totalArchive = $this->sign->getSignNum($sqlstr,$this->auth->getUid());
+        $pager = new DooPager(Doo::conf()->APP_URL . 'sign/list'.$pagestr.'/page', $totalArchive, 10, 100);
+        $pager->setCss('', 'disabled', 'active');
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -10,10')
+            $list = $this->sign->getSignList($sqlstr.' and '.$searchsql,$pager->limit);
+        if(isset($list) && !empty($list)){
+            foreach($list as $k => $v){
+                //获取项目名,标段名,标段期数
+                $project = $this->project->getRowByPid($v['project']);
+                $tender = $this->actmeasure->getRowByPmid($v['tender']);
+//                $phaseno = $this->numofperact->getCurrStatus($v['phaseno']);
+
+                $list[$k]['project'] = $project['pname'];
+                $list[$k]['tender'] = $tender['pmname'];
+//                $list[$k]['phaseno'] = $phaseno['numpname'];
+                $list[$k]['ownname'] = $this->auth->getName($v['ownuid']);
+                $list[$k]['auditname'] = $this->auth->getName($v['audituid']);
+            }
+        }
+
+        $this->data['list'] = isset($list) ? $list : '';
+        $this->data['itemlist'] = $itemlist;
+        $this->data['tenderlist'] = isset($tenderlist) ? $tenderlist : '';
+        $this->data['phasenolist'] = isset($phasenolist) ? $phasenolist : '';
+        $this->data['pager'] = $pager->output;
+        $this->render('sign-list-all', $this->data, TRUE);
+    }
+
+    /**
+     *
+     * @return type
+     */
+    public function signSignSet()
+    {
+        if(!isset($this->params['sid']) || !is_numeric($this->params['sid'])){
+            exit('没有报表参数');
+        }
+        //获取报表信息
+        $signmsg = $this->sign->getOneSignbysid($this->params['sid']);
+
+        //获取标段审批人列表
+        $auditactlist = $this->measureauditact->getUserAuditLast($signmsg['tender'],$signmsg['phaseno']);
+        $userlist = array();
+        if(!empty($auditactlist)){
+            foreach($auditactlist as $k => $v){
+                $usermsg = $this->auth->getRowByUid($v['auditoruid']);
+                $userlist[$k]['userid'] = $usermsg['userid'];
+                $userlist[$k]['name'] = $usermsg['name'];
+                $userlist[$k]['jobs'] = $usermsg['jobs'];
+                $userlist[$k]['avatar'] = $usermsg['avatar'];
+            }
+        }
+
+        //获取项目名,标段名,标段期数
+        $project = $this->project->getRowByPid($signmsg['project']);
+        $tender = $this->actmeasure->getRowByPmid($signmsg['tender']);
+//        $phaseno = $this->numofperact->getCurrStatus($signmsg['phaseno']);
+
+        $signmsg['project'] = $project['pname'];
+        $signmsg['tender'] = $tender['pmname'];
+//        $signmsg['phaseno'] = $phaseno['numpname'];
+
+
+
+
+        //获取报表图片
+        $maxwidth = 794; //默认图片最大宽度   a4
+        $maxheight = 1123; //默认图片最大高度  a4
+        if(!empty($signmsg['widhei'])){
+            $widhei = explode('_', $signmsg['widhei']);
+            $style = $widhei[0].'mm '.$widhei[1].'mm';
+        }else{
+            $style = '210mm 297mm';
+        }
+        $signattlist = $this->sign->getSignAttList($this->params['sid']);
+        if(!empty($signattlist)){
+            foreach($signattlist as $sak => $sav){
+                if($sak == 0){
+                    $imgmsg = getimagesize(Doo::conf()->APP_URL.$sav['filepath']);
+                    $maxwidth = $imgmsg[0];
+                    $maxheight = $imgmsg[1];
+                    break;
+                }
+            }
+        }
+
+        $this->data['signmsg'] = $signmsg;
+        $this->data['userlist'] = $userlist;
+        $this->data['attlist'] = $signattlist;
+        $this->data['maxwidth'] = $maxwidth;
+        $this->data['maxheight'] = $maxheight;
+        $this->data['style'] = $style;
+        $this->render('sign-view-set_signer', $this->data, TRUE);
+    }
+
+    public function signSearchUser(){
+        if(!isset($_GET['email']) || empty($_GET['email'])){
+            echo json_encode(array('code' => 400, 'msg' => '请输入邮箱地址'));
+            exit;
+        }
+
+        $usermsg = $this->auth->checkUserEmail($_GET['email']);
+        if(!empty($usermsg)){
+            echo json_encode(array('code' => 200, 'user' => $usermsg));
+            exit;
+        }else{
+            echo json_encode(array('code' => 400, 'msg' => '没有此邮箱用户'));
+            exit;
+        }
+    }
+
+    public function signUpSigner(){
+        if(!isset($_POST['ids']) || !isset($_POST['names']) || !isset($_POST['sid']) || !is_numeric($_POST['sid'])){
+            echo json_encode(array('code' => 400, 'msg' => '上传参数有误'));
+            exit;
+        }
+        $useridarr = $_POST['ids'];
+        $usernamearr = $_POST['names'];
+        foreach($useridarr as $k => $v){
+            $signs = new Signn();
+            $status = $k != 0 ? 'uncheck' : 'checking';
+            $result = $signs->insertSignAudit($_POST['sid'],$status,$v,$usernamearr[$k]);
+            if(empty($result)){
+                echo json_encode(array('code' => 400, 'msg' => '添加签署人出错'));
+                exit;
+            }
+        }
+        //更新报表信息
+        $result2 = $this->sign->updateSignMsg($_POST['sid'],$this->auth->getUid());
+        if(!empty($result2)){
+            echo json_encode(array('code' => 200, 'msg' => '添加成功'));
+            exit;
+        }else{
+            echo json_encode(array('code' => 400, 'msg' => '添加签署人出错'));
+            exit;
+        }
+    }
+
+    /**
+     *
+     * @return type
+     */
+    public function signView()
+    {
+        if(!isset($this->params['sid']) || !is_numeric($this->params['sid'])){
+            exit('没有报表参数');
+        }
+        //获取报表信息
+        $signmsg = $this->sign->getOneSignbysid($this->params['sid']);
+        //获取项目名,标段名,标段期数
+        $project = $this->project->getRowByPid($signmsg['project']);
+        $tender = $this->actmeasure->getRowByPmid($signmsg['tender']);
+//        $phaseno = $this->numofperact->getCurrStatus($signmsg['phaseno']);
+
+        $signmsg['project'] = $project['pname'];
+        $signmsg['tender'] = $tender['pmname'];
+//        $signmsg['phaseno'] = $phaseno['numpname'];
+
+        //获取签署人列表
+        $signauditlist = $this->sign->getSignAuditList($this->params['sid']);
+        if(!empty($signauditlist)){
+            foreach($signauditlist as $k => $v){
+                //获取签署人头像
+                $signauditlist[$k]['index'] = $k+1;
+                $signauditlist[$k]['avatar'] = $this->auth->getAvatar($v['audituid']);
+            }
+        }
+
+        //获取报表图片
+        $maxwidth = 794; //默认图片最大宽度   a4
+        $maxheight = 1123; //默认图片最大高度  a4
+        if(!empty($signmsg['widhei'])){
+            $widhei = explode('_', $signmsg['widhei']);
+            $style = $widhei[0].'mm '.$widhei[1].'mm';
+        }else{
+            $style = '210mm 297mm';
+        }
+        $signattlist = $this->sign->getSignAttList($this->params['sid']);
+        if(!empty($signattlist)){
+            foreach($signattlist as $sak => $sav){
+                $signattlist[$sak]['auditatt'] = $this->sign->getSignAuditAttList($sav['said']);
+                if($sak == 0){
+                    $imgmsg = getimagesize(Doo::conf()->APP_URL.$sav['filepath']);
+                    $maxwidth = $imgmsg[0];
+                    $maxheight = $imgmsg[1];
+                }
+            }
+        }
+
+        $backurl = '/sign/list';
+        if(isset($_GET['status'])){
+            switch($_GET['status']){
+                case 'done' : $backurl = '/sign/donelist';break;
+                case 'doing' : $backurl = '/sign/onlist';break;
+                case 'mylist' : $backurl = '/sign/mylist';break;
+                case 'onlist' : $backurl = '/sign/onlist';break;
+                case 'donelist' : $backurl = '/sign/donelist';break;
+                default: $backurl = '/sign/list';break;
+            }
+
+        }
+
+        $this->data['signmsg'] = $signmsg;
+        $this->data['auditlist'] = $signauditlist;
+        $this->data['attlist'] = $signattlist;
+        $this->data['backurl'] = $backurl;
+        $this->data['maxwidth'] = $maxwidth;
+        $this->data['maxheight'] = $maxheight;
+        $this->data['style'] = $style;
+
+        $this->render('sign-view-page', $this->data, TRUE);
+    }
+
+
+
+    public function substr_replace_cn($string, $repalce = '*', $start = 0, $len = 0)
+    {
+        $count = mb_strlen($string, 'UTF-8'); //此处传入编码,建议使用utf-8。此处编码要与下面mb_substr()所使用的一致
+        if (!$count) {
+            return $string;
+        }
+        if ($len == 0) {
+            $end = $count;  //传入0则替换到最后
+        } else {
+            $end = $start + $len;       //传入指定长度则为开始长度+指定长度
+        }
+        $i = 0;
+        $returnString = '';
+        while ($i < $count) { //循环该字符串
+            $tmpString = mb_substr($string, $i, 1, 'UTF-8'); // 与mb_strlen编码一致
+            if ($start <= $i && $i < $end) {
+                $returnString .= $repalce;
+            } else {
+                $returnString .= $tmpString;
+            }
+            $i++;
+        }
+        return $returnString;
+    }
+
+    function unicode_encode($name)
+    {//to Unicode
+        $name = iconv('UTF-8', 'UCS-2', $name);
+        $len = strlen($name);
+        $str = '';
+        for ($i = 0; $i < $len - 1; $i = $i + 2) {
+            $c = $name[$i];
+            $c2 = $name[$i + 1];
+            if (ord($c) > 0) {// 两个字节的字
+                $str .= '\\' . base_convert(ord($c), 10, 16) . base_convert(ord($c2), 10, 16);
+            } else {
+                $str .= $c2;
+            }
+        }
+        $str = strtoupper($str);
+        return $str;
+    }
+
+    function unicode_decode($name)
+    {//Unicode to
+        $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';
+        preg_match_all($pattern, $name, $matches);
+        if (!empty($matches)) {
+            $name = '';
+            for ($j = 0; $j < count($matches[0]); $j++) {
+                $str = $matches[0][$j];
+                if (strpos($str, '\\u') === 0) {
+                    $code = base_convert(substr($str, 2, 2), 16, 10);
+                    $code2 = base_convert(substr($str, 4), 16, 10);
+                    $c = chr($code) . chr($code2);
+                    $c = iconv('UCS-2', 'UTF-8', $c);
+                    $name .= $c;
+                } else {
+                    $name .= $str;
+                }
+            }
+        }
+        return $name;
+    }
+
+}
+
+?>

+ 8 - 3
protected/controller/UserController.php

@@ -12,7 +12,7 @@ Doo::loadClass('PasswordHash');
 Doo::loadClass('sms');
 Doo::loadClass('sms');
 Doo::loadModelAt('aconfig', 'admin');
 Doo::loadModelAt('aconfig', 'admin');
 Doo::loadClass('measureauditact');
 Doo::loadClass('measureauditact');
-
+Doo::loadClass('sign');
 /* * proDetail
 /* * proDetail
  * MainController
  * MainController
  * Feel free to delete the methods and replace them with your own code.
  * Feel free to delete the methods and replace them with your own code.
@@ -23,7 +23,7 @@ Doo::loadClass('measureauditact');
 class UserController extends DooController
 class UserController extends DooController
 {
 {
 
 
-    private $data, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $numofperact, $user, $ph, $sms, $aconfig;
+    private $data, $sign, $auth, $attfile, $profile, $project, $contractact, $actmeasure, $numofperact, $user, $ph, $sms, $aconfig;
 
 
     public function beforeRun($resource, $action)
     public function beforeRun($resource, $action)
     {
     {
@@ -56,6 +56,7 @@ class UserController extends DooController
         $this->sms = new Sms(Doo::conf()->SMS_URL, Doo::conf()->SMS_AUTHKEY);
         $this->sms = new Sms(Doo::conf()->SMS_URL, Doo::conf()->SMS_AUTHKEY);
         $this->aconfig = new AConfig();
         $this->aconfig = new AConfig();
         $this->measureauditact = new MeasureauditAct();
         $this->measureauditact = new MeasureauditAct();
+        $this->sign = new signn();
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['rootUrl'] = Doo::conf()->APP_URL;
         $this->data['currChannle'] = 'p';
         $this->data['currChannle'] = 'p';
         $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
         $this->data['user'] = $this->profile->getProWithUid($this->auth->getUid());
@@ -66,9 +67,13 @@ class UserController extends DooController
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
                 $this->data['numofchecking'] += $this->measureauditact->getCountMyChecking($value['pid'], $this->auth->getUid());
             }
             }
         }
         }
-        if ($this->data['numofchecking'] == 0) {
+        if (!isset($this->data['numofchecking']) || $this->data['numofchecking'] == 0) {
             $this->data['numofchecking'] = null;
             $this->data['numofchecking'] = null;
         }
         }
+
+        //获取需要您签署的数目
+        $this->data['needSignNum'] = $this->sign->getNeedSignNumbyUid($this->auth->getUid()) != 0 ? $this->sign->getNeedSignNumbyUid($this->auth->getUid()) : '';
+
     }
     }
 
 
     /**
     /**

+ 34 - 0
protected/model/sign.php

@@ -0,0 +1,34 @@
+<?php
+
+Doo::loadCore('db/DooModel');
+
+/**
+ * 用户表
+ */
+class Sign extends DooModel {
+
+    public $sid;
+    public $project;
+    public $tender;
+    public $phaseno;
+    public $name;
+    public $ownuid;
+    public $intime;
+    public $pagenum;
+    public $widhei;
+    public $audituid;
+    public $aintime;
+    public $status;
+    public $sintime;
+    public $ishare;
+    public $_table = 'jl_sign';
+    public $_primarykey = 'sid';
+    public $_fields = array('sid', 'project', 'tender', 'phaseno', 'name', 'ownuid', 'intime', 'pagenum', 'widhei', 'audituid', 'aintime', 'status', 'sintime', 'ishare');
+
+    public function __construct() {
+        parent::setupModel(__CLASS__);
+    }
+
+}
+
+?>

+ 24 - 0
protected/model/signatt.php

@@ -0,0 +1,24 @@
+<?php
+
+Doo::loadCore('db/DooModel');
+
+/**
+ * 用户表
+ */
+class SignAtt extends DooModel {
+
+    public $said;
+    public $sid;
+    public $curnum;
+    public $filepath;
+    public $_table = 'jl_sign_attachment';
+    public $_primarykey = 'said';
+    public $_fields = array('said', 'sid', 'curnum', 'filepath');
+
+    public function __construct() {
+        parent::setupModel(__CLASS__);
+    }
+
+}
+
+?>

+ 26 - 0
protected/model/signaudit.php

@@ -0,0 +1,26 @@
+<?php
+
+Doo::loadCore('db/DooModel');
+
+/**
+ * 用户表
+ */
+class SignAudit extends DooModel {
+
+    public $satid;
+    public $sid;
+    public $status;
+    public $audituid;
+    public $aname;
+    public $intime;
+    public $_table = 'jl_sign_audit';
+    public $_primarykey = 'satid';
+    public $_fields = array('satid', 'sid', 'status', 'audituid', 'aname', 'intime');
+
+    public function __construct() {
+        parent::setupModel(__CLASS__);
+    }
+
+}
+
+?>

+ 25 - 0
protected/model/signauditatt.php

@@ -0,0 +1,25 @@
+<?php
+
+Doo::loadCore('db/DooModel');
+
+/**
+ * 用户表
+ */
+class SignAuditAtt extends DooModel {
+
+    public $saaid;
+    public $audituid;
+    public $said;
+    public $picpath;
+    public $position;
+    public $_table = 'jl_sign_audit_attachment';
+    public $_primarykey = 'saaid';
+    public $_fields = array('saaid', 'audituid', 'said', 'picpath', 'position');
+
+    public function __construct() {
+        parent::setupModel(__CLASS__);
+    }
+
+}
+
+?>

+ 3 - 1
protected/model/uprofile.php

@@ -18,9 +18,11 @@ class Uprofile extends DooModel
     public $groups;
     public $groups;
     public $avatar;
     public $avatar;
     public $isnotice;
     public $isnotice;
+    public $remark;
+    public $signpath;
     public $_table = 'jl_user_profiles';
     public $_table = 'jl_user_profiles';
     public $_primarykey = 'userid';
     public $_primarykey = 'userid';
-    public $_fields = array('userid', 'name', 'company', 'jobs', 'phone', 'mobile', 'qq', 'groups', 'avatar', 'isnotice', 'remark');
+    public $_fields = array('userid', 'name', 'company', 'jobs', 'phone', 'mobile', 'qq', 'groups', 'avatar', 'isnotice', 'remark', 'signpath');
 
 
     public function __construct()
     public function __construct()
     {
     {

+ 11 - 0
protected/module/admin/controller/AdminController.php

@@ -95,6 +95,17 @@ class AdminController extends DooController
                 $this->userz->update(array('where' => 'uid = ?', 'param' => array($this->params['uid'])));
                 $this->userz->update(array('where' => 'uid = ?', 'param' => array($this->params['uid'])));
             }
             }
         }
         }
+        if(isset($_FILES['sign']) && !empty($_FILES['sign']['name']) && $_FILES['sign']['type'] == "image/png"){
+            $dir = 'global/signpath';
+            if ($_FILES['sign']['error'] > 0) {
+
+            } else {
+                $fileName = date("YmdHis") . '_' . floor(microtime() * 1000) . '_' . self::createRandomCode(8);
+                $virtualPath = "$dir/php_sign_$fileName.jpg";
+                move_uploaded_file($_FILES['sign']["tmp_name"], Doo::conf()->SITE_PATH .$virtualPath);
+                $this->profile->setSignPath($this->params['uid'], $virtualPath);
+            }
+        }
         if (isset($_POST['company']) && isset($_POST['jobs']) && isset($_POST['name']) && isset($_POST['phone'])) {
         if (isset($_POST['company']) && isset($_POST['jobs']) && isset($_POST['name']) && isset($_POST['phone'])) {
             $this->profile->upProfile($this->params['uid'], $_POST);
             $this->profile->upProfile($this->params['uid'], $_POST);
             return Doo::conf()->APP_URL . 'manage/user/list';
             return Doo::conf()->APP_URL . 'manage/user/list';

+ 2 - 2
protected/module/admin/controller/ProController.php

@@ -211,8 +211,8 @@ class ProController extends DooController
                     }
                     }
                     //修改上一审状态为uncheck,下一审状态为checking
                     //修改上一审状态为uncheck,下一审状态为checking
                     $lastmamsg = $this->ama->getAuditByMpidStatus($mamsg['mpid'],'checking');
                     $lastmamsg = $this->ama->getAuditByMpidStatus($mamsg['mpid'],'checking');
-                    $this->ama->updateStatus($lastmamsg['maid'],'uncheck');
-                    $this->ama->updateStatus($_POST['maid'],'checking');
+                    $this->ama->updateStatus($lastmamsg['maid'],'uncheck',2);
+                    $this->ama->updateStatus($_POST['maid'],'checking',2);
                     $this->attfile->updateHash($mumsg['pmid'], $mumsg['numpname'], $mumsg['times']);
                     $this->attfile->updateHash($mumsg['pmid'], $mumsg['numpname'], $mumsg['times']);
                 }
                 }
                 die(json_encode(array('status' => 'ok')));
                 die(json_encode(array('status' => 'ok')));

+ 8 - 2
protected/module/admin/model/measureaudit.php

@@ -21,9 +21,11 @@ class AmeasureAudit extends DooModel
     public $last;
     public $last;
     public $audittime;
     public $audittime;
     public $auditcontent;
     public $auditcontent;
+    public $intime;
+    public $onlineaudit;
     public $_table = 'jl_measure_audit';
     public $_table = 'jl_measure_audit';
     public $_primarykey = 'maid';
     public $_primarykey = 'maid';
-    public $_fields = array('maid', 'pid', 'creatoruid', 'auditoruid', 'mpid', 'pmid', 'stid', 'numpname', 'times', 'mastatus', 'last', 'audittime', 'auditcontent');
+    public $_fields = array('maid', 'pid', 'creatoruid', 'auditoruid', 'mpid', 'pmid', 'stid', 'numpname', 'times', 'mastatus', 'last', 'audittime', 'auditcontent', 'intime', 'onlineaudit');
 
 
     public function __construct()
     public function __construct()
     {
     {
@@ -40,10 +42,14 @@ class AmeasureAudit extends DooModel
         return $this->getOne(array('where' => 'maid=?', 'param' => array($maid), 'asArray' => true));
         return $this->getOne(array('where' => 'maid=?', 'param' => array($maid), 'asArray' => true));
     }
     }
 
 
-    function updateStatus($maid, $status)
+    function updateStatus($maid, $status, $auditcontent = 1, $online = 1)
     {
     {
         $this->mastatus = $status;
         $this->mastatus = $status;
         $this->audittime = time();
         $this->audittime = time();
+        if($auditcontent != 1){
+            $this->auditcontent = '';
+        }
+        $this->onlineaudit = $online;
         return $this->update(array('where' => 'maid=?', 'param' => array($maid)));
         return $this->update(array('where' => 'maid=?', 'param' => array($maid)));
     }
     }
 
 

+ 61 - 1
protected/module/admin/view/admin-editUser.html

@@ -27,7 +27,7 @@
     </div>
     </div>
     <div class="adminContent">
     <div class="adminContent">
         <div class="adminMain">
         <div class="adminMain">
-            <form class="form-horizontal" method="post">
+            <form class="form-horizontal" method="post" enctype="multipart/form-data">
                 <fieldset>
                 <fieldset>
                     <legend>编辑用户</legend>
                     <legend>编辑用户</legend>
                     <div class="control-group">
                     <div class="control-group">
@@ -72,6 +72,12 @@
                             <input type="text" disabled="disabled" value="{{profile.mobile}}">
                             <input type="text" disabled="disabled" value="{{profile.mobile}}">
                         </div>
                         </div>
                     </div>
                     </div>
+                    <div class="control-group">
+                        <label class="control-label">电子签名</label>
+                        <div class="controls">
+                            <img id="signpic" src="{{rootUrl}}{{profile.signpath}}" width="150px"> <a href="#addsign" data-toggle="modal">更新</a>
+                        </div>
+                    </div>
                     <div class="alert alert-error">
                     <div class="alert alert-error">
                         <strong>请谨慎编辑用户!</strong> 编辑后将影响该用户曾参与的所有标段数据。
                         <strong>请谨慎编辑用户!</strong> 编辑后将影响该用户曾参与的所有标段数据。
                     </div>
                     </div>
@@ -82,6 +88,37 @@
                         </div>
                         </div>
                     </div>
                     </div>
                 </fieldset>
                 </fieldset>
+                <!-- 更新签名 -->
+                <div id="addsign" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                    <div class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                        <h3 id="myModalLabel">更新电子签名</h3>
+                    </div>
+                    <div class="modal-body">
+
+                        <div class="form">
+                            <form class="form-horizontal">
+                                <div class="control-group">
+                                    <label class="control-label">上传签名图</label>
+                                    <div class="controls">
+                                        <input type="file" name="sign" id="uploadsign" value="" accept="image/png">
+                                    </div>
+                                </div>
+                                <div class="control-group">
+                                    <label class="control-label">生成签名图</label>
+                                    <div class="controls">
+                                        <a href="http://sign.6jlzf.cn" target="_blank" class="btn">打开 HWPenSign</a>
+                                    </div>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+                    <div class="modal-footer">
+                        <button class="btn" data-dismiss="modal" aria-hidden="true">关闭</button>
+                        <button class="btn btn-primary" sign-url="" id="updatesignbtn" data-dismiss="modal" aria-hidden="true">更新</button>
+                    </div>
+                </div>
+                <!-- 更新签名 -->
             </form>
             </form>
 
 
             <div class="tabbable">
             <div class="tabbable">
@@ -146,4 +183,27 @@
     </div>
     </div>
 </div>
 </div>
 <script type="text/javascript">autoFlashHeight();</script>
 <script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $(function(){
+        $('#uploadsign').change(function(){
+            var objUrl = getObjectURL(this.files[0]) ;
+            $('#updatesignbtn').attr('sign-url',objUrl);
+        });
+        $('#updatesignbtn').click(function(){
+            $('#signpic').attr('src',$(this).attr('sign-url'));
+            $(this).attr('sign-url','');
+        })
+    });
+    function getObjectURL(file) {
+        var url = null;
+        if (window.createObjectURL != undefined) {
+            url = window.createObjectURL(file)
+        } else if (window.URL != undefined) {
+            url = window.URL.createObjectURL(file)
+        } else if (window.webkitURL != undefined) {
+            url = window.webkitURL.createObjectURL(file)
+        }
+        return url;
+    };
+</script>
 </body>
 </body>

+ 1 - 1
protected/view/left.html

@@ -4,7 +4,7 @@
 	    <li data-placement="right" data-toggle="tooltip" data-original-title="业主"><a href="{{rootUrl}}project/index" <!-- if {{currChannle}}=='p' --> class="focus" <!-- endif --> title="项目管理"><div data-icon="A" aria-hidden="true" class="navIcon"></div>项目管理</a></li>
 	    <li data-placement="right" data-toggle="tooltip" data-original-title="业主"><a href="{{rootUrl}}project/index" <!-- if {{currChannle}}=='p' --> class="focus" <!-- endif --> title="项目管理"><div data-icon="A" aria-hidden="true" class="navIcon"></div>项目管理</a></li>
 	    <li data-placement="right" data-toggle="tooltip" data-original-title="审批人"><a href="{{rootUrl}}rproject/index" <!-- if {{currChannle}}=='r' --> class="focus" <!-- endif --> title="需审批项目"><div data-icon="C" aria-hidden="true" class="navIcon"></div>审批项目</a><span class="badge badge-warning">{{numofchecking}}</span></li>
 	    <li data-placement="right" data-toggle="tooltip" data-original-title="审批人"><a href="{{rootUrl}}rproject/index" <!-- if {{currChannle}}=='r' --> class="focus" <!-- endif --> title="需审批项目"><div data-icon="C" aria-hidden="true" class="navIcon"></div>审批项目</a><span class="badge badge-warning">{{numofchecking}}</span></li>
 	    <li data-placement="right" data-toggle="tooltip" data-original-title="计量上报人"><a href="{{rootUrl}}sproject/index" <!-- if {{currChannle}}=='s' --> class="focus" <!-- endif --> title="我编制的项目"><div data-icon="B" aria-hidden="true" class="navIcon"></div>编制项目</a></li>
 	    <li data-placement="right" data-toggle="tooltip" data-original-title="计量上报人"><a href="{{rootUrl}}sproject/index" <!-- if {{currChannle}}=='s' --> class="focus" <!-- endif --> title="我编制的项目"><div data-icon="B" aria-hidden="true" class="navIcon"></div>编制项目</a></li>
-	    <!--<li><a href="" title="生成报表"><div data-icon="D" aria-hidden="true" class="navIcon"></div>报表</a></li>-->
+		<li><a href="/sign/index" <!-- if {{currChannle}}=='sign' --> class="focus" <!-- endif --> title="报表签署"><div data-icon="D" aria-hidden="true" class="navIcon"></div>报表签署</a><span class="badge badge-warning">{{needSignNum}}</span></li>
 	    <!--<li><a href="" title="数据汇总"><div data-icon="E" aria-hidden="true" class="navIcon"></div>汇总</a></li>-->
 	    <!--<li><a href="" title="数据汇总"><div data-icon="E" aria-hidden="true" class="navIcon"></div>汇总</a></li>-->
 	</ul>
 	</ul>
     </div>
     </div>

+ 125 - 0
protected/view/sign-create_sign.html

@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    <div class="mainContainer">
+        <!--内容-->
+        <div class="mainContent">
+            <div class="title clearfix">
+                <h1><a href="/sign/index" title="返回"><span class="closePanel" aria-hidden="true"
+                                                               data-icon="Z"></span></a>&nbsp;发起签署</h1>
+            </div>
+            <div class="project">
+                <div class="proSection">
+                    <ul class="nav nav-pills">
+                        <li>
+                            <select id="itemlist">
+                                <option value="0">请选择项目</option>
+                                <!-- if !empty({{itemlist}}) -->
+                                <!-- loop itemlist -->
+                                <option value="{{itemlist' value.project}}" <!-- if {{project}} == {{itemlist' value.project}} -->selected<!-- endif --> >{{itemlist' value.pname}}</option>
+                                <!-- endloop -->
+                                <!-- endif -->
+                            </select>&nbsp;
+                        </li>
+                        <li>
+                            <select id="tenderlist">
+                                <option value="0">请选择标段</option>
+                                <!-- if !empty({{tenderlist}}) -->
+                                <!-- loop tenderlist -->
+                                <option value="{{tenderlist' value.tender}}" <!-- if {{tender}} == {{tenderlist' value.tender}} -->selected<!-- endif -->>{{tenderlist' value.pmname}}</option>
+                                <!-- endloop -->
+                                <!-- endif -->
+                            </select>&nbsp;
+                        </li>
+                        <li>
+                            <select id="phasenolist">
+                                <option value="0">请选择期数</option>
+                                <!-- if !empty({{phasenolist}}) -->
+                                <!-- loop phasenolist -->
+                                <option value="{{phasenolist' value.phaseno}}" <!-- if {{phaseno}} == {{phasenolist' value.phaseno}} -->selected<!-- endif -->>第{{ToChinaseNum(phasenolist' value.numpname)}}期</option>
+                                <!-- endloop -->
+                                <!-- endif -->
+                            </select>&nbsp;
+                        </li>
+                    </ul>
+                    <table class="table">
+                        <thead>
+                        <tr>
+                            <th width="40%">报表名</th>
+                            <th width="20%">项目-标段-期数</th>
+                            <th width="10%">生成人</th>
+                            <th width="10%">生成时间</th>
+                            <th width="10%">操作</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <!-- if !empty({{unlist}}) -->
+                        <!-- loop unlist -->
+                        <tr>
+                            <td width="">{{unlist' value.name}}</td>
+                            <td>{{unlist' value.project}}-{{unlist' value.tender}}-第{{ToChinaseNum(unlist' value.phaseno)}}期</td>
+                            <td>{{unlist' value.ownname}}</td>
+                            <td>{{formatDate(unlist' value.intime,'Y-m-d')}}</td>
+                            <td width=""><a class="btn btn-primary btn-small" href="/sign/set/{{list' value.sid}}">发起签署</a>
+                        </tr>
+                        <!-- endloop -->
+                        <!-- endif -->
+                        </tbody>
+                    </table>
+                    <div class="pagination">
+                        <ul>
+                            {{pager}}
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--内容-->
+    </div>
+</div>
+
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $(function(){
+        $('#itemlist').change(function(){
+            var url = '/sign/create';
+            if($(this).val() != 0){
+                url += '/project/'+$(this).val();
+            }
+            window.location.href = url;
+        });
+
+        $('#tenderlist').change(function(){
+            var url = '/sign/create/project/'+$('#itemlist').val();
+            if($(this).val() != 0){
+                url += '/tender/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+        $('#phasenolist').change(function(){
+            var url = '/sign/create/project/'+$('#itemlist').val()+'/tender/'+$('#tenderlist').val();
+            if($(this).val() != 0){
+                url += '/phaseno/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+    })
+</script>
+</body>

+ 39 - 0
protected/view/sign-index.html

@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    <div class="mainContainer">
+        <!--内容-->
+        <div class="mainContent">
+            <div class="sign-index">
+                <div class="sign-menu clearfix">
+                    <div class="item"><h1>需要我签署</h1><a href="/sign/needlist"><!-- if !empty({{needSignNum}}) -->{{needSignNum}}<!-- else -->0<!-- endif --></a></div>
+                    <div class="item"><h1>我发起的签署</h1><a href="/sign/mylist">{{mySignNum}}</a></div>
+                    <div class="item"><h1>正在签署</h1><a href="/sign/onlist">{{doingSignNum}}</a></div>
+                    <div class="item"><h1>签署完成</h1><a href="/sign/donelist">{{doneSignNum}}</a></div>
+                </div>
+                <div class="bar"><p><a href="/sign/create" class="btn btn-primary btn-large btn-block">发起签署</a>
+                </p>
+                    <p><a href="/sign/list">查看所有报表</a></p></div>
+            </div>
+        </div>
+        <!--内容-->
+    </div>
+</div>
+
+<script type="text/javascript">autoFlashHeight();</script>
+</body>

+ 127 - 0
protected/view/sign-list-all.html

@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    <div class="mainContainer">
+        <!--内容-->
+        <div class="mainContent">
+            <div class="title clearfix">
+                <h1><a href="/sign/index" title="返回"><span class="closePanel" aria-hidden="true"
+                                                               data-icon="Z"></span></a>&nbsp;所有报表</h1>
+            </div>
+            <div class="project">
+                <div class="proSection">
+                    <ul class="nav nav-pills">
+                        <li>
+                            <select id="itemlist">
+                                <option value="0">请选择项目</option>
+                                <!-- if !empty({{itemlist}}) -->
+                                <!-- loop itemlist -->
+                                <option value="{{itemlist' value.project}}" <!-- if {{project}} == {{itemlist' value.project}} -->selected<!-- endif --> >{{itemlist' value.pname}}</option>
+                                <!-- endloop -->
+                                <!-- endif -->
+                            </select>&nbsp;
+                        </li>
+                        <li>
+                            <select id="tenderlist">
+                                <option value="0">请选择标段</option>
+                                <!-- if !empty({{tenderlist}}) -->
+                                <!-- loop tenderlist -->
+                                <option value="{{tenderlist' value.tender}}" <!-- if {{tender}} == {{tenderlist' value.tender}} -->selected<!-- endif -->>{{tenderlist' value.pmname}}</option>
+                                <!-- endloop -->
+                                <!-- endif -->
+                            </select>&nbsp;
+                        </li>
+                        <li>
+                            <select id="phasenolist">
+                                <option value="0">请选择期数</option>
+                                <!-- if !empty({{phasenolist}}) -->
+                                <!-- loop phasenolist -->
+                                <option value="{{phasenolist' value.phaseno}}" <!-- if {{phaseno}} == {{phasenolist' value.phaseno}} -->selected<!-- endif -->>第{{ToChinaseNum(phasenolist' value.numpname)}}期</option>
+                                <!-- endloop -->
+                                <!-- endif -->
+                            </select>&nbsp;
+                        </li>
+                    </ul>
+                    <table class="table">
+                        <thead>
+                        <tr>
+                            <th width="40%">报表名</th>
+                            <th width="20%">项目-标段-期数</th>
+                            <th width="10%">生成</th>
+                            <th width="10%">发起</th>
+                            <th width="10%">状态</th>
+                            <th width="10%">操作</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <!-- if !empty({{list}}) -->
+                        <!-- loop list -->
+                        <tr>
+                            <td width="">{{list' value.name}}</td>
+                            <td>{{list' value.project}}-{{list' value.tender}}-第{{ToChinaseNum(list' value.phaseno)}}期</td>
+                            <td>{{list' value.ownname}}<br>{{formatDate(list' value.intime,'Y-m-d')}}</td>
+                            <td><!-- if !empty({{list' value.auditname}}) -->{{list' value.auditname}}<!-- endif --><br><!-- if !empty({{list' value.aintime}}) -->{{formatDate(list' value.aintime,'Y-m-d')}}<!-- endif --></td>
+                            <td><!-- if {{list' value.status}} == 'checked' --><span class="colGreen">完成</span><br>{{formatDate(list' value.sintime,'Y-m-d')}}<!-- elseif {{list' value.status}} == 'checking' --><span class="colOrange">签署中</span><br><!-- endif --></td>
+                            <td width=""><a class="btn btn-small" href="/sign/view/{{list' value.sid}}">查看报表</a></td>
+                        </tr>
+                        <!-- endloop -->
+                        <!-- endif -->
+                        </tbody>
+                    </table>
+                    <div class="pagination">
+                        <ul>
+                            {{pager}}
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--内容-->
+    </div>
+</div>
+
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $(function(){
+        $('#itemlist').change(function(){
+            var url = '/sign/list';
+            if($(this).val() != 0){
+                url += '/project/'+$(this).val();
+            }
+            window.location.href = url;
+        });
+
+        $('#tenderlist').change(function(){
+            var url = '/sign/list/project/'+$('#itemlist').val();
+            if($(this).val() != 0){
+                url += '/tender/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+        $('#phasenolist').change(function(){
+            var url = '/sign/list/project/'+$('#itemlist').val()+'/tender/'+$('#tenderlist').val();
+            if($(this).val() != 0){
+                url += '/phaseno/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+    })
+</script>
+</body>

+ 118 - 0
protected/view/sign-list-done_sign.html

@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    	<div class="mainContainer">
+    		<!--内容-->
+      <div class="mainContent">
+      <div class="title clearfix">
+        <h1><a href="/sign/index" title="返回"><span class="closePanel" aria-hidden="true" data-icon="Z"></span></a>&nbsp;签署完成</h1>
+      </div>
+    <div class="project">
+      <div class="proSection">
+        <ul class="nav nav-pills">
+            <li>
+                <select id="itemlist">
+                    <option value="0">请选择项目</option>
+                    <!-- if !empty({{itemlist}}) -->
+                    <!-- loop itemlist -->
+                    <option value="{{itemlist' value.project}}" <!-- if {{project}} == {{itemlist' value.project}} -->selected<!-- endif --> >{{itemlist' value.pname}}</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+            <li>
+                <select id="tenderlist">
+                    <option value="0">请选择标段</option>
+                    <!-- if !empty({{tenderlist}}) -->
+                    <!-- loop tenderlist -->
+                    <option value="{{tenderlist' value.tender}}" <!-- if {{tender}} == {{tenderlist' value.tender}} -->selected<!-- endif -->>{{tenderlist' value.pmname}}</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+            <li>
+                <select id="phasenolist">
+                    <option value="0">请选择期数</option>
+                    <!-- if !empty({{phasenolist}}) -->
+                    <!-- loop phasenolist -->
+                    <option value="{{phasenolist' value.phaseno}}" <!-- if {{phaseno}} == {{phasenolist' value.phaseno}} -->selected<!-- endif -->>第{{ToChinaseNum(phasenolist' value.numpname)}}期</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+        </ul>
+        <table class="table">
+          <thead>
+          <tr><th width="50%">报表名</th><th width="20%">项目-标段-期数</th><th width="10%">发起时间</th><th width="10%">状态</th><th width="10%">操作</th></tr>
+          </thead>
+          <tbody>
+          <!-- if !empty({{donelist}}) -->
+          <!-- loop donelist -->
+          <tr>
+            <td width="">{{donelist' value.name}}</td>
+            <td>{{donelist' value.project}}-{{donelist' value.tender}}-第{{ToChinaseNum(donelist' value.phaseno)}}期</td>
+            <td>{{formatDate(donelist' value.aintime,'Y-m-d')}}</td>
+            <td><span class="colGreen">完成</span><br>{{formatDate(donelist' value.sintime,'Y-m-d')}}</td>
+            <td width=""><a class="btn btn-small" href="/sign/view/{{donelist' value.sid}}?status=donelist">查看报表</a></td>
+          </tr>
+          <!-- endloop -->
+          <!-- endif -->
+          </tbody>
+        </table>
+        <div class="pagination">
+           <ul>
+               {{pager}}
+           </ul>
+        </div>
+      </div>
+    </div>
+  </div>
+        <!--内容-->
+    	</div>
+    </div>
+
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $(function(){
+        $('#itemlist').change(function(){
+            var url = '/sign/donelist';
+            if($(this).val() != 0){
+                url += '/project/'+$(this).val();
+            }
+            window.location.href = url;
+        });
+
+        $('#tenderlist').change(function(){
+            var url = '/sign/donelist/project/'+$('#itemlist').val();
+            if($(this).val() != 0){
+                url += '/tender/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+        $('#phasenolist').change(function(){
+            var url = '/sign/donelist/project/'+$('#itemlist').val()+'/tender/'+$('#tenderlist').val();
+            if($(this).val() != 0){
+                url += '/phaseno/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+    })
+</script>
+</body>

+ 190 - 0
protected/view/sign-list-my_create.html

@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    	<div class="mainContainer">
+    		<!--内容-->
+      <div class="mainContent">
+      <div class="title clearfix">
+        <h1><a href="/sign/index" title="返回"><span class="closePanel" aria-hidden="true" data-icon="Z"></span></a>&nbsp;我发起的签署</h1>
+      </div>
+    <div class="project">
+      <div class="proSection">
+        <ul class="nav nav-pills">
+            <li>
+                <select id="itemlist">
+                    <option value="0">请选择项目</option>
+                    <!-- if !empty({{itemlist}}) -->
+                    <!-- loop itemlist -->
+                    <option value="{{itemlist' value.project}}" <!-- if {{project}} == {{itemlist' value.project}} -->selected<!-- endif --> >{{itemlist' value.pname}}</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+            <li>
+                <select id="tenderlist">
+                    <option value="0">请选择标段</option>
+                    <!-- if !empty({{tenderlist}}) -->
+                    <!-- loop tenderlist -->
+                    <option value="{{tenderlist' value.tender}}" <!-- if {{tender}} == {{tenderlist' value.tender}} -->selected<!-- endif -->>{{tenderlist' value.pmname}}</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+            <li>
+                <select id="phasenolist">
+                    <option value="0">请选择期数</option>
+                    <!-- if !empty({{phasenolist}}) -->
+                    <!-- loop phasenolist -->
+                    <option value="{{phasenolist' value.phaseno}}" <!-- if {{phaseno}} == {{phasenolist' value.phaseno}} -->selected<!-- endif -->>第{{ToChinaseNum(phasenolist' value.numpname)}}期</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+        </ul>
+        <table class="table">
+          <thead>
+          <tr><th width="50%">报表名</th><th width="20%">项目-标段-期数</th><th width="10%">发起时间</th><th width="10%">状态</th><th width="10%">操作</th></tr>
+          </thead>
+          <tbody>
+          <!-- if !empty({{mylist}}) -->
+          <!-- loop mylist -->
+          <tr>
+            <td width="">{{mylist' value.name}}</td>
+            <td>{{mylist' value.project}}-{{mylist' value.tender}}-第{{ToChinaseNum(mylist' value.phaseno)}}期</td>
+            <td>{{formatDate(mylist' value.aintime,'Y-m-d')}}</td>
+            <td><!-- if {{mylist' value.status}} == 'checked' --><span class="colGreen">完成</span><br>{{formatDate(mylist' value.sintime,'Y-m-d')}}<!-- elseif {{mylist' value.status}} == 'checking' --><span class="colOrange">签署中</span><br><!-- endif --></td>
+            <td width=""><a class="btn btn-small" href="/sign/view/{{mylist' value.sid}}?status=mylist">查看报表</a>&nbsp;<a class="btn btn-small <!-- if {{mylist' value.ishare}} == 1 -->btn-success<!-- endif -->" onclick="sharesign('{{mylist' value.ishare}}','{{mylist' value.sid}}');" href="#share" title="分享" id="sharebtn{{mylist' value.sid}}" data-toggle="modal"><span class="icon-share <!-- if {{mylist' value.ishare}} == 1 -->icon-white<!-- endif -->"></span></a></td>
+          </tr>
+          <!-- endloop -->
+          <!-- endif -->
+          </tbody>
+        </table>
+        <div class="pagination">
+          <ul>
+              {{pager}}
+          </ul>
+        </div>
+      </div>
+    </div>
+  </div>
+        <!--内容-->
+    	</div>
+    </div>
+<!-- 添加签署人弹出 -->
+<div id="share" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+    <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3 id="myModalLabel">分享报表</h3>
+    </div>
+    <div class="modal-body">
+        <form class="form-horizontal">
+
+        <div class="control-group">
+            <input type="hidden" id="sharesid" value="">
+            <label class="control-label" for="ishare"></label>
+            <div class="controls">
+                <div class="checkbox" >
+                    <label style="display: inline-block" id="ishare">
+                        <input checked="" type="checkbox" name=""> 启用
+                    </label>
+                </div>
+            </div>
+            <div id="showshare" style="display:none">
+            <label class="control-label" for="shareurl">分享地址</label>
+            <div class="controls">
+                <input placeholder="这是该项目的KEY" id="shareurl" value="{{rootUrl}}share?sid=" style="cursor: text" readonly class="span4" onfocus="this.select()" onmouseover="this.focus()" type="text">
+                <p>分享以上链接即可免登录查阅标该报表。</p>
+            </div>
+            </div>
+        </div>
+    </form>
+    </div>
+</div>
+<!-- 添加签署人弹出 -->
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    function sharesign(flag,sid){
+        if(parseInt(flag)){
+            $('#ishare input').prop('checked',true);
+            $('#showshare').show();
+        }else{
+            $('#ishare input').prop('checked',false);
+            $('#showshare').hide();
+        }
+        $('#shareurl').attr('value', '{{rootUrl}}share?sid='+sid);
+        $('#sharesid').val(sid);
+    }
+    $(function(){
+        $('#ishare').click(function(e){
+            if(e.target.tagName != "INPUT")
+                return;
+            $.ajax({
+                type: 'get',
+                url: '/sign/changeshare',
+                data: {status:$('#ishare input').prop('checked'),sid:$('#sharesid').val()},
+                dataType: 'json',
+                success: function(result){
+                    if(result.code == 400){
+                        alert(result.msg);
+                    }else{
+                        if(result.status){
+                            $('#sharebtn'+$('#sharesid').val()).addClass("btn-success");
+                            $('#sharebtn'+$('#sharesid').val()).children('span').addClass('icon-white');
+                            $('#showshare').show();
+                            $('#sharebtn'+$('#sharesid').val()).attr('onclick',"sharesign('1','"+$('#sharesid').val()+"')");
+                        }else{
+                            $('#sharebtn'+$('#sharesid').val()).removeClass("btn-success");
+                            $('#sharebtn'+$('#sharesid').val()).children('span').removeClass('icon-white');
+                            $('#showshare').hide();
+                            $('#sharebtn'+$('#sharesid').val()).attr('onclick',"sharesign('0','"+$('#sharesid').val()+"')");
+                        }
+                    }
+                }
+            })
+        })
+    })
+</script>
+<script>
+    $(function(){
+        $('#itemlist').change(function(){
+            var url = '/sign/mylist';
+            if($(this).val() != 0){
+                url += '/project/'+$(this).val();
+            }
+            window.location.href = url;
+        });
+
+        $('#tenderlist').change(function(){
+            var url = '/sign/mylist/project/'+$('#itemlist').val();
+            if($(this).val() != 0){
+                url += '/tender/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+        $('#phasenolist').change(function(){
+            var url = '/sign/mylist/project/'+$('#itemlist').val()+'/tender/'+$('#tenderlist').val();
+            if($(this).val() != 0){
+                url += '/phaseno/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+    })
+</script>
+</body>

+ 75 - 0
protected/view/sign-list-need_sign.html

@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+  <meta charset=utf-8>
+  <title>纵横计量支付系统</title>
+  <meta name=description content=计量支付>
+  <meta name=copyright content=smartcost.com.cn>
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+  <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+  <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+  <script src={{rootUrl}}global/js/bootstrap.js></script>
+  <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+  <!-- include "left" -->
+    	<div class="mainContainer">
+    		<!--内容-->
+      <div class="mainContent">
+      <div class="title clearfix">
+        <h1><a href="/sign/index" title="返回"><span class="closePanel" aria-hidden="true" data-icon="Z"></span></a>&nbsp;需要我签署</h1>
+      </div>
+    <div class="project">
+      <!-- if !empty({{needlist}}) -->
+      <!-- loop needlist -->
+      <div class="proSection">
+        <legend>{{needlist' value.project}}</legend>
+        <!-- if !empty({{needlist' value.tlist}}) -->
+        <!-- loop needlist' value.tlist -->
+        <!-- if !empty({{needlist' tlist' value.plist -->
+        <!-- loop needlist' tlist' value.plist -->
+        <table class="table">
+          <thead>
+          <tr><th colspan="3">{{needlist' tlist' value.tender}} 第{{ToChinaseNum(needlist' tlist' plist' value.phaseno)}}期</th></tr>
+          </thead>
+          <tbody>
+          <!-- if !empty({{needlist' tlist' plist' value.signlist}}) -->
+          <!-- loop needlist' tlist' plist' value.signlist -->
+          <tr>
+            <td width="50%">{{needlist' tlist' plist' signlist' value.name}}</td>
+            <td>
+              <div class="sign-avatars">
+                <!-- loop needlist' tlist' plist' signlist' value.auditlist -->
+                <!-- if {{needlist' tlist' plist' signlist' auditlist' value.status}} == 'checked' -->
+                <span class="colGreen" data-toggle="tooltip" data-placement="bottom" data-original-title="{{formatDate(needlist' tlist' plist' signlist' auditlist' value.intime,'Y-m-d')}} 完成签署">{{needlist' tlist' plist' signlist' auditlist' value.aname}}</span>
+                <!-- elseif {{needlist' tlist' plist' signlist' auditlist' value.status}} == 'checking' -->
+                <span class="colOrange" data-toggle="tooltip" data-placement="bottom" data-original-title="签署中">{{needlist' tlist' plist' signlist' auditlist' value.aname}}</span>
+                <!-- else -->
+                <span>{{needlist' tlist' plist' signlistt' auditlist' value.aname}}</span>
+                <!-- endif -->
+                <!-- endloop -->
+              </div>
+            </td>
+            <td width="10%"><a href="/sign/needview/{{needlist' tlist' plist' signlist' value.sid}}" class="btn btn-primary btn-small">签署</a></td>
+          </tr>
+          <!-- endloop -->
+          <!-- endif -->
+          </tbody>
+        </table>
+        <!-- endloop -->
+        <!-- endif -->
+        <!-- endloop -->
+        <!-- endif -->
+      </div>
+      <!-- endloop -->
+      <!-- endif -->
+    </div>
+  </div>
+        <!--内容-->
+    	</div>
+    </div>
+<script type="text/javascript">autoFlashHeight();</script>
+</body>

+ 131 - 0
protected/view/sign-list-on_sign.html

@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    	<div class="mainContainer">
+    		<!--内容-->
+      <div class="mainContent">
+      <div class="title clearfix">
+        <h1><a href="/sign/index" title="返回"><span class="closePanel" aria-hidden="true" data-icon="Z"></span></a>&nbsp;签署中的报表</h1>
+      </div>
+    <div class="project">
+      <div class="proSection">
+        <ul class="nav nav-pills">
+            <li>
+                <select id="itemlist">
+                    <option value="0">请选择项目</option>
+                    <!-- if !empty({{itemlist}}) -->
+                    <!-- loop itemlist -->
+                    <option value="{{itemlist' value.project}}" <!-- if {{project}} == {{itemlist' value.project}} -->selected<!-- endif --> >{{itemlist' value.pname}}</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+            <li>
+                <select id="tenderlist">
+                    <option value="0">请选择标段</option>
+                    <!-- if !empty({{tenderlist}}) -->
+                    <!-- loop tenderlist -->
+                    <option value="{{tenderlist' value.tender}}" <!-- if {{tender}} == {{tenderlist' value.tender}} -->selected<!-- endif -->>{{tenderlist' value.pmname}}</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+            <li>
+                <select id="phasenolist">
+                    <option value="0">请选择期数</option>
+                    <!-- if !empty({{phasenolist}}) -->
+                    <!-- loop phasenolist -->
+                    <option value="{{phasenolist' value.phaseno}}" <!-- if {{phaseno}} == {{phasenolist' value.phaseno}} -->selected<!-- endif -->>第{{ToChinaseNum(phasenolist' value.numpname)}}期</option>
+                    <!-- endloop -->
+                    <!-- endif -->
+                </select>&nbsp;
+            </li>
+        </ul>
+        <table class="table">
+          <thead>
+          <tr><th width="50%">报表名</th><th width="20%">项目-标段-期数</th><th width="20%">签署进度</th><th width="10%">操作</th></tr>
+          </thead>
+          <tbody>
+          <!-- if !empty({{onlist}}) -->
+          <!-- loop onlist -->
+          <tr>
+            <td width="">{{onlist' value.name}}</td>
+            <td>{{onlist' value.project}}-{{onlist' value.tender}}-第{{ToChinaseNum(onlist' value.phaseno)}}期</td>
+            <td>
+              <div class="sign-avatars">
+                <!-- if !empty({{{{onlist' value.auditlist}}) -->
+                <!-- loop onlist' value.auditlist -->
+                <!-- if {{onlist' auditlist' value.status}} == 'checked' -->
+                <span class="colGreen" data-toggle="tooltip" data-placement="bottom" data-original-title="{{formatDate(onlist' auditlist' value.status,'Y-m-d')}} 完成签署">{{onlist' auditlist' value.aname}}</span>
+                <!-- elseif {{onlist' auditlist' value.status}} == 'checking' -->
+                <span class="colOrange" data-toggle="tooltip" data-placement="bottom" data-original-title="签署中">{{onlist' auditlist' value.aname}}</span>
+                <!-- else -->
+                <span>{{onlist' auditlist' value.aname}}</span>
+                <!-- endif -->
+                <!-- endloop -->
+                <!-- endif -->
+              </div>
+            </td>
+            <td width=""><a class="btn btn-small" href="/sign/view/{{onlist' value.sid}}?status=onlist">查看报表</a></td>
+          </tr>
+          <!-- endloop -->
+          <!-- endif -->
+          </tbody>
+        </table>
+        <div class="pagination">
+          <ul>
+            {{pager}}
+          </ul>
+        </div>
+      </div>
+    </div>
+  </div>
+        <!--内容-->
+    	</div>
+    </div>
+
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $(function(){
+        $('#itemlist').change(function(){
+            var url = '/sign/onlist';
+            if($(this).val() != 0){
+                url += '/project/'+$(this).val();
+            }
+            window.location.href = url;
+        });
+
+        $('#tenderlist').change(function(){
+            var url = '/sign/onlist/project/'+$('#itemlist').val();
+            if($(this).val() != 0){
+                url += '/tender/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+        $('#phasenolist').change(function(){
+            var url = '/sign/onlist/project/'+$('#itemlist').val()+'/tender/'+$('#tenderlist').val();
+            if($(this).val() != 0){
+                url += '/phaseno/'+$(this).val();
+            }
+            window.location.href = url;
+        })
+
+    })
+</script>
+</body>

+ 46 - 0
protected/view/sign-share.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<div class="sign-share-header">
+    <span class="title"><a href="//jsjs.smartcost.com.cn" target="_balnk">纵横计量支付结算决算一体化软件</a></span>
+    <span class="copyright">Copyright @<a href="//smartcost.com.cn" target="_blank">珠海纵横创新软件有限公司</a> all rights reserved</span>
+</div>
+<input type="hidden" id="maxwidth" value="{{maxwidth}}">
+<div class="sign-content sign-content-warp">
+    <div class="warp-printer">
+        <!-- if !empty({{attlist}}) -->
+        <!-- loop attlist -->
+        <div class="page" id="pageContainer{{attlist' value.curnum}}"><img src="{{rootUrl}}{{attlist' value.filepath}}">
+            <!-- if !empty({{attlist' value.auditatt}}) -->
+            <!-- loop attlist' value.auditatt -->
+            <div class="user-sign" style="{{attlist' auditatt' value.position}}">
+                <div class="">
+                    <img src="{{attlist' auditatt' value.picpath}}">
+                </div>
+            </div>
+            <!-- endloop -->
+            <!-- endif -->
+        </div>
+        <!-- endloop -->
+        <!-- endif -->
+    </div>
+</div>
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $( function() {
+        $('.page').css('width', $('#maxwidth').val() + 'px');
+    })
+</script>
+</body>

+ 117 - 0
protected/view/sign-view-page.html

@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    <div class="mainContainer" style="overflow-y:hidden">
+        <!--内容-->
+        <div class="mainContent signContent">
+            <div class="title clearfix sign-title-height">
+                <div class="fR sign-topbar">
+                    <a class="btn" href="javascript:void(0);" onclick="printdiv('sign_msg')"><i class="icon-print "></i> 打印</a>
+                </div>
+                <div class="fR sign-page-num">
+                    <span id="picnum">1</span> / {{signmsg.pagenum}} 页
+                </div>
+                <h1><a href="{{backurl}}" title="返回"><span class="closePanel" aria-hidden="true"
+                                                                        data-icon="Z"></span></a>&nbsp;{{signmsg.name}}</h1>
+            </div>
+            <div class="sign-view clearfix">
+                <div class="sign-side fR">
+                    <div class="view-info">
+                        <ul>
+                            <li><div class="fL">所在项目</div>{{signmsg.project}}</li>
+                            <li><div class="fL">标段</div>{{signmsg.tender}}</li>
+                            <li><div class="fL">期数</div>第{{ToChinaseNum(signmsg.phaseno)}}期</li>
+                        </ul>
+                    </div>
+                    <div class="signed-list">
+                        <ul>
+                            <!-- if !empty({{auditlist}}) -->
+                            <!-- loop auditlist -->
+                            <li><div class="no fL">{{auditlist' value.index}}</div><div class="avatars fL"><img src="{{auditlist' value.avatar}}">{{auditlist' value.aname}}</div><div class="corl fR"><!-- if {{auditlist' value.status}} == 'checked' --><span class="colGreen">完成</span><!-- elseif {{auditlist' value.status}} == 'checking' --><span class="colOrange">签署中</span><!-- else --><span class=""></span><!-- endif --></div></li>
+                            <!-- endloop -->
+                            <!-- endif -->
+                        </ul>
+                        <div class="btn-bar">
+                        </div>
+                    </div>
+                </div>
+                <input type="hidden" id="maxwidth" value="{{maxwidth}}">
+                <input type="hidden" id="maxheight" value="{{maxheight}}">
+                <div class="sign-content fL" id="sign_msg">
+                    <div class="warp-printer">
+                        <!-- if !empty({{attlist}}) -->
+                        <!-- loop attlist -->
+                        <div class="page" id="pageContainer{{attlist' value.curnum}}"><img src="{{rootUrl}}{{attlist' value.filepath}}" style="max-width: 99.8%">
+                            <!-- if !empty({{attlist' value.auditatt}}) -->
+                            <!-- loop attlist' value.auditatt -->
+                            <div class="user-sign" style="{{attlist' auditatt' value.position}}">
+                                <div class="">
+                                    <img src="{{attlist' auditatt' value.picpath}}">
+                                </div>
+                            </div>
+                            <!-- endloop -->
+                            <!-- endif -->
+                        </div>
+                        <!-- endloop -->
+                        <!-- endif -->
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--内容-->
+    </div>
+</div>
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $( function() {
+        $('.page').css('width',$('#maxwidth').val()+'px');
+
+        $('#sign_msg').scroll(function(){
+            for(var i = 1; i <= $('.page').length; i++){
+                var yheight=$('#sign_msg').scrollTop()+200;
+                var obj = document.getElementById("pageContainer"+i);
+                var tops = obj.offsetTop;//元素距离顶部高度
+                var divheight = obj.offsetHeight;//元素高度
+                var tops2 = tops+divheight;
+                if(tops<=yheight && yheight<tops2) {
+                    document.getElementById("picnum").innerHTML = i;
+                    break;
+                }
+            }
+        });
+    } );
+
+    function printdiv(printpage)
+    {
+        var maxwidth = $('#maxwidth').val();
+        var maxheight = $('#maxheight').val();
+        $('.warp-printer').css("max-width",maxwidth+"px");
+        var headstr = '<html><head><title></title><link rel="stylesheet" href="https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"><style type="text/css" media="print">' +
+                '@page {size: {{style}}; margin: 0mm; padding: 0mm; border:0mm; } @media print body {margin:0mm;padding:0mm;border: 0mm} .warp-printer .page{margin:0mm;padding:0mm;border: 0mm;widows:0 orphans:0} .sign-content .page{margin:0mm;padding:0mm;border: 0mm;widows:0 orphans:0}' +
+                '</style></head><body>';
+        var footstr = '</body>';
+        var newstr = document.all.item(printpage).innerHTML;
+        var oldstr = document.body.innerHTML;
+        document.body.innerHTML = headstr+newstr+footstr;
+        window.print();
+        document.body.innerHTML = oldstr;
+        window.location.reload();
+        return false;
+    }
+</script>
+</body>

+ 276 - 0
protected/view/sign-view-set_signer.html

@@ -0,0 +1,276 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    <div class="mainContainer" style="overflow-y:hidden">
+        <!--内容-->
+        <div class="mainContent signContent">
+            <div class="title clearfix sign-title-height">
+                <div class="fR sign-topbar">
+                    <a class="btn " href="javascript:void(0);" onclick="printdiv('sign_msg')"><i class="icon-print "></i> 打印</a>
+                </div>
+                <h1><a href="/sign/create" title="返回"><span class="closePanel" aria-hidden="true"
+                                                                     data-icon="Z"></span></a>&nbsp;{{signmsg.name}}</h1>
+            </div>
+            <div class="sign-view clearfix">
+                <div class="sign-side fR">
+                    <div class="view-info">
+                        <ul>
+                            <li>
+                                <div class="fL">所在项目</div>
+                                {{signmsg.project}}
+                            </li>
+                            <li>
+                                <div class="fL">标段</div>
+                                {{signmsg.tender}}
+                            </li>
+                            <li>
+                                <div class="fL">期数</div>
+                                第{{ToChinaseNum(signmsg.phaseno)}}期
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="signed-list" id="signerlist">
+                        <ul>
+                        </ul>
+                        <li class="add"><a href="#addsign" data-toggle="modal">+ 添加签署人</a></li>
+                        <div class="btn-bar">
+                            <input type="hidden" id="signid" value="{{signmsg.sid}}">
+                            <a id="signbtn" onclick="upsigner();" href="javascript:void(0);" class="btn btn-large btn-block disabled">发起签署</a>
+                        </div>
+                    </div>
+                </div>
+                <input type="hidden" id="maxwidth" value="{{maxwidth}}">
+                <input type="hidden" id="maxheight" value="{{maxheight}}">
+                <div class="sign-content fL" id="sign_msg">
+                    <div class="warp-printer">
+                        <!-- if !empty({{attlist}}) -->
+                        <!-- loop attlist -->
+                        <div class="page" id="pageContainer{{attlist' value.curnum}}"><img src="{{rootUrl}}{{attlist' value.filepath}}" style="max-width: 99.8%"></div>
+                        <!-- endloop -->
+                        <!-- endif -->
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--内容-->
+    </div>
+</div>
+<!-- 添加签署人弹出 -->
+<div id="addsign" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+    <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3 id="myModalLabel">添加签署人</h3>
+    </div>
+    <div class="modal-body">
+        <div class="">
+            <h5>标段审批人:</h5>
+            <ul class="clearfix moadl-avatars" id="userlist">
+                <!-- if !empty({{userlist}}) -->
+                <!-- loop userlist -->
+                <li>
+                    <a class="fR btn btn-small btn-primary" data-userid="{{userlist' value.userid}}" data-user="{{userlist' value.userid}}&&{{userlist' value.name}}&&{{userlist' value.avatar}}">添加</a>
+                    <p><span class=" icon-user"></span> <b>{{userlist' value.name}}</b></p>
+                    <p>{{userlist' value.jobs}}</p>
+                </li>
+                <!-- endloop -->
+                <!-- endif -->
+            </ul>
+        </div>
+        <div class="">
+            <h5>添加新签署人:</h5>
+            <div class="input-append">
+                <input class="span3" type="text" placeholder="输入邮箱地址检索系统中的用户" id="searchuser">
+                <button class="btn" type="button" onclick="searchuser();">搜索</button>
+            </div>
+            <ul class="clearfix moadl-avatars" id="resultsearch">
+            </ul>
+        </div>
+    </div>
+</div>
+<!-- 添加签署人弹出 -->
+<!-- 发起签署弹出 -->
+<div id="starsign" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
+
+    <div class="modal-body">
+        <h4>发起后不可更改,确认发起签署?</h4>
+    </div>
+    <div class="modal-footer">
+        <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
+        <button type="button" class="btn btn-success" onclick="uploadsign();">确认</button>
+    </div>
+</div>
+<!-- 发起签署弹出 -->
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    function printdiv(printpage)
+    {
+        $('.warp-printer').css("max-width","1085px");
+        var headstr = '<html><head><title></title><link rel="stylesheet" href="https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"><style type="text/css" media="print">' +
+                '@page {size: {{style}}; margin: 0mm; padding: 0mm; border:0mm; } @media print body {margin:0mm;padding:0mm;border: 0mm} .warp-printer .page{margin:0mm;padding:0mm;border: 0mm;widows:0 orphans:0} .sign-content .page{margin:0mm;padding:0mm;border: 0mm;widows:0 orphans:0}' +
+                '</style></head><body>';
+        var footstr = '</body>';
+        var newstr = document.all.item(printpage).innerHTML;
+        var oldstr = document.body.innerHTML;
+        document.body.innerHTML = headstr+newstr+footstr;
+        window.print();
+        document.body.innerHTML = oldstr;
+        window.location.reload();
+        return false;
+    }
+
+    function searchuser(){
+        var search = $('#searchuser').val();
+        if(search.trim() == ''){
+            alert('请输入邮箱地址');
+            return false;
+        }else{
+            $.ajax({
+                type: 'get',
+                url: '/sign/search/user',
+                data: {email:search},
+                dataType: 'json',
+                success: function(result){
+                    var html = '';
+                    if(result.code == 400){
+                        alert(result.msg);
+                    }else{
+                        html += '<li><a class="fR btn btn-small btn-primary" data-user="'+result.user.userid+'&&'+result.user.name+'&&'+result.user.avatar+'">添加</a> <p><span class=" icon-user"></span> <b>'+result.user.name+'</b></p> <p>'+result.user.jobs+'</p></li>'
+                    }
+                    $('#resultsearch').html(html);
+                    $('#resultsearch li a').on('click',function(){
+                        var userarr = $(this).attr('data-user').split('&&');
+                        var flag = true;
+                        $('#signerlist ul li').each(function(){
+                            if($(this).attr('data-sid') == userarr[0]){
+                                alert('不能重复添加签署人');
+                                flag = false;
+                                return;
+                            }
+                        });
+                        if(flag){
+                            var html = '<li data-sid="'+userarr[0]+'"> <div class="no fL">'+($('#signerlist ul li').length+1)+'</div> <div class="avatars fL"><img src="{{rootUrl}}'+userarr[2]+'">'+userarr[1]+'</div> <div class="corl fR"><a href="#" class="colRed">移除</a></div> </li>';
+                            $('#signerlist ul').append(html);
+                            $('#signbtn').addClass('btn-primary').removeClass('disabled');
+                            alert('添加成功');
+                            $('#resultsearch').html('');
+                        }
+
+                        $('#signerlist ul li a').on('click',function(){
+                            var sid = $(this).parents('li').attr('data-sid');
+                            $('#userlist li').each(function(){
+                               if($(this).children('a').attr('data-userid') == sid){
+                                   $(this).children('a').removeClass('disabled').addClass('btn-primary');
+                                   return;
+                               }
+                            });
+                            $(this).parents('li').remove();
+                            if($('#signerlist ul li').length == 0){
+                                $('#signbtn').removeClass('btn-primary').addClass('disabled');
+                            }else{
+                                var i =1;
+                                $('#signerlist ul li').each(function(){
+                                    $(this).children('.no').text(i);
+                                    i++;
+                                });
+                            }
+                        })
+                    })
+
+                }
+            })
+        }
+    }
+
+    function upsigner(){
+        if($('#signbtn').hasClass('disabled')){
+            return false;
+        }else{
+            $('#starsign').modal('show');
+        }
+    }
+
+    function uploadsign(){
+        var idarr = [];
+        var namearr = [];
+        $('#signerlist ul li').each(function(){
+            idarr.push($(this).attr('data-sid'));
+            namearr.push($(this).children('.avatars').text());
+        });
+        $.ajax({
+            type: 'post',
+            url: '/sign/upsigner',
+            data: {ids:idarr,names:namearr,sid:$('#signid').val()},
+            dataType: 'json',
+            success: function(result){
+                if(result.code == 400){
+                    alert(result.msg);
+                }else{
+                    window.location.href = '/sign/mylist';
+                }
+            }
+        })
+    }
+</script>
+<script>
+    $(function(){
+        $('.page').css('width',$('#maxwidth').val()+'px');
+
+        $('#userlist li a').on('click',function(){
+            if($(this).hasClass('disabled')){
+                return false;
+            }
+            var userarr = $(this).attr('data-user').split('&&');
+            var flag = true;
+            $('#signerlist ul li').each(function(){
+                if($(this).attr('data-sid') == userarr[0]){
+                    alert('不能重复添加签署人');
+                    flag = false;
+                    return;
+                }
+            });
+            if(flag){
+                var html = '<li data-sid="'+userarr[0]+'"> <div class="no fL">'+($('#signerlist ul li').length+1)+'</div> <div class="avatars fL"><img src="{{rootUrl}}'+userarr[2]+'">'+userarr[1]+'</div> <div class="corl fR"><a href="#" class="colRed">移除</a></div> </li>';
+                $('#signerlist ul').append(html);
+                $('#signbtn').addClass('btn-primary').removeClass('disabled');
+                $(this).removeClass('btn-primary').addClass('disabled');
+                alert('添加成功');
+            }
+
+            $('#signerlist ul li a').on('click',function(e){
+                var sid = $(this).parents('li').attr('data-sid');
+                $('#userlist li').each(function(){
+                    if($(this).children('a').attr('data-userid') == sid){
+                        $(this).children('a').removeClass('disabled').addClass('btn-primary');
+                        return;
+                    }
+                });
+                $(this).parents('li').remove();
+                if($('#signerlist ul li').length == 0){
+                    $('#signbtn').removeClass('btn-primary').addClass('disabled');
+                }else{
+                    var i =1;
+                    $('#signerlist ul li').each(function(){
+                        $(this).children('.no').text(i);
+                        i++;
+                    });
+                }
+            })
+        })
+    })
+</script>
+</body>

+ 307 - 0
protected/view/sign-view-signer_sign.html

@@ -0,0 +1,307 @@
+ <!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+    <meta charset=utf-8>
+    <title>纵横计量支付系统</title>
+    <meta name=description content=计量支付>
+    <meta name=copyright content=smartcost.com.cn>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel=stylesheet href="{{rootUrl}}global/css/bootstrap.css">
+    <link rel="stylesheet" href="{{rootUrl}}global/css/jquery-ui.min.css">
+    <link rel=stylesheet href={{rootUrl}}global/css/style.css>
+    <script src={{rootUrl}}global/js/jquery-1.9.1.min.js></script>
+    <script src={{rootUrl}}global/js/bootstrap.js></script>
+    <script src={{rootUrl}}global/js/jl.js></script>
+    <script src="{{rootUrl}}global/js/jquery-ui.min.js"></script>
+</head>
+<body>
+<!-- include "top" -->
+<div class="wrapContent">
+    <!-- include "left" -->
+    <div class="mainContainer" style="overflow-y:hidden">
+        <!--内容-->
+        <div class="mainContent signContent">
+            <div class="title clearfix sign-title-height">
+                <div class="fR sign-topbar">
+                    <a class="btn btn-primary" href="javascript:void(0);" onclick="addsgin()"><i class="icon-pencil icon-white"></i> 签名</a>
+                    <a id="delallsign" class="btn btn-danger" style="display: none" href="javascript:void(0);" onclick="delconfirm();"><i class="icon-remove icon-white"></i> 清除签名</a>
+                    <a class="btn " href="javascript:void(0);" onclick="printdiv('sign_msg')"><i class="icon-print "></i> 打印</a>
+                </div>
+                <div class="fR sign-page-num">
+                    <span id="picnum">1</span> / {{signmsg.pagenum}} 页
+                </div>
+                <h1><a href="/sign/needlist" title="返回"><span class="closePanel" aria-hidden="true" data-icon="Z"></span></a>&nbsp;{{signmsg.name}}</h1>
+            </div>
+            <div class="sign-view clearfix">
+                <div class="sign-side fR">
+                    <div class="view-info">
+                        <ul>
+                            <li><div class="fL">所在项目</div>{{signmsg.project}}</li>
+                            <li><div class="fL">标段</div>{{signmsg.tender}}</li>
+                            <li><div class="fL">期数</div>第{{ToChinaseNum(signmsg.phaseno)}}期</li>
+                        </ul>
+                    </div>
+                    <div class="signed-list">
+                        <ul>
+                            <!-- if !empty({{auditlist}}) -->
+                            <!-- loop auditlist -->
+                            <li><div class="no fL">{{auditlist' value.index}}</div><div class="avatars fL"><img src="{{auditlist' value.avatar}}">{{auditlist' value.aname}}</div><div class="corl fR"><!-- if {{auditlist' value.status}} == 'checked' --><span class="colGreen">完成</span><!-- elseif {{auditlist' value.status}} == 'checking' --><span class="colOrange">签署中</span><!-- else --><span class=""></span><!-- endif --></div></li>
+                            <!-- endloop -->
+                            <!-- endif -->
+                        </ul>
+                        <div class="btn-bar">
+                            <a  href="javascript:void(0);" onclick="judagedonesign();" class="btn btn-success btn-large btn-block">完成签署</a>
+                        </div>
+                    </div>
+                </div>
+                <input type="hidden" id="maxwidth" value="{{maxwidth}}">
+                <input type="hidden" id="maxheight" value="{{maxheight}}">
+                <div class="sign-content fL" id="sign_msg">
+                    <div class="warp-printer">
+                        <!-- if !empty({{attlist}}) -->
+                        <!-- loop attlist -->
+                        <div class="page" id="pageContainer{{attlist' value.curnum}}"><img src="{{rootUrl}}{{attlist' value.filepath}}" style="max-width: 99.8%">
+                            <div class="user-sign draggable" data-num="{{attlist' value.sid}}_{{attlist' value.said}}" style="position: absolute;top: 10%;left: 10%;z-index: 999;width: 300px;height: 150px;">
+                                <div class="img-bar">
+                                    <a href="javascript:void(0);" onclick="setallqm({{attlist' value.curnum}})" title="批量签名" class="allqm" style="display: none"><span data-icon="v" aria-hidden="true" ></span></a>
+                                    <a href="javascript:void(0);" onclick="setqm({{attlist' value.curnum}});" title="确定签署" class="sign_confirm"><span data-icon="T" aria-hidden="true" class="colGreen"></span></a>
+                                    <a href="javascript:void(0);" onclick="delqm({{attlist' value.curnum}});" title="删除签名" class="sign_del"><span data-icon="U" aria-hidden="true" class="colRed"></span></a>
+                                </div>
+                                <div class="focus">
+                                    <img src="{{picpath}}">
+                                </div>
+                            </div>
+                            <!-- if !empty({{attlist' value.auditatt}}) -->
+                            <!-- loop attlist' value.auditatt -->
+                            <div class="user-sign" style="z-index:10;{{attlist' auditatt' value.position}}">
+                                <div class="">
+                                    <img src="{{attlist' auditatt' value.picpath}}">
+                                </div>
+                            </div>
+                            <!-- endloop -->
+                            <!-- endif -->
+                        </div>
+                        <!-- endloop -->
+                        <!-- endif -->
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--内容-->
+    </div>
+</div>
+<!-- 完成签署人弹出 -->
+<div id="donesign" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
+
+    <div class="modal-body">
+        <h4>完成后不可更改,确认完成签署?</h4>
+    </div>
+    <div class="modal-footer">
+        <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
+        <button type="button" class="btn btn-success" onclick="donesign();">确认</button>
+    </div>
+</div>
+<!-- 添加签署人弹出 -->
+<script type="text/javascript">autoFlashHeight();</script>
+<script>
+    $( function() {
+        $('.page').css('width',$('#maxwidth').val()+'px');
+
+        $('#sign_msg').scroll(function(){
+            for(var i = 1; i <= $('.page').length; i++){
+                var yheight=$('#sign_msg').scrollTop()+200;
+                var obj = document.getElementById("pageContainer"+i);
+                var tops = obj.offsetTop;//元素距离顶部高度
+                var divheight = obj.offsetHeight;//元素高度
+                var tops2 = tops+divheight;
+                if(tops<=yheight && yheight<tops2) {
+                    document.getElementById("picnum").innerHTML = i;
+                    break;
+                }
+            }
+        });
+        $( ".draggable" ).draggable({ containment: "parent" },{stop: function( event, ui ) {
+        }}).resizable({ maxWidth: 600 },{ maxHeight: 300 },{ aspectRatio: true },{ autoHide: true },{
+            stop: function( event, ui ) {
+//                localStorage.setItem('sign_'+$(this).attr('data-num'),$(this).attr('style'));
+            }
+        });
+
+        //把本地缓存的信息读出来
+        $('.page .draggable').each(function(k,v){
+            if(localStorage.getItem('sign_'+$(this).attr('data-num'))){
+                $(this).attr('style',localStorage.getItem('sign_'+$(this).attr('data-num')));
+                $('#delallsign').show();
+            }
+            if(localStorage.getItem('status_'+$(this).attr('data-num'))){
+                if(localStorage.getItem('status_'+$(this).attr('data-num')) == 'copyhide'){
+                    $(this).find(".sign_confirm").hide();
+                    $(this).find(".allqm").hide();
+                }else if(localStorage.getItem('status_'+$(this).attr('data-num')) == 'copyshow'){
+                    $(this).find(".sign_confirm").hide();
+                    $(this).find(".allqm").show();
+                }
+                $(this).draggable( "option", "cancel", ".page" );
+                $(this).resizable("option", "cancel", ".page");
+                $(this).resizable( "option", "cancel", ".page" );
+            }
+        });
+    } );
+</script>
+<script type="text/javascript">
+    function addsgin() {
+        if($('.focus img').attr('src') == '{{rootUrl}}'){
+            alert('请先在个人信息中添加属于您的签名照');
+            return false;
+        }
+
+        var curpage = $('#picnum').text();
+        if(localStorage.getItem('sign_'+$( "#pageContainer"+curpage+" .draggable" ).attr('data-num'))){
+            alert('第 '+curpage+' 张报表已存在您的签名,无法重复添加');
+            return false;
+        }
+        $("#pageContainer"+curpage+" .draggable").show();
+        $("#pageContainer"+curpage+" .draggable").css({'width':"300px","height":"150px","left":"10%","top":"10%","position":"absolute"});
+        $( "#pageContainer"+curpage+" .draggable" ).draggable( "option", "cancel", "" );
+        $( "#pageContainer"+curpage+" .draggable" ).resizable("option", "cancel", "");
+        $( "#pageContainer"+curpage).find(".sign_confirm").show();
+        $( "#pageContainer"+curpage).find(".allqm").hide();
+//        localStorage.setItem('sign_'+$( "#pageContainer"+curpage+" .draggable" ).attr('data-num'),$( "#pageContainer"+curpage+" .draggable" ).attr('style'));
+    }
+
+    function delconfirm(){
+        var delall = confirm('确定删除所有签名?');
+        if(delall == true){
+            $('.page .draggable').each(function(k,v){
+                $(this).hide();
+                localStorage.removeItem('sign_'+$(this).attr('data-num'));
+                localStorage.removeItem('status_'+$(this).attr('data-num'));
+            });
+            $('#delallsign').hide();
+        }else{
+            return false;
+        }
+    }
+
+    function setqm(id) {
+        $( "#pageContainer"+id+" .draggable" ).resizable("option", "cancel", ".page").draggable( "option", "cancel", ".page" );
+        $( "#pageContainer"+id).find(".sign_confirm").hide();
+        $( "#pageContainer"+id).find(".allqm").show();
+        $('#delallsign').show();
+        localStorage.setItem('sign_'+$( "#pageContainer"+id+" .draggable" ).attr('data-num'),$( "#pageContainer"+id+" .draggable" ).attr('style'));
+        localStorage.setItem('status_'+$( "#pageContainer"+id+" .draggable" ).attr('data-num'),'copyshow');
+    }
+    function delqm(id) {
+        $( "#pageContainer"+id+" .draggable" ).hide();
+        localStorage.removeItem('sign_'+$( "#pageContainer"+id+" .draggable" ).attr('data-num'));
+        localStorage.removeItem('status_'+$( "#pageContainer"+id+" .draggable" ).attr('data-num'));
+        var flag = false;
+        $('.page .draggable').each(function(k,v){
+            if(localStorage.getItem('sign_'+$(this).attr('data-num'))){
+                flag = true;
+                return;
+            }
+        });
+        if(!flag){
+            $('#delallsign').hide();
+        }
+    }
+    function setallqm(id) {
+        var left = $( "#pageContainer"+id+" .draggable" ).css('left');
+        var top = $( "#pageContainer"+id+" .draggable" ).css('top');
+        var width = $( "#pageContainer"+id+" .draggable" ).css('width');
+        var height = $( "#pageContainer"+id+" .draggable" ).css('height');
+        for(var i = 1; i <= $('.page').length; i++){
+            if(id != i){
+                $( "#pageContainer"+i+" .draggable" ).css({'width':width,"height":height,"left":left,"top":top,"position":"absolute"});
+                $( "#pageContainer"+i+" .draggable" ).show();
+                $( "#pageContainer"+i+" .draggable" ).draggable( "option", "cancel", ".page" );
+                $( "#pageContainer"+i+" .draggable" ).resizable("option", "cancel", ".page");
+                $( "#pageContainer"+i+" .draggable" ).resizable( "option", "cancel", ".page" );
+                $( "#pageContainer"+i).find(".sign_confirm").hide();
+                $( "#pageContainer"+i).find(".allqm").hide();
+                localStorage.setItem('sign_'+$( "#pageContainer"+i+" .draggable" ).attr('data-num'),$( "#pageContainer"+i+" .draggable" ).attr('style'));
+            }else{
+                $( "#pageContainer"+i).find(".allqm").hide();
+            }
+            localStorage.setItem('status_'+$( "#pageContainer"+i+" .draggable" ).attr('data-num'),'copyhide');
+        }
+    }
+</script>
+<script>
+    function printdiv(printpage)
+    {
+        var maxwidth = $('#maxwidth').val();
+        var maxheight = $('#maxheight').val();
+        $('.warp-printer').css("max-width",maxwidth+"px");
+        var headstr = '<html><head><title></title><link rel="stylesheet" href="https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"><style type="text/css" media="print">' +
+                '@page {size: {{style}}; margin: 0mm; padding: 0mm; border:0mm; } @media print body {margin:0mm;padding:0mm;border: 0mm} .warp-printer .page{margin:0mm;padding:0mm;border: 0mm;widows:0 orphans:0} .sign-content .page{margin:0mm;padding:0mm;border: 0mm;widows:0 orphans:0}' +
+                '</style></head><body>';
+        var footstr = '</body>';
+        var newstr = document.all.item(printpage).innerHTML;
+        var oldstr = document.body.innerHTML;
+        //把数据存到本地缓存中
+//        $('.page .draggable').each(function(k,v){
+//            if($(this).attr('style')){
+//                localStorage.setItem('sign_'+$(this).attr('data-num'),$(this).attr('style'));
+//            }
+//        });
+        document.body.innerHTML = headstr+newstr+footstr;
+        window.print();
+        document.body.innerHTML = oldstr;
+        window.location.reload();
+        return false;
+    }
+
+    function judagedonesign()
+    {
+        var flag = false;
+        $('.page .draggable').each(function(k,v){
+            if(localStorage.getItem('sign_'+$(this).attr('data-num'))){
+                flag = true;
+                return;
+            }
+//            if($(this).attr('style') && $(this).css('display') == 'block'){
+//                flag = true;
+//                return;
+//            }
+        });
+        if(flag){
+            $('#donesign').modal('show');
+
+        }else{
+            alert('请至少签署一个报表');
+        }
+    }
+
+    function donesign(){
+        var saidarray = new Array();
+        var positionarray = new Array();
+        var i = 0;
+        $('.page .draggable').each(function(k,v){
+            if(localStorage.getItem('sign_'+$(this).attr('data-num'))){
+                saidarray[i] = $(this).attr('data-num').split('_')[1];
+                positionarray[i] = $(this).attr('style');
+                i++;
+            }
+            localStorage.removeItem('sign_'+$(this).attr('data-num'));
+            localStorage.removeItem('status_'+$(this).attr('data-num'));
+        });
+
+        $.ajax({
+            type: 'post',
+            url: '/sign/donesign',
+            data:{sid:'{{signsid}}',path:'{{picpath}}',said:saidarray,position:positionarray},
+            dataType: 'json',
+            success: function(result){
+                if(result.code == 400){
+                    alert(result.msg);
+                }else{
+                    window.location.href = result.url;
+                }
+
+            }
+        })
+    }
+</script>
+</body>

+ 75 - 0
protected/viewc/sign-list-need_sign.php

@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang=zh-cn>
+<head>
+  <meta charset=utf-8>
+  <title>纵横计量支付系统</title>
+  <meta name=description content=计量支付>
+  <meta name=copyright content=smartcost.com.cn>
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <link rel=stylesheet href="<?php echo $data['rootUrl']; ?>global/css/bootstrap.css">
+  <link rel=stylesheet href=<?php echo $data['rootUrl']; ?>global/css/style.css>
+  <script src=<?php echo $data['rootUrl']; ?>global/js/jquery-1.9.1.min.js></script>
+  <script src=<?php echo $data['rootUrl']; ?>global/js/bootstrap.js></script>
+  <script src=<?php echo $data['rootUrl']; ?>global/js/jl.js></script>
+</head>
+<body>
+<?php include Doo::conf()->SITE_PATH .  Doo::conf()->PROTECTED_FOLDER . "viewc//top.php"; ?>
+<div class="wrapContent">
+  <?php include Doo::conf()->SITE_PATH .  Doo::conf()->PROTECTED_FOLDER . "viewc//left.php"; ?>
+    	<div class="mainContainer">
+    		<!--内容-->
+      <div class="mainContent">
+      <div class="title clearfix">
+        <h1><a href="/sign/index" title="返回"><span class="closePanel" aria-hidden="true" data-icon="Z"></span></a>&nbsp;需要我签署</h1>
+      </div>
+    <div class="project">
+      <?php if( !empty($data['needlist']) ): ?>
+      <?php foreach($data['needlist'] as $k1=>$v1): ?>
+      <div class="proSection">
+        <legend><?php echo $v1['project']; ?></legend>
+        <?php if( !empty($v1['tlist']) ): ?>
+        <?php foreach($v1['tlist'] as $k2=>$v2): ?>
+        <?php if( !empty($v2['plist']) ): ?>
+        <?php foreach($v2['plist'] as $k3=>$v3): ?>
+        <table class="table">
+          <thead>
+          <tr><th colspan="3"><?php echo $v2['tender']; ?> 第<?php echo ToChinaseNum($v3['phaseno']); ?>期</th></tr>
+          </thead>
+          <tbody>
+          <?php if( !empty($v3['signlist']) ): ?>
+          <?php foreach($v3['signlist'] as $k4=>$v4): ?>
+          <tr>
+            <td width="50%"><?php echo $v4['name']; ?></td>
+            <td>
+              <div class="sign-avatars">
+                <?php foreach($v4['auditlist'] as $k5=>$v5): ?>
+                <?php if( $v5['status'] == 'checked' ): ?>
+                <span class="colGreen" data-toggle="tooltip" data-placement="bottom" data-original-title="<?php echo formatDate($v5['intime'], 'Y-m-d'); ?> 完成签署"><?php echo $v5['aname']; ?></span>
+                <?php elseif( $v5['status'] == 'checking' ): ?>
+                <span class="colOrange" data-toggle="tooltip" data-placement="bottom" data-original-title="签署中"><?php echo $v5['aname']; ?></span>
+                <?php else: ?>
+                <span><?php echo $v5['aname']; ?></span>
+                <?php endif; ?>
+                <?php endforeach; ?>
+              </div>
+            </td>
+            <td width="10%"><a href="/sign/needview/<?php echo $v4['sid']; ?>" class="btn btn-primary btn-small">签署</a></td>
+          </tr>
+          <?php endforeach; ?>
+          <?php endif; ?>
+          </tbody>
+        </table>
+        <?php endforeach; ?>
+        <?php endif; ?>
+        <?php endforeach; ?>
+        <?php endif; ?>
+      </div>
+      <?php endforeach; ?>
+      <?php endif; ?>
+    </div>
+  </div>
+        <!--内容-->
+    	</div>
+    </div>
+<script type="text/javascript">autoFlashHeight();</script>
+</body>

+ 147 - 0
在线签署.sql

@@ -0,0 +1,147 @@
+-- phpMyAdmin SQL Dump
+-- version 4.7.0
+-- https://www.phpmyadmin.net/
+--
+-- Host: 10.27.6.148
+-- Generation Time: 2017-06-08 09:23:08
+-- 服务器版本: 5.7.17-13
+-- PHP Version: 7.0.15-0ubuntu0.16.04.4
+
+SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
+SET AUTOCOMMIT = 0;
+START TRANSACTION;
+SET time_zone = "+00:00";
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+
+--
+-- Database: `jlwebdev`
+--
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign`
+--
+
+CREATE TABLE IF NOT EXISTS `jl_sign` (
+  `sid` int(11) NOT NULL COMMENT '主键',
+  `project` int(11) NOT NULL COMMENT '项目主键',
+  `tender` int(11) NOT NULL COMMENT '标段主键',
+  `phaseno` int(11) NOT NULL COMMENT '期数',
+  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '报表名',
+  `ownuid` smallint(6) NOT NULL COMMENT '生成人id',
+  `intime` int(11) NOT NULL COMMENT '生成时间',
+  `pagenum` smallint(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT '共有多少张报表,未解压默认为0',
+  `widhei` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '报表纸张大小 以mm为单位',
+  `audituid` smallint(6) UNSIGNED DEFAULT NULL COMMENT '发起人id',
+  `aintime` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '发起时间',
+  `status` enum('uncheck','checking','checked') NOT NULL DEFAULT 'uncheck' COMMENT '签署状态',
+  `sintime` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '签署完成时间',
+  `ishare` tinyint(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否分享,0不分享(默认),1分享'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='在线签署报表信息表';
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign_attachment`
+--
+
+CREATE TABLE IF NOT EXISTS `jl_sign_attachment` (
+  `said` int(11) UNSIGNED NOT NULL COMMENT '主键',
+  `sid` int(11) UNSIGNED NOT NULL COMMENT '报表id主键',
+  `curnum` smallint(5) UNSIGNED NOT NULL COMMENT '编号,第几张',
+  `filepath` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '报表文件路径'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='签署文件信息表';
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign_audit`
+--
+
+CREATE TABLE IF NOT EXISTS `jl_sign_audit` (
+  `satid` int(11) UNSIGNED NOT NULL COMMENT '主键',
+  `sid` int(11) UNSIGNED NOT NULL COMMENT '报表id主键',
+  `status` enum('uncheck','checking','checked') NOT NULL DEFAULT 'uncheck' COMMENT '个人签署状态',
+  `audituid` int(11) UNSIGNED NOT NULL COMMENT '签署人id',
+  `aname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '签署人姓名',
+  `intime` int(11) NOT NULL COMMENT '签署时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户签署表';
+
+-- --------------------------------------------------------
+
+--
+-- 表的结构 `jl_sign_audit_attachment`
+--
+
+CREATE TABLE IF NOT EXISTS `jl_sign_audit_attachment` (
+  `saaid` int(11) NOT NULL COMMENT '主键',
+  `audituid` int(11) NOT NULL COMMENT '签署人id',
+  `said` int(11) NOT NULL COMMENT '报表文件id',
+  `picpath` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '签名图片地址',
+  `position` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT '签名所在位置'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户签名关联表' ROW_FORMAT=COMPACT;
+
+--
+-- Indexes for dumped tables
+--
+
+--
+-- Indexes for table `jl_sign`
+--
+ALTER TABLE `jl_sign`
+  ADD PRIMARY KEY (`sid`);
+
+--
+-- Indexes for table `jl_sign_attachment`
+--
+ALTER TABLE `jl_sign_attachment`
+  ADD PRIMARY KEY (`said`);
+
+--
+-- Indexes for table `jl_sign_audit`
+--
+ALTER TABLE `jl_sign_audit`
+  ADD PRIMARY KEY (`satid`);
+
+--
+-- Indexes for table `jl_sign_audit_attachment`
+--
+ALTER TABLE `jl_sign_audit_attachment`
+  ADD PRIMARY KEY (`saaid`);
+
+--
+-- 在导出的表使用AUTO_INCREMENT
+--
+
+--
+-- 使用表AUTO_INCREMENT `jl_sign`
+--
+ALTER TABLE `jl_sign`
+  MODIFY `sid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;
+--
+-- 使用表AUTO_INCREMENT `jl_sign_attachment`
+--
+ALTER TABLE `jl_sign_attachment`
+  MODIFY `said` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;
+--
+-- 使用表AUTO_INCREMENT `jl_sign_audit`
+--
+ALTER TABLE `jl_sign_audit`
+  MODIFY `satid` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;
+--
+-- 使用表AUTO_INCREMENT `jl_sign_audit_attachment`
+--
+ALTER TABLE `jl_sign_audit_attachment`
+  MODIFY `saaid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=1;COMMIT;
+
+ALTER TABLE `jl_user_profiles` ADD `signpath` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'global/signpath/signavatar.png' COMMENT '签名图片地址';
+
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;