FormItemService.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace App\Form\Services;
  3. use App\Services\CommonUserBaseService;
  4. use App\Form\Facades\FormItemDetailFacade;
  5. class FormItemService extends CommonUserBaseService
  6. {
  7. const TYPE_RADIO = 200;
  8. const TYPE_CHECKBOX = 201;
  9. const TYPE_SELECT = 202;
  10. protected $cache = true;
  11. protected $cacheBucket = 'FormItem:';
  12. protected $tokenBucket = 'Token:';
  13. protected $activeBucket = "Active:";
  14. /**
  15. * 添加多项数据
  16. * @param $formId
  17. * @param array $items
  18. * @param null $userId
  19. * @return array
  20. */
  21. public function addList($formId, $items = [], $userId = null)
  22. {
  23. if (!empty($items)) {
  24. $sort = 1;
  25. foreach ($items as $k => $item) {
  26. $item['sort'] = $sort++;
  27. $item['id'] = $this->addData($formId, $item, $userId);
  28. if (!empty($item['content']) && is_array($item['content'])) {
  29. $item['content'] = FormItemDetailFacade::addList($formId, $item['id'], $item['content'], $userId);
  30. }
  31. $items[$k] = $item;
  32. }
  33. $ids = array_column($items, 'id');
  34. $allIds = $this->getData($formId);
  35. $allIds = array_column($allIds, 'id');
  36. $delIds = array_diff($allIds, $ids);
  37. if (!empty($delIds)) {
  38. //删除已取消的数据
  39. $this->delData($formId, $delIds);
  40. }
  41. }
  42. return $items;
  43. }
  44. /**
  45. * 添加表单项数据
  46. * @param $formId
  47. * @param $item
  48. * @param null $userId
  49. * @return mixed
  50. */
  51. public function addData($formId, $item, $userId = null)
  52. {
  53. $userId = $userId ?? $this->getAuthUserId();
  54. $add = [];
  55. $add['form_id'] = $formId;
  56. if (isset($item['type'])) {
  57. $add['type'] = $item['type'];
  58. }
  59. if (isset($item['sort'])) {
  60. $add['sort'] = $item['sort'];
  61. }
  62. if (isset($item['name'])) {
  63. $add['name'] = $item['name'];
  64. }
  65. if (isset($item['is_required'])) {
  66. $add['is_required'] = empty($item['is_required']) ? '0' : $item['is_required'];
  67. }
  68. if (isset($item['is_email'])) {
  69. $add['is_email'] = empty($item['is_email']) ? '0' : '1';
  70. }
  71. if (isset($item['is_phone'])) {
  72. $add['is_phone'] = $item['is_phone'];
  73. }
  74. if (isset($item['is_url'])) {
  75. $add['is_url'] = $item['is_url'];
  76. }
  77. if (isset($item['is_min'])) {
  78. $add['is_min'] = $item['is_min'];
  79. }
  80. if (isset($item['is_max'])) {
  81. $add['is_max'] = $item['is_max'];
  82. }
  83. if (isset($item['min_val'])) {
  84. $add['min_val'] = $item['min_val'];
  85. }
  86. if (isset($item['max_val'])) {
  87. $add['max_val'] = $item['max_val'];
  88. }
  89. if (isset($item['status'])) {
  90. $add['status'] = $item['status'];
  91. }
  92. if (!empty($item['id']) && $item['id'] > 0) {
  93. $id = $item['id'];
  94. $this->model->where('id', '=', $id)->update($add);
  95. } else {
  96. $add['user_id'] = $userId;
  97. $id = $this->save($add)->id;
  98. }
  99. return $id;
  100. }
  101. /**
  102. * 获取表单项数据
  103. * @param $formId
  104. * @return array
  105. */
  106. public function getData($formId)
  107. {
  108. $map = [];
  109. $map['form_id'] = $formId;
  110. $map['status'] = $this->model::STATUS_ENABLED;
  111. $items = $this->model->buildQuery($map)
  112. ->selectRaw('id,form_id,type,sort,name,is_required,is_email,is_phone,is_url,is_min,is_max,min_val,max_val,is_code_valid,create_time')
  113. ->orderBy('sort', 'desc')
  114. ->get()->toArray();
  115. if (!empty($items)) {
  116. foreach ($items as &$item) {
  117. if ($item['type'] == self::TYPE_RADIO || $item['type'] == self::TYPE_CHECKBOX || $item['type'] == self::TYPE_SELECT) {
  118. $itemDetail = FormItemDetailFacade::getData($formId, $item['id']);
  119. if (!empty($itemDetail)) {
  120. usort($itemDetail, function($a, $b) {
  121. return $a['sort'] <=> $b['sort'];
  122. });
  123. $item['item_options'] = $itemDetail;
  124. }
  125. }
  126. }
  127. }
  128. return $items;
  129. }
  130. /**
  131. * 删除数据
  132. * @param $formId
  133. * @param $itemId
  134. * @return bool
  135. */
  136. public function delData($formId, $itemId)
  137. {
  138. $map = [];
  139. $map['form_id'] = $formId;
  140. //删除整个表单项
  141. if (isset($itemId) && !empty($itemId)) {
  142. if (is_array($itemId)) {
  143. $map['id'] = [['in', $itemId]];
  144. } else {
  145. $map['id'] = $itemId;
  146. }
  147. }
  148. FormItemDetailFacade::delItemDetails($formId, $itemId);
  149. return $this->updateBy($map,
  150. ['status' => $this->model::STATUS_DELETED]
  151. );
  152. }
  153. /**
  154. * 排序
  155. * @param $ids
  156. * @return array|int
  157. */
  158. public function sortItem($ids)
  159. {
  160. $sort = 1;
  161. foreach ($ids as $id) {
  162. $this->updateBy([
  163. 'id' => $id,
  164. 'status' => $this->model::STATUS_ENABLED
  165. ], ['sort' => $sort++]);
  166. }
  167. return [
  168. 'code' => 0,
  169. 'msg' => '排序成功'
  170. ];
  171. }
  172. public function getItemsByFromId($fromId)
  173. {
  174. $data = $this->model->where(['form_id' => $fromId, 'status' => 0])->orderBy('sort')->get()->toArray();
  175. return $data;
  176. }
  177. }