|
@@ -0,0 +1,570 @@
|
|
|
+package com.zkqy.system.service.impl;
|
|
|
+
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
+import java.net.URLDecoder;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
+import com.alibaba.fastjson2.JSONArray;
|
|
|
+import com.alibaba.fastjson2.JSONObject;
|
|
|
+import com.zkqy.common.utils.CollectionUtil;
|
|
|
+import com.zkqy.common.utils.DateUtils;
|
|
|
+import com.zkqy.common.utils.StringUtils;
|
|
|
+import com.zkqy.system.entity.vo.MobilePageDesignDataSubTableVo;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import com.zkqy.system.mapper.MobilePageDesignDataMapper;
|
|
|
+import com.zkqy.system.entity.MobilePageDesignData;
|
|
|
+import com.zkqy.system.service.IMobilePageDesignDataService;
|
|
|
+import org.jsoup.select.Elements;
|
|
|
+import org.jsoup.Jsoup;
|
|
|
+import org.jsoup.nodes.Document;
|
|
|
+import org.jsoup.nodes.Element;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 新新页面设计Service业务层处理
|
|
|
+ *
|
|
|
+ * @author zkqy
|
|
|
+ * @date 2025-03-24
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class MobilePageDesignDataServiceImpl implements IMobilePageDesignDataService
|
|
|
+{
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(MobilePageDesignDataServiceImpl.class);
|
|
|
+ private static final String TABLE_TYPE = "zkqyTable";
|
|
|
+ @Autowired
|
|
|
+ private MobilePageDesignDataMapper mobilePageDesignDataMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询新新页面设计
|
|
|
+ *
|
|
|
+ * @param id 新新页面设计主键
|
|
|
+ * @return 新新页面设计
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public MobilePageDesignData selectMobilePageDesignDataById(Long id)
|
|
|
+ {
|
|
|
+ return mobilePageDesignDataMapper.selectMobilePageDesignDataById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询新新页面设计列表
|
|
|
+ *
|
|
|
+ * @param mobilePageDesignData 新新页面设计
|
|
|
+ * @return 新新页面设计
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<MobilePageDesignData> selectMobilePageDesignDataList(MobilePageDesignData mobilePageDesignData)
|
|
|
+ {
|
|
|
+ return mobilePageDesignDataMapper.selectMobilePageDesignDataList(mobilePageDesignData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增新新页面设计
|
|
|
+ *
|
|
|
+ * @param mobilePageDesignData 新新页面设计
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int insertMobilePageDesignData(MobilePageDesignData mobilePageDesignData)
|
|
|
+ {
|
|
|
+ mobilePageDesignData.setCreateTime(DateUtils.getNowDate());
|
|
|
+ return mobilePageDesignDataMapper.insertMobilePageDesignData(mobilePageDesignData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改新新页面设计
|
|
|
+ *
|
|
|
+ * @param mobilePageDesignData 新新页面设计
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int updateMobilePageDesignData(MobilePageDesignData mobilePageDesignData)
|
|
|
+ {
|
|
|
+ mobilePageDesignData.setUpdateTime(DateUtils.getNowDate());
|
|
|
+ return mobilePageDesignDataMapper.updateMobilePageDesignData(mobilePageDesignData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除新新页面设计
|
|
|
+ *
|
|
|
+ * @param ids 需要删除的新新页面设计主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteMobilePageDesignDataByIds(Long[] ids)
|
|
|
+ {
|
|
|
+ return mobilePageDesignDataMapper.deleteMobilePageDesignDataByIds(ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除新新页面设计信息
|
|
|
+ *
|
|
|
+ * @param id 新新页面设计主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteMobilePageDesignDataById(Long id)
|
|
|
+ {
|
|
|
+ return mobilePageDesignDataMapper.deleteMobilePageDesignDataById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getTableNameByPageOptions(String pageOptions) {
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(pageOptions);
|
|
|
+ JSONObject formJsonObject = jsonObject.getJSONObject("form");
|
|
|
+ if (formJsonObject == null){
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ String o = (String) formJsonObject.get("formInDatabase");
|
|
|
+ if (StringUtils.isBlank(o)){
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ return o;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> executeQuerySql(String fullQuerySql) {
|
|
|
+ return mobilePageDesignDataMapper.executeQuerySql(fullQuerySql);
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public int executeUpdateSql(String fullQuerySql) {
|
|
|
+ return mobilePageDesignDataMapper.executeUpdateSql(fullQuerySql);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int executeInsertSql(String fullQuerySql) {
|
|
|
+ return mobilePageDesignDataMapper.executeInsertSql(fullQuerySql);
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public int executeDeleteSql(String fullQuerySql) {
|
|
|
+ return mobilePageDesignDataMapper.executeDeleteSql(fullQuerySql);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String fillUpdateJsonPageData(MobilePageDesignData fromDesignData,MobilePageDesignData toDesignData, Long searchId) {
|
|
|
+ //得到列名 + 表名
|
|
|
+ String primaryTable = findPrimaryTableByPageJson(fromDesignData.getPageJson());
|
|
|
+ String querySqlWhere = String.format(" and %s.id = %d",primaryTable,searchId);
|
|
|
+ String pageJson = toDesignData.getPageJson();
|
|
|
+ JSONArray columns = JSONArray.parseArray(pageJson);
|
|
|
+ // 构建SELECT部分
|
|
|
+ String selectSql = buildSelectClause(columns);
|
|
|
+ // 构建FROM和JOIN部分
|
|
|
+ String fromSql = buildFromClause(columns);
|
|
|
+ // 构建where部分
|
|
|
+ String whereSql = " where " + primaryTable +".del_flag='0'";
|
|
|
+ String querySql = selectSql + " " + fromSql + whereSql ;
|
|
|
+
|
|
|
+ if (StringUtils.isBlank(querySql)){
|
|
|
+ return "输入框绑定字段有问题";
|
|
|
+ }
|
|
|
+ List<Map<String, Object>> mapsList = mobilePageDesignDataMapper.executeQuerySql(querySql);
|
|
|
+ List<Map<String, Object>> mapListUnderLine = CollectionUtil.copyListMapWithCamelToUnderline(mapsList);
|
|
|
+ //因为有id传参,这里只会有1条数据
|
|
|
+ Map<String, Object> maps = mapListUnderLine.get(0);
|
|
|
+ //先解析html,然后往html里面填数据,这里的html需要解码才能使用
|
|
|
+ String htmlDecode = null;
|
|
|
+ try {
|
|
|
+ htmlDecode = URLDecoder.decode(toDesignData.getHtmlData(),"UTF-8");
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ log.info("html的解码失败");
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ Document doc = Jsoup.parse(htmlDecode);
|
|
|
+ Elements scripts = doc.select("script");
|
|
|
+
|
|
|
+ for (Element script : scripts) {
|
|
|
+ String scriptContent = script.html();
|
|
|
+ if (scriptContent.contains("rule: formCreate.parseJson")) {
|
|
|
+ // 提取rule部分 这里后期可能提取方式会变。
|
|
|
+ int startIndex = scriptContent.indexOf("rule: formCreate.parseJson('") + "rule: formCreate.parseJson('".length();
|
|
|
+ int endIndex = scriptContent.indexOf("')", startIndex);
|
|
|
+ String oldRuleJson = scriptContent.substring(startIndex, endIndex);
|
|
|
+ // 里面的每一个对象代表着每一个组件
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(oldRuleJson);
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
+ JSONObject jsonObject = jsonArray.getJSONObject(i);
|
|
|
+ String field = (String) jsonObject.get("searchValue");
|
|
|
+ if (field == null || field.equals("")){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //从结果的map中遍历,得到结果
|
|
|
+// for (Map<String, String> map : maps) {
|
|
|
+ Object fieldValue = maps.get(field);
|
|
|
+ if (fieldValue != null && !String.valueOf(fieldValue).equals("")&& StringUtils.isNotBlank(String.valueOf(fieldValue))){
|
|
|
+ jsonObject.put("value",fieldValue);
|
|
|
+ }
|
|
|
+// }
|
|
|
+ }
|
|
|
+ //替换html的rule数据
|
|
|
+ htmlDecode = htmlDecode.replace(
|
|
|
+ "rule: formCreate.parseJson('" + oldRuleJson + "')",
|
|
|
+ "rule: formCreate.parseJson('" + jsonArray + "')"
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(htmlDecode)){
|
|
|
+ return toDesignData.getHtmlData();
|
|
|
+ }
|
|
|
+ String htmlEncode = "";
|
|
|
+ // 结果加密返回
|
|
|
+ try {
|
|
|
+ htmlEncode = URLEncoder.encode(htmlDecode, "UTF-8");
|
|
|
+ htmlEncode = htmlEncode.replaceAll("\\+", "%20");
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ System.out.println("html加密失败");
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ return htmlEncode;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String mapToInsertSql(Map<String, Object> dataMap, Long pageId) {
|
|
|
+ MobilePageDesignData mobilePageDesignData = selectMobilePageDesignDataById(pageId);
|
|
|
+ String pageJson = mobilePageDesignData.getPageJson();
|
|
|
+ JSONArray pageConfigs = JSON.parseArray(pageJson);
|
|
|
+ for (JSONObject pageConfig : pageConfigs.toJavaList(JSONObject.class)) {
|
|
|
+ JSONArray columns = pageConfig.getJSONArray("columns");
|
|
|
+ String primaryTableName = findPrimaryTable(columns);
|
|
|
+ Map<String, MobilePageDesignDataSubTableVo> subTableMap = findSubTableMap(columns);
|
|
|
+ // 得到哪几个表需要新增数据 根据数据封装成新的map
|
|
|
+ /// key为表名,value为对应字段以及值
|
|
|
+ Map<String, Map<String, Object>> resultMap = new HashMap<>();
|
|
|
+
|
|
|
+ for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
|
|
|
+ String key = entry.getKey();
|
|
|
+ Object value = entry.getValue();
|
|
|
+
|
|
|
+ // 按第一个下划线分割key
|
|
|
+ int underscoreIndex = key.indexOf('@');
|
|
|
+ if (underscoreIndex > 0) {
|
|
|
+ String prefix = key.substring(0, underscoreIndex);
|
|
|
+ resultMap.computeIfAbsent(prefix, k -> new HashMap<>())
|
|
|
+ .put(key.substring(underscoreIndex + 1), value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //构建 构建insert
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ Map<String, Object> primaryMap = resultMap.get(primaryTableName);
|
|
|
+ resultMap.remove(primaryTableName);
|
|
|
+ List<String> extraList = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, Map<String, Object>> entry : resultMap.entrySet()) {
|
|
|
+ String tableName = entry.getKey(); // 如 "stu"
|
|
|
+ Map<String, Object> fieldMap = entry.getValue();
|
|
|
+
|
|
|
+ // 收集字段名和值(不再截断字段名前缀)
|
|
|
+ List<String> fields = new ArrayList<>();
|
|
|
+ List<String> values = new ArrayList<>();
|
|
|
+
|
|
|
+ for (Map.Entry<String, Object> fieldEntry : fieldMap.entrySet()) {
|
|
|
+ String fieldName = fieldEntry.getKey(); // 直接使用完整字段名,如 "stu_name"
|
|
|
+ Object fieldValue = fieldEntry.getValue();
|
|
|
+ fields.add(fieldName);
|
|
|
+ values.add(processFieldValue(fieldValue));
|
|
|
+ }
|
|
|
+ // 构建 INSERT SQL
|
|
|
+ sqlBuilder.append("INSERT INTO ")
|
|
|
+ .append("{DBNAME}.").append(tableName)
|
|
|
+ .append(" (")
|
|
|
+ .append(String.join(", ", fields))
|
|
|
+ .append(") VALUES (")
|
|
|
+ .append(String.join(", ", values))
|
|
|
+ .append(");\n");
|
|
|
+ MobilePageDesignDataSubTableVo subTableVo = subTableMap.get(tableName);
|
|
|
+ // 得到最新的一个id,最后主表关联的时候会用到
|
|
|
+ extraList.add(subTableVo.getPrimaryKey());
|
|
|
+ sqlBuilder.append("SET @").append(subTableVo.getPrimaryKey()).append("= LAST_INSERT_ID();\n");
|
|
|
+ }
|
|
|
+ sqlBuilder.append(generateInsertSql(primaryTableName, primaryMap, extraList));
|
|
|
+ return sqlBuilder.toString();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String mapToUpdateSql2(Map<String, Object> dataMap, Long pageId){
|
|
|
+ // 查找出所有需要修改的子表 和 主表
|
|
|
+ MobilePageDesignData mobilePageDesignData = selectMobilePageDesignDataById(pageId);
|
|
|
+ String pageJson = mobilePageDesignData.getPageJson();
|
|
|
+ JSONArray pageConfigs = JSON.parseArray(pageJson);
|
|
|
+ String fullUpdateSql = "";
|
|
|
+ for (JSONObject pageConfig : pageConfigs.toJavaList(JSONObject.class)) {
|
|
|
+ JSONArray columns = pageConfig.getJSONArray("columns");
|
|
|
+ String primaryTable = findPrimaryTable(columns);
|
|
|
+ Map<String, MobilePageDesignDataSubTableVo> subTableMap = findSubTableMap(columns);
|
|
|
+ // 分三段拼接出 update set 和 where 语法
|
|
|
+ List<String> collect = subTableMap.keySet().stream().collect(Collectors.toList());
|
|
|
+ StringBuilder update = new StringBuilder("UPDATE ")
|
|
|
+ .append("{DBNAME}.").append(primaryTable);
|
|
|
+ collect.forEach(tableName -> update.append(",").append("{DBNAME}.").append(tableName));
|
|
|
+ String updateSql = update.toString();
|
|
|
+ //从datamap中提取出 where判断的id
|
|
|
+ Number id = (Number) dataMap.get(primaryTable + "@id");
|
|
|
+ dataMap.remove(primaryTable + "@id");
|
|
|
+ Map<String, Object> stringObjectMap = convertKeysFromFirstUnderLineToDot(dataMap);
|
|
|
+ String setSql = " SET " + stringObjectMap.entrySet().stream()
|
|
|
+ .map(entry -> entry.getKey() + "='" + entry.getValue()+"'")
|
|
|
+ .collect(Collectors.joining(", ")); // 自动处理逗号分隔
|
|
|
+ // 拼接 where条件 (关联的表 + 主键该行的id)
|
|
|
+ String idSql = primaryTable +".id" +"=" + id;
|
|
|
+ String whereSql = subTableMap.entrySet().stream()
|
|
|
+ .map(entry -> primaryTable + "." + entry.getValue().getPrimaryKey() +
|
|
|
+ "=" + entry.getKey() + "." + entry.getValue().getSubKey())
|
|
|
+ .collect(Collectors.joining(" and ")) ;
|
|
|
+ whereSql = " where " + (StringUtils.isBlank(whereSql) ? idSql : whereSql + " and " + idSql);
|
|
|
+ fullUpdateSql = updateSql + setSql + whereSql;
|
|
|
+ }
|
|
|
+ return fullUpdateSql;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String mapToDeleteSql(Long lineId, Long pageId) {
|
|
|
+ // 查找出所有需要修改的子表 和 主表
|
|
|
+ MobilePageDesignData mobilePageDesignData = selectMobilePageDesignDataById(pageId);
|
|
|
+ String pageJson = mobilePageDesignData.getPageJson();
|
|
|
+ JSONArray pageConfigs = JSON.parseArray(pageJson);
|
|
|
+ String fullUpdateSql = "";
|
|
|
+ for (JSONObject pageConfig : pageConfigs.toJavaList(JSONObject.class)) {
|
|
|
+ JSONArray columns = pageConfig.getJSONArray("columns");
|
|
|
+ String primaryTable = findPrimaryTable(columns);
|
|
|
+ Map<String, MobilePageDesignDataSubTableVo> subTableMap = findSubTableMap(columns);
|
|
|
+ // 分三段拼接出 update set 和 where 语法
|
|
|
+ List<String> collect = subTableMap.keySet().stream().collect(Collectors.toList());
|
|
|
+ StringBuilder update = new StringBuilder("UPDATE ")
|
|
|
+ .append("{DBNAME}.").append(primaryTable);
|
|
|
+ collect.forEach(tableName -> update.append(",").append("{DBNAME}.").append(tableName));
|
|
|
+ String updateSql = update.toString();
|
|
|
+ String DELFLAG = ".del_flag = '2' ";
|
|
|
+ String setSQL = " SET " + primaryTable + DELFLAG + " ";
|
|
|
+ subTableMap.entrySet().stream()
|
|
|
+ .map(entry -> setSQL + entry.getKey() + DELFLAG)
|
|
|
+ .collect(Collectors.joining(", "));
|
|
|
+ // 拼接 where条件 (关联的表 + 主键该行的id)
|
|
|
+ String idSql = primaryTable +".id" +"=" + lineId;
|
|
|
+ String whereSql = subTableMap.entrySet().stream()
|
|
|
+ .map(entry -> primaryTable + "." + entry.getValue().getPrimaryKey() +
|
|
|
+ "=" + entry.getKey() + "." + entry.getValue().getSubKey())
|
|
|
+ .collect(Collectors.joining(" and "));
|
|
|
+ whereSql = " where " + (StringUtils.isBlank(whereSql) ? idSql : whereSql + " and " + idSql);
|
|
|
+ fullUpdateSql = updateSql + setSQL + whereSql;
|
|
|
+ }
|
|
|
+ return fullUpdateSql;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String mapToQuerySql(String pageJson) {
|
|
|
+ JSONArray pageConfigs = JSON.parseArray(pageJson);
|
|
|
+ String querySql = "";
|
|
|
+ for (JSONObject pageConfig : pageConfigs.toJavaList(JSONObject.class)) {
|
|
|
+ JSONArray columns = pageConfig.getJSONArray("columns");
|
|
|
+ if (columns == null || columns.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建SELECT部分
|
|
|
+ String selectSql = buildSelectClause(columns);
|
|
|
+ // 构建FROM和JOIN部分
|
|
|
+ String fromSql = buildFromClause(columns);
|
|
|
+ // 构建where部分
|
|
|
+ String primaryTable = findPrimaryTable(columns);
|
|
|
+ String whereSql = " where " + primaryTable +".del_flag='0'";
|
|
|
+ querySql = selectSql + " " + fromSql + whereSql ;
|
|
|
+ }
|
|
|
+ return querySql;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void fillPageIdToHtmlData(MobilePageDesignData mobilePageDesignData) {
|
|
|
+ Long id = mobilePageDesignData.getId();
|
|
|
+ String htmlData = mobilePageDesignData.getHtmlData();
|
|
|
+ htmlData = URLDecoder.decode(htmlData);
|
|
|
+ Pattern pattern = Pattern.compile("options:\\s*formCreate\\.parseJson\\('(.*?)'\\)");
|
|
|
+ Matcher matcher = pattern.matcher(htmlData);
|
|
|
+
|
|
|
+ if (!matcher.find()) {
|
|
|
+ throw new IllegalArgumentException("无法在HTML中找到options JSON");
|
|
|
+ }
|
|
|
+
|
|
|
+ String oldJsonStr = matcher.group(1);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(oldJsonStr);
|
|
|
+ JSONObject form = jsonObject.getJSONObject("form");
|
|
|
+ form.put("pageId",id);
|
|
|
+ jsonObject.put("form",form);
|
|
|
+ String newJsonStr = jsonObject.toString();
|
|
|
+ String newHtmlData = htmlData.replace(oldJsonStr,newJsonStr);
|
|
|
+ String encodeHtml = "";
|
|
|
+ try {
|
|
|
+ encodeHtml = URLEncoder.encode(newHtmlData, "UTF-8");
|
|
|
+ encodeHtml = encodeHtml.replaceAll("\\+", "%20");
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ mobilePageDesignData.setHtmlData(encodeHtml);
|
|
|
+ // 给pageOption里面也加上
|
|
|
+ mobilePageDesignData.setPageOptions(newJsonStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String buildSelectClause(JSONArray columns) {
|
|
|
+ StringBuilder selectBuilder = new StringBuilder("select ");
|
|
|
+ for (int i = 0; i < columns.size(); i++) {
|
|
|
+ JSONObject column = columns.getJSONObject(i);
|
|
|
+ String tableName = column.getString("tableName");
|
|
|
+ String showValue = column.getString("showValue");
|
|
|
+ String searchValue = column.getString("searchValue");
|
|
|
+ selectBuilder.append("{DBNAME}.").append(tableName).append(".").append(showValue)
|
|
|
+ .append(" as '").append(searchValue).append("'");
|
|
|
+ if (i < columns.size() - 1) {
|
|
|
+ selectBuilder.append(",");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return selectBuilder.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private String buildFromClause(JSONArray columns) {
|
|
|
+ String primaryTable = findPrimaryTable(columns);
|
|
|
+ if (primaryTable == null) {
|
|
|
+ return ""; // 或者抛出异常,根据业务需求决定
|
|
|
+ }
|
|
|
+
|
|
|
+ StringBuilder fromBuilder = new StringBuilder(" from ").append("{DBNAME}.").append(primaryTable);
|
|
|
+
|
|
|
+ for (JSONObject column : columns.toJavaList(JSONObject.class)) {
|
|
|
+ String tableType = column.getString("tableType");
|
|
|
+ if (!"sub".equals(tableType)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ String tableName = column.getString("tableName");
|
|
|
+ String subKey = column.getString("subKey");
|
|
|
+ String primaryKey = column.getString("primaryKey");
|
|
|
+
|
|
|
+ fromBuilder.append(" left join ")
|
|
|
+ .append("{DBNAME}.").append(tableName)
|
|
|
+ .append(" on ")
|
|
|
+ .append(tableName).append(".").append(subKey)
|
|
|
+ .append("=")
|
|
|
+ .append(primaryTable).append(".").append(primaryKey)
|
|
|
+ .append(" AND ").append(tableName).append(".del_flag = '0'");
|
|
|
+ }
|
|
|
+ return fromBuilder.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private String buildWhereClause(JSONArray columns){
|
|
|
+ StringBuilder whereBuilder = new StringBuilder();
|
|
|
+ HashSet<String> tableSet = new HashSet<>();
|
|
|
+ for (JSONObject column : columns.toJavaList(JSONObject.class)) {
|
|
|
+ String tableName = column.getString("tableName");
|
|
|
+ tableSet.add(tableName);
|
|
|
+ }
|
|
|
+ String conditions = tableSet.stream()
|
|
|
+ .map(tableName -> "{DBNAME}." + tableName + ".del_flag = '0'")
|
|
|
+ .collect(Collectors.joining(" AND "));
|
|
|
+ whereBuilder.append(" where ").append(conditions);
|
|
|
+ return whereBuilder.toString();
|
|
|
+ }
|
|
|
+ private String findPrimaryTableByPageJson(String pageJson) {
|
|
|
+ String primaryTable = "";
|
|
|
+ JSONArray pageConfigs = JSON.parseArray(pageJson);
|
|
|
+ for (JSONObject pageConfig : pageConfigs.toJavaList(JSONObject.class)) {
|
|
|
+ JSONArray columns = pageConfig.getJSONArray("columns");
|
|
|
+ primaryTable = findPrimaryTable(columns);
|
|
|
+ }
|
|
|
+ return primaryTable;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据内部的columns获取主表
|
|
|
+ private String findPrimaryTable(JSONArray columns) {
|
|
|
+ for (JSONObject column : columns.toJavaList(JSONObject.class)) {
|
|
|
+ if ("primary".equals(column.getString("tableType"))) {
|
|
|
+ return column.getString("tableName");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ // 根据内部的columns获取子表以及需要关联的主键id和字段
|
|
|
+ public Map<String, MobilePageDesignDataSubTableVo> findSubTableMap(JSONArray columns) {
|
|
|
+ Map<String, MobilePageDesignDataSubTableVo> result = new HashMap<>();
|
|
|
+ for (int i = 0; i < columns.size(); i++) {
|
|
|
+ JSONObject column = columns.getJSONObject(i);
|
|
|
+ // 只处理 tableType 为 "sub" 的列
|
|
|
+ if ("sub".equals(column.getString("tableType"))) {
|
|
|
+ String tableName = column.getString("tableName");
|
|
|
+ // 如果该表名尚未存入结果,则添加
|
|
|
+ if (!result.containsKey(tableName)) {
|
|
|
+ MobilePageDesignDataSubTableVo subTableVo = new MobilePageDesignDataSubTableVo();
|
|
|
+ subTableVo.setSubKey(column.getString("subKey"));
|
|
|
+ subTableVo.setPrimaryKey(column.getString("primaryKey"));
|
|
|
+ result.put(tableName, subTableVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ public static String generateInsertSql(
|
|
|
+ String tableName,
|
|
|
+ Map<String, Object> dataMap,
|
|
|
+ List<String> extraFields) {
|
|
|
+
|
|
|
+ // 合并所有字段名(dataMap 的 key + extraFields)
|
|
|
+ List<String> allFields = new ArrayList<>(dataMap.keySet());
|
|
|
+ allFields.addAll(extraFields);
|
|
|
+
|
|
|
+ // 处理值:
|
|
|
+ // 1. dataMap 的值直接处理
|
|
|
+ // 2. extraFields 的值前加 @
|
|
|
+ List<String> allValues = new ArrayList<>();
|
|
|
+ for (Object value : dataMap.values()) {
|
|
|
+ allValues.add(processFieldValue(value));
|
|
|
+ }
|
|
|
+ for (String field : extraFields) {
|
|
|
+ allValues.add("@" + field); // 额外字段的值加 @
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建 SQL
|
|
|
+ return String.format(
|
|
|
+ "INSERT INTO %s (%s) VALUES (%s);",
|
|
|
+ "{DBNAME}."+ tableName,
|
|
|
+ String.join(", ", allFields),
|
|
|
+ String.join(", ", allValues)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ private static String processFieldValue(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return "NULL";
|
|
|
+ }
|
|
|
+ // 基本类型处理
|
|
|
+ if (value instanceof String) {
|
|
|
+ return "'" + escapeSqlString(value.toString()) + "'";
|
|
|
+ } else if (value instanceof Number || value instanceof Boolean) {
|
|
|
+ return value.toString();
|
|
|
+ }
|
|
|
+ return "NULL";
|
|
|
+ }
|
|
|
+ private static String escapeSqlString(String str) {
|
|
|
+ return str.replace("'", "''");
|
|
|
+ }
|
|
|
+ public Map<String, Object> convertKeysFromFirstUnderLineToDot(Map<String, Object> dataMap) {
|
|
|
+ Map<String, Object> convertedMap = new HashMap<>();
|
|
|
+ for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
|
|
|
+ String originalKey = entry.getKey();
|
|
|
+ String convertedKey = convertKey(originalKey);
|
|
|
+ convertedMap.put(convertedKey, entry.getValue());
|
|
|
+ }
|
|
|
+ return convertedMap;
|
|
|
+ }
|
|
|
+ private String convertKey(String key) {
|
|
|
+ int firstUnderscoreIndex = key.indexOf('@');
|
|
|
+ if (firstUnderscoreIndex != -1) {
|
|
|
+ return key.substring(0, firstUnderscoreIndex) + "." + key.substring(firstUnderscoreIndex + 1);
|
|
|
+ }
|
|
|
+ return key; // 如果没有下划线,保持原样
|
|
|
+ }
|
|
|
+}
|