diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreDictService.java b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreDictService.java index f115533e..d1a607bc 100644 --- a/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreDictService.java +++ b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreDictService.java @@ -2,6 +2,7 @@ package com.ibeetl.admin.core.service; import com.ibeetl.admin.core.dao.CoreDictDao; import com.ibeetl.admin.core.entity.CoreDict; +import com.ibeetl.admin.core.util.BeetlSqlKit; import com.ibeetl.admin.core.util.enums.DelFlagEnum; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -36,7 +37,6 @@ public class CoreDictService extends CoreBaseService { @Autowired CoreDictService self ; - /** * 根据类型获取字典集合 * @param type 字典类型, @@ -111,7 +111,19 @@ public class CoreDictService extends CoreBaseService { return null; } - + + /** + * 支持beetlsql模板变量渲染 + * + * @param type + * @param value + * @return + */ + @Cacheable(value = "core.coreDict:.findCoreDictByTableAndField", key="#type+\"_\"+#value") + public List findCoreDictByTableAndField(String type, Object value) { + return findAllByTable(BeetlSqlKit.render(type, value)); + } + /** * 级联字典查询,必须提供一个字典类型 * @param type diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/util/BeetlSqlKit.java b/admin-core/src/main/java/com/ibeetl/admin/core/util/BeetlSqlKit.java new file mode 100644 index 00000000..84188746 --- /dev/null +++ b/admin-core/src/main/java/com/ibeetl/admin/core/util/BeetlSqlKit.java @@ -0,0 +1,124 @@ +package com.ibeetl.admin.core.util; + +import cn.hutool.core.bean.BeanUtil; +import org.beetl.core.Configuration; +import org.beetl.core.GroupTemplate; +import org.beetl.core.ReThrowConsoleErrorHandler; +import org.beetl.core.Template; +import org.beetl.core.config.BeetlConfig; +import org.beetl.core.exception.BeetlException; +import org.beetl.core.exception.ErrorInfo; +import org.beetl.core.resource.StringTemplateResourceLoader; +import org.beetl.core.util.Log; + +import java.io.IOException; +import java.io.Writer; +import java.util.HashMap; +import java.util.Map; + +/** + * 一个综合展示BeetlSql功能代码 + * * @author mlx + */ +public class BeetlSqlKit { + + /** DEBUG flag */ + private static final boolean DEBUG = BeetlConfig.DEBUG; + /** Log TAG */ + private static final String TAG = "BeetlSqlKit"; + + /** + * BeetlKit 默认使用的GroupTemplate,用户可以设置新的 + */ + public static GroupTemplate gtp = null; + + static { + StringTemplateResourceLoader resourceLoader = new StringTemplateResourceLoader(); + Configuration cfg; + try { + Configuration cfg1 = Configuration.defaultConfiguration(); + cfg1.add("/web/../btsql-ext.properties"); + cfg = cfg1; + } catch (IOException e) { + throw new RuntimeException(e); + } + gtp = new GroupTemplate(resourceLoader, cfg); + gtp.setErrorHandler(new ReThrowConsoleErrorHandler()); + + } + + private static Map emptyMap = new HashMap(); + + /* 模板部分 */ + + /** + * 渲染模板 + * + * @return 模板返回值 + */ + public static String render(String template, Map paras) { + Template t = gtp.getTemplate(template); + t.binding(paras); + return t.render(); + } + + /** + * 渲染模板 + * + * @return 模板返回值 + */ + public static String render(String template, Object paras) { + Template t = gtp.getTemplate(template); + t.binding(BeanUtil.beanToMap(paras)); + return t.render(); + } + + /** + * 渲染模板 + */ + public static void renderTo(String template, Writer writer, Map paras) { + Template t = gtp.getTemplate(template); + t.binding(paras); + t.renderTo(writer); + } + + /* 脚本部分 */ + + /** + * @param paras 返回map,包含的"return" 是返回值,其他均为顶级变量 + */ + public static Map execute(String script, Map paras) throws BeetlException { + return gtp.runScript(script, emptyMap); + } + + /** + * 执行脚本,和参数,返回脚本里的Root scope的变量 + */ + public static Map execute(String script) throws BeetlException { + return gtp.runScript(script, new HashMap()); + + } + + /** + * @param template 模板内容 + * @param initValue 模板初始化值 + * @return 模板渲染结果 + */ + public static String testTemplate(String template, String initValue) throws BeetlException { + return render(template, execute(initValue)); + } + + public static void main(String[] args) throws BeetlException { + BeetlSqlKit.gtp.getConf().setStatementStart("@"); + BeetlSqlKit.gtp.getConf().setStatementEnd(null); + String json = "var a=".concat("[1,2,c+1 ]").concat(";"); + try { + BeetlSqlKit.execute(json); + } catch (BeetlException e) { + if (DEBUG) { + ErrorInfo info = new ErrorInfo(e); + Log.e(TAG, "error=" + info.toString()); + } + } + } +} diff --git a/web/src/main/java/cn/jlw/util/excel/ExcelSelectorDataWriteHandler.java b/web/src/main/java/cn/jlw/util/excel/ExcelSelectorDataWriteHandler.java index 9ed8b53b..c30edf3a 100644 --- a/web/src/main/java/cn/jlw/util/excel/ExcelSelectorDataWriteHandler.java +++ b/web/src/main/java/cn/jlw/util/excel/ExcelSelectorDataWriteHandler.java @@ -5,10 +5,7 @@ import com.alibaba.excel.write.handler.SheetWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import lombok.Data; -import org.apache.poi.ss.usermodel.DataValidation; -import org.apache.poi.ss.usermodel.DataValidationConstraint; -import org.apache.poi.ss.usermodel.DataValidationHelper; -import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import java.util.Map; @@ -26,8 +23,23 @@ public class ExcelSelectorDataWriteHandler implements SheetWriteHandler { return; } selectedMap.forEach((k, v) -> { + String[] deptList = v.getSelectorData(); + int startRow = v.getStartRow(); + int endRow = v.getEndRow(); + String hiddenName = "hidden"+k; + //1.创建隐藏的sheet页。 起个名字吧!叫"hidden"! + Sheet hidden = sheet.getWorkbook().createSheet(hiddenName); + //2.循环赋值(为了防止下拉框的行数与隐藏域的行数相对应,将隐藏域加到结束行之后) + for (int i = 0, length = deptList.length; i < length; i++) { + hidden.createRow(endRow + i).createCell(k).setCellValue(deptList[i]); + } + Name category1Name = sheet.getWorkbook().createName(); + category1Name.setNameName(hiddenName); + //3 A1:A代表隐藏域创建第N列createCell(N)时。以A1列开始A行数据获取下拉数组 + category1Name.setRefersToFormula(hiddenName + "!A1:A" + (deptList.length + endRow)); + // // 下拉 首行 末行 首列 末列 - CellRangeAddressList list = new CellRangeAddressList(v.getStartRow(), v.getEndRow(), k, k); + CellRangeAddressList list = new CellRangeAddressList(startRow, endRow, k, k); // 下拉值 DataValidationConstraint constraint = helper.createExplicitListConstraint(v.getSelectorData()); DataValidation validation = helper.createValidation(constraint, list); diff --git a/web/src/main/java/cn/jlw/util/excel/ExcelSelectorResolve.java b/web/src/main/java/cn/jlw/util/excel/ExcelSelectorResolve.java index 2b4eb98f..0f8e2f47 100644 --- a/web/src/main/java/cn/jlw/util/excel/ExcelSelectorResolve.java +++ b/web/src/main/java/cn/jlw/util/excel/ExcelSelectorResolve.java @@ -16,7 +16,7 @@ public class ExcelSelectorResolve { /** * 下拉选起始行 */ - private int startRow = 0; + private int startRow = 1; /** * 下拉选结束行 diff --git a/web/src/main/java/cn/jlw/util/excel/ExcelSelectorService.java b/web/src/main/java/cn/jlw/util/excel/ExcelSelectorService.java index 665e0b69..d6ac7ba2 100644 --- a/web/src/main/java/cn/jlw/util/excel/ExcelSelectorService.java +++ b/web/src/main/java/cn/jlw/util/excel/ExcelSelectorService.java @@ -1,5 +1,9 @@ package cn.jlw.util.excel; +/** + * excel表格下拉字典的service + * @author lx + */ public interface ExcelSelectorService { /** diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeResourcesQuestion.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeResourcesQuestion.java index cf07373b..3c4784cc 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeResourcesQuestion.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeResourcesQuestion.java @@ -1,11 +1,13 @@ package com.ibeetl.jlw.entity; +import cn.jlw.util.excel.DeviceExcelSelectorServiceImpl; import cn.jlw.util.excel.ExcelSelector; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.ibeetl.admin.core.annotation.Dict; import com.ibeetl.admin.core.entity.BaseEntity; import com.ibeetl.admin.core.util.ValidateConfig; +import lombok.EqualsAndHashCode; import org.beetl.sql.annotation.entity.AssignID; import javax.validation.constraints.NotNull; @@ -16,6 +18,7 @@ import java.math.BigDecimal; * gen by Spring Boot2 Admin 2022-10-26 */ @ExcelIgnoreUnannotated +@EqualsAndHashCode(callSuper=false) public class TeacherOpenCourseMergeResourcesQuestion extends BaseEntity{ //ID @@ -26,70 +29,74 @@ public class TeacherOpenCourseMergeResourcesQuestion extends BaseEntity{ private Long teacherOpenCourseMergeResourcesQuestionId ; //开课ID - @ExcelSelector(dictKeyValue = "teacher_open_course.teacher_open_course_title.teacher_open_course_status=1") + @ExcelSelector( + dictKeyValue = "teacher_open_course.teacher_open_course_title.teacher_open_course_status=1", + serviceClass = DeviceExcelSelectorServiceImpl.class) @Dict(type="teacher_open_course.teacher_open_course_title.teacher_open_course_status=1") - @ExcelProperty("关联开课") + @ExcelProperty(value = "关联开课", index = 0) private Long teacherOpenCourseId ; //课程章节ID - @ExcelSelector(dictKeyValue = "teacher_open_course_merge_course_info.course_info_name.course_info_status=1") + @ExcelSelector( + dictKeyValue = "teacher_open_course_merge_course_info.course_info_name.course_info_status=1,course_info_type!=1", + serviceClass = DeviceExcelSelectorServiceImpl.class) @Dict(type="teacher_open_course_merge_course_info.course_info_name.course_info_status=1") - @ExcelProperty("课程章节") + @ExcelProperty(value = "课程章节", index = 1) private Long teacherOpenCourseMergeCourseInfoId ; //题型(1单选 2多选 3判断 4填空 5分析) @ExcelSelector(fixedSelector = {"1单选", "2多选", "3判断" }) - @ExcelProperty("题型") + @ExcelProperty(value = "题型", index = 2) private Integer questionType ; //分值 - @ExcelProperty("分值") + @ExcelProperty(value = "分值", index = 3) private BigDecimal questionScore ; //题干 - @ExcelProperty("题干") + @ExcelProperty(value = "题干",index = 4) private String questionStem ; //选项A - @ExcelProperty("选项A") + @ExcelProperty(value = "选项A",index = 5) private String questionOptionA ; //选项B - @ExcelProperty("选项B") + @ExcelProperty(value = "选项B",index = 6) private String questionOptionB ; //选项C - @ExcelProperty("选项C") + @ExcelProperty(value = "选项C",index = 7) private String questionOptionC ; //选项D - @ExcelProperty("选项D") + @ExcelProperty(value = "选项D", index = 8) private String questionOptionD ; //选项E - @ExcelProperty("选项E") + @ExcelProperty(value = "选项E",index = 9) private String questionOptionE ; //答案(单选是一个 多选是多个 判断是对错) - @ExcelProperty("答案 单选是一个 多选是多个 判断是对错") + @ExcelProperty(value = "答案 单选是一个 多选是多个 判断是对错", index = 10) private String questionAnswer ; //解析 - @ExcelProperty("解析") + @ExcelProperty(value = "解析", index = 11) private String questionAnalysis ; diff --git a/web/src/main/resources/sql/jlw/generalQuestionLog.md b/web/src/main/resources/sql/jlw/generalQuestionLog.md index fed170dd..8fc58fe2 100644 --- a/web/src/main/resources/sql/jlw/generalQuestionLog.md +++ b/web/src/main/resources/sql/jlw/generalQuestionLog.md @@ -1177,6 +1177,11 @@ getQuestionLogScoreDetailsInfo === * 查询学生详细得分信息,查询分数详细信息 + select + @pageTag() { + tz.* + @} + from ( select t.student_id, ta.student_name, @@ -1213,3 +1218,4 @@ getQuestionLogScoreDetailsInfo ta.student_sn, ta.class_id, tb.class_name + ) tz \ No newline at end of file diff --git a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md index 42c1cba7..e89bfe35 100644 --- a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md +++ b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md @@ -687,6 +687,11 @@ getQuestionLogScoreDetailsInfo === * 查询学生详细得分信息,查询分数详细信息 + select + @pageTag() { + tz.* + @} + from ( select t.student_id, ta.student_name, @@ -723,3 +728,4 @@ getQuestionLogScoreDetailsInfo ta.student_sn, ta.class_id, tb.class_name + ) tz