1.5.4后端

AI表单设置
master
xs 3 months ago
parent c156bc2c70
commit 0f1fc16f98

@ -0,0 +1,154 @@
package org.dromara.ai.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.ai.domain.AiFormSetting;
import org.dromara.ai.domain.AiSqlTable;
import org.dromara.ai.domain.bo.AiSqlTableBo;
import org.dromara.ai.domain.vo.AiFormSettingDetailVo;
import org.dromara.common.mybatis.helper.DataBaseHelper;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.ai.domain.vo.AiFormSettingVo;
import org.dromara.ai.domain.bo.AiFormSettingBo;
import org.dromara.ai.service.IAiFormSettingService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* AI
* 访:/ai/aiFormSetting
*
* @author xins
* @date 2025-09-10
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/aiFormSetting")
public class AiFormSettingController extends BaseController {
private final IAiFormSettingService aiFormSettingService;
/**
* AI
*/
@SaCheckPermission("ai:aiFormSetting:list")
@GetMapping("/list")
public TableDataInfo<AiFormSettingVo> list(AiFormSettingBo bo, PageQuery pageQuery) {
return aiFormSettingService.queryPageList(bo, pageQuery);
}
/**
* AI
*/
@SaCheckPermission("ai:aiFormSetting:export")
@Log(title = "AI表单设置", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(AiFormSettingBo bo, HttpServletResponse response) {
List<AiFormSettingVo> list = aiFormSettingService.queryList(bo);
ExcelUtil.exportExcel(list, "AI表单设置", AiFormSettingVo.class, response);
}
/**
* AI
*
* @param formSettingId
*/
@SaCheckPermission("ai:aiFormSetting:query")
@GetMapping("/{formSettingId}")
public R<AiFormSettingVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long formSettingId) {
return R.ok(aiFormSettingService.queryById(formSettingId));
}
/**
* AI
*/
@SaCheckPermission("ai:aiFormSetting:add")
@Log(title = "AI表单设置", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody AiFormSettingBo bo) {
return toAjax(aiFormSettingService.insertByBo(bo));
}
/**
* AI
*/
@SaCheckPermission("ai:aiFormSetting:edit")
@Log(title = "AI表单设置", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody AiFormSettingBo bo) {
return toAjax(aiFormSettingService.updateByBo(bo));
}
/**
* AI
*
* @param formSettingIds
*/
@SaCheckPermission("ai:aiFormSetting:remove")
@Log(title = "AI表单设置", businessType = BusinessType.DELETE)
@DeleteMapping("/{formSettingIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] formSettingIds) {
return toAjax(aiFormSettingService.deleteWithValidByIds(List.of(formSettingIds), true));
}
/**
* AI
*/
@GetMapping("/getAiFormSettingList")
public R<List<AiFormSettingVo>> getAiFormSettingList(AiFormSettingBo bo) {
List<AiFormSettingVo> list = aiFormSettingService.queryList(bo);
return R.ok(list);
}
/**
*
*/
@SaCheckPermission("ai:aiFormSetting:list")
@GetMapping(value = "/getDataNames")
public R<Object> getCurrentDataSourceNameList() {
return R.ok(DataBaseHelper.getDataSourceNameList());
}
/**
*
*/
@SaCheckPermission("ai:aiFormSetting:list")
@GetMapping("/db/list")
public TableDataInfo<AiFormSettingVo> dbTableList(AiFormSettingBo aiFormSettingBo, PageQuery pageQuery) {
return aiFormSettingService.selectPageDbTableList(aiFormSettingBo, pageQuery);
}
/**
* Column
*/
@SaCheckPermission("ai:aiFormSetting:list")
@GetMapping("/db/columnList")
public R<List<AiFormSettingDetailVo>> dbTableColumnList(AiFormSettingBo aiFormSettingBo) {
return R.ok(aiFormSettingService.selectDbTableColumnsByName(aiFormSettingBo.getTableName(),
aiFormSettingBo.getDataName()));
}
}

