control.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. <?php
  2. class stakeholder extends control
  3. {
  4. /**
  5. * 干系人列表页面。
  6. * Stakeholder list.
  7. *
  8. * @param int $projectID
  9. * @param string $browseType all|inside|outside|key
  10. * @param string $orderBy
  11. * @param int $recTotal
  12. * @param int $recPerPage
  13. * @param int $pageID
  14. * @access public
  15. * @return void
  16. */
  17. public function browse($projectID, $browseType = 'all', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
  18. {
  19. $this->app->loadLang('user');
  20. $projectID = $this->loadModel('project')->setMenu($projectID);
  21. if(!$projectID) return $this->locate($this->createLink('project', 'browse'));
  22. /* Get stake holders list. */
  23. $this->app->loadClass('pager', true);
  24. $pager = pager::init($recTotal, $recPerPage, $pageID);
  25. $stakeholders = $this->stakeholder->getStakeholders($projectID, $browseType, $orderBy, $pager);
  26. /* Save SQL to session for previous and next buttons on the stakeholder detail page. */
  27. $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'stakeholder');
  28. $this->view->title = $this->lang->stakeholder->browse;
  29. $this->view->pager = $pager;
  30. $this->view->recTotal = $recTotal;
  31. $this->view->recPerPage = $recPerPage;
  32. $this->view->pageID = $pageID;
  33. $this->view->projectID = $projectID;
  34. $this->view->orderBy = $orderBy;
  35. $this->view->browseType = $browseType;
  36. $this->view->stakeholders = $stakeholders;
  37. $this->display();
  38. }
  39. /**
  40. * 创建一个干系人。
  41. * Create a stakeholder.
  42. *
  43. * @param int objectID
  44. * @access public
  45. * @return void
  46. */
  47. public function create($objectID = 0)
  48. {
  49. if($_POST)
  50. {
  51. if($this->post->from != 'outside') $this->config->stakeholder->create->requiredFields .= ',user';
  52. if($this->post->from == 'outside' && $this->post->newUser)
  53. {
  54. $this->config->stakeholder->create->requiredFields .= $this->post->newCompany ? ',companyName' : ',company';
  55. }
  56. $stakeholderData = form::data()->setDefault('objectID', $objectID)->get();
  57. $stakeholderID = $this->stakeholder->create($stakeholderData);
  58. if(!$stakeholderID || dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
  59. $this->loadModel('action')->create('stakeholder', $stakeholderID, 'added');
  60. if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $stakeholderID));
  61. $moduleName = $this->app->tab == 'program' ? 'program' : $this->moduleName;
  62. $methodName = $this->app->tab == 'program' ? 'stakeholder' : 'browse';
  63. $param = $this->app->tab == 'program' ? "programID=$objectID" : "projectID=$objectID";
  64. return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $this->createLink($moduleName, $methodName, $param)));
  65. }
  66. $members = array();
  67. if($this->app->tab == 'program')
  68. {
  69. common::setMenuVars('program', $objectID);
  70. $members = $this->loadModel('program')->getTeamMemberPairs($objectID);
  71. }
  72. else
  73. {
  74. $this->loadModel('project')->setMenu($objectID);
  75. $members = $this->loadModel('user')->getTeamMemberPairs($objectID, 'project');
  76. }
  77. $stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($objectID);
  78. foreach($members as $account => $realname)
  79. {
  80. if(isset($stakeholders[$account])) unset($members[$account]);
  81. }
  82. $this->view->title = $this->lang->stakeholder->create;
  83. $this->view->companys = $this->loadModel('company')->getOutsideCompanies();
  84. $this->view->programID = $this->app->tab == 'program' ? $objectID : 0;
  85. $this->view->projectID = $this->app->tab == 'project' ? $objectID : 0;
  86. $this->view->members = $members;
  87. $this->view->objectID = $objectID;
  88. $this->display();
  89. }
  90. /**
  91. * 批量创建干系人页面。
  92. * Batch create stakeholders.
  93. *
  94. * @param int $projectID
  95. * @param string $dept
  96. * @param int $parentID
  97. * @access public
  98. * @return void
  99. */
  100. public function batchCreate($projectID, $dept = '', $parentID = 0)
  101. {
  102. if($_POST)
  103. {
  104. $stakeholderList = $this->stakeholder->batchCreate($projectID, $_POST['accounts']);
  105. if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
  106. if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'idList' => $stakeholderList));
  107. return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $this->createLink('stakeholder', 'browse', "projectID=$projectID")));
  108. }
  109. if($this->app->tab == 'program')
  110. {
  111. common::setMenuVars('program', $projectID);
  112. }
  113. else
  114. {
  115. $this->loadModel('project')->setMenu($projectID);
  116. }
  117. $this->loadModel('dept');
  118. $this->loadModel('execution');
  119. $this->view->title = $this->lang->stakeholder->batchCreate;
  120. $this->view->project = $this->loadModel('project')->getByID($this->session->project);
  121. $this->view->users = $this->loadModel('user')->getPairs('all|nodeleted|noclosed');
  122. $this->view->deptUsers = $dept === '' ? array() : $this->dept->getDeptUserPairs((int)$dept);
  123. $this->view->dept = $dept;
  124. $this->view->projectID = $projectID;
  125. $this->view->depts = $this->dept->getOptionMenu();
  126. $this->view->stakeholders = $this->stakeholder->getStakeholders($projectID, 'all', 'id_desc');
  127. $this->view->parentStakeholders = $this->loadModel('program')->getStakeholders($parentID, 't1.id_desc');
  128. $this->display();
  129. }
  130. /**
  131. * 编辑一个干系人。
  132. * Edit a stakeholder.
  133. *
  134. * @param int $stakeholderID
  135. * @access public
  136. * @return void
  137. */
  138. public function edit($stakeholderID = 0)
  139. {
  140. $stakeholder = $this->stakeholder->getByID($stakeholderID);
  141. $this->loadModel('project')->setMenu($stakeholder->objectID);
  142. if($_POST)
  143. {
  144. $postData = form::data()->get();
  145. $changes = $this->stakeholder->edit($stakeholderID, $postData);
  146. if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
  147. $actionID = $this->loadModel('action')->create('stakeholder', $stakeholderID, 'Edited');
  148. $this->action->logHistory($actionID, $changes);
  149. return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $this->createLink('stakeholder', 'browse', "projectID={$stakeholder->objectID}")));
  150. }
  151. $users = array();
  152. if($stakeholder->from == 'team') $users = $this->loadModel('user')->getTeamMemberPairs($this->session->project, 'project');
  153. if($stakeholder->from == 'company')
  154. {
  155. $members = $this->loadModel('user')->getTeamMemberPairs($this->session->project, 'project');
  156. $users = $this->user->getPairs('noclosed');
  157. $users = array_diff($users, $members);
  158. }
  159. if($stakeholder->objectType == 'project') $this->view->projectID = $stakeholder->objectID;
  160. $this->view->title = $this->lang->stakeholder->edit;
  161. $this->view->stakeholder = $stakeholder;
  162. $this->view->users = $users;
  163. $this->view->companys = $this->loadModel('company')->getOutsideCompanies();
  164. $this->display();
  165. }
  166. /**
  167. * Ajax:获取项目集或项目的团队成员。
  168. * Ajax: Get team members of the program or project.
  169. *
  170. * @param int $programID
  171. * @param int $projectID
  172. * @access public
  173. * @return void
  174. */
  175. public function ajaxGetMembers($programID = 0, $projectID = 0)
  176. {
  177. if($programID)
  178. {
  179. $members = $this->loadModel('program')->getTeamMemberPairs($programID);
  180. }
  181. else
  182. {
  183. $members = $this->loadModel('user')->getTeamMemberPairs($projectID, 'project');
  184. }
  185. $stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($programID ? $programID : $projectID);
  186. foreach($members as $account => $realname)
  187. {
  188. if(isset($stakeholders[$account])) unset($members[$account]);
  189. }
  190. $items = array();
  191. foreach($members as $account => $realname) $items[] = array('value' => $account, 'text' => $realname, 'keys' => $realname);
  192. return print(json_encode($items));
  193. }
  194. /**
  195. * Ajax:获取公司用户。
  196. * Ajax: Get company user.
  197. *
  198. * @param int $programID
  199. * @param int $projectID
  200. * @access public
  201. * @return void
  202. */
  203. public function ajaxGetCompanyUser($programID = 0, $projectID = 0)
  204. {
  205. if($programID)
  206. {
  207. $members = $this->loadModel('program')->getTeamMemberPairs($programID);
  208. }
  209. else
  210. {
  211. $members = $this->loadModel('user')->getTeamMemberPairs($projectID, 'project');
  212. }
  213. $users = $this->loadModel('user')->getPairs('noclosed');
  214. $companyUsers = array_diff($users, $members);
  215. $stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($programID ? $programID : $projectID);
  216. foreach($companyUsers as $account => $realname)
  217. {
  218. if(isset($stakeholders[$account])) unset($companyUsers[$account]);
  219. }
  220. $userItems = array();
  221. foreach($companyUsers as $account => $realname) $userItems[] = array('text' => $realname, 'value' => $account);
  222. return print(json_encode($userItems));
  223. }
  224. /**
  225. * Ajax:获取外部用户。
  226. * Ajax: Get outside user.
  227. *
  228. * @access public
  229. * @return void
  230. * @param int $objectID
  231. */
  232. public function ajaxGetOutsideUser($objectID = 0)
  233. {
  234. $users = $this->loadModel('user')->getPairs('noclosed|outside|noletter');
  235. $stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($objectID);
  236. foreach($users as $account => $realname)
  237. {
  238. if(isset($stakeholders[$account])) unset($users[$account]);
  239. }
  240. $items = array();
  241. foreach($users as $account => $realname) $items[] = array('text' => $realname, 'value' => $account);
  242. return print(json_encode($items));
  243. }
  244. /**
  245. * 删除一个干系人。
  246. * Deleted user.
  247. *
  248. * @access public
  249. * @param int $userID
  250. * @return void
  251. */
  252. public function delete($userID)
  253. {
  254. $stakeholder = $this->stakeholder->getByID($userID);
  255. $this->stakeholder->delete(TABLE_STAKEHOLDER, $userID);
  256. $project = $this->session->project ? array($this->session->project) : array();
  257. $this->loadModel('user')->updateUserView($project, 'project', array($stakeholder->user));
  258. /* Update linked products view. */
  259. if($stakeholder->objectType == 'project' && $stakeholder->objectID)
  260. {
  261. $this->loadModel('project')->updateInvolvedUserView($stakeholder->objectID, array($stakeholder->user));
  262. }
  263. return $this->send(array('result' => 'success', 'load' => true));
  264. }
  265. /**
  266. * 查看干系人详情。
  267. * View stakeholder detail.
  268. *
  269. * @access public
  270. * @param int $stakeholderID
  271. * @return void
  272. */
  273. public function view($stakeholderID = 0)
  274. {
  275. $stakeholder = $this->stakeholder->getByID($stakeholderID);
  276. $this->loadModel('project')->setMenu($stakeholder->objectID);
  277. $this->commonAction($stakeholderID, 'stakeholder');
  278. if($stakeholder->objectType == 'project') $this->view->projectID = $stakeholder->objectID;
  279. $this->view->title = $this->lang->stakeholder->common . $this->lang->hyphen . $this->lang->stakeholder->view;
  280. $this->view->user = $stakeholder;
  281. $this->view->users = $this->loadModel('user')->getTeamMemberPairs($this->session->project, 'project', 'nodeleted');
  282. $this->view->expects = $this->stakeholder->getExpectByUser($stakeholderID);
  283. $this->display();
  284. }
  285. /**
  286. * 添加沟通记录。
  287. * Add communication record.
  288. *
  289. * @access public
  290. * @param int $stakeholderID
  291. * @return void
  292. */
  293. public function communicate($stakeholderID)
  294. {
  295. if(!empty($_POST))
  296. {
  297. $data = form::data()->get();
  298. $this->loadModel('action')->create('stakeholder', $stakeholderID, 'communicate', $data->comment);
  299. if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
  300. return $this->send(array('result' => 'success', 'closeModal' => true));
  301. }
  302. $this->commonAction($stakeholderID, 'stakeholder');
  303. $this->view->title = $this->lang->stakeholder->common . $this->lang->hyphen . $this->lang->stakeholder->communicate;
  304. $this->view->user = $this->stakeholder->getByID($stakeholderID);
  305. $this->view->objectID = $stakeholderID;
  306. $this->view->users = $this->loadModel('user')->getTeamMemberPairs($this->view->user->objectID, 'project', 'nodeleted');
  307. $this->display();
  308. }
  309. /**
  310. * 添加期望记录。
  311. * Add expect record.
  312. *
  313. * @access public
  314. * @param int $stakeholderID
  315. * @return void
  316. */
  317. public function expect($stakeholderID)
  318. {
  319. if(!empty($_POST))
  320. {
  321. $expectData = form::data()
  322. ->add('userID', $stakeholderID)
  323. ->add('createdBy', $this->app->user->account)
  324. ->add('createdDate', helper::now())
  325. ->add('project', $this->session->project)
  326. ->get();
  327. if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
  328. $this->stakeholder->expect($expectData);
  329. if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
  330. return $this->send(array('result' => 'success', 'closeModal' => true));
  331. }
  332. $this->view->title = $this->lang->stakeholder->common . $this->lang->hyphen . $this->lang->stakeholder->communicate;
  333. $this->view->user = $this->stakeholder->getByID($stakeholderID);
  334. $this->display();
  335. }
  336. /**
  337. * 获取干系人的动态。
  338. * Common actions of stakeholder module.
  339. *
  340. * @param int $stakeholderID
  341. * @access public
  342. * @return void
  343. */
  344. public function commonAction($stakeholderID)
  345. {
  346. $this->view->actions = $this->loadModel('action')->getList('stakeholder', $stakeholderID);
  347. }
  348. /**
  349. * 干系人问题列表。
  350. * Issue list of stakeholder.
  351. *
  352. * @param int $stakeholderID
  353. * @access public
  354. * @return void
  355. */
  356. public function userIssue($stakeholderID)
  357. {
  358. $this->loadModel('issue');
  359. $stakeholder = $this->stakeholder->getByID($stakeholderID);
  360. $this->view->title = $this->lang->stakeholder->common . $this->lang->hyphen . $this->lang->stakeholder->communicate;
  361. $this->view->stakeholder = $stakeholder;
  362. $this->view->projectID = $stakeholder->objectID;
  363. $this->view->issueList = $this->stakeholder->getStakeholderIssue($stakeholder->user);
  364. $this->display();
  365. }
  366. }