FormRepository.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\repositories\system\form;
  12. use app\common\dao\system\form\FormDao;
  13. use app\common\repositories\BaseRepository;
  14. use app\common\repositories\store\product\ProductRepository;
  15. use crmeb\services\ExcelService;
  16. use think\exception\ValidateException;
  17. use think\facade\Cache;
  18. /**
  19. * 表单
  20. */
  21. class FormRepository extends BaseRepository
  22. {
  23. public function __construct(FormDao $dao)
  24. {
  25. $this->dao = $dao;
  26. }
  27. /**
  28. * 根据条件获取列表数据
  29. *
  30. * 本函数用于根据给定的条件数组和分页信息,从数据库中检索并返回列表数据。
  31. * 它首先构造一个查询条件,然后计算符合条件的记录总数,最后根据分页信息和隐藏字段要求,
  32. * 获取指定页码的列表数据。
  33. *
  34. * @param array $where 查询条件数组
  35. * @param int $page 当前页码
  36. * @param int $limit 每页显示的记录数
  37. * @return array 包含总数和列表数据的数组
  38. */
  39. public function getList(array $where, $page, $limit)
  40. {
  41. // 根据条件数组进行查询
  42. $query = $this->dao->search($where);
  43. // 计算符合条件的记录总数
  44. $count = $query->count();
  45. // 获取指定页码的列表数据,隐藏'form_keys'字段
  46. $list = $query->page($page, $limit)->hidden(['form_keys'])->select();
  47. // 返回包含总数和列表数据的数组
  48. return compact('count', 'list');
  49. }
  50. /**
  51. * 获取表单的字段及验证属性
  52. * @param $formId
  53. * @return array
  54. * @author Qinii
  55. * @day 2023/10/8
  56. */
  57. public function getFormKeys(int $formId, $merId = null)
  58. {
  59. $where = ['form_id' => $formId, 'status' => 1, 'is_del' => 0];
  60. if ($merId) $where['mer_id'] = $merId;
  61. $form_info = $this->dao->getSearch($where)->field('form_keys,value')->find();
  62. if (!$form_info) throw new ValidateException('表单信息不存在');
  63. $data = [];
  64. $res = $form_info['form_keys'];
  65. foreach ($res as $item) {
  66. $data[] = $item->key;
  67. $val[$item->key] = [
  68. 'label' => $item->label,
  69. 'val' => $item->val,
  70. 'type'=> $item->type
  71. ];
  72. }
  73. $form = json_encode($form_info['form_keys'], JSON_UNESCAPED_UNICODE);
  74. $form_value = json_encode($form_info['value'], JSON_UNESCAPED_UNICODE);
  75. return compact('form', 'data', 'val', 'form_value');
  76. }
  77. /**
  78. * 导出表格数据。
  79. * 根据给定的查询条件、页码和每页数量,以及商家ID,从缓存中获取或生成表格的头部和数据信息,
  80. * 然后调用Excel服务类来生成并返回表格数据。
  81. *
  82. * @param array $where 查询条件数组,包含链接ID等信息。
  83. * @param int $page 当前页码。
  84. * @param int $limit 每页的数据数量。
  85. * @param int $merId 商家ID。
  86. * @return mixed 返回生成的表格数据。
  87. */
  88. public function excel(array $where, int $page, int $limit, int $merId)
  89. {
  90. // 根据链接ID和商家ID生成缓存键名
  91. $cahce_key = 'form_headers_' . $where['link_id'] . '_' . $merId;
  92. // 尝试从缓存中获取头部和信息数组,如果缓存不存在则进行初始化
  93. if (![$header, $info] = Cache::get($cahce_key)) {
  94. // 初始化头部数组,包含基础字段
  95. $header = ['活动ID', '活动名称', '用户ID', '昵称', '手机号码'];
  96. // 根据链接ID和商家ID获取表单配置
  97. $keys = $this->getFormKeys($where['link_id'], $merId);
  98. // 解析表单配置,获取所有字段标签和键名
  99. $form = json_decode($keys['form']);
  100. foreach ($form as $key) {
  101. $header[] = $key->label; // 将字段标签添加到头部数组
  102. $info[] = $key->key; // 将字段键名添加到信息数组
  103. }
  104. // 添加创建时间字段到头部数组
  105. $header[] = '创建时间';
  106. // 将头部和信息数组存入缓存,缓存有效期为15分钟
  107. Cache::set($cahce_key, [$header, $info], 60 * 15);
  108. }
  109. // 调用Excel服务类,传入头部、信息数组和其他查询条件,生成并返回表格数据
  110. return app()->make(ExcelService::class)->userForm($header, $info, $where, $page, $limit);
  111. }
  112. /**
  113. * 删除表单及其关联商品信息。
  114. *
  115. * 本函数主要用于删除指定ID的表单,并根据需要删除该表单关联的商品信息。
  116. * 这里的"表单"是抽象的概念,可以指代任何需要删除的实体,比如数据库中的记录。
  117. * 如果传入的$mer_id大于0,则表示需要删除与该表单关联的商品信息。
  118. *
  119. * @param int $id 表单的唯一标识ID,用于指定要删除的表单。
  120. * @param int $mer_id 商家ID,用于指定要删除的表单关联的商品信息。如果为0,则不删除关联商品信息。
  121. */
  122. public function delete(int $id, int $mer_id = 0)
  123. {
  124. // 删除指定ID的表单
  125. // 删除表单
  126. $this->dao->delete($id);
  127. // 如果传入的$mer_id大于0,且存在关联商品,则删除这些关联商品
  128. if ($mer_id) {
  129. // 删除所有表单关联商品
  130. app()->make(ProductRepository::class)->deleteProductFormByFormId($id, $mer_id);
  131. }
  132. }
  133. }