@ -0,0 +1,96 @@
package org.dromara.ai.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.util.List;
/**
* AI ai_form_setting
*
* @author xins
* @date 2025-09-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ai_form_setting")
public class AiFormSetting extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "form_setting_id", type = IdType.AUTO)
private Long formSettingId;
/**
* (123formtable)
*/
private String formType;
/**
*
*/
private String dataName;
/**
*
*/
private String tableName;
/**
*
*/
private String tableComment;
/**
*
*/
private String formName;
/**
* (sys_menucomponent/mes/info/index)
*/
private String formPath;
/**
*
*/
private String dialogVisibleVariable;
/**
*
*/
private String subTableName;
/**
*
*/
private String subTableFkName;
/**
* (1Web,2)
*/
private String clientType;
/**
*
*/
private String remark;
/**
* 0 2,
*/
// @TableLogic
private String delFlag;
@TableField(exist = false)
private List<AiFormSettingDetail> aiFormSettingDetailList;
}

@ -0,0 +1,61 @@
package org.dromara.ai.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* AI ai_form_setting_detail
*
* @author xins
* @date 2025-09-10
*/
@Data
//@EqualsAndHashCode(callSuper = true)
@TableName("ai_form_setting_detail")
public class AiFormSettingDetail {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "setting_detail_id", type = IdType.AUTO)
private Long settingDetailId;
/**
* AIIDai_form_setting
*/
private Long formSettingId;
/**
*
*/
private String tableName;
/**
*
*/
private String fieldName;
/**
* sys_deptsys_deptdept_name
*/
private String fieldDesc;
/**
* prop
*/
private String formProp;
/**
* (10)AI
*/
private String settingFlag;
}

