checklistItems->find(array('cardId'=>$cardid))->sort(array('sort'=>-1)); $res = iterator_to_array($docs); echo json_encode( $res ); } function get_risktags(){ global $MYID,$wekan; $cardid = r('cardid'); $risklabels = getRiskLabels($cardid); echo json_encode( $risklabels ); } function get_allrisktags(){ $risklabels = getAllRiskLabels(); echo json_encode( $risklabels ); } function ipuser(){ global $MYID,$wekan; $ip = r('ip'); $docs = $wekan->usersip->find(array('ip'=>$ip)); $res = iterator_to_array($docs); if(count($res)==0){ we("null"); }else{ $info = array_values($res)[0]; unset($info['_id']); we(json_encode($info)); } } //新增检查项 function add_card_checklist(){ global $MYID,$wekan; if(isn($MYID))needLogin(); $cardid = r('cardid'); $text = r('text'); $sort = r('sort'); if(isn($sort))$sort=0; $_id = uniqid(); $data = array( "_id" => $_id, "title" => $text, "sort" => $sort*1 , "isFinished" => false, "checklistId" => "none", "cardId" => $cardid, 'userId' => $MYID, "createdAt" => new MongoDate(time()), ); $res = $wekan->checklistItems->insert( $data ); we (eventData('addchecklist',$data)); } //设置完成状态 function set_checklist_finish(){ global $MYID,$wekan; $id = r('id'); $val = r('val'); if($val=='true'){ $v = true; }else{ $v = false; } $res = $wekan->checklistItems->update(array( '_id' => $id ),array( '$set'=>array( 'isFinished' => $v ) )); $docs = $wekan->checklistItems->find(array('_id'=>$id)); $res = iterator_to_array($docs); we (eventData('setchecklistfinish',$res[$id])); } function del_checklist(){ global $MYID,$wekan; $id = r('id'); $docs = $wekan->checklistItems->find(array('_id'=>$id)); $r = iterator_to_array($docs); $res = $wekan->checklistItems->remove(array( '_id' => $id )); we (eventData('delchecklist',$r[$id])); } function quit_board(){ global $MYID,$wekan; $boardid = r('boardid'); $wekan->boards->update(array( '_id'=>$boardid, 'members.userId'=>$MYID ),array( '$pull'=>array('members'=>array('userId'=>$MYID)) )); we($MYID); } function ping(){ global $MYID,$wekan; $t = time(); $wekan->users->update(array( '_id'=>$MYID ),array( '$set'=>array('lastlogin'=>$t) )); we($MYID.'@'.$t); } function needLogin(){ we('{}'); } //提交评论 function add_card_comments($cardid=null,$boardid=null,$text=null,$continue=false){ global $MYID,$wekan; if(isn($MYID))needLogin(); if(!$cardid)$cardid = r('cardid'); if(!$boardid)$boardid = r('boardid'); if(!$text)$text = r('text'); $_id = uniqid(); $data = array( "_id" => $_id, "text" => $text, "boardId" => $boardid , "cardId" => $cardid, "createdAt" => new MongoDate(time()), "userId" => $MYID ); $res = $wekan->card_comments->insert( $data ); if(!$continue)we (eventData('addcomment',$data)); } //文档被修改了 function doc_has_changed(){ global $MYID,$wekan; $MYID = "system"; $url = r('docurl'); $doc = r('docname'); $query=array("description"=>new MongoRegex("/.*".$url.".*/i")); $query2=array("description"=>new MongoRegex("/.*".urlencode($doc).".*/i")); $res = $wekan->cards->find(array('$or'=>array( $query, $query2 ))); foreach($res as $rs){ add_card_comments( $rs['_id'], $rs['boardId'], "文档[更新]了:{$doc}",true ); $members = $rs['members']; $names = array(); $meminfos = $wekan->users->find( array( "_id" => array('$in'=>$members) )); foreach($meminfos as $_mid=>$meminfo){ if( $meminfo['profile']['fullname'] ){ $names[] = $meminfo['profile']['fullname']; } } if(count($names)>0){ getHttpPage('http://10.0.0.5/senddmsg/index.php',array( 'agentid'=>'164310138', 'content'=>"【{$rs['title']}】附带的文档更新了", 'name'=>implode(',',$names), 'url'=>"http://10.0.0.5/leguwork/?app=list&boardid={$rs['boardId']}#cardid={$rs['_id']}" )); } } we('ok'); } //设置描述 function set_card_description(){ global $MYID,$wekan; $cardid = r('cardid'); $boardid = r('boardid'); $text = r('text'); $res = $wekan->cards->update(array( '_id' => $cardid ),array( '$set'=>array( 'description' => $text ) )); $ndata = getcard($cardid); we (eventData('setdescription',$ndata[$cardid])); } //设置标题 function set_card_title(){ global $MYID,$wekan; $cardid = r('cardid'); $boardid = r('boardid'); $text = r('text'); $uid = r('uid'); $updateArr = array( 'title' => $text ); if(indexOf($text,'~~')==-1){ $updateArr['finishAt'] = 0; $updateArr['finishUid'] = ''; }else{ $updateArr['finishAt'] = time(); $updateArr['finishUid'] = $uid; } $res = $wekan->cards->update(array( '_id' => $cardid ),array( '$set'=>$updateArr )); $ndata = getcard($cardid); we (eventData('settitle',$ndata[$cardid])); } //增加卡片 function add_card(){ global $MYID,$wekan; if(isn($MYID))needLogin(); $listid = r('listid'); $boardid = r('boardid'); $text = r('text'); $desc = r('description'); $_id = uniqid(); $data = array( "_id" => $_id, "title" => $text, "members" => array($MYID), "boardId" => $boardid , "labelIds" => array(), "risklabelIds" => array(), "listId" => $listid, "boardId" => $boardid, "sort" => time(), //"swimlaneId" : "JKaEWmCWHhLigJk3Z", "archived" => false, "createdAt" => new MongoDate(time()), "dateLastActivity" => new MongoDate(time()), "isOvertime" => false, "userId" => $MYID ); if (isset($desc)){ $data['description'] = $desc; } $res = $wekan->cards->insert( $data ); we (eventData('addcard',$data)); } // 删除卡片 function del_card(){ global $MYID,$wekan; if(isn($MYID))needLogin(); $cid = r('cardid'); // $boardid = r('boardid'); // $text = r('text'); // $desc = r('description'); $cardData = $wekan->cards->findOne(array('_id'=>$cid)); if(!$cardData){ we('{"msg":"id错误"}'); } if($MYID != $cardData['userId']){ we('{"msg":"不能删除"}'); } $res = $wekan->cards->remove( array('_id'=>$cid) ); // we('{"msg":"ok"}'); we (eventData('delcard',$cardData)); // we (eventData('addcard',$data)); } function add_card2(){ global $MYID,$wekan; if(isn($MYID))needLogin(); $listid = r('listid'); $boardid = r('boardid'); $text = r('text'); $desc = r('description'); $_id = uniqid(); $data = array( "_id" => $_id, "title" => $text, "members" => array($MYID), "boardId" => $boardid , "labelIds" => array(), "risklabelIds" => array(), "listId" => $listid, // "_type" => 'task', // todo 卡片类型 ci task date "_status" => 'unfinished', // 卡片状态 unfinished 未完成卡片 "sort" => time(), //"swimlaneId" : "JKaEWmCWHhLigJk3Z", "archived" => false, "createdAt" => new MongoDate(time()), "dateLastActivity" => new MongoDate(time()), "isOvertime" => false, "userId" => $MYID ); if (isset($desc)){ $data['description'] = $desc; } $res = $wekan->cards->insert( $data ); we (eventData('addcard',$data)); } //设置卡片状态 function set_card_status(){ global $MYID,$wekan; $cardid = r('cardid'); $boardid = r('boardid'); // $text = r('text'); $uid = r('uid'); $updateArr = array( // '_type' => '', '_status' => 'show' ); $res = $wekan->cards->update(array( '_id' => $cardid ),array( '$set'=>$updateArr )); $ndata = getcard($cardid); we (eventData('addcard',$ndata)); } //设置列表标题 function set_list_title(){ global $MYID,$wekan; $listid = r('listid'); $boardid = r('boardid'); $text = r('text'); $res = $wekan->lists->update(array( '_id' => $listid ),array( '$set'=>array( 'title' => $text ) )); $ndata = getlist($listid); we (eventData('setlisttitle',$ndata[$listid])); } //增加列表 function add_list(){ global $MYID,$wekan; $boardid = r('boardid'); $text = r('text'); $_id = uniqid(); $data = array( "_id" => $_id, "title" => $text, "boardId" => $boardid, "sort" => 0, "archived" => false, "createdAt" => new MongoDate(time()), "updatedAt" => new MongoDate(time()) ); $res = $wekan->lists->insert( $data ); we (eventData('addlist',$data)); } function newcalendar(){ global $MYID,$wekan; $userinfo = getUserInfo($MYID); $_id = uniqid(); $data = array( "_id" => $_id, "title" => r('title'), "start" => r('start'), "end" => r('end'), "org" => $userinfo['org'], "orgname" => $userinfo['orgname'], ); $res = $wekan->events->insert( $data ); we('1'); //we (eventData('addlist',$data)); } function modipmcalendar(){ global $MYID,$wekan; $wekan->events->update(array( '_id'=>r('id'), ),array( '$set'=>array( 'title'=>r('title') ) )); we('1'); } function movepmcalendar(){ global $MYID,$wekan; $wekan->events->update(array( '_id'=>r('id'), ),array( '$set'=>array( 'start'=>r('start'), 'end'=>r('start') ) )); we('1'); } function delpmcalendar(){ global $MYID,$wekan; $wekan->events->remove(array( '_id'=>r('id'), )); we('1'); } function getEvents(){ global $MYID,$wekan; $userinfo = getUserInfo($MYID); $orgid = r('orgid'); if(isn($orgid)){ $orgid = $userinfo['org']; } /* $admin = $userinfo['org']; if($userinfo['extData'] && $userinfo['extData']['admin']){ $admin = $userinfo['extData']['admin']; if($admin=='all' && !isn($orgid)){ $admin = $orgid; } } */ $start = r('start'); $end = r('end'); $docs = $wekan->events->find(array('org'=>$orgid)); $rss = iterator_to_array($docs); $res = array(); foreach($rss as $rs){ $rs['allDay'] = true; $res[] = $rs; } we(json_encode($res)); } //设置成员 function set_member(){ global $MYID,$wekan; $cardid = r('cardid'); $memberid = r('memberid'); $boardid = r('boardid'); $data = getcard($cardid); $data = $data[$cardid]; // 不在里面添加 if(!in_array($memberid,$data['members'])){ $wekan->cards->update(array( '_id'=>$cardid ),array( '$push' => array('members'=>$memberid) )); $boardHasMember = $wekan->boards->find( array( "_id" => $boardid, "members.userId" =>$memberid )); if (count( iterator_to_array($boardHasMember) ) == 0){ //看板里没有这个用户,则自动增加 $wekan->boards->update(array( '_id'=>$boardid ),array( '$push' => array('members'=>array( "userId" => $memberid, "isAdmin" => false, "isActive" => true, "isCommentOnly" => false )) )); } }else{ // 在里面删掉 $mem_time = $data['mem_time']; if(!$mem_time)$mem_time=array(); unset( $mem_time[$memberid] ); $wekan->cards->update(array( '_id'=>$cardid ),array( '$pull' => array('members'=>$memberid), '$set' => array('mem_time'=>$mem_time) )); // 特定列的标签 延期分组 if ($data['listId'] == '5ce68e49bd298'){ $cardLabelIdArr = $data['labelIds']; $labelNameArr = array(); $boardLabelIdNameArr = getBoardLabelIdNames($data['boardId']); foreach ($cardLabelIdArr as $labelId){ if (array_key_exists($labelId,$boardLabelIdNameArr)){ $labelNameArr[] = $boardLabelIdNameArr[$labelId]; } } // 删掉对应用户的标签 $wekan->users->update(array( '_id'=>$memberid ),array( '$pullAll' => array('legulabel'=>$labelNameArr) )); } // 特定列表 日程分组 if ($data['listId'] == '5ce7a226c387f'){ $wekan->users->update(array( '_id'=>$memberid, ),array( '$set'=>array('legugroup'=>'') ),array("multiple" => true)); } } $data = getcard($cardid); // 刷新分组 setYanQiLabelUserForCard($cardid); setRiChengLabelUserForCard($cardid); we (eventData('memberchange',$data[$cardid])); } //设置延期成员 - 舒展专用 function remove_yq_member(){ global $MYID,$wekan; $cardid = r('cardid'); $memberid = r('memberid'); $boardid = r('boardid'); $data = getcard($cardid); $data = $data[$cardid]; $unsetKey = 'mem_time.'.$memberid.'.isyanqi'; $wekan->cards->update(array( '_id'=>$cardid ),array( '$unset' => array($unsetKey=>1) )); $data = getcard($cardid); we (eventData('memberchange',$data[$cardid])); } //设置标签 function set_label(){ global $MYID,$wekan; $cardid = r('cardid'); $labelid = r('labelid'); $timeto = r('timeto'); $data = getcard($cardid); $data = $data[$cardid]; $labels_time = $data['labels_time']; if(!$labels_time)$labels_time=array(); if(!in_array($labelid,$data['labelIds'])){ $wekan->cards->update(array( '_id'=>$cardid ),array( '$push' => array('labelIds'=>$labelid) )); if($timeto!=""){ $labels_time[$labelid] = array('need'=>strtotime($timeto)); }else{ unset($labels_time[$labelid]); } $wekan->cards->update(array( '_id'=>$cardid ),array( '$set' => array('labels_time'=>$labels_time) ),array( 'upsert'=>true )); }else{ $wekan->cards->update(array( '_id'=>$cardid ),array( '$pull' => array('labelIds'=>$labelid) )); if(!$labels_time[$labelid])$labels_time[$labelid]=array(); $labels_time[$labelid]['finishtime'] = time(); $labels_time[$labelid]['uid'] = $MYID; $wekan->cards->update(array( '_id'=>$cardid ),array( '$set' => array('labels_time'=>$labels_time) ),array( 'upsert'=>true )); // 特定列的标签 延期分组 if ($data['listId'] == '5ce68e49bd298'){ $labelNameArr = array(); $boardLabelIdNameArr = getBoardLabelIdNames($data['boardId']); if (array_key_exists($labelid,$boardLabelIdNameArr)){ $labelNameArr[] = $boardLabelIdNameArr[$labelid]; } // 删掉对应用户的标签 $wekan->users->update(array( '_id'=>array('$in'=>$data['members']) ),array( '$pullAll' => array('legulabel'=>$labelNameArr) ),array( "multiple" => true )); } } $data = getcard($cardid); // 刷新分组 setYanQiLabelUserForCard($cardid); we (eventData('labelchange',$data[$cardid])); } //设置风险提示标签 function set_risklabel(){ global $MYID,$wekan; // if(isn($MYID))needLogin(); $cardid = r('cardid'); $labelid = r('labelid'); $timeto = r('timeto'); $data = getcard($cardid); $data = $data[$cardid]; $labels_time = $data['risklabels_time']; $num = count($data['risklabelIds']); if(!$labels_time)$labels_time=array(); if(!in_array($labelid,$data['risklabelIds']) && $num<2){ $wekan->cards->update(array( '_id'=>$cardid ),array( '$push' => array('risklabelIds'=>$labelid) )); if($timeto!=""){ $labels_time[$labelid] = array('need'=>strtotime($timeto)); }else{ unset($labels_time[$labelid]); } $wekan->cards->update(array( '_id'=>$cardid ),array( '$set' => array('risklabels_time'=>$labels_time) ),array( 'upsert'=>true )); }else{ $wekan->cards->update(array( '_id'=>$cardid ),array( '$pull' => array('risklabelIds'=>$labelid) )); if(!$labels_time[$labelid])$labels_time[$labelid]=array(); $labels_time[$labelid]['finishtime'] = time(); $wekan->cards->update(array( '_id'=>$cardid ),array( '$set' => array('risklabels_time'=>$labels_time) ),array( 'upsert'=>true )); } $data = getcard($cardid); // 刷新分组 setYanQiLabelUserForCard($cardid); we (eventData('labelchange',$data[$cardid])); } //修改风险标签 function modify_risklabel(){ global $MYID,$wekan; $boardid = r('boardid'); $labelid = r('labelid'); $labelname = r('labelname'); $labelcolor = r('labelcolor'); if(isn($labelid)){ $_id = uniqid(); $data = array( "_id" => $labelid, "color" => $labelcolor, "name" => $labelname ); $res = $wekan->boards->update(array( '_id'=>$boardid ),array( '$push' => array('risklabels'=>$data) )); }else{ $res = $wekan->boards->update(array( '_id'=>$boardid, 'risklabels._id' => $labelid ),array( '$set' => array( 'risklabels.$.color'=>$labelcolor, 'risklabels.$.name'=>$labelname ) )); } $data = getBoard($boardid); we (eventData('modifylabel',$data[$boardid])); } // 删掉风险标签 function del_risklabel(){ global $MYID,$wekan; $boardid = r('boardid'); $labelid = r('labelid'); $labelname = r('labelname'); $labelcolor = r('labelcolor'); $res = $wekan->boards->update(array( '_id'=>$boardid, 'risklabels._id' => $labelid ),array( '$pull' => array( 'risklabels'=>array('_id'=>$labelid), ) )); $data = getBoard($boardid); we (eventData('modifylabel',$data[$boardid])); } //设置角色完成时间 function set_mem_time(){ global $MYID,$wekan; $cardid = r('cardid'); $memid = r('memid'); $times = r('times'); $timee = r('timee'); $data = getcard($cardid); $data = $data[$cardid]; $mem_time = $data['mem_time']; if(!$mem_time)$mem_time=array(); if(isn($times) && isn($timee)){ unset($mem_time[$memid]); }else{ $mem_time[$memid]['start'] = strtotime($times); $mem_time[$memid]['end'] = strtotime($timee); $mem_time[$memid]['timestr'] = $times.'~'.$timee; } $wekan->cards->update(array( '_id'=>$cardid ),array( '$set' => array('mem_time'=>$mem_time) ),array( 'upsert'=>true )); $data = getcard($cardid); we (eventData('memtimechange',$data[$cardid])); } function get_mem_time(){ global $MYID,$wekan; $who = r('who'); $start = r('start'); $end = r('end'); $where = array( '$or'=>array( array( '$and'=> array( array( "mem_time.{$MYID}.start" => array('$gte'=>$start*1) ), array( "mem_time.{$MYID}.start" => array('$lte'=>$end*1) ) ), ), array( '$and'=> array( array( "mem_time.{$MYID}.end" => array('$gte'=>$start*1) ), array( "mem_time.{$MYID}.end" => array('$lte'=>$end*1) ) ), ) ) ); $docs = $wekan->cards->find($where); //'listId'=>$listid, $rss = iterator_to_array($docs); $boards = getboards(); $res = array(); foreach($rss as $rs){ $res[] = array( 'title'=>$rs['title'], 'allDay'=>true, 'start'=> date('Y-m-d', $rs['mem_time'][ $MYID ]['start'] ), 'end'=> date('Y-m-d', $rs['mem_time'][ $MYID ]['end'] ), 'boardid'=>$rs['boardId'], 'boardtitle'=>$boards[ $rs['boardId'] ]['title'], 'url'=>"./?app=list&boardid={$rs['boardId']}#cardid={$rs['_id']}" ); } we(json_encode(array( 'calendarData'=>$res ))); } function get_timeline_users(){ global $MYID,$wekan; $ts = time()-7*24*3600; $userinfo = getUserInfo($MYID); $where = array('lastlogin'=>array('$gt'=>$ts ),'org'=>$userinfo['org']); if($userinfo['extData'] && $userinfo['extData']['admin']=='all'){ unset($where['org']); } $docs = $wekan->users->find($where); //'listId'=>$listid, // $docs = $wekan->users->find(array('legustatus'=>1,'lastlogin'=>array('$gt'=>time() - 7*24*3600 ))); //'listId'=>$listid, // $docs = $wekan->users->find(array('legustatus'=>1)); //'listId'=>$listid, $rss = iterator_to_array($docs); $res = array(); foreach($rss as $rs){ // $group = $rs['group']; $group = $rs['orgname']; if(isn($group))$group="其他"; $res[] = array( 'id'=>$rs['_id'], 'group'=>$group, 'title'=>$rs['profile']['fullname'] ); } we(json_encode($res)); } // 我的看板 用户延期数据 function get_timeline_events(){ global $MYID,$wekan; $nt = time(); $start = strtotime(r('start')); $end = strtotime(r('end')); $resUser = $wekan->users->find(array()); $allUsers = iterator_to_array($resUser); $where = array("mem_time"=>array('$exists'=>true)); $docs = $wekan->cards->find($where,array('_id'=>1, 'title'=>1,'mem_time'=>1,'boardId'=>1,'labels_time'=>1)); //'listId'=>$listid, $rss = iterator_to_array($docs); //we($rss); //$boards = getboards(); $res = array(); foreach($rss as $rs){ if(count($rs['mem_time'])==0)continue; // 标签更新时间 $labelsTime = $rs['labels_time']; foreach($rs['mem_time'] as $mid=>$mtime){ if( ($mtime['start'] >= $start && $mtime['start'] <= $end) || ($mtime['end'] >= $start && $mtime['end'] <= $end) ){ $title = $rs['title']; $finish = 0; $yanqi = 0; if( indexOf($rs['title'],'~~')!=-1 ){ $title = '☑ '.str_replace('~','',$title); $finish = 1; }else{ if($mtime['end']+24*3600-1$mid, 'title'=>$title, 'allDay'=>true, 'start'=> date('Y-m-d', $mtime['start'] ), 'end'=> date('Y-m-d', $mtime['end']+24*3600 ), 'boardid'=>$rs['boardId'], //'boardtitle'=>$boards[ $rs['boardId'] ]['title'], 'url'=>"./?app=list&boardid={$rs['boardId']}#cardid={$rs['_id']}", ); if($finish==1){ $addArr['backgroundColor'] = '#3eca20'; } if($yanqi==1){ $addArr['backgroundColor'] = '#e0225b'; } $res[] = $addArr; } } } we(json_encode($res)); } // 列表日程 function get_timeline_list_card(){ global $MYID,$wekan; $list = r('list'); $docs = $wekan->cards->find(array( 'listId'=>$list,'archived' => false) ); //'listId'=>$listid, $rss = iterator_to_array($docs); $res = array(); foreach($rss as $rs){ $res[] = array( 'id'=>$rs['_id'], 'title'=>$rs['title'], 'labels'=>$rs['labelIds'], // 'isyanqi'=>true, ); } we(json_encode($res)); } function get_timeline_list_card_events(){ global $MYID,$wekan; $nt = time(); $list = r('list'); $start = strtotime(r('start')); $end = strtotime(r('end')); $resUser = $wekan->users->find(array()); $allUsers = iterator_to_array($resUser); $where = array("listId"=>$list,"mem_time"=>array('$exists'=>true)); $docs = $wekan->cards->find($where,array( 'title'=>1,'mem_time'=>1,'boardId'=>1,'_id'=>1,'members'=>1) ); //'listId'=>$listid, $rss = iterator_to_array($docs); //we($rss); //$boards = getboards(); $res = array(); foreach($rss as $rs){ if(count($rs['mem_time'])==0)continue; $members = $rs['members']; $docs_users = $wekan->users->find(array('_id'=>array('$in'=>$members )),array('profile.fullname'=>1)); //'listId'=>$listid, $rs_users = iterator_to_array($docs_users); foreach($rs['mem_time'] as $mid=>$mtime){ if( ($mtime['start'] >= $start && $mtime['start'] <= $end) || ($mtime['end'] >= $start && $mtime['end'] <= $end) ){ $title = '雷锋'; if (array_key_exists($mid,$rs_users)){ $title = $rs_users[$mid]['profile']['fullname']; } // $title = "<p>fasdaa

