ClientController.php 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145
  1. <?php
  2. Doo::loadCore('auth/DooAuth');
  3. Doo::loadClass('PasswordHash');
  4. Doo::loadClass('client');
  5. Doo::loadClass('auth');
  6. Doo::loadClass('attachment');
  7. Doo::loadClass('attfile');
  8. Doo::loadClass('actmeasure');
  9. Doo::loadClass('contractact');
  10. Doo::loadClass('project');
  11. Doo::loadClass('profile');
  12. Doo::loadClass('numofperact');
  13. Doo::loadClass('measureauditact');
  14. Doo::loadClass('itemfile');
  15. Doo::loadModel('users');
  16. /**
  17. * MainController
  18. * Feel free to delete the methods and replace them with your own code.
  19. *
  20. * @author NoNZero
  21. */
  22. class ClientController extends DooController {
  23. private $data, $client, $auth, $att, $file, $zip, $actmeasure, $contractact, $project, $profile, $numofperact, $measureauditact, $attfile, $users, $itemfile;
  24. private $statusArray = array('uncheck' => '1', 'checking' => '2', 'checked' => '3', 'checkno' => '4');
  25. private $fileTypeArray = array('台帐附件');
  26. public function __construct() {
  27. $this->data['rootUrl'] = Doo::conf()->APP_URL;
  28. $this->client = new client();
  29. $this->auth = new Auth();
  30. $this->att = new attachment();
  31. $this->attfile = new attFile();
  32. $this->zip = new ZipArchive();
  33. $this->actmeasure = new actMeasure();
  34. $this->contractact = new Contractact();
  35. $this->project = new Project();
  36. $this->profile = new Profile();
  37. $this->numofperact = new NumofperAct();
  38. $this->measureauditact = new MeasureauditAct();
  39. $this->users = new Users();
  40. $this->itemfile = new ItemFile();
  41. }
  42. public function ClientSignin() {
  43. if (isset($_POST['zhname']) && isset($_POST['zhpass'])) {
  44. echo json_encode(array('status' => FALSE, 'msg' => '登录失败,请更新软件。'), JSON_UNESCAPED_UNICODE);
  45. die;
  46. }
  47. if (isset($_POST['uname']) && isset($_POST['upass'])) {
  48. echo json_encode(array('status' => FALSE, 'msg' => '登录失败,请更新软件。'), JSON_UNESCAPED_UNICODE);
  49. die;
  50. }
  51. if (isset($_POST['v3name']) && isset($_POST['v3pass']))
  52. try {
  53. if ($this->auth->login($_POST['v3name'], $_POST['v3pass'])) {
  54. $uinfo = $this->auth->getUinfo();
  55. if (isset($uinfo['isstop']) && $uinfo['isstop'] > 0) {
  56. echo json_encode(array('status' => FALSE, 'msg' => '登录失败'), JSON_UNESCAPED_UNICODE);
  57. die;
  58. }
  59. if (isset($uinfo['uid'])) {
  60. $userArray = $this->profile->getProWithUid($uinfo['uid']);
  61. $avatarStr = $userArray['avatar'];
  62. if (isset($userArray['userid'])) {
  63. $msgArray = array('uid' => $uinfo['uid'], 'name' => $userArray['name'], 'email' => $uinfo['uemail'], 'ucompany' => $userArray['company'], 'jobtitle' => $userArray['jobs'], 'avatar' => Doo::conf()->APP_URL . $avatarStr);
  64. echo json_encode(array('status' => TRUE, 'msg' => '', 'userinfo' => $msgArray), JSON_UNESCAPED_UNICODE);
  65. die;
  66. }
  67. }
  68. } else {
  69. echo json_encode(array('status' => FALSE, 'msg' => '登录失败'), JSON_UNESCAPED_UNICODE);
  70. die;
  71. }
  72. } catch (Exception $exc) {
  73. }
  74. }
  75. // 创建标段
  76. // 参数:用户ID,创建名称,KEY
  77. function ClientCreatmeasure() {
  78. if (isset($this->params['uid']) && $this->params['uid'] && isset($this->params['bname']) && $this->params['bname'] && $this->params['ckey'] && isset($this->params['ckey'])) {
  79. $retval = $this->contractact->getPidWithKey($this->params['ckey']);
  80. if (isset($retval['pid'])) {
  81. $pArray = $this->project->getRowByPid($retval['pid']);
  82. if (isset($this->params['uid']) && ($this->params['uid'] == $pArray['uid'])) {
  83. $status = array('status' => FALSE, 'msg' => '业主不能作为编制人新建标段!');
  84. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  85. die();
  86. }
  87. $id = $this->actmeasure->insertMeasure(intval($this->params['uid']), $retval['pid'], $retval['stid'], iconv('GB2312', 'UTF-8', $this->params['bname']));
  88. $this->measureauditact->insertMeasureAudit($pArray['pid'], 0, $pArray['uid'], 0, $id, $retval['stid'], 1, 'uncheck', 1); //加入业主
  89. $uArray = $this->profile->getProWithUid($retval['uid']);
  90. $strAvatar = $this->auth->getAvatar($uArray['userid']);
  91. $createArray = array('catid' => $id, 'name' => $uArray['name'], 'avatar' => $strAvatar, 'jobs' => $uArray['jobs'], 'company' => $uArray['company'], 'coninfo' => array('phone' => $uArray['phone'], 'mobile' => $uArray['mobile'], 'qq' => $uArray['qq']), 'pname' => $pArray['pname'], 'ptype' => $retval['stname'], 'ownuid' => $pArray['uid'], 'pnameid' => $pArray['pid'], 'ptypeid' => $retval['stid']);
  92. $status = array('status' => TRUE, 'msg' => '', 'createinfo' => $createArray);
  93. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  94. die();
  95. } else {
  96. $status = array('status' => FALSE, 'msg' => 'The key is error');
  97. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  98. die();
  99. }
  100. } else {
  101. $status = array('status' => FALSE, 'msg' => 'error_create');
  102. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  103. die();
  104. }
  105. }
  106. // 编制人审核第一期时 开始审核第一期时候调用
  107. public function ClientPeriod() {
  108. // TODO:上报数据
  109. // TODO:每期更新数据时候和上传时候要查询当前进行期数的第几次一并写入数据库
  110. if (isset($this->params['userid']) && isset($this->params['tenderid']) && isset($this->params['phaseno']) && isset($_POST['MD5_JL'])) {
  111. $fp = $this->upfile('upfile');
  112. if (isset($fp[0]['filepath'])) {
  113. $res = $this->zip->open(Doo::conf()->SITE_PATH . $fp[0]['filepath']);
  114. $extPath = pathinfo($fp[0]['filepath']);
  115. $extPathdir = Doo::conf()->SITE_PATH . $extPath['dirname'] . '/' . $extPath['filename'];
  116. if ($res === TRUE) {
  117. if (!$this->dir_create($extPathdir)) {
  118. $status = array('status' => 'FALSE', 'msg' => '期数数据上传失败');
  119. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  120. die();
  121. }
  122. $this->zip->extractTo($extPathdir);
  123. $this->zip->close();
  124. }
  125. $countArray = json_decode(file_get_contents($extPathdir . '/' . 'JsonFile_Common.json'), TRUE, JSON_UNESCAPED_UNICODE);
  126. if (!isset($countArray)) {
  127. $status = array('status' => 'FALSE', 'msg' => '期数汇总数据上传失败');
  128. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  129. die();
  130. }
  131. $this->actmeasure->updateCon($this->params['tenderid'], $countArray['TotalPrice']);
  132. $pmArray = $this->actmeasure->getRowByPmid($this->params['tenderid']);
  133. if (isset($pmArray['pmid'])) {
  134. // 由于不通过功能数据表记录重复写入时要考虑当前是第几次审核
  135. $intMaxTimes = $this->numofperact->getMaxTimes($this->params['tenderid'], $this->params['phaseno']);
  136. if (isset($intMaxTimes['times']) && ($intMaxTimes['times'] >= 0)) {
  137. $iniTimes = $intMaxTimes['times'] + 1;
  138. } else {
  139. $iniTimes = 0;
  140. }
  141. // 写入第一期
  142. $mpid = $this->numofperact->insert($pmArray['pid'], $this->params['userid'], $this->params['tenderid'], $pmArray['stid'], $this->params['phaseno'], $countArray['BQHTJL'], $countArray['BQSLBGJL'], $countArray['JZSQLJWC'], $countArray['BQWCJL'], $countArray['LJWCJL'], $iniTimes);
  143. // 更新审核人MPID
  144. $this->measureauditact->updateAuditorMPID($mpid, $this->params['tenderid'], $this->params['phaseno'], $iniTimes);
  145. // 设置审核人状态
  146. $firstAuditor = $this->measureauditact->getFirstAuditor($this->params['tenderid'], $this->params['phaseno'], $iniTimes);
  147. if (isset($firstAuditor)) {
  148. if ($firstAuditor['mastatus'] == 'uncheck') {
  149. $this->measureauditact->updateMastatus($firstAuditor['maid']);
  150. }
  151. }
  152. }
  153. if ($mpid > 0) {
  154. if ($this->attfile->insertFile($pmArray['pid'], $pmArray['stid'], $mpid, $this->params['tenderid'], $this->params['phaseno'], $this->params['userid'], $fp[0]['filepath'], 0, $_POST['MD5_JL'], $iniTimes)) {
  155. $infostatus = 0;
  156. $pmArray = $this->numofperact->getRowTender($this->params['tenderid']);
  157. if ($pmArray) {
  158. $countTotal = count($pmArray);
  159. $ownerStatusArray = $this->measureauditact->getStatusTender($pmArray[0]['pmid'], $pmArray[0]['numpname']);
  160. if ($ownerStatusArray) {
  161. $infostatus = $this->statusArray[$ownerStatusArray['mastatus']];
  162. }
  163. echo json_encode(array('status' => 'TRUE', 'msg' => '', 'info' => array('curr' => $pmArray[0]['numpname'], 'infostatus' => $infostatus, 'total' => $countTotal)), JSON_UNESCAPED_UNICODE);
  164. die();
  165. } else {
  166. echo json_encode(array('status' => 'TRUE', 'msg' => '', 'info' => array('curr' => 1, 'infostatus' => 1, 'total' => 1)), JSON_UNESCAPED_UNICODE);
  167. die();
  168. }
  169. } else {
  170. $status = array('status' => 'FALSE', 'msg' => '期数上传失败');
  171. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  172. die();
  173. }
  174. } else {
  175. $status = array('status' => 'FALSE', 'msg' => '期数上传失败');
  176. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  177. die();
  178. }
  179. } else {
  180. $status = array('status' => 'FALSE', 'msg' => '文件上传失败,请重试');
  181. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  182. die();
  183. }
  184. } else {
  185. $status = array('status' => 'FALSE', 'msg' => '上传参数错误');
  186. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  187. die();
  188. }
  189. }
  190. /**
  191. * 获取标段状态信息(由于加入了)
  192. * 每个标段只有一期在进行中 group by?
  193. *
  194. * 查询标段的审核状态可以根据业主的审核依据来查询
  195. * 如果除业主意外的人审核状态为未通过怎么处理
  196. */
  197. public function getMAStatus() {
  198. // curr:当前期数,status:当前状态,total:总期数
  199. // 参数catid
  200. if (isset($this->params['tenderid'])) {
  201. $pmArray = $this->numofperact->getRowTenderCurr($this->params['tenderid']);
  202. $countTotal = count($pmArray);
  203. $ownerStatus = NULL;
  204. $isUnCheck = TRUE;
  205. $ownerStatusArray = $this->measureauditact->getStatusTen($pmArray[0]['pmid'], $pmArray[0]['numpname']);
  206. // if (isset($ownerStatusArray))
  207. // if (($ownerStatusArray[0]['last'] == 1) && ($ownerStatusArray[0]['mastatus'] == 'checked')) {
  208. // $ownerStatus = 'checked';
  209. // } else {
  210. // $ownerStatus = 'checking';
  211. // }
  212. $statusArray = $this->numofperact->getMaxRowStatus($pmArray[0]['pmid'], $pmArray[0]['numpname']);
  213. $ownerStatus = $statusArray['currstatus'];
  214. // foreach ($ownerStatusArray as $kk => $vv) {
  215. // if (($vv['last'] == 1) && ($vv['mastatus'] == 'checked')) {
  216. // $ownerStatus = 'checked';
  217. // } else {
  218. // $ownerStatus = 'checking';
  219. // }
  220. // }
  221. $projectArray = $this->project->getRowByPid($ownerStatusArray[0]['pid']);
  222. $stArray = $this->contractact->getRowByStid($ownerStatusArray[0]['stid']);
  223. $profileArray = $this->profile->getProWithUid($projectArray['uid']);
  224. $auditArray = $this->measureauditact->getAuditUserRedo($pmArray[0]['pmid'], $pmArray[0]['numpname']);
  225. if (isset($auditArray[0]['auditoruid'])) {
  226. foreach ($auditArray as $key => $value) {
  227. $userArray = $this->profile->getProWithUid($value['auditoruid']);
  228. // $finalStatus = $value['mastatus'];
  229. if ($value['mastatus'] != 'uncheck') {
  230. $isUnCheck = FALSE;
  231. }
  232. $auditInfo[] = array('uid' => $userArray['userid'], 'name' => $userArray['name'], 'company' => $userArray['company'], 'jobs' => $userArray['jobs'], 'avatar' => $this->auth->getAvatar($value['auditoruid']), 'mastatus' => $this->statusArray[$value['mastatus']], 'CheckerMemo' => $value['auditcontent']);
  233. }
  234. }
  235. if ($ownerStatusArray) {
  236. if ($isUnCheck) {
  237. echo json_encode(array('status' => 'TRUE', 'msg' => '', 'info' => array('curr' => $pmArray[0]['numpname'], 'infostatus' => $this->statusArray['uncheck'], 'total' => "$countTotal", 'proName' => $projectArray['pname'], 'stName' => $stArray['stname'], 'name' => $profileArray['name'], 'company' => $profileArray['company'], 'jobs' => $profileArray['jobs']), 'auditinfo' => $auditInfo), JSON_UNESCAPED_UNICODE);
  238. } else {
  239. echo json_encode(array('status' => 'TRUE', 'msg' => '', 'info' => array('curr' => $pmArray[0]['numpname'], 'infostatus' => $this->statusArray[$ownerStatus], 'total' => "$countTotal", 'proName' => $projectArray['pname'], 'stName' => $stArray['stname'], 'name' => $profileArray['name'], 'company' => $profileArray['company'], 'jobs' => $profileArray['jobs']), 'auditinfo' => $auditInfo), JSON_UNESCAPED_UNICODE);
  240. }
  241. die();
  242. } else {
  243. echo json_encode(array('status' => 'FALSE', 'msg' => '标段状态查询不存在'), JSON_UNESCAPED_UNICODE);
  244. die();
  245. }
  246. } else {
  247. echo json_encode(array('status' => 'FALSE', 'msg' => '标段状态查询参数错误'), JSON_UNESCAPED_UNICODE);
  248. die();
  249. }
  250. }
  251. public function getUserSearch() {
  252. if (isset($_POST['uemail']) && filter_var($_POST['uemail'], FILTER_VALIDATE_EMAIL)) {
  253. $retval = $this->users->getOne(array('where' => 'uemail=?', 'param' => array($_POST['uemail']), 'asArray' => TRUE));
  254. if (isset($retval['uid'])) {
  255. $proArray = $this->profile->getProWithUid($retval['uid']);
  256. if (isset($proArray['userid'])) {
  257. $strAvatar = $this->auth->getAvatar($proArray['userid']);
  258. echo json_encode(array('status' => 'TRUE', 'msg' => '', 'info' => array('uid' => $proArray['userid'], 'avatar' => $strAvatar, 'name' => $proArray['name'], 'jobs' => $proArray['jobs'], 'company' => $proArray['company'])), JSON_UNESCAPED_UNICODE);
  259. die();
  260. } else {
  261. echo json_encode(array('status' => 'FALSE', 'msg' => ''), JSON_UNESCAPED_UNICODE);
  262. die();
  263. }
  264. } else {
  265. echo json_encode(array('status' => 'FALSE', 'msg' => ''), JSON_UNESCAPED_UNICODE);
  266. die();
  267. }
  268. } else {
  269. echo json_encode(array('status' => 'FALSE', 'msg' => ''), JSON_UNESCAPED_UNICODE);
  270. die();
  271. }
  272. }
  273. /**
  274. * 获取指定标段指定期数{默认提取重做后最新一期的}
  275. * 单击获取项目相关审核人员和状态
  276. * sectionid:标段ID periodid:期数
  277. * TODO:如果审核人的期数或者次数与标段期数或者次数存在不对应情况的处理
  278. */
  279. public function getAlluserMeasure() {
  280. if (isset($this->params['tenderid']) && isset($this->params['phaseno'])) {
  281. // error_log(var_export($this->params, TRUE), 3, '/opt/html/jlzftest/data/' . time());
  282. // 先判断是否存在期数问题
  283. // 然后再判断是否存在次数不匹配
  284. // $intNum = $this->numofperact->getCountNumpname($this->params['tenderid'], $this->params['phaseno']);
  285. // // 如果期数是第一期期数必须大于一,否则减一为无效数据 ,为0表示这期为做上报没有产生记录
  286. // if (( $this->params['phaseno'] > 1) && ($intNum == 0)) {// 提取上一期的数据
  287. // // 提取期数减一
  288. // $intLastTimes = $this->numofperact->getMaxTimes($this->params['tenderid'], $this->params['phaseno'] - 1)['times'];
  289. // $uinfoTmpArray = $this->measureauditact->getAllAudit($this->params['tenderid'], $this->params['phaseno'] - 1, $intLastTimes);
  290. // } else {
  291. // $IntMaxRedoTimes = $this->measureauditact->getMaxTimes($this->params['tenderid'], $this->params['phaseno'])['maxtimes'];
  292. // $intTimes = $this->numofperact->getCountTimes($this->params['tenderid'], $this->params['phaseno'], $IntMaxRedoTimes);
  293. // if (($intTimes == 0) && ($IntMaxRedoTimes > 0)) {
  294. // $lastTimes = $IntMaxRedoTimes - 1;
  295. // $uinfoTmpArray = $this->measureauditact->getAllAudit($this->params['tenderid'], $this->params['phaseno'], $lastTimes);
  296. // } else {
  297. // $uinfoTmpArray = $this->measureauditact->getAllAudit($this->params['tenderid'], $this->params['phaseno'], $IntMaxRedoTimes);
  298. // }
  299. // }
  300. $uinfoTmpArray = $this->measureauditact->getAlluserMeasureAudit($this->params['tenderid'], $this->params['phaseno']);
  301. if ($uinfoTmpArray) {
  302. foreach ($uinfoTmpArray as $key => $value) {
  303. $uArray = $this->profile->getProWithUid($value['auditoruid']);
  304. $uinfoArray[$key]['name'] = $uArray['name'];
  305. $uinfoArray[$key]['company'] = $uArray['company'];
  306. $uinfoArray[$key]['jobs'] = $uArray['jobs'];
  307. $uinfoArray[$key]['mastatus'] = $this->statusArray[$value['mastatus']];
  308. $uinfoArray[$key]['uid'] = $value['auditoruid'];
  309. $uinfoArray[$key]['avatar'] = $this->auth->getAvatar($value['auditoruid']);
  310. $uinfoArray[$key]['CheckerMemo'] = $value['auditcontent'];
  311. }
  312. } else {
  313. echo json_encode(array('status' => FALSE, 'msg' => '用户列表不存在'), JSON_UNESCAPED_UNICODE);
  314. die();
  315. }
  316. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $uinfoArray), JSON_UNESCAPED_UNICODE);
  317. die();
  318. } else {
  319. echo json_encode(array('status' => FALSE, 'msg' => '错误'), JSON_UNESCAPED_UNICODE);
  320. die();
  321. }
  322. }
  323. //
  324. //
  325. // 配置审核人时候还没有创建标段所以没有MPID存在
  326. function addAuditMeasure() {
  327. // 必须检查期数是否存在
  328. // 标段ID 当前登录 审核人ID
  329. // 检测是否重复写入 && ($_POST['creatoruid'] > 0)
  330. // TODO: 增加多次审核人变更需求,调整审核人增加、删除接口
  331. // 当前操作的是否为最新一期还是最新一期加一(项目进行中时,不能编辑审核人,所以直接加一)
  332. // 大于一次重做的时候,自动复制编制人和所有审核人次数加一
  333. if (isset($_POST['pmid']) && isset($_POST['creatoruid']) && isset($_POST['auditoruid']) && isset($_POST['numpname'])) {
  334. $IntMaxTimes = $this->measureauditact->getMaxTimesInt($_POST['pmid'], $_POST['numpname']); // 根据标段PMID,期数numpname,获取目前重做次数
  335. if ($IntMaxTimes > 0) {
  336. $inTimes = $IntMaxTimes;
  337. } else {
  338. $inTimes = 0;
  339. }
  340. $pmArray = $this->actmeasure->getRowByPmid($_POST['pmid']);
  341. try {
  342. if ($this->measureauditact->insertMeasureAudit($pmArray['pid'], $_POST['creatoruid'], $_POST['auditoruid'], 0, $_POST['pmid'], $pmArray['stid'], $_POST['numpname'], 'uncheck', 2, $inTimes) > 0) {
  343. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => ''), JSON_UNESCAPED_UNICODE);
  344. die();
  345. }
  346. } catch (PDOException $e) {// 判断异常类型,提示不同错误信息
  347. echo json_encode(array('status' => FALSE, 'msg' => '配置审核人错误'), JSON_UNESCAPED_UNICODE);
  348. }
  349. } else {
  350. echo json_encode(array('status' => FALSE, 'msg' => '配置审核人参数错误'), JSON_UNESCAPED_UNICODE);
  351. die();
  352. }
  353. }
  354. /**
  355. * 删除审核用户
  356. */
  357. function delAuditMeasure() {
  358. if (isset($this->params['userid']) && isset($this->params['tenderid']) && isset($this->params['phaseno'])) {
  359. // 判断当前标段期数审核状态,决定是否继续执行
  360. $IntMaxTimes = $this->measureauditact->getMaxTimesInt($this->params['tenderid'], $this->params['phaseno']); // 根据标段PMID,期数numpname,获取目前重做次数
  361. if ($IntMaxTimes > 0) {
  362. $inTimes = $IntMaxTimes;
  363. $intHasCount = $this->numofperact->hasTheTimesRow($this->params['tenderid'], $this->params['phaseno'], $inTimes);
  364. if (isset($intHasCount) && ($intHasCount > 0)) {
  365. echo json_encode(array('status' => FALSE, 'msg' => '此标段状态,禁止删除审核人员'), JSON_UNESCAPED_UNICODE);
  366. die();
  367. }
  368. } else {
  369. $inTimes = 0;
  370. }
  371. try {
  372. $this->measureauditact->delAuditUserTimes($this->params['tenderid'], $this->params['phaseno'], $this->params['userid'], $inTimes);
  373. echo json_encode(array('status' => TRUE, 'msg' => ''), JSON_UNESCAPED_UNICODE);
  374. die();
  375. } catch (PDOException $e) {// 判断异常类型,提示不同错误信息
  376. echo json_encode(array('status' => FALSE, 'msg' => '删除审核人错误'), JSON_UNESCAPED_UNICODE);
  377. }
  378. } else {
  379. echo json_encode(array('status' => FALSE, 'msg' => '删除审核人员参数错误'), JSON_UNESCAPED_UNICODE);
  380. die();
  381. }
  382. }
  383. // 查询状态变更为审核中,已审核中为查询依据
  384. function checkMeasureStatus() {
  385. if (isset($_POST['sectionid']) && isset($_POST['periodid'])) {
  386. $mpArray = $this->numofperact->getRow($_POST['sectionid'], $_POST['periodid']);
  387. $maArray = $this->measureauditact->getAlluserMeasureAudit($_POST['sectionid'], $_POST['periodid']);
  388. foreach ($maArray as $key => $value) {
  389. if ($value['mastatus'] == 'uncheck') {
  390. $mastatus = $this->statusArray[$value['mastatus']];
  391. }
  392. }
  393. if (isset($mpArray['mpid'])) {
  394. echo json_encode(array('status' => TRUE, 'msg' => '', 'isexist' => TRUE, 'checkstatus' => $mastatus), JSON_UNESCAPED_UNICODE);
  395. die();
  396. } else {
  397. echo json_encode(array('status' => TRUE, 'msg' => '', 'isexist' => FALSE), JSON_UNESCAPED_UNICODE);
  398. die();
  399. }
  400. } else {
  401. echo json_encode(array('status' => FALSE, 'msg' => '标段信息不正确'), JSON_UNESCAPED_UNICODE);
  402. die();
  403. }
  404. }
  405. // 根据用户查询参与的标段信息
  406. // 参数为1时,当提交的附件中有重做记录时,提取记录未经过排重处理,出现重复结果。
  407. // api/client/user/get/15/allproject 此接口也有同样问题
  408. function getAuditProject() {
  409. // TODO:可以通过SQL直接查询出来
  410. if (isset($_POST['audituid']) && isset($_POST['RequestType'])) {
  411. $downfileurl = NULL;
  412. /**
  413. * 只查询审核中状态的记录
  414. * 然后根据每天记录所在的标段、期数、创建人查询所有此次所有审核人记录、为了判断
  415. * 判断此用户是第几个审核的人
  416. * 直接提取状态为未审核、审核中的
  417. * 未审核(没有到该审核人)
  418. * 审核中(出现在第一个)
  419. * 上传审核时候先遍历所有审核提交文件的状态并设置为旧文件状态
  420. * 然后写入新审核的文件路径等信息
  421. * 审核同时上传审核文件并设置审核表的状态做更改
  422. *
  423. */
  424. if ($_POST['RequestType'] == 1) {
  425. /**
  426. * 功能描述:
  427. * 参数1功能为,取得与当前用户相关的待审核状态的所有进行中的标段期数、最新一次的记录
  428. * 根据用户ID查询编制人和审核人参与的正在进行中的项目,进行中的项目状态为uncheck,checking
  429. * 由于·uncheck状态不能准确反映出其他用户操作对所属标段操作产生的的状态{比如:其他用户操作标段状态为(未通过【打回重做】)}、要排除这种情况
  430. * 还有一种情况为编制人编制项目时,审核人列表已经添加审核人,但是项目没有提交,没有项目文件,此时应根据有没有项目文件进行过滤。
  431. *
  432. * ??此ID为编制人或者为审核人时
  433. */
  434. // 第一步:根据用户ID,查询此用户参与的所有标段{根据最大期数【由于期数是递进关系只获取最大值】、最大次数【由于次数是递进关系只获取最大值】作为条件参数进行查询记录}
  435. $mpArray = $this->measureauditact->getCheckedRowbyUID2($_POST['audituid']); // 通过pmid,numpname分组获取参与的记录
  436. if (isset($mpArray)) {
  437. $statusArray = array('uncheck', 'checking');
  438. foreach ($mpArray as $key => $value) {
  439. /**
  440. * 根据审核ID查询所在标段期数
  441. * 然后去附件表根据标段ID 期数 是否新标志字段去查询最新的文件
  442. * 项目名称 项目类型
  443. *
  444. *
  445. * 此处现在是以创建者ID和审核人ID做关联来做判断
  446. * 判断上一个人的审核状态来提取记录
  447. *
  448. * 变更为一个用户添加所有人
  449. *
  450. */
  451. // $maxtimes = $this->attfile->getMaxTimes2($value['pmid'], $value['numpname']);
  452. $numStatusArray = $this->numofperact->getRow($value['pmid'], $value['numpname'], $value['times']);
  453. if (in_array($numStatusArray['currstatus'], $statusArray)) {
  454. $newfileArray = $this->attfile->getNewLast($value['pmid'], $value['numpname'], $value['times']);
  455. if (isset($newfileArray['filepath'])) {
  456. $projectArray = $this->project->getRowByPid($newfileArray['pid']);
  457. $pmidArray = $this->actmeasure->getRowByPmid($value['pmid']);
  458. $stArray = $this->contractact->getRowByStid($newfileArray['stid']);
  459. // $auditArray = $this->measureauditact->getLastNewRowInfo($value['pmid'], $value['numpname'], $_POST['audituid']);
  460. $pathinfo = pathinfo($newfileArray['filepath']);
  461. $downfileurl[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf', 'proName' => $projectArray['pname'], 'stName' => $stArray['stname'], 'MD5_Jl' => $newfileArray['filehashcode'], 'tenderstatus' => $this->statusArray[$value['mastatus']], 'tenderid' => $value['pmid'], 'pnameid' => $projectArray['pid'], 'ptypeid' => $stArray['stid'], 'audituidstatus' => $this->statusArray[$value['mastatus']], 'bianzhirenuid' => $pmidArray['uid'], 'tenderName' => $pmidArray['pmname']);
  462. }
  463. }
  464. }
  465. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $downfileurl), JSON_UNESCAPED_UNICODE);
  466. die();
  467. } else {
  468. echo json_encode(array('status' => FALSE, 'msg' => '暂时无审核信息'), JSON_UNESCAPED_UNICODE);
  469. die();
  470. }
  471. }
  472. if ($_POST['RequestType'] == 2) {
  473. /**
  474. {
  475. "downurl": "http://d.jl.smartcost.com.cn/data/2015/0608/20150608043245691/ProjectFile.rmf", 最新一期最新一次的文件
  476. "proName": "巫溪县前进桥", 项目名称
  477. "stName": "巫溪县 前进桥(终)", 合同段名称
  478. "MD5_Jl": "7cf05dccc6ad45b2d78f476a3388c3b2", 最新一期最新一次的文件hash code
  479. "tenderstatus": "2", 标段状态
  480. "tenderid": "234", 标段ID
  481. "pnameid": "79", 项目ID
  482. "ptypeid": "96", 合同段ID
  483. "audituidstatus": "2", 当前用户审核状态
  484. "bianzhirenuid": "59", 编制人UID
  485. "tenderName": "巫溪县 前进桥 终" 标段名称
  486. }
  487. */
  488. // TODO::不同角色提取条件不同是否使用audituid 作为当前用户提取条件,容易产生冲突
  489. if (!isset($_POST['audituid']) || !($_POST['audituid'] > 0)) {
  490. echo json_encode(array('status' => FALSE, 'msg' => '返回指定用户参与的所有项目参数错误'), JSON_UNESCAPED_UNICODE);
  491. die();
  492. }
  493. // 三个角色数据合并返回
  494. // 返回最新一期的项目文件
  495. // 业主
  496. // 业主查询参与的项目时
  497. // TODO::业主是否参与审核?如果参与提取哪个参与者的审核状态?
  498. $userproArray = $this->project->getRowUid($_POST['audituid']);
  499. $newattArray = $retArray = $hashArray = NULL;
  500. foreach ($userproArray as $upk => $upv) {
  501. $attArray = $this->attfile->getPmidGroup($upv['pid']);
  502. $attaArray = NULL;
  503. foreach ($attArray as $akey => $avalue) {
  504. $attaArray[] = $this->attfile->getLastNumTimes($avalue['pmid']);
  505. }
  506. foreach ($attaArray as $attk => $attv) {
  507. $attfileArray = $this->contractact->getRowByStid($attv['stid']);
  508. $pmidArray = $this->actmeasure->getRowByPmid($attv['pmid']);
  509. $numArray = $this->numofperact->getRow($attv['pmid'], $attv['numpname'], $attv['times']);
  510. $auditArray = $this->measureauditact->getLastNewRowInfo($attv['pmid'], $attv['numpname'], $_POST['audituid']);
  511. $pathinfo = pathinfo($attv['filepath']);
  512. if (isset($pathinfo['dirname'])) {
  513. $retArray[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf', 'proName' => $upv['pname'], 'stName' => $attfileArray['stname'], 'MD5_Jl' => $attv['filehashcode'], 'tenderstatus' => $this->statusArray[$numArray['currstatus']], 'tenderid' => $attv['pmid'], 'pnameid' => $upv['pid'], 'ptypeid' => $attfileArray['stid'], 'audituidstatus' => $this->statusArray[$auditArray['mastatus']], 'bianzhirenuid' => $pmidArray['uid'], 'tenderName' => $pmidArray['pmname']);
  514. $hashArray[] = md5(Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf' . $upv['pname'] . $attfileArray['stname'] . $attv['filehashcode'] . $this->statusArray[$numArray['currstatus']] . $attv['pmid'] . $upv['pid'] . $attfileArray['stid'] . $this->statusArray[$auditArray['mastatus']] . $pmidArray['uid'] . $pmidArray['pmname']);
  515. }
  516. }
  517. }
  518. // 施工
  519. $measureArray = $this->actmeasure->getPmidRow($_POST['audituid']);
  520. if (isset($measureArray) && $measureArray) {
  521. $attfileArray = $stidArray = NULL;
  522. foreach ($measureArray as $key => $value) {
  523. $proArray = $this->project->getRowByPid($value['pid']);
  524. $conArray = $this->contractact->getRowByStid($value['stid']);
  525. $attfileArray = $this->attfile->getLastNewProfile2($value['pmid']);
  526. $pmidArray = $this->actmeasure->getRowByPmid($value['pmid']);
  527. $statusArray = $this->numofperact->getMaxRowStatus($attfileArray['pmid'], $attfileArray['numpname']);
  528. $auditArray = $this->measureauditact->getLastNewRowInfo($attfileArray['pmid'], $attfileArray['numpname'], $_POST['audituid']);
  529. $pathinfo = pathinfo($attfileArray['filepath']);
  530. if (!$auditArray['mastatus'])
  531. $auditStr = 'uncheck';
  532. if (isset($pathinfo['dirname'])) {
  533. $hashstr = md5(Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf' . $proArray['pname'] . $conArray['stname'] . $attfileArray['filehashcode'] . $this->statusArray[$statusArray['currstatus']] . $value['pmid'] . $proArray['pid'] . $conArray['stid'] . $this->statusArray[$auditStr] . $pmidArray['uid'] . $pmidArray['pmname']);
  534. if (!in_array($hashstr, $hashArray)) {
  535. $retArray[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf', 'proName' => $proArray['pname'], 'stName' => $conArray['stname'], 'MD5_Jl' => $attfileArray['filehashcode'], 'tenderstatus' => $this->statusArray[$statusArray['currstatus']], 'tenderid' => $value['pmid'], 'pnameid' => $proArray['pid'], 'ptypeid' => $conArray['stid'], 'audituidstatus' => $this->statusArray[$auditStr], 'bianzhirenuid' => $pmidArray['uid'], 'tenderName' => $pmidArray['pmname']);
  536. $hashArray[] = $hashstr;
  537. }
  538. }
  539. }
  540. }
  541. // 审批 是否只提取最新一期?
  542. $pmidGroupArray = $this->measureauditact->getPmidGroup($_POST['audituid']);
  543. /**
  544. * 从审核人列表中提取记录时,如果项目进行到新开一次或者一期数据,但是上报人并未上报数据,(犹豫逻辑上机制导致,先创建审批人再通过上报人上报数据才能产生新一期)
  545. * 这时,上报人查询到的数据就为空。
  546. * 如果没有最新一次上报数据(可否提取2期上报数据?即便是能下载也不能打开,因为上一期数据的审批人数或者状态,可能与最新一期的审批人状态不同,然后软件报错)
  547. */
  548. $retval = null;
  549. foreach ($pmidGroupArray as $gkey => $gvalue) {
  550. $retval[] = $this->measureauditact->getLastNumTimes($gvalue['pmid'], $_POST['audituid']);
  551. }
  552. foreach ($retval as $spkey => $spvalue) {
  553. $pathinfo = null;
  554. $proArray = $this->project->getRowByPid($spvalue['pid']);
  555. $conArray = $this->contractact->getRowByStid($spvalue['stid']);
  556. $pmidArray = $this->actmeasure->getRowByPmid($spvalue['pmid']);
  557. /**
  558. * 两种情况 一种情况是 新建一期 还有一种是审核未通过重做 这两种未提交
  559. */
  560. $intNum = $this->numofperact->getCountNumpname($spvalue['pmid'], $spvalue['numpname']);
  561. // 如果期数是第一期期数必须大于一,否则减一为无效数据 ,为0表示这期为做上报没有产生记录
  562. if (( $spvalue['numpname'] > 1) && ($intNum == 0)) {// 提取上一期的数据
  563. // 提取期数减一
  564. $intLastTimes = $this->numofperact->getMaxTimes($spvalue['pmid'], $spvalue['numpname'] - 1)['times'];
  565. $numstatusArray = $this->numofperact->getRow($spvalue['pmid'], $spvalue['numpname'] - 1, $intLastTimes); //获取上一期最新一次的状态
  566. } else {
  567. $intTimes = $this->numofperact->getCountTimes($spvalue['pmid'], $spvalue['numpname'], $spvalue['times']);
  568. if (($intTimes == '0') && $spvalue['times'] > 0) {
  569. $numstatusArray = $this->numofperact->getRow($spvalue['pmid'], $spvalue['numpname'], $spvalue['times'] - 1);
  570. } else {// 当创建第一次的时候也会为空,所以下方加了判断
  571. $numstatusArray = $this->numofperact->getRow($spvalue['pmid'], $spvalue['numpname'], $spvalue['times']);
  572. }
  573. }
  574. $afArray = $this->attfile->getLastNewProfile2($spvalue['pmid']); // 由于始终提取最新一期所以不用放入判断情况中
  575. $auditArray = $this->measureauditact->getLastNewRowInfo($spvalue['pmid'], $spvalue['numpname'], $_POST['audituid']);
  576. $pathinfo = pathinfo($afArray['filepath']);
  577. if ($numstatusArray && $auditArray) { // 如果重做审核人有变更,根据审核状态判断是否存在该审核人,不存在则不显示此条记录
  578. $hashstr = md5(Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf' . $proArray['pname'] . $conArray['stname'] . $afArray['filehashcode'] . $this->statusArray[$numstatusArray['currstatus']] . $spvalue['pmid'] . $proArray['pid'] . $conArray['stid'] . $this->statusArray[$auditArray['mastatus']] . $pmidArray['uid'] . $pmidArray['pmname']);
  579. if (!in_array($hashstr, $hashArray)) {
  580. $retArray[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf', 'proName' => $proArray['pname'], 'stName' => $conArray['stname'], 'MD5_Jl' => $afArray['filehashcode'], 'tenderstatus' => $this->statusArray[$numstatusArray['currstatus']], 'tenderid' => $spvalue['pmid'], 'pnameid' => $proArray['pid'], 'ptypeid' => $conArray['stid'], 'audituidstatus' => $this->statusArray[$auditArray['mastatus']], 'bianzhirenuid' => $pmidArray['uid'], 'tenderName' => $pmidArray['pmname']);
  581. $hashArray[] = $hashstr;
  582. }
  583. }
  584. }
  585. // $dd = NULL;
  586. // if (isset($retArray))
  587. // $dd = $this->array_unique_fb($retArray);
  588. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $retArray), JSON_UNESCAPED_UNICODE);
  589. }
  590. }
  591. }
  592. //二维数组去掉重复值 并保留键值
  593. function array_unique_fb($array2D) {
  594. $key = array();
  595. foreach ($array2D as $k => $v) {
  596. if (empty($key))
  597. $key = array_keys($v); //记录数组的KEY
  598. $v = join(",", $v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
  599. $temp[$k] = $v;
  600. }
  601. $temp = array_unique($temp); //去掉重复的字符串,也就是重复的一维数组
  602. foreach ($temp as $k => $v) {
  603. $array = explode(",", $v); //再将拆开的数组重新组装
  604. foreach ($array as $i => $t) {
  605. $temp2[$k] = !empty($temp2[$k]) ? array_merge($temp2[$k], array("{$key[$i]}" => $t)) : array("{$key[$i]}" => $t); //依次添加到新的数组中去
  606. }
  607. }
  608. return $temp2;
  609. }
  610. function unique_arr($array2D, $stkeep = false, $ndformat = true) {
  611. // 判断是否保留一级数组键 (一级数组键可以为非数字)
  612. if ($stkeep)
  613. $stArr = array_keys($array2D);
  614. // 判断是否保留二级数组键 (所有二级数组键必须相同)
  615. if ($ndformat)
  616. $ndArr = array_keys(end($array2D));
  617. //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
  618. foreach ($array2D as $v) {
  619. $v = join(",", $v);
  620. $temp[] = $v;
  621. }
  622. //去掉重复的字符串,也就是重复的一维数组
  623. $temp = array_unique($temp);
  624. //再将拆开的数组重新组装
  625. foreach ($temp as $k => $v) {
  626. if ($stkeep)
  627. $k = $stArr[$k];
  628. if ($ndformat) {
  629. $tempArr = explode(",", $v);
  630. foreach ($tempArr as $ndkey => $ndval) {
  631. $output[$k][$ndArr[$ndkey]] = $ndval;
  632. }
  633. } else {
  634. $output[$k] = explode(",", $v);
  635. }
  636. }
  637. return $output;
  638. }
  639. // 标段期审核接口
  640. function auditMeasure() {
  641. if (isset($_POST['userid']) && isset($_POST['tenderid']) && isset($_POST['phaseno']) && isset($_POST['MD5_JL'])) {
  642. $auditcontent = iconv('GB2312', 'UTF-8', $_POST['CheckerMemo']);
  643. $auditArray = $this->measureauditact->getLastNewRowInfo($_POST['tenderid'], $_POST['phaseno'], $_POST['userid']);
  644. if (isset($auditArray ['mastatus']) && ($auditArray ['mastatus'] == 'checked') || ($auditArray ['mastatus'] == 'checkno')) {
  645. echo json_encode(array('status' => FALSE, 'msg' => '已审核完毕,请勿重复提交'), JSON_UNESCAPED_UNICODE);
  646. die();
  647. }
  648. $auditUserArray = $this->measureauditact->getUserAuditLast($_POST['tenderid'], $_POST['phaseno']);
  649. $fp = $this->upfile('upfile');
  650. if (isset($fp[0]['filepath'])) {
  651. $res = $this->zip->open(Doo::conf()->SITE_PATH . $fp[0]['filepath']);
  652. $extPath = pathinfo($fp[0]['filepath']);
  653. $extPathdir = Doo::conf()->SITE_PATH . $extPath ['dirname'] . '/' . $extPath['filename'];
  654. if ($res === TRUE) {
  655. if (!$this->dir_create($extPathdir)) {
  656. return FALSE;
  657. }
  658. $this->zip->extractTo($extPathdir);
  659. $this->zip->close();
  660. }
  661. // 更新五项最新数据
  662. $countArray = json_decode(file_get_contents($extPathdir . '/' . 'JsonFile_Common.json'), TRUE, JSON_UNESCAPED_UNICODE);
  663. if (!isset($countArray)) {
  664. $status = array('status' => FALSE, 'msg' => '期数汇总数据上传失败');
  665. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  666. die();
  667. }
  668. $iniTimes = 0;
  669. $intMaxTimes = $this->numofperact->getMaxTimes($_POST['tenderid'], $_POST['phaseno']);
  670. if (isset($intMaxTimes['times']) && ($intMaxTimes['times'] > 0)) {
  671. $iniTimes = $intMaxTimes['times'];
  672. }
  673. $this->actmeasure->updateCon($_POST['tenderid'], $countArray['TotalPrice']);
  674. $this->numofperact->updateNumofper($_POST['tenderid'], $_POST['phaseno'], $countArray, $iniTimes);
  675. $numArray = $this->numofperact->getRow($_POST['tenderid'], $_POST['phaseno'], $iniTimes);
  676. if (isset($auditArray['pid'])) {
  677. // 插入附件表之前要更新所有次标段期数的提交的数据状态为旧标志
  678. $this->attfile->setOldfileFlag($_POST['tenderid'], $_POST['phaseno'], $iniTimes);
  679. // 插入此次提交的文件路径数据并设置为新状态
  680. // 写入此时是第几次重做
  681. $this->attfile->insertFile($auditArray['pid'], $auditArray['stid'], $numArray['mpid'], $_POST['tenderid'], $_POST['phaseno'], $_POST['userid'], $fp[0]['filepath'], 0, $_POST['MD5_JL'], $iniTimes);
  682. // 更新审核表审核人的标段期数审核状态
  683. if ($this->measureauditact->setStatusTo($auditArray['maid'], 3, $auditcontent)) {
  684. // 更新下一个人的状态
  685. $countAudit = count($auditUserArray);
  686. if ($auditArray['last'] == '1') {
  687. $this->measureauditact->setStatusTo($auditUserArray[0]['maid'], 3);
  688. $this->numofperact->updateAuditStatus($_POST['tenderid'], $_POST['phaseno'], 'checked', $iniTimes);
  689. echo json_encode(array('status' => TRUE, 'msg' => ''), JSON_UNESCAPED_UNICODE);
  690. die();
  691. } else {
  692. if (($countAudit == 2) && ($auditUserArray[0]['last'] == 1) && ($auditUserArray[1]['maid'] == $auditArray['maid'])) {
  693. $this->measureauditact->updateMastatus($auditUserArray[0]['maid']);
  694. $this->numofperact->updateAuditStatus($_POST['tenderid'], $_POST['phaseno'], 'checking', $iniTimes);
  695. echo json_encode(array('status' => TRUE, 'msg' => ''), JSON_UNESCAPED_UNICODE);
  696. die();
  697. }
  698. if (($countAudit > 2)) {
  699. foreach ($auditUserArray as $k => $v) {
  700. if ($v['maid'] == $auditArray['maid']) {
  701. if ($k == ($countAudit - 1)) {//如果是最后一个
  702. $this->measureauditact->updateMastatus($auditUserArray[0]['maid']);
  703. } else {
  704. $this->measureauditact->updateMastatus($auditUserArray[$k + 1]['maid']);
  705. }
  706. $this->numofperact->updateAuditStatus($_POST['tenderid'], $_POST['phaseno'], 'checking', $iniTimes);
  707. echo json_encode(array('status' => TRUE, 'msg' => ''), JSON_UNESCAPED_UNICODE);
  708. die();
  709. }
  710. }
  711. // 我是第几个审核的
  712. // 如果是最后一个就把业主审核状态更改为审核中
  713. // 如果是第一个就把后一个设置为审核中
  714. }
  715. }
  716. } else {
  717. echo json_encode(array('status' => FALSE, 'msg' => '审核文件提交失败1'), JSON_UNESCAPED_UNICODE);
  718. die();
  719. }
  720. }
  721. } else {
  722. echo json_encode(array('status' => FALSE, 'msg' => '审核文件提交失败'), JSON_UNESCAPED_UNICODE);
  723. die();
  724. }
  725. } else {
  726. echo json_encode(array('status' => FALSE, 'msg' => '审核参数错误'), JSON_UNESCAPED_UNICODE);
  727. die();
  728. }
  729. }
  730. /**
  731. * 根据标段ID查询是否需要更新
  732. */
  733. function checkTenderUpdate() {
  734. if (isset($this->params ['tenderid']) && $this->params['tenderid']) {
  735. $updateArray = $this->attfile->getFileUpdate($this->params['tenderid']);
  736. $projectArray = $this->project->getRowByPid($updateArray['pid']);
  737. $stArray = $this->contractact->getRowByStid($updateArray['stid']);
  738. $MeasureArray = $this->actmeasure->getRowByPmid($this->params['tenderid']);
  739. if (isset($updateArray['filepath'])) {
  740. $pathinfo = pathinfo($updateArray['filepath']);
  741. $downfileurl[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf', 'MD5_Jl' => $updateArray['filehashcode'], 'proName' => $projectArray['pname'], 'stName' => $stArray['stname'], 'pnameid' => $projectArray['pid'], 'ptypeid' => $stArray['stid'], 'BidName' => $MeasureArray['pmname']);
  742. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $downfileurl), JSON_UNESCAPED_UNICODE);
  743. die();
  744. } else {
  745. echo json_encode(array('status' => TRUE, 'msg' => '暂无更新数据'), JSON_UNESCAPED_UNICODE);
  746. die();
  747. }
  748. } else {
  749. echo json_encode(array('status' => FALSE, 'msg' => '更新查询参数错误'), JSON_UNESCAPED_UNICODE);
  750. die();
  751. }
  752. }
  753. /**
  754. * 手动创建第二期的审核人
  755. */
  756. function creatTenderNumPnameUser() {
  757. if (isset($_POST['tenderid']) && isset($_POST['phaseno']) && ($_POST['phaseno'] > 1)) {
  758. $allMeasureUser = $this->measureauditact->getUserAudit($_POST['tenderid'], $_POST['phaseno'] - 1);
  759. if (isset($allMeasureUser)) {
  760. foreach ($allMeasureUser as $key => $value) {
  761. // if ($key == 1) {
  762. // $status = 'checking';
  763. // } else {
  764. $status = 'uncheck';
  765. // }
  766. try {
  767. $this->measureauditact->insertMeasureAudit($value['pid'], $value['creatoruid'], $value['auditoruid'], $value['mpid'], $value['pmid'], $value['stid'], $_POST['phaseno'], $status, $value['last']);
  768. } catch (Exception $exc) {
  769. }
  770. }
  771. echo json_encode(array('status' => TRUE, 'msg' => ''), JSON_UNESCAPED_UNICODE);
  772. die();
  773. } else {
  774. echo json_encode(array('status' => FALSE, 'msg' => '审核人员列表不存在'), JSON_UNESCAPED_UNICODE);
  775. die();
  776. }
  777. } else {
  778. echo json_encode(array('status' => FALSE, 'msg' => '创建审核人员列表参数错误'), JSON_UNESCAPED_UNICODE);
  779. die();
  780. }
  781. }
  782. /**
  783. * 返回指定用户参与的所有项目
  784. */
  785. function getUserALLProject() {
  786. if (!isset($this->params['userid']) || !($this->params['userid'] > 0)) {
  787. echo json_encode(array('status' => FALSE, 'msg' => '返回指定用户参与的所有项目参数错误'), JSON_UNESCAPED_UNICODE);
  788. die();
  789. }
  790. $conArray = $this->contractact->getUserRow($this->params['userid']);
  791. if (isset($conArray) && $conArray) {
  792. foreach ($conArray as $key => $value) {
  793. $proArray = $this->project->getRowByPid($value['pid']);
  794. $attfileArray = $this->attfile->getLastData($value['stid']);
  795. foreach ($attfileArray as $k => $v) {
  796. $pathinfo = pathinfo($v['filepath']);
  797. $retArray[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf', 'proName' => $proArray['pname'], 'stName' => $value['stname'], 'MD5_Jl' => $v['filehashcode']);
  798. }
  799. }
  800. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $retArray), JSON_UNESCAPED_UNICODE);
  801. die();
  802. } else {
  803. $userproArray = $this->measureauditact->getProject($this->params['userid']);
  804. if (isset($userproArray) && $userproArray) {
  805. foreach ($userproArray as $upk => $upv) {
  806. $attArray = $this->attfile->getMeasureLastNew($upv['pmid'], $upv['numpname']);
  807. $proArray = $this->project->getRowByPid($attArray['pid']);
  808. $attfileArray = $this->contractact->getRowByStid($attArray['stid']);
  809. $pathinfo = pathinfo($attArray['filepath']);
  810. if (isset($pathinfo['dirname']))
  811. $newattArray[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo ['dirname'] . '/' . $pathinfo ['filename'] . '/ProjectFile.rmf', 'proName' => $proArray['pname'], 'stName' => $attfileArray['stname'], 'MD5_Jl' => $attArray['filehashcode']);
  812. }
  813. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $newattArray), JSON_UNESCAPED_UNICODE);
  814. die();
  815. }
  816. }
  817. }
  818. /**
  819. * 设置审核未通过操作
  820. * 第一步设置未通过操作,操作相关期数。 同步状态。
  821. * 第二步设置项目查询接口未通过审核的查询返回未锁定的
  822. * 第三步前台相关状态更新
  823. *
  824. * TODO: 更新附件标志位未加入次数标志做更新 ok
  825. * TODO: 不通过两次未通过时候操作期数状态为错误位同步状态位 ok
  826. * TODO: MPID未通过操作不争取 ok
  827. */
  828. function setCheckno() {
  829. if (isset($this->params['userid']) && isset($this->params['tenderid']) && isset($this->params['phaseno']) && isset($_POST['MD5_JL'])) {
  830. $auditcontent = iconv('GB2312', 'UTF-8', $_POST['CheckerMemo']);
  831. $auditArray = $this->measureauditact->getRowInfo($this->params['tenderid'], $this->params['phaseno'], $this->params['userid']);
  832. if (isset($auditArray['maid'])) {
  833. $intMaxTimes = $this->numofperact->getMaxTimes($this->params['tenderid'], $this->params['phaseno']);
  834. if (isset($intMaxTimes['times'])) {
  835. $iniTimes = $intMaxTimes['times'];
  836. }
  837. $this->measureauditact->setCheckno($auditArray['maid'], $auditcontent);
  838. $this->numofperact->updateAuditStatus($this->params['tenderid'], $this->params['phaseno'], 'checkno', $iniTimes);
  839. $fp = $this->upfile('upfile');
  840. if (isset($fp[0]['filepath'])) {
  841. // 解压缩文件等待以后直接使用
  842. // TODO:根据校验码校验包的完整性
  843. $res = $this->zip->open(Doo::conf()->SITE_PATH . $fp[0]['filepath']);
  844. $extPath = pathinfo($fp[0]['filepath']);
  845. $extPathdir = Doo::conf()->SITE_PATH . $extPath ['dirname'] . '/' . $extPath['filename'];
  846. if ($res === TRUE) {
  847. if (!$this->dir_create($extPathdir)) {
  848. return FALSE;
  849. }
  850. $this->zip->extractTo($extPathdir);
  851. $this->zip->close();
  852. }
  853. $numArray = $this->numofperact->getRow($this->params['tenderid'], $this->params['phaseno'], $iniTimes);
  854. // 插入附件表之前要更新所有次标段期数的提交的数据状态为旧标志
  855. $this->attfile->setOldfileFlag($this->params['tenderid'], $this->params['phaseno'], $iniTimes);
  856. // 插入此次提交的文件路径数据并设置为新状态
  857. $this->attfile->insertFile($auditArray['pid'], $auditArray['stid'], $auditArray['mpid'], $this->params['tenderid'], $this->params['phaseno'], $this->params['userid'], $fp[0]['filepath'], 0, $_POST['MD5_JL'], $iniTimes);
  858. echo json_encode(array('status' => TRUE, 'msg' => ''), JSON_UNESCAPED_UNICODE);
  859. die();
  860. } else {
  861. echo json_encode(array('status' => FALSE, 'msg' => '文件上传故障'), JSON_UNESCAPED_UNICODE);
  862. die();
  863. }
  864. } else {
  865. echo json_encode(array('status' => FALSE, 'msg' => '审核期数不存在'), JSON_UNESCAPED_UNICODE);
  866. die();
  867. }
  868. } else {
  869. echo json_encode(array('status' => FALSE, 'msg' => '审核未通过参数错误'), JSON_UNESCAPED_UNICODE);
  870. die();
  871. }
  872. }
  873. /**
  874. * 创建未通过的新一期
  875. *
  876. */
  877. function createNewAudit() {
  878. // 插入上次期数相关审核人员
  879. // TODO:
  880. // error_log(var_export($this->params, TRUE), 3, '/opt/html/jiliang_customedProduct/data/' . time());
  881. // die;
  882. if (isset($this->params['tenderid']) && isset($this->params['phaseno'])) {
  883. $auditArray = $this->numofperact->getChecknoRow($this->params['tenderid'], $this->params['phaseno']);
  884. if (isset($auditArray['currstatus']) && ($auditArray['currstatus'] == 'checkno')) {
  885. $auditUserArray = $this->measureauditact->getUserAudit($this->params['tenderid'], $this->params['phaseno'], $auditArray['times']);
  886. if ($auditUserArray) {
  887. foreach ($auditUserArray as $key => $value) {
  888. $auditUserArray = $this->measureauditact->insertMeasureAudit($value['pid'], $value['creatoruid'], $value['auditoruid'], $value['mpid'], $value['pmid'], $value['stid'], $value['numpname'], $status = 'uncheck', $value['last'], $auditArray['times'] + 1);
  889. }
  890. }
  891. $timesArray = $this->numofperact->getMaxTimes($this->params['tenderid'], $this->params['phaseno']);
  892. $urlinfoArray = $this->attfile->getLastNewProfileUnlock($this->params['tenderid'], $this->params['phaseno'], $timesArray['times']);
  893. $proArray = $this->project->getRowByPid($urlinfoArray['pid']);
  894. $stArray = $this->contractact->getRowByStid($urlinfoArray['stid']);
  895. $MeasureArray = $this->actmeasure->getRowByPmid($this->params['tenderid']);
  896. $downArray = NULL;
  897. $pathinfo = pathinfo($urlinfoArray['filepath']);
  898. if (isset($pathinfo['dirname']))
  899. $downArray[] = array('downurl' => Doo::conf()->APP_URL . $pathinfo['dirname'] . '/' . $pathinfo['filename'] . '/ProjectFile_UnLock', 'MD5_Jl' => $urlinfoArray['filehashcode'], 'proName' => $proArray['pname'], 'stName' => $stArray['stname'], 'pnameid' => $proArray['pid'], 'ptypeid' => $stArray['stid'], 'BidName' => $MeasureArray['pmname']);
  900. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $downArray), JSON_UNESCAPED_UNICODE);
  901. die();
  902. } else {
  903. echo json_encode(array('status' => FALSE, 'msg' => '审核状态无效'), JSON_UNESCAPED_UNICODE);
  904. die();
  905. }
  906. } else {
  907. echo json_encode(array('status' => FALSE, 'msg' => '创建未通过的新一期参数错误'), JSON_UNESCAPED_UNICODE);
  908. die();
  909. }
  910. }
  911. public function getUserInfo() {
  912. if (isset($this->params['userid']) && ($this->params['userid'] > 0)) {
  913. $proArray = $this->profile->getProWithUid($this->params['userid']);
  914. if (isset($proArray['userid'])) {
  915. $strAvatar = $this->auth->getAvatar($proArray['userid']);
  916. echo json_encode(array('status' => 'TRUE', 'msg' => '', 'info' => array('avatar' => $strAvatar, 'name' => $proArray['name'], 'jobs' => $proArray['jobs'], 'company' => $proArray['company'])), JSON_UNESCAPED_UNICODE);
  917. die();
  918. } else {
  919. echo json_encode(array('status' => 'FALSE', 'msg' => '此用户不存在'), JSON_UNESCAPED_UNICODE);
  920. die();
  921. }
  922. } else {
  923. echo json_encode(array('status' => 'FALSE', 'msg' => '用户查询参数无效'), JSON_UNESCAPED_UNICODE);
  924. die();
  925. }
  926. }
  927. public function updateTenderName() {
  928. if (isset($this->params['BidID']) && isset($this->params['BidNewName'])) {
  929. if ($this->actmeasure->updateName($this->params['BidID'], iconv('GB2312', 'UTF-8', $this->params['BidNewName']))) {
  930. echo json_encode(array('status' => 'TRUE', 'msg' => ''), JSON_UNESCAPED_UNICODE);
  931. die();
  932. } else {
  933. echo json_encode(array('status' => 'FALSE', 'msg' => '标段名称更新错误'), JSON_UNESCAPED_UNICODE);
  934. die();
  935. }
  936. } else {
  937. echo json_encode(array('status' => 'FALSE', 'msg' => '标段名称更新参数无效'), JSON_UNESCAPED_UNICODE);
  938. die();
  939. }
  940. }
  941. /**
  942. * 清单附件上传,单文件上传
  943. * @param int $tenderid 标段ID
  944. * @param int $uid 上传人ID
  945. * @param int $itemid 本地清单ID
  946. */
  947. public function uploadItemFile() {
  948. if (isset($this->params['tenderid']) && isset($this->params['uid'])) {
  949. if (!isset($_FILES['upitem']) && !isset($_POST['itemid']) && !isset($_POST['Category'])) {
  950. $this->msg(0, '上传参数错误');
  951. }
  952. $fileArray = $this->upItemFile('upitem')[0];
  953. if (isset($fileArray['filepath'])) {
  954. $memoStr = iconv('GB2312', 'UTF-8', $_POST['Memo']);
  955. $fnArray = explode('.', $fileArray['filename']);
  956. $filenameStr = iconv('GB2312', 'UTF-8', $fnArray[0]);
  957. $postArray = array('mpid' => $this->params['tenderid'], 'ownerid' => $this->params['uid'], 'itemid' => $_POST['itemid'], 'filename' => $filenameStr, 'filesize' => $fileArray['filesize'], 'fileext' => $fileArray['fileext'], 'filepath' => $fileArray['filepath'], 'categoryid' => array_search($_POST['Category'], $this->fileTypeArray), 'tips' => $memoStr);
  958. if ($this->itemfile->insertItemFileRecord($postArray) > 1) {
  959. $extPath = pathinfo($fileArray['filepath']);
  960. $itemArray = array('onlineFileName' => $extPath['filename'] . '.' . $extPath['extension']);
  961. $status = array('status' => TRUE, 'msg' => '', 'iteminfo' => $itemArray);
  962. echo json_encode($status, JSON_UNESCAPED_UNICODE);
  963. die();
  964. }
  965. } else {
  966. $this->msg(0, '附件上传失败,请重新上传');
  967. }
  968. } else {
  969. $this->msg(0, '上传参数错误');
  970. }
  971. }
  972. /**
  973. * 获得清单附件列表
  974. */
  975. public function getItemFileList() {
  976. if (isset($this->params['tenderid'])) {
  977. $itemfileArray = $this->itemfile->getItemFileList($this->params['tenderid']);
  978. $key = array_search(max($itemfileArray), $itemfileArray);
  979. if ($key >= 0) {
  980. foreach ($itemfileArray as $value) {
  981. $profileArray = $this->profile->getProWithUid($value['ownerid']);
  982. $downArray[] = array('downurl' => Doo::conf()->APP_URL . $value['filepath'], 'filename' => $value['filename'] . '.' . $value['fileext'], 'fileext' => $value['fileext'], 'ownerName' => $profileArray['name'], 'itemid' => $value['itemid'], 'Category' => $this->fileTypeArray[$value['categoryid']], 'Memo' => $value['tips'], 'ownerid' => $value['ownerid'], 'uptime' => date('Y-m-d H:i', $value['intime']), 'fileid' => $value['iaid']);
  983. }
  984. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $downArray), JSON_UNESCAPED_UNICODE);
  985. die();
  986. }
  987. } else {
  988. $this->msg(0, '获取附件列表参数错误');
  989. }
  990. }
  991. /**
  992. * 编辑清单附件描述 文件名?
  993. */
  994. public function updateItemFileDesc() {
  995. if (isset($this->params['fileid']) && isset($_POST['FileName']) && isset($_POST['Memo'])) {
  996. if ($this->itemfile->updateItemFields($this->params['fileid'], $_POST['FileName'], $_POST['Memo']) > 0) {
  997. echo json_encode(array('status' => 'TRUE', 'msg' => ''), JSON_UNESCAPED_UNICODE);
  998. die();
  999. } else {
  1000. echo json_encode(array('status' => 'FALSE', 'msg' => '附件更新接口参数错误'), JSON_UNESCAPED_UNICODE);
  1001. die();
  1002. }
  1003. } else {
  1004. $this->msg(0, '附件更新接口参数错误');
  1005. }
  1006. }
  1007. /**
  1008. * 查询指定项目的指定期的全部审核意见。
  1009. * 标段ID,期号
  1010. */
  1011. public function getAuditOpinion() {
  1012. if (isset($this->params['tenderid']) && isset($this->params['phaseno'])) {
  1013. $retval = $this->measureauditact->getAuditOpinion($this->params['tenderid'], $this->params['phaseno']);
  1014. $iterator = new ArrayIterator($retval);
  1015. if (iterator_count($iterator) > 0) {
  1016. foreach ($retval as $value) {
  1017. $proArray = $this->profile->getProWithUid($value['auditoruid']);
  1018. $uArray[] = array('realname' => $proArray['name'], 'jobs' => $proArray['jobs'], 'acontent' => $value['auditcontent']);
  1019. }
  1020. echo json_encode(array('status' => TRUE, 'msg' => '', 'info' => $uArray), JSON_UNESCAPED_UNICODE);
  1021. die();
  1022. } else {
  1023. echo json_encode(array('status' => 'FALSE', 'msg' => '查询指定项目的指定期的全部审核意见参数错误'), JSON_UNESCAPED_UNICODE);
  1024. die();
  1025. }
  1026. } else {
  1027. $this->msg(0, '查询指定项目的指定期的全部审核意见接口参数错误');
  1028. }
  1029. }
  1030. function upfile($fildname, $param = 'doc, docx, xls, xlsx, png, zip') {
  1031. return $this->att->uploadMut($fildname, $param);
  1032. }
  1033. function upItemFile($fildname, $param = 'doc, docx, xls, xlsx, png, zip') {
  1034. $this->att->setUploadDir();
  1035. return $this->att->uploadMut($fildname, $param);
  1036. }
  1037. function getFileupErrorNo() {
  1038. return $this->att->error();
  1039. }
  1040. function Signout() {
  1041. session_destroy();
  1042. }
  1043. function isLoggedIn() {
  1044. return isset($_SESSION['user_id']);
  1045. }
  1046. function generateFormHash($salt) {
  1047. $hash = md5(mt_rand(1, 1000000) . $salt);
  1048. $_SESSION['csrf_hash'] = $hash;
  1049. return $hash;
  1050. }
  1051. function isValidFormHash($hash) {
  1052. return $_SESSION['csrf_hash'] === $hash;
  1053. }
  1054. /**
  1055. * 随机字符串函数
  1056. * @param $password 密码
  1057. * @param $random 随机数
  1058. */
  1059. function random($length, $chars = '0123456789') {
  1060. $hash = '';
  1061. $max = strlen($chars) - 1;
  1062. for ($i = 0; $i < $length; $i++) {
  1063. $hash .= $chars[mt_rand(0, $max)];
  1064. }
  1065. return $hash;
  1066. }
  1067. /**
  1068. * 生成随机字符串
  1069. * @param string $lenth 长度
  1070. * @return string 字符串
  1071. */
  1072. function create_randomstr($lenth = 6) {
  1073. return $this->random($lenth, '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ');
  1074. }
  1075. function dir_create($path, $mode = 0777) {
  1076. if (is_dir($path))
  1077. return TRUE;
  1078. $path = $this->dir_path($path);
  1079. $parent = dirname($path);
  1080. if (!is_dir($parent))
  1081. @mkdir($parent, 0777, true);
  1082. @mkdir($path, 0777, true);
  1083. return is_dir($path);
  1084. }
  1085. function dir_path($path) {
  1086. $path = str_replace('\\', '/', $path);
  1087. if (substr($path, -1) != '/')
  1088. $path = $path . '/';
  1089. return $path;
  1090. }
  1091. function msg($isTrue = 0, $msg = null, $retmsg = null) {
  1092. if ($isTrue > 0) {
  1093. echo json_encode(array('status' => 'TRUE', 'msg' => ''), JSON_UNESCAPED_UNICODE);
  1094. die();
  1095. } else {
  1096. echo json_encode(array('status' => 'FALSE', 'msg' => $msg), JSON_UNESCAPED_UNICODE);
  1097. die();
  1098. }
  1099. }
  1100. }
  1101. ?>