@ -0,0 +1,95 @@
package org.dromara.ai.domain.bo;
import org.dromara.ai.domain.AiFormSetting;
import org.dromara.ai.domain.AiFormSettingDetail;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.List;
/**
* AI ai_form_setting
*
* @author xins
* @date 2025-09-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = AiFormSetting.class, reverseConvertGenerate = false)
public class AiFormSettingBo extends BaseEntity {
/**
*
*/
private Long formSettingId;
/**
* (123formtable)1
*/
@NotBlank(message = "表单类型(1单表2主子表3主form子table)不能为空", groups = { AddGroup.class, EditGroup.class })
private String formType;
/**
*
*/
@NotBlank(message = "数据源名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String dataName;
/**
*
*/
@NotBlank(message = "表名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String tableName;
/**
*
*/
private String tableComment;
/**
*
*/
@NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String formName;
/**
* (sys_menucomponent/mes/info/index)
*/
@NotBlank(message = "表单路径不能为空", groups = { AddGroup.class, EditGroup.class })
private String formPath;
/**
*
*/
private String dialogVisibleVariable;
/**
*
*/
private String subTableName;
/**
*
*/
private String subTableFkName;
/**
* (1Web,2)
*/
@NotBlank(message = "客户端类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String clientType;
/**
*
*/
private String remark;
private List<AiFormSettingDetail> aiFormSettingDetailList;
}

@ -0,0 +1,66 @@
package org.dromara.ai.domain.bo;
import org.dromara.ai.domain.AiFormSettingDetail;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* AI ai_form_setting_detail
*
* @author xins
* @date 2025-09-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = AiFormSettingDetail.class, reverseConvertGenerate = false)
public class AiFormSettingDetailBo extends BaseEntity {
/**
*
*/
@NotNull(message = "主键不能为空", groups = { AddGroup.class, EditGroup.class })
private Long settingDetailId;
/**
* AIIDai_form_setting
*/
@NotNull(message = "AI表单设置ID关联ai_form_setting不能为空", groups = { AddGroup.class, EditGroup.class })
private Long formSettingId;
/**
*
*/
@NotBlank(message = "表名称(用于一个表单多个表的情况)不能为空", groups = { AddGroup.class, EditGroup.class })
private String tableName;
/**
*
*/
@NotBlank(message = "字段名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String fieldName;
/**
* sys_deptsys_deptdept_name
*/
@NotBlank(message = "字段描述如果有关联表则在此说明例如关联表sys_deptsys_dept中字段dept_name是部门名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String fieldDesc;
/**
* prop
*/
@NotBlank(message = "表单prop不能为空", groups = { AddGroup.class, EditGroup.class })
private String formProp;
/**
* (10)AI
*/
@NotBlank(message = "设置标识(1是0否)代表是否需要AI赋值不能为空", groups = { AddGroup.class, EditGroup.class })
private String settingFlag;
}

@ -0,0 +1,76 @@
package org.dromara.ai.domain.vo;
import org.dromara.ai.domain.AiFormSettingDetail;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* AI ai_form_setting_detail
*
* @author xins
* @date 2025-09-10
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = AiFormSettingDetail.class)
public class AiFormSettingDetailVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "主键")
private Long settingDetailId;
/**
* AIIDai_form_setting
*/
@ExcelProperty(value = "AI表单设置ID关联ai_form_setting")
private Long formSettingId;
/**
*
*/
@ExcelProperty(value = "表名称", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "用=于一个表单多个表的情况")
private String tableName;
/**
*
*/
@ExcelProperty(value = "字段名称")
private String fieldName;
/**
* sys_deptsys_deptdept_name
*/
@ExcelProperty(value = "字段描述", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=果有关联表则在此说明例如关联表sys_deptsys_dept中字段dept_name是部门名称")
private String fieldDesc;
/**
* prop
*/
@ExcelProperty(value = "表单prop")
private String formProp;
/**
* (10)AI
*/
@ExcelProperty(value = "设置标识(1是0否)代表是否需要AI赋值")
private String settingFlag;
}

@ -0,0 +1,106 @@
package org.dromara.ai.domain.vo;
import org.dromara.ai.domain.AiFormSetting;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.ai.domain.AiFormSettingDetail;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* AI ai_form_setting
*
* @author xins
* @date 2025-09-10
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = AiFormSetting.class)
public class AiFormSettingVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "主键")
private Long formSettingId;
/**
* (123formtable)
*/
@ExcelProperty(value = "表单类型(1单表2主子表3主form子table)")
private String formType;
/**
*
*/
@ExcelProperty(value = "数据源名称")
private String dataName;
/**
*
*/
@ExcelProperty(value = "表名称")
private String tableName;
/**
*
*/
@ExcelProperty(value = "表注释")
private String tableComment;
/**
*
*/
@ExcelProperty(value = "表单名称")
private String formName;
/**
* (sys_menucomponent/mes/info/index)
*/
@ExcelProperty(value = "表单路径(与sys_menu中的component一样例如/mes/info/index)")
private String formPath;
/**
*
*/
@ExcelProperty(value = "弹窗可见变量名称")
private String dialogVisibleVariable;
/**
*
*/
@ExcelProperty(value = "子表名称")
private String subTableName;
/**
*
*/
@ExcelProperty(value = "子表关联的外键名")
private String subTableFkName;
/**
* (1Web,2)
*/
@ExcelProperty(value = "客户端类型(1Web,2手机)")
private String clientType;
/**
*
*/
@ExcelProperty(value = "备注")
private String remark;
private List<AiFormSettingDetail> aiFormSettingDetailList;
}

@ -0,0 +1,19 @@
package org.dromara.ai.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import org.dromara.ai.domain.AiFormSettingDetail;
import org.dromara.ai.domain.vo.AiFormSettingDetailVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* AIMapper
*
* @author xins
* @date 2025-09-10
*/
public interface AiFormSettingDetailMapper extends BaseMapperPlus<AiFormSettingDetail, AiFormSettingDetailVo> {
public int insertFormSettingDetailBatch(List<AiFormSettingDetail> list);
}

@ -0,0 +1,28 @@
package org.dromara.ai.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.dromara.ai.domain.AiFormSetting;
import org.dromara.ai.domain.vo.AiFormSettingVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* AIMapper
*
* @author xins
* @date 2025-09-10
*/
public interface AiFormSettingMapper extends BaseMapperPlus<AiFormSetting, AiFormSettingVo> {
/**
*
*
* @param dataName
* @return
*
* @DS("") 使
*/
@DS("")
List<String> selectTableNameList(String dataName);
}

