Administrator
22 hours ago 1e35772e6e401dd9a0f6fe80299c9109edbb13c7
feat(ai): 添加产品问答状态批量更新功能

- 在控制器中新增 stateUpdate 接口用于批量更新状态
- 在服务层实现 stateUpdate 方法支持批量状态修改
- 添加前端页面按钮和事件处理逻辑
- 实现批量选择和状态启用禁用功能
- 集成确认对话框防止误操作
- 完善异常处理和参数校验机制
4 files modified
66 ■■■■■ changed files
src/main/java/cc/mrbird/febs/ai/controller/productQuestion/AiProductQuestionController.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java 17 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/ai/productQuestion/list.html 41 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/controller/productQuestion/AiProductQuestionController.java
@@ -72,6 +72,12 @@
        return aiProductQuestionService.update(dto);
    }
    @PostMapping(value = "stateUpdate/{type}/{ids}")
    @ControllerEndpoint(operation = "更新", exceptionMessage = "更新失败")
    public FebsResponse stateUpdate(@PathVariable("ids") String ids, @PathVariable("type") Integer type) {
        return aiProductQuestionService.stateUpdate(ids, type);
    }
    @GetMapping("delete/{id}")
    @ControllerEndpoint(operation = "删除", exceptionMessage = "操作失败")
    public FebsResponse delete(
src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java
@@ -33,6 +33,8 @@
    FebsResponse update(AiProductQuestion dto);
    FebsResponse stateUpdate(String ids, Integer type);
    FebsResponse delete(String id);
    List<AiProductQuestion> questionTree(String companyId);
src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java
@@ -9,9 +9,12 @@
import cc.mrbird.febs.ai.util.UUID;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.mall.entity.MallMember;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
@@ -155,6 +158,20 @@
    }
    @Override
    public FebsResponse stateUpdate(String ids, Integer type) {
        if (StrUtil.isEmpty(ids)) {
            throw new FebsException("参数错误");
        }
        List<String> idList = StrUtil.split(ids, ',');
        this.update(null,
                Wrappers.lambdaUpdate(AiProductQuestion.class)
                        .set(AiProductQuestion::getState, type)
                        .set(AiProductQuestion::getUpdatedTime, new Date())
                        .in(AiProductQuestion::getId, idList));
        return new FebsResponse().success().message("操作成功");
    }
    @Override
    public FebsResponse delete(String id) {
        AiProductQuestion entity = this.getById(id);
        if(ObjectUtil.isNotNull( entity)){
src/main/resources/templates/febs/views/modules/ai/productQuestion/list.html
@@ -52,7 +52,9 @@
<script type="text/html" id="productQuestionToolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="productQuestionList:add" lay-event="productQuestionAdd">手动新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="productQuestionList:aiAdd" lay-event="productQuestionAiAdd">AI新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="productQuestionList:add" lay-event="productQuestionAdd">手动新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="productQuestionList:aiAdd" lay-event="productQuestionStateOpen">状态启用</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="productQuestionList:aiAdd" lay-event="productQuestionStateClose">状态禁用</button>
    </div>
</script>
@@ -205,7 +207,44 @@
                    }
                });
            }
            if (layEvent === 'productQuestionStateOpen') {
                var checkData = table.checkStatus('productQuestionTable').data;
                if (checkData.length <= 0) {
                    febs.alert.warn('请选择');
                    return;
                }
                febs.modal.confirm('状态', '启用?', function () {
                    var ids = [];
                    layui.each(checkData, function (key, item) {
                        ids.push(item.id)
        });
                    productQuestionStateUpdate(ids.join(','), 1);
                });
            }
            if (layEvent === 'productQuestionStateClose') {
                var checkData = table.checkStatus('productQuestionTable').data;
                if (checkData.length <= 0) {
                    febs.alert.warn('请选择');
                    return;
                }
                febs.modal.confirm('状态', '禁用?', function () {
                    var ids = [];
                    layui.each(checkData, function (key, item) {
                        ids.push(item.id)
                    });
                    productQuestionStateUpdate(ids.join(','), 0);
                });
            }
        });
        function productQuestionStateUpdate(ids, type) {
            febs.post(ctx + 'admin/productQuestion/stateUpdate/' + type + "/"+ ids, null, function () {
                febs.alert.success('重置成功');
            });
        }
        function initProductQuestionTable() {
            tableIns = febs.table.init({