ActivityController.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package com.ruoyi.web.controller.clock;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.ruoyi.clock.domain.bo.*;
  6. import com.ruoyi.clock.domain.vo.*;
  7. import com.ruoyi.clock.service.IActivityService;
  8. import com.ruoyi.clock.service.IClockRecordService;
  9. import com.ruoyi.common.annotation.Log;
  10. import com.ruoyi.common.annotation.RepeatSubmit;
  11. import com.ruoyi.common.core.controller.BaseController;
  12. import com.ruoyi.common.core.domain.PageQuery;
  13. import com.ruoyi.common.core.domain.R;
  14. import com.ruoyi.common.core.page.TableDataInfo;
  15. import com.ruoyi.common.core.validate.AddGroup;
  16. import com.ruoyi.common.core.validate.EditGroup;
  17. import com.ruoyi.common.core.validate.QueryGroup;
  18. import com.ruoyi.common.enums.BusinessType;
  19. import com.ruoyi.common.filepathsplicing.FilePathSplicing;
  20. import com.ruoyi.common.filepathsplicing.FilePathSplicingType;
  21. import com.ruoyi.common.utils.poi.ExcelUtil;
  22. import io.swagger.annotations.Api;
  23. import io.swagger.annotations.ApiOperation;
  24. import io.swagger.annotations.ApiParam;
  25. import lombok.RequiredArgsConstructor;
  26. import org.springframework.validation.annotation.Validated;
  27. import org.springframework.web.bind.annotation.*;
  28. import javax.servlet.http.HttpServletResponse;
  29. import javax.validation.constraints.NotEmpty;
  30. import javax.validation.constraints.NotNull;
  31. import java.util.Arrays;
  32. import java.util.List;
  33. /**
  34. * 活动信息Controller
  35. *
  36. * @author pengc
  37. * @date 2026-03-04
  38. */
  39. @Validated
  40. @Api(value = "活动信息控制器", tags = {"活动信息管理"})
  41. @RequiredArgsConstructor
  42. @RestController
  43. @RequestMapping("/clock/activity")
  44. public class ActivityController extends BaseController {
  45. private final IActivityService iActivityService;
  46. private final IClockRecordService iClockRecordService;
  47. /**
  48. * 分页查询活动信息列表
  49. */
  50. @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
  51. @ApiOperation("查询活动信息列表")
  52. @SaCheckPermission("clock:activity:list")
  53. @GetMapping("/page")
  54. public TableDataInfo<ActivityVo> page(@Validated(QueryGroup.class) ActivityBo bo, PageQuery pageQuery) {
  55. TableDataInfo<ActivityVo> activityVoTableDataInfo = iActivityService.queryPageList(bo, pageQuery);
  56. if (CollUtil.isNotEmpty(activityVoTableDataInfo.getRows())){
  57. activityVoTableDataInfo.getRows().forEach(item -> {
  58. item.loadAgentList();
  59. item.loadProductList();
  60. });
  61. }
  62. return activityVoTableDataInfo;
  63. }
  64. /**
  65. * 查询活动信息列表
  66. */
  67. @ApiOperation("查询活动信息列表")
  68. @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
  69. @GetMapping("/list")
  70. public R<List<ActivityVo>> list(@Validated(QueryGroup.class) ActivityBo bo) {
  71. return R.ok(iActivityService.queryList(bo));
  72. }
  73. /**
  74. * 获取活动信息详细信息
  75. */
  76. @ApiOperation("获取活动信息详细信息")
  77. @SaCheckPermission("clock:activity:query")
  78. @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
  79. @GetMapping("/info/{activityId}")
  80. public R<ActivityVo> getInfo(@ApiParam("主键")
  81. @NotNull(message = "主键不能为空")
  82. @PathVariable("activityId") Long activityId) {
  83. ActivityVo activityVo = iActivityService.queryById(activityId);
  84. if(ObjectUtil.isNotNull(activityVo)){
  85. activityVo.loadAgentList();
  86. activityVo.loadProductList();
  87. }
  88. return R.ok(activityVo);
  89. }
  90. /**
  91. * 新增活动信息
  92. */
  93. @ApiOperation("新增活动信息")
  94. @SaCheckPermission("clock:activity:add")
  95. @Log(title = "活动信息", businessType = BusinessType.INSERT)
  96. @FilePathSplicing(type = FilePathSplicingType.REQUEST)
  97. @RepeatSubmit()
  98. @PostMapping("/add")
  99. public R<Void> add(@Validated(AddGroup.class) @RequestBody ActivityBo bo) {
  100. return toAjax(iActivityService.insertByBo(bo) ? 1 : 0);
  101. }
  102. /**
  103. * 修改活动信息
  104. */
  105. @ApiOperation("修改活动信息")
  106. @SaCheckPermission("clock:activity:edit")
  107. @Log(title = "活动信息", businessType = BusinessType.UPDATE)
  108. @FilePathSplicing(type = FilePathSplicingType.REQUEST)
  109. @RepeatSubmit()
  110. @PostMapping("/edit")
  111. public R<Void> edit(@Validated(EditGroup.class) @RequestBody ActivityBo bo) {
  112. return toAjax(iActivityService.updateByBo(bo) ? 1 : 0);
  113. }
  114. /**
  115. * 删除活动信息
  116. */
  117. @ApiOperation("删除活动信息")
  118. @SaCheckPermission("clock:activity:remove")
  119. @Log(title = "活动信息", businessType = BusinessType.DELETE)
  120. @PostMapping("/del/{activityIds}")
  121. public R<Void> remove(@ApiParam("主键串")
  122. @NotEmpty(message = "主键不能为空")
  123. @PathVariable Long[] activityIds) {
  124. return toAjax(iActivityService.deleteWithValidByIds(Arrays.asList(activityIds), true) ? 1 : 0);
  125. }
  126. /**
  127. * 状态修改
  128. */
  129. @ApiOperation("状态修改")
  130. @Log(title = "活动状态修改", businessType = BusinessType.UPDATE)
  131. @SaCheckPermission("clock:activity:changeStatus")
  132. @PostMapping("/changeStatus")
  133. public R<Void> changeStatus(@RequestBody ActivityStatusBo bo) {
  134. return toAjax(iActivityService.updateStatus(bo));
  135. }
  136. /**
  137. * 导出活动信息列表
  138. */
  139. @ApiOperation("导出活动信息列表")
  140. @SaCheckPermission("clock:activity:export")
  141. @Log(title = "活动信息", businessType = BusinessType.EXPORT)
  142. @PostMapping("/export")
  143. public void export(@Validated ActivityBo bo, HttpServletResponse response) {
  144. List<ActivityVo> list = iActivityService.queryList(bo);
  145. list.forEach(item -> {
  146. item.loadAgentList();
  147. item.loadProductList();
  148. item.loadImage();
  149. item.convert();
  150. });
  151. ExcelUtil.exportExcel(list, "活动信息", ActivityVo.class, response);
  152. }
  153. /**
  154. * 分页查询活动打卡记录列表
  155. * 查询条件:店员姓名、所属代理商、所属门店、打卡状态
  156. */
  157. @ApiOperation("查询活动打卡记录列表(分页)")
  158. @SaCheckPermission("clock:activity:clockRecord:list")
  159. @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
  160. @GetMapping("/clockRecord/page")
  161. public TableDataInfo<ActivityClockRecordVo> clockRecordPage(
  162. @Validated(QueryGroup.class) ActivityClockRecordBo bo, PageQuery pageQuery) {
  163. return iClockRecordService.queryActivityClockRecordPage(bo, pageQuery);
  164. }
  165. /**
  166. * 导出活动打卡记录信息列表
  167. */
  168. @ApiOperation("导出活动信息列表")
  169. @Log(title = "活动信息", businessType = BusinessType.EXPORT)
  170. @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
  171. @PostMapping("/clockRecordExport")
  172. public void clockRecordExport(@Validated ActivityClockRecordBo bo, HttpServletResponse response) {
  173. List<ActivityClockRecordVo> list = iClockRecordService.queryActivityClockRecordList(bo);
  174. list.forEach(item -> {
  175. item.convert();
  176. });
  177. ExcelUtil.exportExcel(list, "活动打卡记录信息", ActivityClockRecordVo.class, response);
  178. }
  179. /**
  180. * 查询活动打卡统计
  181. * 当前筛选条件下打卡店员人数与销售数量合计
  182. */
  183. @ApiOperation("查询活动打卡统计(打卡人数 + 销售数量)")
  184. @SaCheckPermission("clock:activity:clockRecord:list")
  185. @GetMapping("/clockRecord/statistic")
  186. public R<ActivityClockStatisticVo> clockRecordStatistic(
  187. @Validated(QueryGroup.class) ActivityClockRecordBo bo) {
  188. return R.ok(iClockRecordService.queryActivityClockStatistic(bo));
  189. }
  190. /**
  191. * 查询活动销量打卡排行
  192. */
  193. @ApiOperation("查询活动销量打卡排行")
  194. @SaCheckPermission("clock:activity:saleRankList:list")
  195. @PostMapping("/saleRankList")
  196. public R<List<SaleStatisticRecordVo>> saleRankList(@Validated(QueryGroup.class) @RequestBody SaleStatisticBo bo) {
  197. return R.ok(iClockRecordService.querySaleStatisticRecordList(bo));
  198. }
  199. /**
  200. * 将员工在指定活动下的所有打卡设为失效
  201. */
  202. @ApiOperation("设为无效打卡")
  203. @SaCheckPermission("clock:activity:clockRecord:invalidate")
  204. @Log(title = "活动打卡记录", businessType = BusinessType.UPDATE)
  205. @RepeatSubmit()
  206. @PostMapping("/clockRecord/invalidate/{activityId}/{employeeId}")
  207. public R<Void> invalidateClockRecord(
  208. @ApiParam("活动id") @NotNull @PathVariable("activityId") Long activityId,
  209. @ApiParam("员工id") @NotNull @PathVariable("employeeId") Long employeeId) {
  210. Boolean result = iClockRecordService.invalidateEmployeeClock(activityId, employeeId);
  211. return toAjax(result ? 1 : 0);
  212. }
  213. /**
  214. * 分页查询活动店铺销量列表(销量活动)
  215. * 活动类型为1(销量PK),过滤掉失效的打卡记录
  216. */
  217. @ApiOperation("查询活动店铺销量列表")
  218. @SaCheckPermission("clock:activity:shopSale:list")
  219. @GetMapping("/shopSale/page")
  220. public TableDataInfo<ActivityShopSaleVo> shopSalePage(
  221. @Validated(QueryGroup.class) ActivityShopSaleBo bo, PageQuery pageQuery) {
  222. return iClockRecordService.queryActivityShopSalePage(bo, pageQuery);
  223. }
  224. }