@ -0,0 +1,90 @@
package org.dromara.ai.service;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.dromara.ai.domain.AiFormSetting;
import org.dromara.ai.domain.vo.AiFormSettingDetailVo;
import org.dromara.ai.domain.vo.AiFormSettingVo;
import org.dromara.ai.domain.bo.AiFormSettingBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* AIService
*
* @author xins
* @date 2025-09-10
*/
public interface IAiFormSettingService {
/**
* AI
*
* @param formSettingId
* @return AI
*/
AiFormSettingVo queryById(Long formSettingId);
/**
* AI
*
* @param bo
* @param pageQuery
* @return AI
*/
TableDataInfo<AiFormSettingVo> queryPageList(AiFormSettingBo bo, PageQuery pageQuery);
/**
* AI
*
* @param bo
* @return AI
*/
List<AiFormSettingVo> queryList(AiFormSettingBo bo);
/**
* AI
*
* @param bo AI
* @return
*/
Boolean insertByBo(AiFormSettingBo bo);
/**
* AI
*
* @param bo AI
* @return
*/
Boolean updateByBo(AiFormSettingBo bo);
/**
* AI
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
*
*
* @param aiFormSettingBo AiFormSettingBo
* @param pageQuery PageQuery
* @return TableDataInfo
*/
public TableDataInfo<AiFormSettingVo> selectPageDbTableList(AiFormSettingBo aiFormSettingBo, PageQuery pageQuery);
/**
*
*
* @param tableName
* @param dataName
* @return
*/
public List<AiFormSettingDetailVo> selectDbTableColumnsByName(String tableName, String dataName);
}

