From 02104d85e7e2f6e495274591892d6028169d2323 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Fri, 01 Aug 2025 18:18:26 +0800 Subject: [PATCH] feat(ai): 新增产品题目功能 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionItemServiceImpl.java | 26 ++ src/main/java/cc/mrbird/febs/ai/entity/AiProductQuestion.java | 6 src/main/java/cc/mrbird/febs/ai/controller/productQuestion/ViewController.java | 13 + src/main/resources/mapper/modules/AiProductQuestionItemMapper.xml | 4 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java | 46 ++++ src/main/resources/templates/febs/views/modules/ai/productQuestion/list.html | 2 src/main/resources/templates/febs/views/modules/ai/productQuestion/info.html | 282 +++++++++++++++++++-------- src/main/resources/templates/febs/views/modules/ai/productQuestion/add.html | 161 +++++++++++++-- src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionItemService.java | 7 9 files changed, 434 insertions(+), 113 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/ViewController.java b/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/ViewController.java index e365f68..fe0640d 100644 --- a/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/ViewController.java +++ b/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/ViewController.java @@ -2,9 +2,13 @@ import cc.mrbird.febs.ai.entity.AiProductPoint; import cc.mrbird.febs.ai.entity.AiProductQuestion; +import cc.mrbird.febs.ai.entity.AiProductQuestionItem; +import cc.mrbird.febs.ai.service.AiProductQuestionItemService; import cc.mrbird.febs.ai.service.AiProductQuestionService; import cc.mrbird.febs.common.entity.FebsConstant; import cc.mrbird.febs.common.utils.FebsUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.stereotype.Controller; @@ -12,6 +16,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; /** * @author Administrator @@ -23,6 +29,7 @@ private final AiProductQuestionService aiProductQuestionService; + private final AiProductQuestionItemService aiProductQuestionItemService; @GetMapping("list") @RequiresPermissions("productQuestionList:view") @@ -42,6 +49,12 @@ @RequiresPermissions("productQuestionList:info") public String artInfo(@PathVariable String id, Model model) { AiProductQuestion entity = aiProductQuestionService.getById(id); + + LambdaQueryWrapper<AiProductQuestionItem> query = Wrappers.lambdaQuery(AiProductQuestionItem.class); + query.eq(AiProductQuestionItem::getProductQuestionId, id); + query.orderByAsc(AiProductQuestionItem::getCreatedTime); + List<AiProductQuestionItem> aiProductQuestionItems = aiProductQuestionItemService.getListByQuery(query); + entity.setAiProductQuestionItems(aiProductQuestionItems); model.addAttribute("aiProductQuestion", entity); return FebsUtil.view("modules/ai/productQuestion/info"); } diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiProductQuestion.java b/src/main/java/cc/mrbird/febs/ai/entity/AiProductQuestion.java index 95fc26e..0660101 100644 --- a/src/main/java/cc/mrbird/febs/ai/entity/AiProductQuestion.java +++ b/src/main/java/cc/mrbird/febs/ai/entity/AiProductQuestion.java @@ -1,8 +1,11 @@ package cc.mrbird.febs.ai.entity; import cc.mrbird.febs.common.entity.AiBaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; + +import java.util.List; /** * AI产品题目 @@ -38,4 +41,7 @@ * 状态 0-禁用 1-启用 2-已删除 */ private Integer state; + + @TableField(exist = false) + private List<AiProductQuestionItem> aiProductQuestionItems; } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionItemService.java index a71b1bf..8090440 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionItemService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionItemService.java @@ -1,7 +1,10 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiProductQuestionItem; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; /** * AI产品题目子表 Service接口 @@ -11,4 +14,8 @@ */ public interface AiProductQuestionItemService extends IService<AiProductQuestionItem> { + List<AiProductQuestionItem> getListByQuery(LambdaQueryWrapper<AiProductQuestionItem> query); + + void deleteByQuestionId(String id); + } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionItemServiceImpl.java index 5f156c3..f4646f0 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionItemServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionItemServiceImpl.java @@ -3,10 +3,17 @@ import cc.mrbird.febs.ai.entity.AiProductQuestionItem; import cc.mrbird.febs.ai.mapper.AiProductQuestionItemMapper; import cc.mrbird.febs.ai.service.AiProductQuestionItemService; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * AI产品题目子表 Service实现类 @@ -19,4 +26,23 @@ @Transactional public class AiProductQuestionItemServiceImpl extends ServiceImpl<AiProductQuestionItemMapper, AiProductQuestionItem> implements AiProductQuestionItemService { + private final AiProductQuestionItemMapper aiProductQuestionItemMapper; + + + @Override + public List<AiProductQuestionItem> getListByQuery(LambdaQueryWrapper<AiProductQuestionItem> query) { + return aiProductQuestionItemMapper.selectList( query); + } + + @Override + public void deleteByQuestionId(String id) { + LambdaQueryWrapper<AiProductQuestionItem> query = Wrappers.lambdaQuery(AiProductQuestionItem.class); + query.eq(AiProductQuestionItem::getProductQuestionId, id); + + List<AiProductQuestionItem> listByQuery = this.getListByQuery(query); + if(CollUtil.isNotEmpty(listByQuery)){ + Set<String> collect = listByQuery.stream().map(AiProductQuestionItem::getId).collect(Collectors.toSet()); + this.removeByIds(collect); + } + } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java index 616f060..cdea318 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java @@ -3,11 +3,14 @@ import cc.mrbird.febs.ai.entity.AiMemberRole; import cc.mrbird.febs.ai.entity.AiProductPoint; import cc.mrbird.febs.ai.entity.AiProductQuestion; +import cc.mrbird.febs.ai.entity.AiProductQuestionItem; import cc.mrbird.febs.ai.mapper.AiProductQuestionMapper; +import cc.mrbird.febs.ai.service.AiProductQuestionItemService; import cc.mrbird.febs.ai.service.AiProductQuestionService; import cc.mrbird.febs.ai.util.UUID; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -34,6 +37,7 @@ public class AiProductQuestionServiceImpl extends ServiceImpl<AiProductQuestionMapper, AiProductQuestion> implements AiProductQuestionService { private final AiProductQuestionMapper aiProductQuestionMapper; + private final AiProductQuestionItemService aiProductQuestionItemService; @Override public AiProductQuestion getById(String id) { @@ -45,6 +49,7 @@ public IPage<AiProductQuestion> listInPage(AiProductQuestion dto, QueryRequest request) { Page<AiProductQuestion> page = new Page<>(request.getPageNum(), request.getPageSize()); LambdaQueryWrapper<AiProductQuestion> query = Wrappers.lambdaQuery(AiProductQuestion.class); + query.ne(AiProductQuestion::getState, 2); Page<AiProductQuestion> pages = aiProductQuestionMapper.selectPage(page, query); return pages; } @@ -65,6 +70,16 @@ @Override public FebsResponse add(AiProductQuestion dto) { + List<AiProductQuestionItem> aiProductQuestionItems = dto.getAiProductQuestionItems(); + if(CollUtil.isEmpty(aiProductQuestionItems)){ + return new FebsResponse().fail().message("请添加答案选项"); + } + //stream流操作aiProductQuestionItems,返回aiProductQuestionItems是否存在中correctAnswer为1的元素 + boolean hasCorrectAnswer = aiProductQuestionItems.stream().anyMatch(item -> item != null && item.getCorrectAnswer() != null && item.getCorrectAnswer() == 1); + if (!hasCorrectAnswer) { + return new FebsResponse().fail().message("请添加一项为正确的答案"); + } + AiProductQuestion entity = new AiProductQuestion(); entity.setId(UUID.getSimpleUUIDString()); entity.setCompanyId(dto.getCompanyId()); @@ -73,13 +88,34 @@ entity.setDifficulty(dto.getDifficulty()); entity.setCreatedTime(new Date()); this.save(entity); + + + for (AiProductQuestionItem item : dto.getAiProductQuestionItems()){ + item.setId(UUID.getSimpleUUIDString()); + item.setProductQuestionId(entity.getId()); + item.setTitle(entity.getTitle()); + item.setCreatedTime(new Date()); + aiProductQuestionItemService.getBaseMapper().insert(item); + } return new FebsResponse().success().message("操作成功"); } + + @Override public FebsResponse update(AiProductQuestion dto) { String id = dto.getId(); AiProductQuestion entity = this.getById(id); + + List<AiProductQuestionItem> aiProductQuestionItems = dto.getAiProductQuestionItems(); + if(CollUtil.isEmpty(aiProductQuestionItems)){ + return new FebsResponse().fail().message("请添加答案选项"); + } + //stream流操作aiProductQuestionItems,返回aiProductQuestionItems是否存在中correctAnswer为1的元素 + boolean hasCorrectAnswer = aiProductQuestionItems.stream().anyMatch(item -> item != null && item.getCorrectAnswer() != null && item.getCorrectAnswer() == 1); + if (!hasCorrectAnswer) { + return new FebsResponse().fail().message("请添加一项为正确的答案"); + } if (ObjectUtil.isNotNull( entity)){ this.update(null, Wrappers.lambdaUpdate(AiProductQuestion.class) @@ -90,6 +126,16 @@ .set(AiProductQuestion::getUpdatedTime, new Date()) .eq(AiProductQuestion::getId, id) ); + + aiProductQuestionItemService.deleteByQuestionId(id); + + for (AiProductQuestionItem item : dto.getAiProductQuestionItems()){ + item.setId(UUID.getSimpleUUIDString()); + item.setProductQuestionId(entity.getId()); + item.setTitle(entity.getTitle()); + item.setCreatedTime(new Date()); + aiProductQuestionItemService.getBaseMapper().insert(item); + } } return new FebsResponse().success().message("操作成功"); } diff --git a/src/main/resources/mapper/modules/AiProductQuestionItemMapper.xml b/src/main/resources/mapper/modules/AiProductQuestionItemMapper.xml new file mode 100644 index 0000000..ac1c755 --- /dev/null +++ b/src/main/resources/mapper/modules/AiProductQuestionItemMapper.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > +<mapper namespace="cc.mrbird.febs.ai.mapper.AiProductQuestionItemMapper"> +</mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/ai/productQuestion/add.html b/src/main/resources/templates/febs/views/modules/ai/productQuestion/add.html index 8884723..ed46c36 100644 --- a/src/main/resources/templates/febs/views/modules/ai/productQuestion/add.html +++ b/src/main/resources/templates/febs/views/modules/ai/productQuestion/add.html @@ -19,45 +19,44 @@ </div> <div class="layui-row layui-col-space10 layui-form-item"> <div class="layui-col-lg6"> - <label class="layui-form-label febs-form-item-require">标题:</label> + <label class="layui-form-label febs-form-item-require">题目:</label> <div class="layui-input-block"> <input type="text" name="title" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> </div> </div> </div> - <div class="layui-row layui-col-space10 layui-form-item"> - <div class="layui-col-lg6"> - <label class="layui-form-label febs-form-item-require">答案:</label> - <div class="layui-input-block"> - <input type="text" name="answer" lay-verify="required" - placeholder="" autocomplete="off" class="layui-input"> - </div> - </div> - </div> <div class="layui-row layui-col-space10 layui-form-item"> <div class="layui-col-lg6"> - <label class="layui-form-label febs-form-item-require">正确答案:</label> + <label class="layui-form-label febs-form-item-require">难度:</label> <div class="layui-input-block"> - <input type="radio" name="correctAnswer" value="1" title="是" > - <input type="radio" name="correctAnswer" value="2" title="否" checked=""> + <input type="radio" name="difficulty" value="1" title="简单" checked=""> + <input type="radio" name="difficulty" value="2" title="中等" > + <input type="radio" name="difficulty" value="3" title="困难" > </div> </div> </div> + <div class="layui-form-item multi-sku-table"> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">答案:</label> + </div> + <div class="layui-col-lg1"> + <button type="button" + class="layui-btn layui-btn-normal layui-btn" id="test3"> + 添加 + </button> + </div> + </div> - <div class="layui-form-item"> - <label class="layui-form-label febs-form-item-require">详情:</label> - <div class="layui-input-block"> - <div style="border: 1px solid #ccc;"> - <div id="product-point-toolbar-container" class="toolbar"></div> - <div id="product-point-text-container" class="text" style="height: 450px;"></div> + <div class="layui-form-item"> + <div class="layui-input-block"> + <table id="multiSku" lay-filter="multiSku"></table> </div> </div> </div> - - </div> </div> @@ -71,6 +70,11 @@ </div> </div> </div> +<script type="text/html" id="toolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="delSku">删除</button> + </div> +</script> <!-- 表格操作栏 end --> <script data-th-inline="javascript"> @@ -121,18 +125,117 @@ }); }) - form.on('select(point-type-select)', function(data){ - $('.tc-set').each(function() { - if (data.value == 2) { - $(this).show(); - } else { - $(this).hide(); + var tableSkuData=[]; + var tableIns = table.render({ + elem: '#multiSku' + ,limit:999 + ,toolbar:"#toolbar" + ,defaultToolbar:[] + ,cols: [[ //表头 + {type: 'checkbox'} + ,{field: 'index', title: '序号', width:70} + ,{field: 'answer', title: '答案', edit:'text', width:500} + ,{field: 'correctAnswer', title: '正确答案', templet: function(d){ + var options = ''; + if(d.correctAnswer == 1) { + options = '<option value="0">否</option><option value="1" selected>是</option>'; + } else { + options = '<option value="0" selected>否</option><option value="1">是</option>'; + } + return '<select lay-ignore name="correctAnswer" lay-filter="correctAnswerSelect">' + options + '</select>'; + }, width:200} + ,{field: 'answerAnalysis', title: '答案解析', edit:'text', width:500} + ]] + ,data: [] + }); + + // 监听下拉框变化 + $(document).on('change', 'select[name="correctAnswer"]', function() { + var selectIndex = $(this).closest('tr').index(); // 获取行索引 + var newValue = $(this).val(); // 获取新值 + + // 更新表格数据 + var hasData = table.cache['multiSku']; + if (hasData && hasData[selectIndex]) { + hasData[selectIndex].correctAnswer = parseInt(newValue); + + // 更新全局数据 + for (let i = 0; i < tableSkuData.length; i++) { + if (tableSkuData[i].index == hasData[selectIndex].index) { + tableSkuData[i].correctAnswer = parseInt(newValue); + break; + } } - }) + } + }); + + + table.on('toolbar(multiSku)', function(obj){ + var data = obj.data; + + var hasData = table.cache['multiSku']; + var checkData = table.checkStatus('multiSku').data; + + if (checkData.length <= 0) { + febs.alert.warn('请选择删除数据'); + return; + } + if(obj.event === 'delSku'){ + for (let i = 0; i < checkData.length; i++) { + var delData = checkData[i]; + for (let j = 0; j < hasData.length; j++) { + if (hasData[j].index == delData.index) { + hasData.splice(j, 1); + break; + } + } + } + + for (let i = 0; i < hasData.length; i++) { + hasData[i].index = i + 1; + } + + tableSkuData=hasData; + reloadTable(hasData); + } + }); + + function addTableDate(data) { + var hasData = table.cache['multiSku']; + + data.index = hasData.length + 1; + tableSkuData.push(data); + + reloadTable(tableSkuData); + return data.index; + } + + function reloadTable(data) { + table.reload('multiSku', { + data : data + }); + } + + table.on('edit(multiSku)', function(obj){ + var value = obj.value //得到修改后的值 + ,data = obj.data //得到所在行所有键值 + ,field = obj.field; //得到字段 + + for (let i = 0; i < tableSkuData.length; i++) { + if (tableSkuData[i].index == data.index) { + tableSkuData[i] = data; + } + } + }); + + $('#test3').on('click', function (){ + var data = {}; + addTableDate(data); }); form.on('submit(productQuestion-add-form-submit)', function (data) { - data.field.description = editor.txt.html(); + data.field.productCategoryId = category.getValue('valueStr'); + data.field.aiProductQuestionItems = tableSkuData; $.ajax({ 'url':ctx + 'admin/productQuestion/add', 'type':'post', diff --git a/src/main/resources/templates/febs/views/modules/ai/productQuestion/info.html b/src/main/resources/templates/febs/views/modules/ai/productQuestion/info.html index 0d86d8b..d82441f 100644 --- a/src/main/resources/templates/febs/views/modules/ai/productQuestion/info.html +++ b/src/main/resources/templates/febs/views/modules/ai/productQuestion/info.html @@ -1,8 +1,8 @@ -<div class="layui-fluid layui-anim febs-anim" id="febs-productPoint-Info" lay-title="编辑"> +<div class="layui-fluid layui-anim febs-anim" id="febs-productQuestion-Info" lay-title="编辑"> <div class="layui-row febs-container"> <div class="layui-col-md12"> - <div class="layui-fluid" id="productPoint-info"> - <form class="layui-form" action="" lay-filter="productPoint-info-form"> + <div class="layui-fluid" id="productQuestion-info"> + <form class="layui-form" action="" lay-filter="productQuestion-info-form"> <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> <ul class="layui-tab-title"> <li class="layui-this">基础信息</li> @@ -14,35 +14,15 @@ <div class="layui-row layui-col-space10 layui-form-item"> <div class="layui-col-lg6"> - <label class="layui-form-label febs-form-item-require">类型:</label> + <label class="layui-form-label febs-form-item-require">分类:</label> <div class="layui-input-block"> - <select name="isNormal" class="point-type" lay-filter="point-type-select"> - <option value="1">普通内容</option> - <option value="2">视频号内容</option> - </select> - </div> - </div> - </div> - - <blockquote class="layui-elem-quote blue-border febs-hide tc-set">视频号信息</blockquote> - <div class="layui-form-item febs-hide tc-set"> - <div class="layui-col-lg6"> - <label class="layui-form-label">视频号 id:</label> - <div class="layui-input-block"> - <input type="text" name="finderUserName" placeholder="请输入" autocomplete="off" class="layui-input"> - <div class="layui-form-mid layui-word-aux">视频号 id,以“sph”开头的id,可在视频号助手获取。</div> - </div> - </div> - <div class="layui-col-lg6"> - <label class="layui-form-label">视频 feedId:</label> - <div class="layui-input-block"> - <input type="text" name="feedId" placeholder="请输入" autocomplete="off" class="layui-input"> + <div id="product-category"></div> </div> </div> </div> <div class="layui-row layui-col-space10 layui-form-item"> <div class="layui-col-lg6"> - <label class="layui-form-label febs-form-item-require">标题:</label> + <label class="layui-form-label febs-form-item-require">题目:</label> <div class="layui-input-block"> <input type="text" name="title" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> @@ -50,12 +30,33 @@ </div> </div> - <div class="layui-form-item"> - <label class="layui-form-label febs-form-item-require">详情:</label> - <div class="layui-input-block"> - <div style="border: 1px solid #ccc;"> - <div id="product-point-toolbar-container" class="toolbar"></div> - <div id="product-point-text-container" class="text" style="height: 450px;"></div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">难度:</label> + <div class="layui-input-block"> + <input type="radio" name="difficulty" value="1" title="简单" checked=""> + <input type="radio" name="difficulty" value="2" title="中等" > + <input type="radio" name="difficulty" value="3" title="困难" > + </div> + </div> + </div> + + <div class="layui-form-item multi-sku-table"> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">答案:</label> + </div> + <div class="layui-col-lg1"> + <button type="button" + class="layui-btn layui-btn-normal layui-btn" id="test3"> + 添加 + </button> + </div> + </div> + + <div class="layui-form-item"> + <div class="layui-input-block"> + <table id="multiSku" lay-filter="multiSku"></table> </div> </div> </div> @@ -64,7 +65,7 @@ </div> </div> <div class="layui-form-item febs-hide"> - <button class="layui-btn" lay-submit="" lay-filter="productPoint-info-form-submit" id="submit">保存</button> + <button class="layui-btn" lay-submit="" lay-filter="productQuestion-info-form-submit" id="submit">保存</button> </div> </form> </div> @@ -86,6 +87,12 @@ margin: 0 5px !important; } </style> + +<script type="text/html" id="toolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="delSku">删除</button> + </div> +</script> <!-- 表格操作栏 end --> <script data-th-inline="javascript"> layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () { @@ -94,73 +101,182 @@ layer = layui.layer, table = layui.table, form = layui.form, - $view = $('#productPoint-info'), - aiProductPoint = [[${aiProductPoint}]], + $view = $('#productQuestion-info'), + aiProductQuestion = [[${aiProductQuestion}]], upload = layui.upload, validate = layui.validate; form.render(); - const E = window.wangEditor; - const editor = new E('#product-point-toolbar-container', '#product-point-text-container'); // 传入两个元素 - editor.config.showLinkImg = false; - editor.config.uploadFileName = 'file'; - editor.config.customUploadImg = function (files, insertImgFn) { - // files 是 input 中选中的文件列表 - // insertImgFn 是获取图片 url 后,插入到编辑器的方法 - // 上传图片,返回结果,将图片插入到编辑器中 - for (let i = 0; i < files.length; i++){ - var form = new FormData(); - form.append("file", files[0]); - $.ajax({ - url:'/admin/goods/uploadFileBase64', - type: "post", - processData: false, - contentType: false, - data: form, - dataType: 'json', - success(res) { - // 上传代码返回结果之后,将图片插入到编辑器中 - insertImgFn(res.data.src, res.data.title, '') - } - }) - } - }; - editor.create(); + var category = xmSelect.render({ + el: '#product-category', + language: 'zn', + prop : { + value : 'id', + children : 'child' + }, + iconfont: { + parent: 'hidden', + }, + tips: '请选择', + filterable: true, + radio: true, + clickClose: true, + tree: { + show: true, + //非严格模式 + strict: false, + }, + data: [] + }) - form.on('select(point-type-select)', function(data){ - $('.tc-set').each(function() { - if (data.value == 2) { - $(this).show(); - } else { - $(this).hide(); + febs.get(ctx + 'admin/productCategory/categoryTree', null, function(res) { + category.update({ + data : res.data, + autoRow: true, + }); + }) + + var tableSkuData=[]; + var tableIns = table.render({ + elem: '#multiSku' + ,limit:999 + ,toolbar:"#toolbar" + ,defaultToolbar:[] + ,cols: [[ //表头 + {type: 'checkbox'} + ,{field: 'index', title: '序号', width:70} + ,{field: 'answer', title: '答案', edit:'text', width:500} + ,{field: 'correctAnswer', title: '正确答案', templet: function(d){ + var options = ''; + if(d.correctAnswer == 1) { + options = '<option value="0">否</option><option value="1" selected>是</option>'; + } else { + options = '<option value="0" selected>否</option><option value="1">是</option>'; + } + return '<select lay-ignore name="correctAnswer" lay-filter="correctAnswerSelect">' + options + '</select>'; + }, width:200} + ,{field: 'answerAnalysis', title: '答案解析', edit:'text', width:500} + ]] + ,data: [] + }); + + // 监听下拉框变化 + $(document).on('change', 'select[name="correctAnswer"]', function() { + var selectIndex = $(this).closest('tr').index(); // 获取行索引 + var newValue = $(this).val(); // 获取新值 + + // 更新表格数据 + var hasData = table.cache['multiSku']; + if (hasData && hasData[selectIndex]) { + hasData[selectIndex].correctAnswer = parseInt(newValue); + + // 更新全局数据 + for (let i = 0; i < tableSkuData.length; i++) { + if (tableSkuData[i].index == hasData[selectIndex].index) { + tableSkuData[i].correctAnswer = parseInt(newValue); + break; + } } - }) + } + }); + + + table.on('toolbar(multiSku)', function(obj){ + var data = obj.data; + + var hasData = table.cache['multiSku']; + var checkData = table.checkStatus('multiSku').data; + + if (checkData.length <= 0) { + febs.alert.warn('请选择删除数据'); + return; + } + if(obj.event === 'delSku'){ + for (let i = 0; i < checkData.length; i++) { + var delData = checkData[i]; + for (let j = 0; j < hasData.length; j++) { + if (hasData[j].index == delData.index) { + hasData.splice(j, 1); + break; + } + } + } + + for (let i = 0; i < hasData.length; i++) { + hasData[i].index = i + 1; + } + + tableSkuData=hasData; + reloadTable(hasData); + } + }); + + function addTableDate(data) { + var hasData = table.cache['multiSku']; + + data.index = hasData.length + 1; + tableSkuData.push(data); + + reloadTable(tableSkuData); + return data.index; + } + + function reloadTable(data) { + table.reload('multiSku', { + data : data + }); + } + + table.on('edit(multiSku)', function(obj){ + var value = obj.value //得到修改后的值 + ,data = obj.data //得到所在行所有键值 + ,field = obj.field; //得到字段 + + for (let i = 0; i < tableSkuData.length; i++) { + if (tableSkuData[i].index == data.index) { + tableSkuData[i] = data; + } + } + }); + + $('#test3').on('click', function (){ + var data = {}; + addTableDate(data); }); setTimeout(() => { - initProductPointInfo(); + initProductQuestionInfo(); }, 500); - function initProductPointInfo() { - form.val("productPoint-info-form", { - "id": aiProductPoint.id, - "title": aiProductPoint.title, - "isNormal": aiProductPoint.isNormal, - "finderUserName": aiProductPoint.finderUserName, - "feedId": aiProductPoint.feedId, + function initProductQuestionInfo() { + form.val("productQuestion-info-form", { + "id": aiProductQuestion.id, + "title": aiProductQuestion.title, + "difficulty": aiProductQuestion.difficulty, }); - editor.txt.html(aiProductPoint.description); - if (aiProductPoint.isNormal == 2) { - $(".tc-set").show(); + var categoryList = []; + categoryList.push(aiProductQuestion.productCategoryId) + category.setValue(categoryList); + + let aiProductQuestionItems = aiProductQuestion.aiProductQuestionItems; + if(Array.isArray(aiProductQuestionItems) && aiProductQuestionItems.length){ + for (let i = 0; i < aiProductQuestionItems.length; i++) { + aiProductQuestionItems[i].index = i+1; + } + } + if (aiProductQuestionItems) { + tableSkuData = aiProductQuestionItems; + reloadTable(aiProductQuestionItems); } } - form.on('submit(productPoint-info-form-submit)', function (data) { - data.field.description = editor.txt.html(); + form.on('submit(productQuestion-info-form-submit)', function (data) { + data.field.productCategoryId = category.getValue('valueStr'); + data.field.aiProductQuestionItems = tableSkuData; $.ajax({ - 'url':ctx + 'admin/productPoint/update', + 'url':ctx + 'admin/productQuestion/update', 'type':'post', 'dataType':'json', 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 @@ -170,7 +286,7 @@ if(data.code==200){ layer.closeAll(); febs.alert.success(data.message); - $('#febs-productPoint').find('#query').click(); + $('#febs-productQuestion').find('#query').click(); }else{ febs.alert.warn(data.message); } diff --git a/src/main/resources/templates/febs/views/modules/ai/productQuestion/list.html b/src/main/resources/templates/febs/views/modules/ai/productQuestion/list.html index a769fc4..d21d086 100644 --- a/src/main/resources/templates/febs/views/modules/ai/productQuestion/list.html +++ b/src/main/resources/templates/febs/views/modules/ai/productQuestion/list.html @@ -185,7 +185,7 @@ productSwitch(data.value,0); } }) - function productSwitch(id,type,state) { + function productSwitch(id,state) { febs.get(ctx + 'admin/productQuestion/changeState/' + id+'/' + state, null, function (data) { febs.alert.success(data.message); $query.click(); -- Gitblit v1.9.1