products.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. /**
  3. * The products entry point of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
  6. * @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author Chunsheng Wang <chunsheng@cnezsoft.com>
  8. * @package entries
  9. * @version 1
  10. * @link https://www.zentao.net
  11. */
  12. class productsEntry extends entry
  13. {
  14. /**
  15. * GET method.
  16. *
  17. * @param int $projectID
  18. * @access public
  19. * @return string
  20. */
  21. public function get($programID = 0)
  22. {
  23. $fields = $this->param('fields', '');
  24. if(strpos(strtolower(",{$fields},"), ',dropmenu,') !== false) return $this->getDropMenu();
  25. if(!$programID) $programID = $this->param('program', 0);
  26. $projectID = $this->param('project', 0);
  27. $mergeChildren = $this->param('mergeChildren', '');
  28. if($programID)
  29. {
  30. $control = $this->loadController('program', 'product');
  31. $control->product($programID, $this->param('status', 'all'), $this->param('order', 'order_asc'), 0, $this->param('limit', '20'), $this->param('page', '1'));
  32. /* Response */
  33. $data = $this->getData();
  34. if(!$data or !isset($data->status)) return $this->sendError(400, 'error');
  35. if(isset($data->status) and $data->status == 'fail') return $this->sendError(zget($data, 'code', 400), $data->message);
  36. $products = $data->data->products;
  37. }
  38. elseif($projectID)
  39. {
  40. $control = $this->loadController('project', 'manageProducts');
  41. $control->manageProducts($projectID);
  42. /* Response */
  43. $data = $this->getData();
  44. if(!$data or !isset($data->status)) return $this->sendError(400, 'error');
  45. if(isset($data->status) and $data->status == 'fail') return $this->sendError(zget($data, 'code', 400), $data->message);
  46. $products = $data->data->linkedProducts;
  47. }
  48. else
  49. {
  50. $control = $this->loadController('product', 'all');
  51. $control->all($this->param('status', 'all'), $this->param('order', 'program_asc'), 0, 0, $this->param('limit', 100), $this->param('page', 1));
  52. /* Response */
  53. $data = $this->getData();
  54. if(!$data or !isset($data->status)) return $this->sendError(400, 'error');
  55. if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message);
  56. $products = $data->data->productStats;
  57. if($mergeChildren) $products = $data->data->productStructure;
  58. }
  59. $pager = $data->data->pager;
  60. $result = array();
  61. if($mergeChildren)
  62. {
  63. $programs = $this->mergeChildren($products);
  64. return $this->send(200, $programs);
  65. }
  66. else
  67. {
  68. $accounts = array();
  69. foreach($products as $product)
  70. {
  71. $accounts[$product->PO] = $product->PO;
  72. $accounts[$product->QD] = $product->QD;
  73. $accounts[$product->RD] = $product->RD;
  74. $accounts[$product->createdBy] = $product->createdBy;
  75. if(isset($product->feedback)) $accounts[$product->feedback] = $product->feedback;
  76. if(!empty($product->mailto))
  77. {
  78. foreach(explode(',', $product->mailto) as $account)
  79. {
  80. $account = trim($account);
  81. if(empty($account)) continue;
  82. $accounts[$account] = $account;
  83. }
  84. }
  85. $result[] = $this->format($product, 'createdDate:time,whitelist:userList,createdBy:user,PO:user,RD:user,QD:user');
  86. }
  87. $data = array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'products' => $result);
  88. $withUser = $this->param('withUser', '');
  89. if(!empty($withUser)) $data['users'] = $this->loadModel('user')->getListByAccounts($accounts, 'account');
  90. return $this->send(200, $data);
  91. }
  92. }
  93. /**
  94. * POST method.
  95. *
  96. * @access public
  97. * @return string
  98. */
  99. public function post()
  100. {
  101. $control = $this->loadController('product', 'create');
  102. $useCode = $this->checkCodeUsed();
  103. $fields = 'program,line,name,PO,QD,RD,type,desc,whitelist';
  104. if($useCode) $fields .= ',code';
  105. $this->batchSetPost($fields);
  106. $this->setPost('acl', $this->request('acl', 'private'));
  107. $this->setPost('whitelist', $this->request('whitelist', array()));
  108. $requireFields = 'name';
  109. if($useCode) $requireFields .= ',code';
  110. $this->requireFields($requireFields);
  111. $control->create($this->request('program', 0));
  112. $data = $this->getData();
  113. if(isset($data->result) and $data->result == 'fail') return $this->sendError(zget($data, 'code', 400), $data->message);
  114. /* Response */
  115. $product = $this->loadModel('product')->getByID($data->id);
  116. $product = $this->format($product, 'createdDate:time,whitelist:userList,createdBy:user,PO:user,RD:user,QD:user');
  117. return $this->send(201, $product);
  118. }
  119. /**
  120. * Get dropmenu.
  121. *
  122. * @access public
  123. * @return string
  124. */
  125. public function getDropMenu()
  126. {
  127. $control = $this->loadController('product', 'ajaxGetDropMenu');
  128. $control->ajaxGetDropMenu($this->request('productID', 0), $this->request('module', 'product'), $this->request('method', 'browse'), $this->request('extra', ''), $this->request('from', ''));
  129. $data = $this->getData();
  130. if(isset($data->status) and $data->status == 'fail') return $this->sendError(zget($data, 'code', 400), $data->message);
  131. $dropMenu = array('owner' => array(), 'other' => array(), 'closed' => array());
  132. foreach($data->data->products as $programID => $products)
  133. {
  134. foreach($products as $product)
  135. {
  136. $product = $this->filterFields($product, 'id,program,name,code,status,PO');
  137. if($product->status == 'closed')
  138. {
  139. $dropMenu['closed'][] = $product;
  140. }
  141. elseif($product->PO == $this->app->user->account)
  142. {
  143. $dropMenu['owner'][] = $product;
  144. }
  145. else
  146. {
  147. $dropMenu['other'][] = $product;
  148. }
  149. }
  150. }
  151. return $this->send(200, $dropMenu);
  152. }
  153. /**
  154. * Merge children products.
  155. *
  156. * @param array $products
  157. * @access public
  158. * @return string
  159. */
  160. public function mergeChildren($products)
  161. {
  162. $programs = array();
  163. foreach($products as $programID => $program)
  164. {
  165. $programs[$programID] = new stdclass();
  166. if(!empty($programID))
  167. {
  168. $programs[$programID]->id = $programID;
  169. $programs[$programID]->name = $program->programName;
  170. $programs[$programID]->type = 'program';
  171. }
  172. $unclosedTotal = 0;
  173. foreach($program as $lineID => $value)
  174. {
  175. if(!isset($programs[$programID]->children)) $programs[$programID]->children = array();
  176. if(isset($value->products))
  177. {
  178. if(empty($lineID))
  179. {
  180. foreach($value->products as $product)
  181. {
  182. unset($product->desc);
  183. $programs[$programID]->children[$product->id] = $product;
  184. if($product->status != 'closed') $unclosedTotal += 1;
  185. }
  186. }
  187. else
  188. {
  189. $line = new stdclass();
  190. $line->id = $lineID;
  191. $line->name = $value->lineName;
  192. $line->type = 'line';
  193. $line->children = array();
  194. foreach($value->products as $product)
  195. {
  196. unset($product->desc);
  197. $line->children[$product->id] = $product;
  198. if($product->status != 'closed') $unclosedTotal += 1;
  199. }
  200. if(isset($line->children)) $line->children = array_values($line->children);
  201. $programs[$programID]->children[$lineID] = $line;
  202. }
  203. if(isset($programs[$programID]->children)) $programs[$programID]->children = array_values($programs[$programID]->children);
  204. $programs[$programID]->unclosedTotal = $unclosedTotal;
  205. }
  206. }
  207. }
  208. $topProducts = array();
  209. if(isset($programs[0]))
  210. {
  211. $topProducts = $programs[0]->children;
  212. unset($programs[0]);
  213. }
  214. $programs = array_values($programs);
  215. foreach($topProducts as $product) $programs[] = $product;
  216. return $programs;
  217. }
  218. }