@ -0,0 +1,318 @@
package org.dromara.ai.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.yulichang.interfaces.MPJBaseJoin;
import org.anyline.metadata.Column;
import org.anyline.metadata.Table;
import org.anyline.proxy.ServiceProxy;
import org.dromara.ai.domain.AiChatMessage;
import org.dromara.ai.domain.AiFormSettingDetail;
import org.dromara.ai.domain.vo.AiFormSettingDetailVo;
import org.dromara.ai.mapper.AiFormSettingDetailMapper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.ai.domain.bo.AiFormSettingBo;
import org.dromara.ai.domain.vo.AiFormSettingVo;
import org.dromara.ai.domain.AiFormSetting;
import org.dromara.ai.mapper.AiFormSettingMapper;
import org.dromara.ai.service.IAiFormSettingService;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* AIService
*
* @author xins
* @date 2025-09-10
*/
@RequiredArgsConstructor
@Service
public class AiFormSettingServiceImpl implements IAiFormSettingService {
private static final String[] TABLE_IGNORE = new String[]{"sj_", "act_", "flw_", "gen_"};
private final AiFormSettingMapper baseMapper;
private final AiFormSettingDetailMapper aiFormSettingDetailMapper;
/**
* AI
*
* @param formSettingId
* @return AI
*/
@Override
public AiFormSettingVo queryById(Long formSettingId){
MPJLambdaWrapper<AiFormSettingDetail> lqw = JoinWrappers.lambda(AiFormSettingDetail.class)
.select(AiFormSettingDetail::getSettingDetailId)
.select(AiFormSettingDetail::getFieldName)
.select(AiFormSettingDetail::getFieldDesc)
.select(AiFormSettingDetail::getFormProp)
.select(AiFormSettingDetail::getSettingFlag)
.eq(AiFormSettingDetail::getFormSettingId, formSettingId);
List<AiFormSettingDetail> aiFormSettingDetailList = aiFormSettingDetailMapper.selectList(lqw);
AiFormSettingVo aiFormSetting = baseMapper.selectVoById(formSettingId);
aiFormSetting.setAiFormSettingDetailList(aiFormSettingDetailList);
return aiFormSetting;
}
/**
* AI
*
* @param bo
* @param pageQuery
* @return AI
*/
@Override
public TableDataInfo<AiFormSettingVo> queryPageList(AiFormSettingBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<AiFormSetting> lqw = buildQueryWrapper(bo);
Page<AiFormSettingVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* AI
*
* @param bo
* @return AI
*/
@Override
public List<AiFormSettingVo> queryList(AiFormSettingBo bo) {
MPJLambdaWrapper<AiFormSetting> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private MPJLambdaWrapper<AiFormSetting> buildQueryWrapper(AiFormSettingBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<AiFormSetting> lqw = JoinWrappers.lambda(AiFormSetting.class)
.selectAll(AiFormSetting.class)
.eq(bo.getFormSettingId() != null, AiFormSetting::getFormSettingId, bo.getFormSettingId())
.eq(StringUtils.isNotBlank(bo.getFormType()), AiFormSetting::getFormType, bo.getFormType())
.like(StringUtils.isNotBlank(bo.getTableName()), AiFormSetting::getTableName, bo.getTableName())
.like(StringUtils.isNotBlank(bo.getFormName()), AiFormSetting::getFormName, bo.getFormName())
.like(StringUtils.isNotBlank(bo.getFormPath()), AiFormSetting::getFormPath, bo.getFormPath())
.eq(StringUtils.isNotBlank(bo.getDialogVisibleVariable()), AiFormSetting::getDialogVisibleVariable, bo.getDialogVisibleVariable())
.like(StringUtils.isNotBlank(bo.getSubTableName()), AiFormSetting::getSubTableName, bo.getSubTableName())
.like(StringUtils.isNotBlank(bo.getSubTableFkName()), AiFormSetting::getSubTableFkName, bo.getSubTableFkName())
.eq(StringUtils.isNotBlank(bo.getClientType()), AiFormSetting::getClientType, bo.getClientType())
.orderByDesc(AiFormSetting::getCreateTime);
return lqw;
}
/**
* AI
*
* @param bo AI
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(AiFormSettingBo bo) {
AiFormSetting add = MapstructUtils.convert(bo, AiFormSetting.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
List<AiFormSettingDetail> detailList = bo.getAiFormSettingDetailList();
detailList.forEach(item -> item.setFormSettingId(add.getFormSettingId()));
aiFormSettingDetailMapper.insertFormSettingDetailBatch(detailList);
}
return flag;
}
/**
* AI
*
* @param bo AI
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(AiFormSettingBo bo) {
List<AiFormSettingDetail> aiFormSettingDetailList = bo.getAiFormSettingDetailList();
aiFormSettingDetailMapper.updateBatchById(aiFormSettingDetailList);
AiFormSetting update = MapstructUtils.convert(bo, AiFormSetting.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(AiFormSetting entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* AI
*
* @param ids
* @param isValid
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
ids.forEach(id -> {
aiFormSettingDetailMapper.delete(Wrappers.<AiFormSettingDetail>lambdaQuery()
.eq(AiFormSettingDetail::getFormSettingId, id));
});
return baseMapper.deleteByIds(ids) > 0;
}
/**
*
*
* @param aiFormSettingBo AiFormSettingBo
* @param pageQuery PageQuery
* @return TableDataInfo
*/
@DS("#aiFormSettingBo.dataName")
@Override
public TableDataInfo<AiFormSettingVo> selectPageDbTableList(AiFormSettingBo aiFormSettingBo, PageQuery pageQuery) {
// 获取查询条件
String tableName = aiFormSettingBo.getTableName();
String tableComment = aiFormSettingBo.getTableComment();
LinkedHashMap<String, Table<?>> tablesMap = ServiceProxy.metadata().tables();
if (CollUtil.isEmpty(tablesMap)) {
return TableDataInfo.build();
}
List<String> tableNames = baseMapper.selectTableNameList(aiFormSettingBo.getDataName());
String[] tableArrays;
if (CollUtil.isNotEmpty(tableNames)) {
tableArrays = tableNames.toArray(new String[0]);
} else {
tableArrays = new String[0];
}
// 过滤并转换表格数据
List<AiFormSettingVo> tables = tablesMap.values().stream()
.filter(x -> !startWithAnyIgnoreCase(x.getName(), TABLE_IGNORE))
.filter(x -> {
if (CollUtil.isEmpty(tableNames)) {
return true;
}
return !StringUtils.equalsAnyIgnoreCase(x.getName(), tableArrays);
})
.filter(x -> {
boolean nameMatches = true;
boolean commentMatches = true;
// 进行表名称的模糊查询
if (StringUtils.isNotBlank(tableName)) {
nameMatches = StringUtils.containsIgnoreCase(x.getName(), tableName);
}
// 进行表描述的模糊查询
if (StringUtils.isNotBlank(tableComment)) {
commentMatches = StringUtils.containsIgnoreCase(x.getComment(), tableComment);
}
// 同时匹配名称和描述
return nameMatches && commentMatches;
})
.map(x -> {
AiFormSettingVo gen = new AiFormSettingVo();
gen.setTableName(x.getName());
gen.setTableComment(x.getComment());
return gen;
}).toList();
IPage<AiFormSettingVo> page = pageQuery.build();
page.setTotal(tables.size());
// 手动分页 set数据
page.setRecords(CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tables));
return TableDataInfo.build(page);
}
public static boolean startWithAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) {
// 判断是否是以指定字符串开头
for (CharSequence searchCharSequence : searchCharSequences) {
if (StringUtils.startsWithIgnoreCase(cs, searchCharSequence)) {
return true;
}
}
return false;
}
/**
*
*
* @param tableName
* @param dataName
* @return
*/
@DS("#dataName")
@Override
public List<AiFormSettingDetailVo> selectDbTableColumnsByName(String tableName, String dataName) {
LinkedHashMap<String, Column> columns = ServiceProxy.metadata().columns(tableName);
List<AiFormSettingDetailVo> aiFormSettingDetailList = new ArrayList<>();
columns.forEach((columnName, column) -> {
AiFormSettingDetailVo aiFormSettingDetail = new AiFormSettingDetailVo();
aiFormSettingDetail.setTableName(tableName);
aiFormSettingDetail.setFieldName(column.getName());
aiFormSettingDetail.setFieldDesc(column.getComment());
aiFormSettingDetail.setFormProp(convertToCamelCase(column.getName()));
aiFormSettingDetail.setSettingFlag("0");
aiFormSettingDetailList.add(aiFormSettingDetail);
});
return aiFormSettingDetailList;
}
/**
*
* @param snakeCaseStr
* @return
*/
public static String convertToCamelCase(String snakeCaseStr) {
// 使用Apache Commons Lang库的核心方法
// 1. 先用 `split` 按 `_` 分割成单词数组
// 2. 然后用 `StringUtils.capitalize` 将每个单词首字母大写
// 3. 最后用 `String.join` 或 `StringUtils.join` 拼接起来
if (snakeCaseStr == null || snakeCaseStr.isEmpty()) {
return snakeCaseStr;
}
// 核心转换逻辑
String[] words = snakeCaseStr.split("_");
// 如果字符串中没有下划线,直接返回原字符串(或原字符串的小写形式,根据需求定)
if (words.length == 0) {
return snakeCaseStr;
}
// 将第一个单词全部转为小写
StringBuilder result = new StringBuilder(words[0].toLowerCase());
// 从第二个单词开始,将每个单词首字母大写后追加
for (int i = 1; i < words.length; i++) {
result.append(StringUtils.capitalize(words[i].toLowerCase()));
}
return result.toString();
}
}

@ -0,0 +1,14 @@
<?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="org.dromara.ai.mapper.AiFormSettingDetailMapper">
<insert id="insertFormSettingDetailBatch" parameterType="java.util.List">
insert into ai_form_setting_detail (form_setting_id, table_name, field_name, field_desc, form_prop,setting_flag)
values
<foreach collection="list" item="item" separator=",">
(#{item.formSettingId}, #{item.tableName}, #{item.fieldName}, #{item.fieldDesc}, #{item.formProp},#{item.settingFlag})
</foreach>
</insert>
</mapper>

@ -0,0 +1,10 @@
<?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="org.dromara.ai.mapper.AiFormSettingMapper">
<select id="selectTableNameList" resultType="java.lang.String">
select table_name from ai_form_setting where data_name = #{dataName,jdbcType=VARCHAR}
</select>
</mapper>
Loading…
Cancel
Save