From ebe39f02077c05d654668c6e7f974cfcfcff97ef Mon Sep 17 00:00:00 2001 From: tianziyan <2217423348@qq.com> Date: Fri, 6 Mar 2026 10:32:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BF=80=E6=B4=BB=E7=A0=81=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E8=A1=A8=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tMeiyuTextbookActivateBatchController.java | 119 +++++++++ .../MmxtMeiyuTextbookActivateController.java | 30 ++- .../mmxt/MmxtMeiyuTextbookController.java | 10 + .../src/main/resources/application-pro.yml | 2 +- .../domain/MmxtMeiyuTextbookActivate.java | 102 ++------ .../MmxtMeiyuTextbookActivateBatch.java | 167 +++++++++++++ .../domain/MmxtMeiyuTextbookActivateLog.java | 42 +--- .../vo/MmxtMeiyuTextbookActivateVo.java | 129 ++++++++++ .../MmxtMeiyuTextbookActivateBatchMapper.java | 68 +++++ .../MmxtMeiyuTextbookActivateMapper.java | 29 +++ .../mapper/MmxtMeiyuTextbookMapper.java | 7 + ...MmxtMeiyuTextbookActivateBatchService.java | 72 ++++++ .../IMmxtMeiyuTextbookActivateService.java | 8 +- .../service/IMmxtMeiyuTextbookService.java | 7 + ...MeiyuTextbookActivateBatchServiceImpl.java | 233 ++++++++++++++++++ .../MmxtMeiyuTextbookActivateServiceImpl.java | 107 +++----- .../impl/MmxtMeiyuTextbookServiceImpl.java | 10 + .../MmxtMeiyuTextbookActivateBatchMapper.xml | 146 +++++++++++ .../MmxtMeiyuTextbookActivateLogMapper.xml | 25 +- .../MmxtMeiyuTextbookActivateMapper.xml | 153 ++++++------ .../business/MmxtMeiyuTextbookMapper.xml | 6 + .../manager/factory/AsyncFactory.java | 3 + .../com/mmxt/system/domain/SysLogininfor.java | 52 +++- .../mapper/system/SysLogininforMapper.xml | 43 ++-- 24 files changed, 1238 insertions(+), 332 deletions(-) create mode 100644 mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateBatchController.java create mode 100644 mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateBatch.java create mode 100644 mmxt-business/src/main/java/com/mmxt/business/domain/vo/MmxtMeiyuTextbookActivateVo.java create mode 100644 mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateBatchMapper.java create mode 100644 mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateBatchService.java create mode 100644 mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateBatchServiceImpl.java create mode 100644 mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateBatchMapper.xml diff --git a/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateBatchController.java b/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateBatchController.java new file mode 100644 index 00000000..1e8f0c96 --- /dev/null +++ b/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateBatchController.java @@ -0,0 +1,119 @@ +package com.mmxt.web.controller.mmxt; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.mmxt.business.domain.vo.MmxtMeiyuTextbookActivateVo; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.mmxt.common.annotation.Log; +import com.mmxt.common.core.controller.BaseController; +import com.mmxt.common.core.domain.AjaxResult; +import com.mmxt.common.enums.BusinessType; +import com.mmxt.business.domain.MmxtMeiyuTextbookActivateBatch; +import com.mmxt.business.service.IMmxtMeiyuTextbookActivateBatchService; +import com.mmxt.common.utils.poi.ExcelUtil; +import com.mmxt.common.core.page.TableDataInfo; + +/** + * 美美学堂智慧美育教材学习卡激活批次Controller + * + * @author mmxt + * @date 2026-03-04 + */ +@RestController +@RequestMapping("/mmxt/mmxtMeiyuTextbookActivateBatch") +public class MmxtMeiyuTextbookActivateBatchController extends BaseController +{ + @Autowired + private IMmxtMeiyuTextbookActivateBatchService mmxtMeiyuTextbookActivateBatchService; + + /** + * 查询美美学堂智慧美育教材学习卡激活批次列表 + */ + @PreAuthorize("@ss.hasPermi('mmxt:mmxtMeiyuTextbookActivateBatch:list')") + @GetMapping("/list") + public TableDataInfo list(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch) + { + startPage(); + List list = mmxtMeiyuTextbookActivateBatchService.selectMmxtMeiyuTextbookActivateBatchList(mmxtMeiyuTextbookActivateBatch); + return getDataTable(list); + } + + /** + * 导出美美学堂智慧美育教材学习卡激活批次列表 + */ + @PreAuthorize("@ss.hasPermi('mmxt:mmxtMeiyuTextbookActivateBatch:export')") + @Log(title = "美美学堂智慧美育教材学习卡激活批次", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch) + { + List list = mmxtMeiyuTextbookActivateBatchService.selectMmxtMeiyuTextbookActivateBatchList(mmxtMeiyuTextbookActivateBatch); + ExcelUtil util = new ExcelUtil(MmxtMeiyuTextbookActivateBatch.class); + util.exportExcel(response, list, "美美学堂智慧美育教材学习卡激活批次数据"); + } + + /** + * 获取美美学堂智慧美育教材学习卡激活批次详细信息 + */ + @PreAuthorize("@ss.hasPermi('mmxt:mmxtMeiyuTextbookActivateBatch:query')") + @GetMapping(value = "/{batchId}") + public AjaxResult getInfo(@PathVariable("batchId") Long batchId) + { + return success(mmxtMeiyuTextbookActivateBatchService.selectMmxtMeiyuTextbookActivateBatchByBatchId(batchId)); + } + + /** + * 新增美美学堂智慧美育教材学习卡激活批次 + */ + @PreAuthorize("@ss.hasPermi('mmxt:mmxtMeiyuTextbookActivateBatch:add')") + @Log(title = "美美学堂智慧美育教材学习卡激活批次", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch) + { + return toAjax(mmxtMeiyuTextbookActivateBatchService.insertMmxtMeiyuTextbookActivateBatch(mmxtMeiyuTextbookActivateBatch)); + } + + /** + * 修改美美学堂智慧美育教材学习卡激活批次 + */ + @PreAuthorize("@ss.hasPermi('mmxt:mmxtMeiyuTextbookActivateBatch:edit')") + @Log(title = "美美学堂智慧美育教材学习卡激活批次", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch) + { + return toAjax(mmxtMeiyuTextbookActivateBatchService.updateMmxtMeiyuTextbookActivateBatch(mmxtMeiyuTextbookActivateBatch)); + } + + /** + * 删除美美学堂智慧美育教材学习卡激活批次 + */ + @PreAuthorize("@ss.hasPermi('mmxt:mmxtMeiyuTextbookActivateBatch:remove')") + @Log(title = "美美学堂智慧美育教材学习卡激活批次", businessType = BusinessType.DELETE) + @DeleteMapping("/{batchIds}") + public AjaxResult remove(@PathVariable Long[] batchIds) + { + return toAjax(mmxtMeiyuTextbookActivateBatchService.deleteMmxtMeiyuTextbookActivateBatchByBatchIds(batchIds)); + } + + /** + * 批量生成激活码 + * @param param + * @return + */ + @PostMapping("/batchInsertTextbookActivate") + public AjaxResult batchInsertMmxtMeiyuTextbookActivate(@RequestBody MmxtMeiyuTextbookActivateBatch param){ + return success(mmxtMeiyuTextbookActivateBatchService.batchInsertMmxtMeiyuTextbookActivate(param)); + } + + +} + diff --git a/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateController.java b/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateController.java index 40e16eac..1f7c16b4 100644 --- a/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateController.java +++ b/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookActivateController.java @@ -1,5 +1,6 @@ package com.mmxt.web.controller.mmxt; +import com.mmxt.business.domain.vo.MmxtMeiyuTextbookActivateVo; import com.mmxt.common.annotation.Log; import com.mmxt.common.core.controller.BaseController; import com.mmxt.common.core.domain.AjaxResult; @@ -97,17 +98,28 @@ public class MmxtMeiyuTextbookActivateController extends BaseController } /** - * 批量生成激活码 - * @param param + * 查询已经激活的激活码列表 + * @param mmxtMeiyuTextbookActivateVo * @return */ - @PostMapping("/batchInsertMmxtMeiyuTextbookActivate") - public AjaxResult batchInsertMmxtMeiyuTextbookActivate(@RequestBody MmxtMeiyuTextbookActivate param){ - Integer count = param.getGenerateCount(); - if (count == null || count <= 0) { - return AjaxResult.error("请输入有效的激活码生成数量"); - } - return mmxtMeiyuTextbookActivateService.batchInsertMmxtMeiyuTextbookActivate(param); + @GetMapping("/selectActivationList") + public TableDataInfo selectActivationList(MmxtMeiyuTextbookActivateVo mmxtMeiyuTextbookActivateVo){ + startPage(); + List list = mmxtMeiyuTextbookActivateService.selectActivationList(mmxtMeiyuTextbookActivateVo); + return getDataTable(list); + } + + /** + * 导出已经激活的激活码列表 + */ + @PreAuthorize("@ss.hasPermi('mmxt:mmxtMeiyuTextbookActivate:export')") + @Log(title = "已经激活的激活码列表", businessType = BusinessType.EXPORT) + @PostMapping("/exportActivate") + public void exportActivate(HttpServletResponse response, MmxtMeiyuTextbookActivateVo mmxtMeiyuTextbookActivateVo) + { + List list = mmxtMeiyuTextbookActivateService.selectActivationList(mmxtMeiyuTextbookActivateVo); + ExcelUtil util = new ExcelUtil(MmxtMeiyuTextbookActivateVo.class); + util.exportExcel(response, list, "美美学堂智慧美育教材学习卡已经激活的激活码数据"); } } diff --git a/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookController.java b/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookController.java index 3f71b222..75724a0c 100644 --- a/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookController.java +++ b/mmxt-admin/src/main/java/com/mmxt/web/controller/mmxt/MmxtMeiyuTextbookController.java @@ -1034,5 +1034,15 @@ public class MmxtMeiyuTextbookController extends BaseController logger.error("提取教材内容失败", e); } } + + /** + * 查询教材 easy + * @param mmxtMeiyuTextbook + * @return + */ + @GetMapping("/selectTextbookEasy") + public AjaxResult selectTextbookEasy(MmxtMeiyuTextbook mmxtMeiyuTextbook){ + return success(mmxtMeiyuTextbookService.selectTextbookEasy(mmxtMeiyuTextbook)); + } } diff --git a/mmxt-admin/src/main/resources/application-pro.yml b/mmxt-admin/src/main/resources/application-pro.yml index ea137910..bbbb0b40 100644 --- a/mmxt-admin/src/main/resources/application-pro.yml +++ b/mmxt-admin/src/main/resources/application-pro.yml @@ -7,7 +7,7 @@ mmxt: # 版权年份 copyrightYear: 2025 # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) - profile: /home/mmxt/uploadPath + profile: /home/mmxtdata/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数字计算 char 字符验证 diff --git a/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivate.java b/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivate.java index 4893efe9..9897606c 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivate.java +++ b/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivate.java @@ -1,15 +1,15 @@ package com.mmxt.business.domain; -import com.mmxt.common.annotation.Excel; -import com.mmxt.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; +import com.mmxt.common.annotation.Excel; +import com.mmxt.common.core.domain.BaseEntity; /** * 美美学堂智慧美育教材学习卡激活码对象 mmxt_meiyu_textbook_activate * - * @author tzy - * @date 2025-12-17 + * @author mmxt + * @date 2026-03-04 */ public class MmxtMeiyuTextbookActivate extends BaseEntity { @@ -18,23 +18,11 @@ public class MmxtMeiyuTextbookActivate extends BaseEntity /** 记录id */ private Long recordId; - /** 教材id(关联mmxt_meiyu_textbook) */ - private String textbookId; - - /** 教材名称 */ - @Excel(name = "教材名称") - private String textbookName; + /** 批次id 关联mmxt_meiyu_textbook_activate_batch */ + private Long batchId; - /** 批次 */ - @Excel(name = "批次") - private String batch; - - /** 地域id (关联mmxt_meiyu_region) */ - private Long regionId; - - /** 完整地区名称 */ - @Excel(name = "完整地区名称") - private String regionAddr; + @Excel(name = "批次名称") + private String batchName; /** 激活码 */ @Excel(name = "激活码") @@ -47,44 +35,12 @@ public class MmxtMeiyuTextbookActivate extends BaseEntity /** 删除标志 0存在 1删除 */ private String delFlag; - /** 生成数量 */ - private Integer generateCount; - - /** - * 学科 0美术 1书法 2新三科 - */ - private String channel; - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - public String getTextbookName() { - return textbookName; - } - - public void setTextbookName(String textbookName) { - this.textbookName = textbookName; - } - - public String getRegionAddr() { - return regionAddr; + public String getBatchName() { + return batchName; } - public void setRegionAddr(String regionAddr) { - this.regionAddr = regionAddr; - } - - public Integer getGenerateCount() { - return generateCount; - } - - public void setGenerateCount(Integer generateCount) { - this.generateCount = generateCount; + public void setBatchName(String batchName) { + this.batchName = batchName; } public void setRecordId(Long recordId) @@ -97,34 +53,14 @@ public class MmxtMeiyuTextbookActivate extends BaseEntity return recordId; } - public void setTextbookId(String textbookId) - { - this.textbookId = textbookId; - } - - public String getTextbookId() - { - return textbookId; - } - - public void setBatch(String batch) - { - this.batch = batch; - } - - public String getBatch() - { - return batch; - } - - public void setRegionId(Long regionId) + public void setBatchId(Long batchId) { - this.regionId = regionId; + this.batchId = batchId; } - public Long getRegionId() + public Long getBatchId() { - return regionId; + return batchId; } public void setActivateCode(String activateCode) @@ -161,15 +97,11 @@ public class MmxtMeiyuTextbookActivate extends BaseEntity public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("recordId", getRecordId()) - .append("textbookId", getTextbookId()) - .append("batch", getBatch()) - .append("regionId", getRegionId()) + .append("batchId", getBatchId()) .append("activateCode", getActivateCode()) .append("qrCode", getQrCode()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) - .append("updateTime", getUpdateTime()) - .append("updateBy", getUpdateBy()) .append("delFlag", getDelFlag()) .toString(); } diff --git a/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateBatch.java b/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateBatch.java new file mode 100644 index 00000000..1503c92c --- /dev/null +++ b/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateBatch.java @@ -0,0 +1,167 @@ +package com.mmxt.business.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.mmxt.common.annotation.Excel; +import com.mmxt.common.core.domain.BaseEntity; + +/** + * 美美学堂智慧美育教材学习卡激活批次对象 mmxt_meiyu_textbook_activate_batch + * + * @author mmxt + * @date 2026-03-04 + */ +public class MmxtMeiyuTextbookActivateBatch extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 批次id */ + private Long batchId; + + /** 教材id(关联mmxt_meiyu_textbook) */ + private String textbookId; + + /** 批次名称 */ + @Excel(name = "批次名称") + private String batchName; + + /** 地域id (关联mmxt_meiyu_region) */ + private Long regionId; + + /** 地域地址 */ + @Excel(name = "地域地址") + private String regionAddr; + + /** 已激活数量 */ + @Excel(name = "已激活数量") + private Long activationCount; + + /** 未激活数量 */ + @Excel(name = "未激活数量") + private Long unactivationCount; + + /** 删除标志 0存在 1删除 */ + private String delFlag; + + + /** 生成数量 */ + private Integer generateCount; + + + /** + * 学科 美术 、书法 、舞蹈、戏剧、影视 + */ + private String subject; + + public String getRegionAddr() { + return regionAddr; + } + + public void setRegionAddr(String regionAddr) { + this.regionAddr = regionAddr; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + + public Integer getGenerateCount() { + return generateCount; + } + + public void setGenerateCount(Integer generateCount) { + this.generateCount = generateCount; + } + + public void setBatchId(Long batchId) + { + this.batchId = batchId; + } + + public Long getBatchId() + { + return batchId; + } + + public void setTextbookId(String textbookId) + { + this.textbookId = textbookId; + } + + public String getTextbookId() + { + return textbookId; + } + + public void setBatchName(String batchName) + { + this.batchName = batchName; + } + + public String getBatchName() + { + return batchName; + } + + public void setRegionId(Long regionId) + { + this.regionId = regionId; + } + + public Long getRegionId() + { + return regionId; + } + + public void setActivationCount(Long activationCount) + { + this.activationCount = activationCount; + } + + public Long getActivationCount() + { + return activationCount; + } + + public void setUnactivationCount(Long unactivationCount) + { + this.unactivationCount = unactivationCount; + } + + public Long getUnactivationCount() + { + return unactivationCount; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("batchId", getBatchId()) + .append("textbookId", getTextbookId()) + .append("batchName", getBatchName()) + .append("regionId", getRegionId()) + .append("activationCount", getActivationCount()) + .append("unactivationCount", getUnactivationCount()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .append("delFlag", getDelFlag()) + .toString(); + } +} diff --git a/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateLog.java b/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateLog.java index a2c4be91..f1940560 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateLog.java +++ b/mmxt-business/src/main/java/com/mmxt/business/domain/MmxtMeiyuTextbookActivateLog.java @@ -27,15 +27,9 @@ public class MmxtMeiyuTextbookActivateLog extends BaseEntity @Excel(name = "学生名称") private String studentName; - /** 教材id */ - private String textbookId; - - @Excel(name = "教材名称") - private String textbookName; - - /** 激活码 */ - @Excel(name = "激活码") - private String activateCode; + /** 激活码记录id 关联 mmxt_meiyu_textbook_activate */ + @Excel(name = "激活码记录id 关联 mmxt_meiyu_textbook_activate") + private Long recordId; /** IP地址 */ @Excel(name = "IP地址") @@ -62,13 +56,6 @@ public class MmxtMeiyuTextbookActivateLog extends BaseEntity this.studentName = studentName; } - public String getTextbookName() { - return textbookName; - } - - public void setTextbookName(String textbookName) { - this.textbookName = textbookName; - } public void setLogId(Long logId) { @@ -90,24 +77,12 @@ public class MmxtMeiyuTextbookActivateLog extends BaseEntity return studentId; } - public void setTextbookId(String textbookId) - { - this.textbookId = textbookId; + public Long getRecordId() { + return recordId; } - public String getTextbookId() - { - return textbookId; - } - - public void setActivateCode(String activateCode) - { - this.activateCode = activateCode; - } - - public String getActivateCode() - { - return activateCode; + public void setRecordId(Long recordId) { + this.recordId = recordId; } public void setIpaddr(String ipaddr) @@ -155,12 +130,11 @@ public class MmxtMeiyuTextbookActivateLog extends BaseEntity return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("logId", getLogId()) .append("studentId", getStudentId()) - .append("textbookId", getTextbookId()) - .append("activateCode", getActivateCode()) .append("ipaddr", getIpaddr()) .append("browser", getBrowser()) .append("os", getOs()) .append("logTime", getLogTime()) + .append("recordId", getRecordId()) .toString(); } } diff --git a/mmxt-business/src/main/java/com/mmxt/business/domain/vo/MmxtMeiyuTextbookActivateVo.java b/mmxt-business/src/main/java/com/mmxt/business/domain/vo/MmxtMeiyuTextbookActivateVo.java new file mode 100644 index 00000000..05d5e866 --- /dev/null +++ b/mmxt-business/src/main/java/com/mmxt/business/domain/vo/MmxtMeiyuTextbookActivateVo.java @@ -0,0 +1,129 @@ +package com.mmxt.business.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mmxt.common.annotation.Excel; +import com.mmxt.common.core.domain.BaseEntity; + +import java.util.Date; + +public class MmxtMeiyuTextbookActivateVo extends BaseEntity { + /** 批次id 关联mmxt_meiyu_textbook_activate_batch */ + private Long batchId; + + @Excel(name = "批次名称") + private String batchName; + + /** 激活码 */ + @Excel(name = "激活码") + private String activateCode; + + /** 二维码 */ + @Excel(name = "二维码") + private String qrCode; + + @Excel(name = "学生名称") + private String studentName; + + /** IP地址 */ + @Excel(name = "IP地址") + private String ipaddr; + + /** 浏览器类型 */ + @Excel(name = "浏览器类型") + private String browser; + + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + + /** 激活时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "激活时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date logTime; + + public String getBatchName() { + return batchName; + } + + public void setBatchName(String batchName) { + this.batchName = batchName; + } + + public Long getBatchId() { + return batchId; + } + + public void setBatchId(Long batchId) { + this.batchId = batchId; + } + + public String getActivateCode() { + return activateCode; + } + + public void setActivateCode(String activateCode) { + this.activateCode = activateCode; + } + + public String getQrCode() { + return qrCode; + } + + public void setQrCode(String qrCode) { + this.qrCode = qrCode; + } + + public String getStudentName() { + return studentName; + } + + public void setStudentName(String studentName) { + this.studentName = studentName; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public Date getLogTime() { + return logTime; + } + + public void setLogTime(Date logTime) { + this.logTime = logTime; + } + + @Override + public String toString() { + return "MmxtMeiyuTextbookActivateVo{" + + "batchId=" + batchId + + ", activateCode='" + activateCode + '\'' + + ", qrCode='" + qrCode + '\'' + + ", studentName='" + studentName + '\'' + + ", ipaddr='" + ipaddr + '\'' + + ", browser='" + browser + '\'' + + ", os='" + os + '\'' + + ", logTime=" + logTime + + '}'; + } +} diff --git a/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateBatchMapper.java b/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateBatchMapper.java new file mode 100644 index 00000000..e62435f9 --- /dev/null +++ b/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateBatchMapper.java @@ -0,0 +1,68 @@ +package com.mmxt.business.mapper; + +import java.util.List; +import com.mmxt.business.domain.MmxtMeiyuTextbookActivateBatch; + +/** + * 美美学堂智慧美育教材学习卡激活批次Mapper接口 + * + * @author mmxt + * @date 2026-03-04 + */ +public interface MmxtMeiyuTextbookActivateBatchMapper +{ + /** + * 查询美美学堂智慧美育教材学习卡激活批次 + * + * @param batchId 美美学堂智慧美育教材学习卡激活批次主键 + * @return 美美学堂智慧美育教材学习卡激活批次 + */ + public MmxtMeiyuTextbookActivateBatch selectMmxtMeiyuTextbookActivateBatchByBatchId(Long batchId); + + /** + * 查询美美学堂智慧美育教材学习卡激活批次列表 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 美美学堂智慧美育教材学习卡激活批次集合 + */ + public List selectMmxtMeiyuTextbookActivateBatchList(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch); + + /** + * 新增美美学堂智慧美育教材学习卡激活批次 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 结果 + */ + public int insertMmxtMeiyuTextbookActivateBatch(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch); + + /** + * 修改美美学堂智慧美育教材学习卡激活批次 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 结果 + */ + public int updateMmxtMeiyuTextbookActivateBatch(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch); + + /** + * 删除美美学堂智慧美育教材学习卡激活批次 + * + * @param batchId 美美学堂智慧美育教材学习卡激活批次主键 + * @return 结果 + */ + public int deleteMmxtMeiyuTextbookActivateBatchByBatchId(Long batchId); + + /** + * 批量删除美美学堂智慧美育教材学习卡激活批次 + * + * @param batchIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMmxtMeiyuTextbookActivateBatchByBatchIds(Long[] batchIds); + + /** + * 修改批次未激活数量 + * @param mmxtMeiyuTextbookActivateBatch + * @return + */ + public int updateBatchUnactivationCount(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch); +} diff --git a/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateMapper.java b/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateMapper.java index 9ec075d7..53deb694 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateMapper.java +++ b/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookActivateMapper.java @@ -1,6 +1,7 @@ package com.mmxt.business.mapper; import com.mmxt.business.domain.MmxtMeiyuTextbookActivate; +import com.mmxt.business.domain.vo.MmxtMeiyuTextbookActivateVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -61,6 +62,20 @@ public interface MmxtMeiyuTextbookActivateMapper */ public int deleteMmxtMeiyuTextbookActivateByRecordIds(Long[] recordIds); + /** + * 批量删除激活码批次 + * @param batchIds + * @return + */ + public int deleteMmxtMeiyuTextbookActivateByBatchIds(Long[] batchIds); + + /** + * 删除激活码批次 + * @param batchId + * @return + */ + public int deleteMmxtMeiyuTextbookActivateByBatchId(Long batchId); + /** * 批量插入 @@ -69,4 +84,18 @@ public interface MmxtMeiyuTextbookActivateMapper */ public int batchInsertMmxtMeiyuTextbookActivate(@Param("list") List list); + /** + * 根据recordIds查询batchId + * @param recordIds + * @return + */ + public Long selectBatchIdByRecordIds(Long[] recordIds); + + /** + * 查询已经激活的激活码列表 + * @param mmxtMeiyuTextbookActivateVo + * @return + */ + public List selectActivationList(MmxtMeiyuTextbookActivateVo mmxtMeiyuTextbookActivateVo); + } diff --git a/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookMapper.java b/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookMapper.java index 49b43ed7..8f204c76 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookMapper.java +++ b/mmxt-business/src/main/java/com/mmxt/business/mapper/MmxtMeiyuTextbookMapper.java @@ -67,4 +67,11 @@ public interface MmxtMeiyuTextbookMapper * @return 结果 */ public int deleteMmxtMeiyuTextbookByTextbookIds(String[] textbookIds); + + /** + * 查询教材 easy + * @param mmxtMeiyuTextbook + * @return + */ + public List selectTextbookEasy(MmxtMeiyuTextbook mmxtMeiyuTextbook); } diff --git a/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateBatchService.java b/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateBatchService.java new file mode 100644 index 00000000..1febc1b1 --- /dev/null +++ b/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateBatchService.java @@ -0,0 +1,72 @@ +package com.mmxt.business.service; + +import java.util.List; +import com.mmxt.business.domain.MmxtMeiyuTextbookActivateBatch; +import com.mmxt.business.domain.vo.MmxtMeiyuTextbookActivateVo; +import com.mmxt.common.core.domain.AjaxResult; + +/** + * 美美学堂智慧美育教材学习卡激活批次Service接口 + * + * @author mmxt + * @date 2026-03-04 + */ +public interface IMmxtMeiyuTextbookActivateBatchService +{ + /** + * 查询美美学堂智慧美育教材学习卡激活批次 + * + * @param batchId 美美学堂智慧美育教材学习卡激活批次主键 + * @return 美美学堂智慧美育教材学习卡激活批次 + */ + public MmxtMeiyuTextbookActivateBatch selectMmxtMeiyuTextbookActivateBatchByBatchId(Long batchId); + + /** + * 查询美美学堂智慧美育教材学习卡激活批次列表 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 美美学堂智慧美育教材学习卡激活批次集合 + */ + public List selectMmxtMeiyuTextbookActivateBatchList(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch); + + /** + * 新增美美学堂智慧美育教材学习卡激活批次 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 结果 + */ + public int insertMmxtMeiyuTextbookActivateBatch(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch); + + /** + * 修改美美学堂智慧美育教材学习卡激活批次 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 结果 + */ + public int updateMmxtMeiyuTextbookActivateBatch(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch); + + /** + * 批量删除美美学堂智慧美育教材学习卡激活批次 + * + * @param batchIds 需要删除的美美学堂智慧美育教材学习卡激活批次主键集合 + * @return 结果 + */ + public int deleteMmxtMeiyuTextbookActivateBatchByBatchIds(Long[] batchIds); + + /** + * 删除美美学堂智慧美育教材学习卡激活批次信息 + * + * @param batchId 美美学堂智慧美育教材学习卡激活批次主键 + * @return 结果 + */ + public int deleteMmxtMeiyuTextbookActivateBatchByBatchId(Long batchId); + + /** + * 批量生成激活码 + * @param param + * @return + */ + public AjaxResult batchInsertMmxtMeiyuTextbookActivate(MmxtMeiyuTextbookActivateBatch param); + + +} diff --git a/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateService.java b/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateService.java index 1b74951d..c4aefd2b 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateService.java +++ b/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookActivateService.java @@ -1,6 +1,7 @@ package com.mmxt.business.service; import com.mmxt.business.domain.MmxtMeiyuTextbookActivate; +import com.mmxt.business.domain.vo.MmxtMeiyuTextbookActivateVo; import com.mmxt.common.core.domain.AjaxResult; import java.util.List; @@ -62,9 +63,10 @@ public interface IMmxtMeiyuTextbookActivateService public int deleteMmxtMeiyuTextbookActivateByRecordId(Long recordId); /** - * 批量生成激活码 - * @param param + * 查询已经激活的激活码列表 + * @param mmxtMeiyuTextbookActivateVo * @return */ - public AjaxResult batchInsertMmxtMeiyuTextbookActivate(MmxtMeiyuTextbookActivate param); + public List selectActivationList(MmxtMeiyuTextbookActivateVo mmxtMeiyuTextbookActivateVo); + } diff --git a/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookService.java b/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookService.java index 17b60ca2..2ff7ea25 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookService.java +++ b/mmxt-business/src/main/java/com/mmxt/business/service/IMmxtMeiyuTextbookService.java @@ -66,4 +66,11 @@ public interface IMmxtMeiyuTextbookService * @return 结果 */ public int deleteMmxtMeiyuTextbookByTextbookId(String textbookId); + + /** + * 查询教材 easy + * @param mmxtMeiyuTextbook + * @return + */ + public List selectTextbookEasy(MmxtMeiyuTextbook mmxtMeiyuTextbook); } diff --git a/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateBatchServiceImpl.java b/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateBatchServiceImpl.java new file mode 100644 index 00000000..dcf96d78 --- /dev/null +++ b/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateBatchServiceImpl.java @@ -0,0 +1,233 @@ +package com.mmxt.business.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import java.util.stream.Collectors; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.mmxt.business.domain.MmxtMeiyuTextbookActivate; +import com.mmxt.business.domain.vo.MmxtMeiyuTextbookActivateVo; +import com.mmxt.business.mapper.MmxtMeiyuTextbookActivateMapper; +import com.mmxt.business.mapper.MmxtMeiyuTextbookMapper; +import com.mmxt.common.constant.Constants; +import com.mmxt.common.core.domain.AjaxResult; +import com.mmxt.common.exception.ServiceException; +import com.mmxt.common.utils.DateUtils; +import com.mmxt.common.utils.QrCodeUtil; +import com.mmxt.common.utils.RandomCodeUtil; +import com.mmxt.common.utils.bean.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.mmxt.business.mapper.MmxtMeiyuTextbookActivateBatchMapper; +import com.mmxt.business.domain.MmxtMeiyuTextbookActivateBatch; +import com.mmxt.business.service.IMmxtMeiyuTextbookActivateBatchService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; + +import static com.mmxt.common.utils.OSSUtil.uploadQrCodeToOss; +import static com.mmxt.common.utils.SecurityUtils.getUsername; + +/** + * 美美学堂智慧美育教材学习卡激活批次Service业务层处理 + * + * @author mmxt + * @date 2026-03-04 + */ +@Service +public class MmxtMeiyuTextbookActivateBatchServiceImpl implements IMmxtMeiyuTextbookActivateBatchService +{ + @Autowired + private MmxtMeiyuTextbookActivateBatchMapper mmxtMeiyuTextbookActivateBatchMapper; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private MmxtMeiyuTextbookActivateMapper mmxtMeiyuTextbookActivateMapper; + + private static final ExecutorService EXECUTOR = new ThreadPoolExecutor( + 8, 16, 60L, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(1000), + new ThreadFactoryBuilder().setNameFormat("qr-gen-%d").build(), + new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时由主线程执行,起到限流作用 + ); + + /** + * 查询美美学堂智慧美育教材学习卡激活批次 + * + * @param batchId 美美学堂智慧美育教材学习卡激活批次主键 + * @return 美美学堂智慧美育教材学习卡激活批次 + */ + @Override + public MmxtMeiyuTextbookActivateBatch selectMmxtMeiyuTextbookActivateBatchByBatchId(Long batchId) + { + return mmxtMeiyuTextbookActivateBatchMapper.selectMmxtMeiyuTextbookActivateBatchByBatchId(batchId); + } + + /** + * 查询美美学堂智慧美育教材学习卡激活批次列表 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 美美学堂智慧美育教材学习卡激活批次 + */ + @Override + public List selectMmxtMeiyuTextbookActivateBatchList(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch) + { + return mmxtMeiyuTextbookActivateBatchMapper.selectMmxtMeiyuTextbookActivateBatchList(mmxtMeiyuTextbookActivateBatch); + } + + /** + * 新增美美学堂智慧美育教材学习卡激活批次 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 结果 + */ + @Override + public int insertMmxtMeiyuTextbookActivateBatch(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch) + { + mmxtMeiyuTextbookActivateBatch.setCreateTime(DateUtils.getNowDate()); + mmxtMeiyuTextbookActivateBatch.setCreateBy(getUsername()); + return mmxtMeiyuTextbookActivateBatchMapper.insertMmxtMeiyuTextbookActivateBatch(mmxtMeiyuTextbookActivateBatch); + } + + /** + * 修改美美学堂智慧美育教材学习卡激活批次 + * + * @param mmxtMeiyuTextbookActivateBatch 美美学堂智慧美育教材学习卡激活批次 + * @return 结果 + */ + @Override + public int updateMmxtMeiyuTextbookActivateBatch(MmxtMeiyuTextbookActivateBatch mmxtMeiyuTextbookActivateBatch) + { + mmxtMeiyuTextbookActivateBatch.setUpdateTime(DateUtils.getNowDate()); + mmxtMeiyuTextbookActivateBatch.setUpdateBy(getUsername()); + return mmxtMeiyuTextbookActivateBatchMapper.updateMmxtMeiyuTextbookActivateBatch(mmxtMeiyuTextbookActivateBatch); + } + + /** + * 批量删除美美学堂智慧美育教材学习卡激活批次 + * + * @param batchIds 需要删除的美美学堂智慧美育教材学习卡激活批次主键 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteMmxtMeiyuTextbookActivateBatchByBatchIds(Long[] batchIds) + { + for (Long batchId : batchIds){ + MmxtMeiyuTextbookActivateBatch batch = mmxtMeiyuTextbookActivateBatchMapper.selectMmxtMeiyuTextbookActivateBatchByBatchId(batchId); + if (batch.getActivationCount() > 0){ + throw new ServiceException(batch.getBatchName() +"批次下有激活码已经激活,不能删除该批次"); + } + } + // 删除当前批次下的所有激活码 + mmxtMeiyuTextbookActivateMapper.deleteMmxtMeiyuTextbookActivateByBatchIds(batchIds); + + return mmxtMeiyuTextbookActivateBatchMapper.deleteMmxtMeiyuTextbookActivateBatchByBatchIds(batchIds); + } + + /** + * 删除美美学堂智慧美育教材学习卡激活批次信息 + * + * @param batchId 美美学堂智慧美育教材学习卡激活批次主键 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteMmxtMeiyuTextbookActivateBatchByBatchId(Long batchId) + { + MmxtMeiyuTextbookActivateBatch batch = mmxtMeiyuTextbookActivateBatchMapper.selectMmxtMeiyuTextbookActivateBatchByBatchId(batchId); + if (batch.getActivationCount() > 0){ + throw new ServiceException(batch.getBatchName() +"批次下有激活码已经激活,不能删除该批次"); + } + // 删除当前批次下的所有激活码 + mmxtMeiyuTextbookActivateMapper.deleteMmxtMeiyuTextbookActivateByBatchId(batchId); + + return mmxtMeiyuTextbookActivateBatchMapper.deleteMmxtMeiyuTextbookActivateBatchByBatchId(batchId); + } + + /** + * 批量生成激活码 + * @param param + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult batchInsertMmxtMeiyuTextbookActivate(MmxtMeiyuTextbookActivateBatch param) { + Integer count = param.getGenerateCount(); + if (count == null || count <= 0) { + return AjaxResult.error("生成数量必须大于0"); + } + + // 新增激活码批次 + param.setUnactivationCount(count.longValue()); + param.setActivationCount(0L); + param.setCreateTime(DateUtils.getNowDate()); + param.setCreateBy(getUsername()); + mmxtMeiyuTextbookActivateBatchMapper.insertMmxtMeiyuTextbookActivateBatch(param); + + + // 提前获取上下文信息,防止子线程丢失 + String createBy = getUsername(); + String ossDir = isSite(param.getSubject()) + Constants.OSS_IMAGE; + + List> futures = new ArrayList<>(); + + // 并行处理耗时的 OSS 上传和二维码生成 + for (int i = 0; i < count; i++) { + futures.add(CompletableFuture.supplyAsync(() -> { + MmxtMeiyuTextbookActivate entity = new MmxtMeiyuTextbookActivate(); + entity.setBatchId(param.getBatchId()); + entity.setRecordId(null); + + String activateCode = RandomCodeUtil.generateCode(); + entity.setActivateCode(activateCode); + + byte[] qrBytes = QrCodeUtil.generateBarcode(activateCode, 200, 100); + String qrUrl = uploadQrCodeToOss(qrBytes, ossDir); + + entity.setQrCode(qrUrl); + entity.setCreateBy(createBy); + return entity; + }, EXECUTOR)); + } + + try { + // 等待所有并行任务完成 + List list = futures.stream() + .map(CompletableFuture::join) + .collect(Collectors.toList()); + + // 3. 使用 TransactionTemplate 执行数据库操作 + transactionTemplate.execute(status -> { + batchInsertInChunks(list, 500); + return null; + }); + + return AjaxResult.success("批量生成激活码成功,共生成 " + count + " 条"); + } catch (Exception e) { + return AjaxResult.error("操作失败:" + e.getMessage()); + } + } + + private void batchInsertInChunks(List list, int chunkSize) { + for (int i = 0; i < list.size(); i += chunkSize) { + int end = Math.min(i + chunkSize, list.size()); + List subList = list.subList(i, end); + mmxtMeiyuTextbookActivateMapper.batchInsertMmxtMeiyuTextbookActivate(subList); + } + } + + public String isSite(String flag) { + if ("美术".equals(flag)) { + return Constants.OSS_list + Constants.MEISHU_SITE; + } + if ("书法".equals(flag)) { + return Constants.OSS_list + Constants.SHUFA365_SITE; + } + return Constants.OSS_list + Constants.XINSANKE_SITE; + } + + +} diff --git a/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateServiceImpl.java b/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateServiceImpl.java index 30ea27d6..9ebde610 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateServiceImpl.java +++ b/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookActivateServiceImpl.java @@ -1,8 +1,13 @@ package com.mmxt.business.service.impl; +import com.mmxt.business.domain.MmxtMeiyuTextbook; import com.mmxt.business.domain.MmxtMeiyuTextbookActivate; +import com.mmxt.business.domain.MmxtMeiyuTextbookActivateBatch; +import com.mmxt.business.domain.vo.MmxtMeiyuTextbookActivateVo; +import com.mmxt.business.mapper.MmxtMeiyuTextbookActivateBatchMapper; import com.mmxt.business.mapper.MmxtMeiyuTextbookActivateMapper; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.mmxt.business.mapper.MmxtMeiyuTextbookMapper; import com.mmxt.common.constant.Constants; import com.mmxt.common.core.domain.AjaxResult; import com.mmxt.common.utils.DateUtils; @@ -12,6 +17,7 @@ import com.mmxt.common.utils.bean.BeanUtils; import com.mmxt.business.service.IMmxtMeiyuTextbookActivateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; import java.util.ArrayList; @@ -35,14 +41,8 @@ public class MmxtMeiyuTextbookActivateServiceImpl implements IMmxtMeiyuTextbookA private MmxtMeiyuTextbookActivateMapper mmxtMeiyuTextbookActivateMapper; @Autowired - private TransactionTemplate transactionTemplate; + private MmxtMeiyuTextbookActivateBatchMapper mmxtMeiyuTextbookActivateBatchMapper; - private static final ExecutorService EXECUTOR = new ThreadPoolExecutor( - 8, 16, 60L, TimeUnit.SECONDS, - new LinkedBlockingQueue<>(1000), - new ThreadFactoryBuilder().setNameFormat("qr-gen-%d").build(), - new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时由主线程执行,起到限流作用 - ); /** * 查询美美学堂智慧美育教材学习卡激活码 @@ -104,8 +104,18 @@ public class MmxtMeiyuTextbookActivateServiceImpl implements IMmxtMeiyuTextbookA * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int deleteMmxtMeiyuTextbookActivateByRecordIds(Long[] recordIds) { + // 1. 查询 batch_id + Long batchId = mmxtMeiyuTextbookActivateMapper.selectBatchIdByRecordIds(recordIds); + + // 2. 扣减数量 + MmxtMeiyuTextbookActivateBatch batch = new MmxtMeiyuTextbookActivateBatch(); + batch.setBatchId(batchId); + batch.setUnactivationCount((long) recordIds.length); + mmxtMeiyuTextbookActivateBatchMapper.updateBatchUnactivationCount(batch); + return mmxtMeiyuTextbookActivateMapper.deleteMmxtMeiyuTextbookActivateByRecordIds(recordIds); } @@ -118,82 +128,29 @@ public class MmxtMeiyuTextbookActivateServiceImpl implements IMmxtMeiyuTextbookA @Override public int deleteMmxtMeiyuTextbookActivateByRecordId(Long recordId) { + Long recordIds[] = new Long[]{recordId}; + + // 1. 查询 batch_id + Long batchId = mmxtMeiyuTextbookActivateMapper.selectBatchIdByRecordIds(recordIds); + + // 2. 扣减数量 + MmxtMeiyuTextbookActivateBatch batch = new MmxtMeiyuTextbookActivateBatch(); + batch.setBatchId(batchId); + batch.setUnactivationCount((long) recordIds.length); + mmxtMeiyuTextbookActivateBatchMapper.updateBatchUnactivationCount(batch); + return mmxtMeiyuTextbookActivateMapper.deleteMmxtMeiyuTextbookActivateByRecordId(recordId); } /** - * 批量生成激活码 - * @param param + * 查询已经激活的激活码列表 + * @param mmxtMeiyuTextbookActivateVo * @return */ @Override - public AjaxResult batchInsertMmxtMeiyuTextbookActivate(MmxtMeiyuTextbookActivate param) { - Integer count = param.getGenerateCount(); - if (count == null || count <= 0) { - return AjaxResult.error("生成数量必须大于0"); - } - - // 提前获取上下文信息,防止子线程丢失 - String createBy = getUsername(); - String ossDir = isSite(param.getChannel()) + Constants.OSS_IMAGE; - - List> futures = new ArrayList<>(); - - // 并行处理耗时的 OSS 上传和二维码生成 - for (int i = 0; i < count; i++) { - futures.add(CompletableFuture.supplyAsync(() -> { - MmxtMeiyuTextbookActivate entity = new MmxtMeiyuTextbookActivate(); - BeanUtils.copyProperties(param, entity); - entity.setRecordId(null); - - String activateCode = RandomCodeUtil.generateCode(); - entity.setActivateCode(activateCode); - - byte[] qrBytes = QrCodeUtil.generateBarcode(activateCode, 200, 100); - String qrUrl = uploadQrCodeToOss(qrBytes, ossDir); - - entity.setQrCode(qrUrl); - entity.setCreateBy(createBy); - return entity; - }, EXECUTOR)); - } - - try { - // 等待所有并行任务完成 - List list = futures.stream() - .map(CompletableFuture::join) - .collect(Collectors.toList()); - - // 3. 使用 TransactionTemplate 执行数据库操作 - transactionTemplate.execute(status -> { - batchInsertInChunks(list, 500); - return null; - }); - - return AjaxResult.success("批量生成激活码成功,共生成 " + count + " 条"); - } catch (Exception e) { - return AjaxResult.error("操作失败:" + e.getMessage()); - } - } - - private void batchInsertInChunks(List list, int chunkSize) { - for (int i = 0; i < list.size(); i += chunkSize) { - int end = Math.min(i + chunkSize, list.size()); - List subList = list.subList(i, end); - mmxtMeiyuTextbookActivateMapper.batchInsertMmxtMeiyuTextbookActivate(subList); - } + public List selectActivationList(MmxtMeiyuTextbookActivateVo mmxtMeiyuTextbookActivateVo){ + return mmxtMeiyuTextbookActivateMapper.selectActivationList(mmxtMeiyuTextbookActivateVo); } - public String isSite(String flag){ - switch (flag) { - case "0": - return Constants.OSS_list + Constants.MEISHU_SITE; - case "1": - return Constants.OSS_list + Constants.SHUFA365_SITE; - case "2": - return Constants.OSS_list + Constants.XINSANKE_SITE; - } - return ""; - } } diff --git a/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookServiceImpl.java b/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookServiceImpl.java index ce87644e..b6b75492 100644 --- a/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookServiceImpl.java +++ b/mmxt-business/src/main/java/com/mmxt/business/service/impl/MmxtMeiyuTextbookServiceImpl.java @@ -225,4 +225,14 @@ public class MmxtMeiyuTextbookServiceImpl implements IMmxtMeiyuTextbookService mmxtMeiyuTextbookActivityService.deleteMmxtMeiyuTextbookActivityByTextbookId(textbookId); return mmxtMeiyuTextbookMapper.deleteMmxtMeiyuTextbookByTextbookId(textbookId); } + + /** + * 查询教材 easy + * @param mmxtMeiyuTextbook + * @return + */ + @Override + public List selectTextbookEasy(MmxtMeiyuTextbook mmxtMeiyuTextbook){ + return mmxtMeiyuTextbookMapper.selectTextbookEasy(mmxtMeiyuTextbook); + } } diff --git a/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateBatchMapper.xml b/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateBatchMapper.xml new file mode 100644 index 00000000..3d383782 --- /dev/null +++ b/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateBatchMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + select batch_id, textbook_id, batch_name, region_id, activation_count, unactivation_count, create_time, create_by, update_time, update_by, del_flag from mmxt_meiyu_textbook_activate_batch + + + + + + + + insert into mmxt_meiyu_textbook_activate_batch + + textbook_id, + batch_name, + region_id, + activation_count, + unactivation_count, + create_time, + create_by, + update_time, + update_by, + del_flag, + + + #{textbookId}, + #{batchName}, + #{regionId}, + #{activationCount}, + #{unactivationCount}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + #{delFlag}, + + + + + update mmxt_meiyu_textbook_activate_batch + + textbook_id = #{textbookId}, + batch_name = #{batchName}, + region_id = #{regionId}, + activation_count = #{activationCount}, + unactivation_count = #{unactivationCount}, + create_time = #{createTime}, + create_by = #{createBy}, + update_time = #{updateTime}, + update_by = #{updateBy}, + del_flag = #{delFlag}, + + where batch_id = #{batchId} + + + + update mmxt_meiyu_textbook_activate_batch + set unactivation_count = unactivation_count - #{unactivationCount} + where batch_id = #{batchId} + and unactivation_count > 0 + + + + update mmxt_meiyu_textbook_activate_batch set del_flag = 1 where batch_id = #{batchId} + + + + update mmxt_meiyu_textbook_activate_batch set del_flag = 1 where batch_id in + + #{batchId} + + + \ No newline at end of file diff --git a/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateLogMapper.xml b/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateLogMapper.xml index bb551e57..4e977f39 100644 --- a/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateLogMapper.xml +++ b/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookActivateLogMapper.xml @@ -6,9 +6,8 @@ + - - @@ -16,28 +15,23 @@ - select log_id, student_id, textbook_id, activate_code, ipaddr, browser, os, log_time from mmxt_meiyu_textbook_activate_log + select log_id, record_id, student_id, ipaddr, browser, os, log_time from mmxt_meiyu_textbook_activate_log - WITH RECURSIVE region_tree AS ( - -- 1️⃣ 起点:激活码表关联的最底层区域 - SELECT - r.region_id, - r.region_name, - r.parent_id, - r.region_id AS leaf_region_id, - CAST(r.region_name AS CHAR(500)) AS full_path - FROM mmxt_meiyu_region r - WHERE r.region_id IN ( - SELECT DISTINCT region_id FROM mmxt_meiyu_textbook_activate - ) - - UNION ALL - - -- 2️⃣ 向上递归父级 - SELECT - parent.region_id, - parent.region_name, - parent.parent_id, - child.leaf_region_id, - CONCAT(parent.region_name, '', child.full_path) AS full_path - FROM mmxt_meiyu_region parent - INNER JOIN region_tree child - ON child.parent_id = parent.region_id - ) - SELECT zmta.record_id, - zmta.textbook_id, - zmta.batch, - zmta.region_id, + zmta.batch_id, zmta.activate_code, zmta.qr_code, zmta.create_time, zmta.create_by, - zmta.update_time, - zmta.update_by, - zmta.del_flag, - zmt.textbook_name AS textbookName, - rt.full_path AS regionAddr - + b.batch_name as batchName FROM mmxt_meiyu_textbook_activate zmta - LEFT JOIN mmxt_meiyu_textbook zmt - ON zmta.textbook_id = zmt.textbook_id - - LEFT JOIN region_tree rt - ON zmta.region_id = rt.leaf_region_id - + left join mmxt_meiyu_textbook_activate_batch b on zmta.batch_id = b.batch_id - zmta.del_flag = 0 and (rt.parent_id = 0 OR rt.parent_id IS NULL) - and zmta.textbook_id = #{textbookId} - and zmta.batch = #{batch} - and zmta.region_id = #{regionId} + zmta.del_flag = 0 and zmta.activate_code = #{activateCode} and zmta.qr_code = #{qrCode} + and zmta.batch_id = #{batchId} order by zmta.record_id desc @@ -102,31 +53,61 @@ where record_id = #{recordId} and del_flag = 0 + + + + insert into mmxt_meiyu_textbook_activate - textbook_id, - batch, - region_id, + batch_id, activate_code, qr_code, create_time, create_by, - update_time, - update_by, del_flag, - #{textbookId}, - #{batch}, - #{regionId}, + #{batchId}, #{activateCode}, #{qrCode}, #{createTime}, #{createBy}, - #{updateTime}, - #{updateBy}, #{delFlag}, @@ -134,9 +115,7 @@ INSERT INTO mmxt_meiyu_textbook_activate ( - textbook_id, - batch, - region_id, + batch_id, activate_code, qr_code, create_by, @@ -145,9 +124,7 @@ VALUES ( - #{item.textbookId}, - #{item.batch}, - #{item.regionId}, + #{item.batchId}, #{item.activateCode}, #{item.qrCode}, #{item.createBy}, @@ -160,15 +137,11 @@ update mmxt_meiyu_textbook_activate - textbook_id = #{textbookId}, - batch = #{batch}, - region_id = #{regionId}, + batch_id = #{batchId}, activate_code = #{activateCode}, qr_code = #{qrCode}, create_time = #{createTime}, create_by = #{createBy}, - update_time = #{updateTime}, - update_by = #{updateBy}, del_flag = #{delFlag}, where record_id = #{recordId} @@ -186,4 +159,18 @@ #{recordId} + + + update mmxt_meiyu_textbook_activate + set del_flag = 1 + where batch_id = #{batchId} + + + + update mmxt_meiyu_textbook_activate set del_flag = 1 where batch_id in + + #{batchId} + + + \ No newline at end of file diff --git a/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookMapper.xml b/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookMapper.xml index 8098cd6e..c1a19aa1 100644 --- a/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookMapper.xml +++ b/mmxt-business/src/main/resources/mapper/business/MmxtMeiyuTextbookMapper.xml @@ -41,6 +41,12 @@ + + - select info_id, user_name, ipaddr, status, msg, access_time from sys_logininfor + select info_id, user_name, ipaddr, login_location, browser, os, status, msg, login_time from sys_logininfor AND ipaddr like concat('%', #{ipaddr}, '%') @@ -31,24 +34,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND user_name like concat('%', #{userName}, '%') - AND access_time >= #{params.beginTime} + AND login_time >= #{params.beginTime} - AND access_time <= #{params.endTime} + AND login_time <= #{params.endTime} order by info_id desc - + - delete from sys_logininfor where info_id in - - #{infoId} - - - - - truncate table sys_logininfor - - + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + \ No newline at end of file