"; $addArr = array( 'resourceId'=>$rs['_id'], 'title'=>$title, // 'isyanqi'=>true, 'allDay'=>true, 'start'=> date('Y-m-d', $mtime['start'] ), 'end'=> date('Y-m-d', $mtime['end']+24*3600 ), 'boardid'=>$rs['boardId'], 'cardid'=>$rs['_id'], //'boardtitle'=>$boards[ $rs['boardId'] ]['title'], 'url'=>"./?app=list&boardid={$rs['boardId']}#cardid={$rs['_id']}" ); if (array_key_exists('isyanqi',$mtime)){ if ($mtime['isyanqi'] > 0){ $addArr['isyanqi'] = true; $rt = $nt - $mtime['isyanqi']; // 用户存在 if (array_key_exists($mid,$allUsers)){ $useLabelArr = $allUsers[$mid]['legulabel']; // 面板 $resBoards = $wekan->boards->find(array( "_id" => $rs['boardId'], "labels.name" =>array('$in' => $useLabelArr), "archived" => false, )); $allBoards = iterator_to_array($resBoards); if ($allBoards){ $boardLabels = $allBoards[$rs['boardId']]['labels']; $isexistArr = array(); $newrt = 0; foreach ($boardLabels as $label){ $labelId = $label['_id']; if (in_array($label['name'],$useLabelArr)){ // if(‌‌in_array($label['name'],$useLabelArr)){ // 标签存在 if ($rs['labels_time'] and array_key_exists($labelId,$rs['labels_time'])){ if ($rs['labels_time'][$labelId]['finishtime']>$newrt){ $newrt = $rs['labels_time'][$labelId]['finishtime']; $rt = $newrt - $mtime['isyanqi']; } } } } } } $yanqoDay = floor($rt/(24*3600)); $addArr['yanqiday'] = $yanqoDay; // 延期了多久 秒 $yanqoRt = $rt; $addArr['yanqiRt'] = $yanqoRt; } } $res[] = $addArr; } } } we(json_encode($res)); } //创建看板 function add_board(){ global $MYID,$wekan,$LEGUWORKUSER; if(isn($MYID))needLogin(); $text = r('text'); $_id = uniqid(); $data = array( "_id" => $_id , "title" => $text , "permission" =>"public", "slug" => "board", "archived" => false, "view" => "board-view-lists", "createdAt" => new MongoDate(time()), "stars" => 0 , "labels" => initLables(), "qalabels" => initQALables(), "risklabels" => array(), "members" => array( array( "userId" => $MYID, "isAdmin" => true, "isActive" => true, "isCommentOnly" => false ) ), "color" => "belize", "modifiedAt" => new MongoDate(time()), "watchers" => array( array( "userId" => $MYID , "level" =>"tracking" ) ), "creator"=>$MYID, "org"=>$LEGUWORKUSER['org'], "orgname"=>$LEGUWORKUSER['orgname'], ); $res = $wekan->boards->insert( $data ); we (eventData('addboard',$data)); } //删除附件 function del_fujian(){ global $MYID,$wekan; $cardid = r('cardid'); $fujianid = r('fujianid'); $data = getcard($cardid); $data = $data[$cardid]; $attachments = $data['attachments']; foreach( $attachments as $idx=>$attachment){ if( $attachment['_id'] == $fujianid){ unset( $attachments[$idx]); } } $wekan->cards->update(array( '_id'=>$cardid ),array( '$set' => array('attachments'=> array_values($attachments) ) )); $data = getcard($cardid); we (eventData('attachmentschange',$data[$cardid])); } //移动card function set_card_listid(){ global $MYID,$wekan; $cardid = r('cardid'); $listid = r('listid'); $cardorder = r('card'); // listid必须要有 if(!isset($listid) or $listid == 'undefined'){ return; } $wekan->cards->update(array( '_id'=>$cardid ),array( '$set' => array('listId'=> $listid ) )); if($cardorder){ foreach($cardorder as $sortIndex=>$cid){ $wekan->cards->update(array( '_id'=>$cid ),array( '$set' => array('sort'=> $sortIndex ) )); } } $data = getcard($cardid); we (eventData('changesort',$data[$cardid])); } //list排序 function sort_list(){ global $MYID,$wekan; $boardid = r('boardid'); $order = r('list'); foreach($order as $sortIndex=>$listid){ $wekan->lists->update(array( '_id'=>$listid ),array( '$set' => array('sort'=> $sortIndex ) )); } $res = array( 'boardId' => $boardid, 'order'=>$order ); we (eventData('listsort',$res)); } //设置看板title function modify_board_title(){ global $MYID,$wekan; $boardid = r('boardid'); $text = r('text'); $res = $wekan->boards->update(array( '_id' => $boardid ),array( '$set'=>array( 'title' => $text ) )); $ndata = getBoard($boardid); we (eventData('boardtitlechange',$ndata[$boardid])); } //归档列表 function archived_list(){ global $MYID,$wekan; $listid = r('listid'); $res = $wekan->lists->update(array( '_id' => $listid ),array( '$set'=>array( 'archived' => true ) )); $res = $wekan->cards->update(array( 'listId' => $listid, 'archived' => false ),array( '$set'=>array( 'archived' => true ) ),array( "multiple" => true )); $ndata = getlist($listid); we (eventData('archivedlist',$ndata[$listid])); } //归档已完成项目 function archived_overedcards(){ global $MYID,$wekan; $listid = r('listid'); $res = $wekan->cards->find(array( 'listId' => $listid, 'title' => new MongoRegex("/~~/$i"), 'archived' => false )); $cards = array_keys(iterator_to_array($res)); $res = $wekan->cards->update(array( 'listId' => $listid, 'title' => new MongoRegex("/~~/$i"), 'archived' => false ),array( '$set'=>array( 'archived' => true ) ),array( "multiple" => true )); we (eventData('archivedcards',array( 'listId' => $listid, 'cards' => $cards ))); } //修改标签 function modify_label(){ global $MYID,$wekan; $boardid = r('boardid'); $labelid = r('labelid'); $labelname = r('labelname'); $labelcolor = r('labelcolor'); if(isn($labelid)){ $_id = uniqid(); $data = array( "_id" => $_id, "color" => $labelcolor, "name" => $labelname ); $res = $wekan->boards->update(array( '_id'=>$boardid ),array( '$push' => array('labels'=>$data) )); }else{ $res = $wekan->boards->update(array( '_id'=>$boardid, 'labels._id' => $labelid ),array( '$set' => array( 'labels.$.color'=>$labelcolor, 'labels.$.name'=>$labelname, ) )); } $data = getBoard($boardid); we (eventData('modifylabel',$data[$boardid])); } // 删掉标签 function del_label(){ global $MYID,$wekan; $boardid = r('boardid'); $labelid = r('labelid'); $labelname = r('labelname'); $labelcolor = r('labelcolor'); $res = $wekan->boards->update(array( '_id'=>$boardid, 'labels._id' => $labelid ),array( '$pull' => array( 'labels'=>array('_id'=>$labelid), ) )); $data = getBoard($boardid); we (eventData('modifylabel',$data[$boardid])); } //归档看板 function archived_board(){ global $MYID,$wekan; $boardid = r('boardid'); $res = $wekan->boards->update(array( '_id' => $boardid ),array( '$set'=>array( 'archived' => true ) )); $ndata = getBoard($boardid); we (eventData('archivedboard',$ndata[$boardid])); } function finishcount(){ global $MYID,$wekan; $boardid = r('boardid'); $timetoday = strtotime(date("Y-m-d",time())); $res = array(); $finishSum = 0; $createSum = 0; for($i=10;$i>=0;$i--){ $stime = $timetoday-$i*24*3600; $end = $stime+24*3600-1; $mongostart = new MongoDate($stime); $mongoend = new MongoDate($end); $create =$wekan->cards->count(array( "createdAt"=> array('$gt' => $mongostart,'$lte' => $mongoend), 'boardId'=>$boardid, )); $createSum+=$create; $finish = $wekan->cards->count(array( 'finishAt' => array('$gte'=>$stime,'$lte'=>$end), 'boardId'=>$boardid, )); $finishSum+=$finish; $d = date("m-d",$stime); $res['day'][] = $d; $res['finish'][] = $finish; $res['create'][] = $create; } $res['title'] = array('新增['. $createSum .']','完成['. $finishSum .']'); we(json_encode($res)); } // 看板统计 当月QA问题类型标签 // title // data function reportQALables(){ global $MYID,$wekan; $boardid = r('boardid'); $act = r('act'); $beginThismonth=mktime(0,0,0,date('m'),1,date('Y')); $endThisMonth = time(); // 当前月份的上个月 if ($act == 'lastmonth'){ $beginThismonth=mktime(0,0,0,date('m') - 1,1,date('Y')); $endThisMonth = mktime(0,0,0,date('m'),date('d') - 1,date('Y')); } $mongostart = new MongoDate($beginThismonth); $mongoend = new MongoDate($endThisMonth); $res = array(); $resCards = $wekan->cards->find(array( // "archived" => true, "boardId" => $boardid, "createdAt"=> array('$gt' => $mongostart,'$lte' => $mongoend), "qalabelIds" => array('$exists'=>1), ),array( 'qalabelIds'=>1 )); $allCard = iterator_to_array($resCards); $data = array(); $labelNameArr = getQANameForIdInBoard($boardid); foreach ($allCard as $item) { $qalabelIds = $item['qalabelIds']; foreach ($qalabelIds as $qid){ if (array_key_exists($qid,$data)){ $data[$qid] += 1; }else{ $data[$qid] = 1; } } } $colorNameArr = getQAColorForBoard($boardid); $jdata = array(); foreach ($data as $k=>$v){ $jdata[] = array('value'=>$v,'name'=>$labelNameArr[$k],'itemStyle'=>array('color'=>$colorNameArr[$k])); } $res['title'] = array_values($labelNameArr); $res['data'] = $jdata; we(json_encode($res)); } // 看板统计 当月全部标签完成情况 function reportshowRemainList(){ global $MYID,$wekan; $boardid = r('boardid'); $act = r('act'); $beginThismonth=mktime(0,0,0,date('m'),1,date('Y')); $endThisMonth = time(); // 当前月份的上个月 if ($act == 'lastmonth'){ $beginThismonth=mktime(0,0,0,date('m') - 1,1,date('Y')); $endThisMonth = mktime(0,0,0,date('m'),date('d') - 1,date('Y')); } $mongostart = new MongoDate($beginThismonth); $mongoend = new MongoDate($endThisMonth); $res = array(); $resCards = $wekan->cards->find(array( // "archived" => true, "boardId" => $boardid, "createdAt"=> array('$gt' => $mongostart,'$lte' => $mongoend), )); $allCard = iterator_to_array($resCards); $allNum = count($allCard); $data = array(); // 已关闭(归档单子) 已完成(勾掉单子) 未完成(当前未验收未解决) $nameArr = array( '已关闭'=>array('value'=>0,'name'=>'已关闭','itemStyle'=>array('color'=>'rgb(51, 75, 92)')), '已完成'=>array('value'=>0,'name'=>'已完成','itemStyle'=>array('color'=>'rgb(116, 159, 131)')), '未完成'=>array('value'=>0,'name'=>'未完成','itemStyle'=>array('color'=>'rgba(213,58,53,1)')) ); foreach ($allCard as $item) { // 关闭 归档 $title = $item['title']; $isArchived = $item['archived']; if ($isArchived){ $nameArr['已关闭']['value'] += 1; // 完成 }elseif (strpos($title, '~~') === 0){ $nameArr['已完成']['value'] += 1; }else{ $nameArr['未完成']['value'] += 1; } } $res['title'] = array_keys($nameArr); $res['data'] = array_values($nameArr); $res['allnum'] = $allNum; we(json_encode($res)); } // 每天0点执行 检查人员是否延期 function chkYanQiEverDay(){ global $MYID,$wekan; $timetoday = strtotime(date("Y-m-d",time())); $nt = time(); // 全部的卡片 $resCards = $wekan->cards->find(array( "archived" => false, "mem_time" => array('$exists'=>1), )); $allCard = iterator_to_array($resCards); $resBoards = $wekan->boards->find(array( "archived" => false, )); $allBoards = iterator_to_array($resBoards); $resUser = $wekan->users->find(array( )); $allUsers = iterator_to_array($resUser); // 看板 foreach ($allBoards as $board){ $boardId = $board['_id']; // 看板标签 $boardLabels = $board['labels']; $boardLabelArr = array(); foreach ($boardLabels as $label){ // $boardLabelArr[$label['_id']] = $label; $boardLabelArr[$label['_id']] = $label['name']; } $resCards = $wekan->cards->find(array( "archived" => false, "boardId" => $boardId, )); $allCard = iterator_to_array($resCards); foreach ($allCard as $card){ // 用户标签 $mem_time = $card['mem_time']; $cardLabelArr = $card['labelIds']; // 卡片的标签名字数组 $cardLabelNameArr = array(); foreach ($cardLabelArr as $labelId) { $labelName = $boardLabelArr[$labelId]; $cardLabelNameArr[] = $labelName; } // 用户时间标签数组 $memTimeArr = array(); if (isset($mem_time)){ $memTimeArr = array_keys($mem_time); } // 卡片标签 部门类标签 // $labelIdsArr = $card['labelIds']; $labelIdsArr = array(); foreach ($card['labelIds'] as $item) { $labelIdsArr[$item] = $item; } $isyanqi = false; foreach ($memTimeArr as $user){ if (array_key_exists($user,$allUsers)){ // 检查用户的标签是否在看板的标签 if (array_key_exists('legulabel',$allUsers[$user])){ $userLabelNameArr = $allUsers[$user]['legulabel']; // 存在 $result = array_intersect($cardLabelNameArr,$userLabelNameArr); if (count($result) > 0){ $etime = $mem_time[$user]['end'] + 60*60*24-1; // 大于今天 延期 if ($nt > $etime and !isset($mem_time[$user]['isyanqi'])){ $isyanqi = true; $mem_time[$user]['isyanqi'] = $etime; } } } } } // 设置延期时间 if ($isyanqi){ $wekan->cards->update(array( '_id'=>$card['_id'] ),array( '$set'=>array('mem_time'=>$mem_time) )); } } } echo 'ok'; // 记录运行的时间 $cachechkYanQiEverDay = 'chkYanQiEverDay'; $cache = $wekan->cache->update(array( 'k'=>$cachechkYanQiEverDay ),array('k'=>$cachechkYanQiEverDay,'v'=>$nt),array('upsert'=>true)); // we(json_encode($allUsers)); } // QA标签 //设置QA标签 只设置一个 function set_qalabel(){ global $MYID,$wekan; $cardid = r('cardid'); $labelid = r('labelid'); $timeto = r('timeto'); $data = getcard($cardid); $data = $data[$cardid]; $labels_time = $data['qalabels_time']; if(!$labels_time)$labels_time=array(); if(!array_key_exists('qalabelIds',$data)){ $wekan->cards->update(array( '_id'=>$cardid ),array( // '$addToSet' => array('qalabelIds'=>$labelid) '$set' => array('qalabelIds'=>array($labelid)) )); }else{ // 不在里面 添加 if(!in_array($labelid,$data['qalabelIds'])){ $wekan->cards->update(array( '_id'=>$cardid ),array( // '$addToSet' => array('qalabelIds'=>$labelid) '$set' => array('qalabelIds'=>array($labelid)) )); }else{ // 在里面 删掉 $wekan->cards->update(array( '_id'=>$cardid ),array( // '$pull' => array('qalabelIds'=>$labelid) '$set' => array('qalabelIds'=>array()) )); } } $data = getcard($cardid); // 刷新分组 setYanQiLabelUserForCard($cardid); we (eventData('labelchange',$data[$cardid])); } //修改QA标签 function modify_qalabel(){ global $MYID,$wekan; $boardid = r('boardid'); $labelid = r('labelid'); $labelname = r('labelname'); $labelcolor = r('labelcolor'); if(isn($labelid)){ $_id = uniqid(); $data = array( "_id" => $_id, "color" => $labelcolor, "name" => $labelname ); $res = $wekan->boards->update(array( '_id'=>$boardid ),array( '$push' => array('qalabels'=>$data) )); }else{ $res = $wekan->boards->update(array( '_id'=>$boardid, 'qalabels._id' => $labelid ),array( '$set' => array( 'qalabels.$.color'=>$labelcolor, 'qalabels.$.name'=>$labelname, ) )); } $data = getBoard($boardid); we (eventData('modifylabel',$data[$boardid])); } // 删掉QA标签 function del_qalabel(){ global $MYID,$wekan; $boardid = r('boardid'); $labelid = r('labelid'); $labelname = r('labelname'); $labelcolor = r('labelcolor'); $res = $wekan->boards->update(array( '_id'=>$boardid, 'qalabels._id' => $labelid ),array( '$pull' => array( 'qalabels'=>array('_id'=>$labelid), ) )); $data = getBoard($boardid); we (eventData('modifylabel',$data[$boardid])); } // 所有日程 延期统计 月 周 function get_yqrank(){ global $MYID,$wekan; $nt = time(); $act = r('act'); if(!isset($act)){ $act = 'week'; } $beginThisweek = mktime(0,0,0,date('m'),date('d')-date('w')+1,date('y')); $st = $beginThisweek; if($act == 'month'){ $beginThismonth=mktime(0,0,0,date('m'),1,date('Y')); $st = $beginThismonth; } $nt = time(); $cacheKey = 'cache_find_'.$act; // todo 缓存时间 $cache = $wekan->cache->find(array( 'k'=>$cacheKey,'et' => array('$gt'=>$nt) )); $cache = iterator_to_array($cache); if($cache){ $v = array_values($cache); we(json_encode($v[0]['v'])); } // 1 在职状态 0 离职 $users = $wekan->users->find(array( 'legustatus'=>1 ),array( 'profile.fullname'=>1 )); $users = iterator_to_array($users); $nameArr = array(); $dataArr = array(); $allDataArr = array(); foreach ($users as $user){ $name = $user['profile']['fullname']; $uid = $user['_id']; // echo 'aa.'.$uid; $yanqiCount = $wekan->cards->count(array( "archived" => false, "mem_time.".$uid.".isyanqi" => array('$exists'=>1), "mem_time.".$uid.".start" => array('$gte'=>$st), )); if ($yanqiCount){ $allDataArr[$name] = $yanqiCount; } } asort($allDataArr); foreach ($allDataArr as $key=>$value) { $nameArr[] = $key; $dataArr[] = $value; } $res = array( 'xdata'=>$nameArr, 'ydata'=>$dataArr, ); $et = $nt + 24*60*60-1; $cache = $wekan->cache->update(array( 'k'=>$cacheKey ),array('k'=>$cacheKey,'v'=>$res,'et'=>$et),array('upsert'=>true)); we(json_encode($res)); } // 获取work权限 function getWorkPermission(){ // __setting.Permission.$permission global $wekan,$LEGUWORK_SETTING_LISTID; // 默认没有权限 $res = false; $uid = r('uid'); $permission = r('pms'); $setKey = '__setting.Permission.'.$permission; $setData = $wekan->cards->findOne(array('title'=>$setKey,'listId'=>$LEGUWORK_SETTING_LISTID)); // var_dump($setData); // var_dump($setData['members']); // 有权限 true if ($setData){ // 直接判断uid if(in_array($uid,$setData['members'])){ $res = true; }else{ // todo 判断组 用延期分组中的用户 } } //we(json_encode($res)); we("true"); } // 获取延期列表数据 部门对应用户 // 5ce68e49bd298 function getYanQiDepartmentUser1(){ global $MYID,$wekan,$LEGUWORK_SETTING_LISTID,$LEGUWORK_BOARDID,$LEGUWORK_YANQI_LISTID; $cardData = $wekan->cards->find(array('archived'=>false,'boardId'=>$LEGUWORK_BOARDID,'listId'=>$LEGUWORK_YANQI_LISTID)); $cardData = iterator_to_array($cardData); $boardData = $wekan->boards->findOne(array( "_id" => $LEGUWORK_BOARDID, )); $boardLabels = $boardData['labels']; $labelNameIdArr = array(); $labelIdNameArr = array(); foreach ($boardLabels as $k => $v) { $labelNameIdArr[$v['name']] = $v['_id']; $labelIdNameArr[$v['_id']] = $v['name']; } $labelUserArr = array(); $labelIdUserArr = array(); foreach ($cardData as $k => $v) { // 延期成员在的部门 $labelIds = $v['labelIds']; $members = $v['members']; // var_dump($members); foreach ($labelIds as $labelID) { $labelIdUserArr[$labelID] = $members; } } we(json_encode($labelIdUserArr)); // we(json_encode(array())); } if(function_exists($act)){ $act(); } // 根据卡片的用户和标签设置标签组 function setYanQiLabelUserForCard($cardid){ //function setYanQiUserForCard(){ // $cardid = '5ce68f7366b3d'; global $MYID,$wekan; $cardData = getcard($cardid); $card = $cardData[$cardid]; $boardId = $card['boardId']; $listId = $card['listId']; // 特定列表的卡片 LeguWork 【设置】延期分组 if ($listId != '5ce68e49bd298'){ return; } $resBoards = $wekan->boards->find(array( "archived" => false, "_id" => $boardId, )); $boardData = iterator_to_array($resBoards); $board = $boardData[$boardId]; $boardLabels = $board['labels']; $boardLabelArr = array(); foreach ($boardLabels as $label){ $boardLabelArr[$label['_id']] = $label['name']; } $members = $card['members']; $labels = $card['labelIds']; $labelNameArr = array(); foreach ($labels as $label) { $labelNameArr[] = $boardLabelArr[$label]; } $wekan->users->update(array( '_id'=>array('$in'=>$members), ),array( // '$push'=>array('legulabel'=> array('$each'=>$labelNameArr)) '$addToSet'=>array('legulabel'=> array('$each'=>$labelNameArr)) ),array("multiple" => true)); } // 根据卡片的用户和标签设置日程分组 function setRiChengLabelUserForCard($cardid){ //function setYanQiUserForCard(){ // $cardid = '5ce68f7366b3d'; global $MYID,$wekan; $cardData = getcard($cardid); $card = $cardData[$cardid]; $boardId = $card['boardId']; $listId = $card['listId']; $title = $card['title']; // 特定列表的卡片 LeguWork 【设置】日程分组 if ($listId != '5ce7a226c387f'){ return; } $members = $card['members']; $wekan->users->update(array( '_id'=>array('$in'=>$members), ),array( '$set'=>array('legugroup'=>$title) ),array("multiple" => true)); } // 根据_id获取board中的标签的名字 function getNameForIdInBoard($boardId,$name){ global $wekan; $resData = $wekan->boards->find(array( // "archived" => true, "_id" => $boardId, // $name => array('$exists'=>1), ),array( $name=>1 )); $resData = iterator_to_array($resData); $resArr = array(); foreach ($resData as $items){ $item = $items[$name]; foreach ($item as $label){ $resArr[$label['_id']] = $label['name']; } } return$resArr; } function getQANameForIdInBoard($boardId){ return getNameForIdInBoard($boardId,'qalabels'); } // 获取QA标签的颜色值 function getQAColorForBoard($boardId){ global $wekan; $colorArr = array( 'legured'=>'#cb1a44', 'leguyellow'=>'#ffb11b', 'legublue'=>'#278785', 'leguaqua'=>'#39CCCC', 'legupurple'=>'#76428d', 'legugray'=>'#787878', 'legugreen'=>'#5eac82', 'legupink'=>'#f596aa', ); $resData = $wekan->boards->find(array( // "archived" => true, "_id" => $boardId, // $name => array('$exists'=>1), ),array( 'qalabels'=>1 )); $resData = iterator_to_array($resData); $resArr = array(); foreach ($resData as $items){ $item = $items['qalabels']; foreach ($item as $label){ $resArr[$label['_id']] = $colorArr[$label['color']]; } } return $resArr; } // 移除新手数据 // http://localhost:8081/?app=api&apiact=remove_guide_board&bid=5d4930074780b function remove_guide_board(){ global $MYID,$wekan; $boardId = r('bid'); $resReturn = array(); $res = $wekan->boards->remove(array( '_id' => $boardId )); $resReturn['boards'] = $res; $res = $wekan->lists->remove(array( 'boardId' => $boardId )); $resReturn['lists'] = $res; $res = $wekan->cards->remove(array( 'boardId' => $boardId )); $resReturn['cards'] = $res; we (json_encode($resReturn)); } // 手动添加新手指导数据 // http://localhost:8081/?app=api&apiact=add_guide_board&uid=KJLYkgxSoBvDwGDB9&gname=服务端 function add_guide_board(){ global $MYID,$wekan; $_uid = r('uid'); $gname = r('gname'); // 没有设置组名 if (!isset($gname)){ $hasMember = $wekan->users->findOne( array( "_id" =>$_uid )); $gname = $hasMember['group']; if(!$gname){ we (json_encode(array( 'err'=>'没有找到用户' ))); } } $tBoardId = getTemplateBoardIdForUserGroupName($gname); $resReturn = insertGuideBoardForTemplateBoard($_uid,$tBoardId); we (json_encode($resReturn)); } ?>