package com.product.admin.service; import com.google.common.collect.Maps; import com.product.admin.config.CmnConst; import com.product.admin.entity.FaceListEntity; import com.product.admin.service.idel.ISystemFaceService; import com.product.common.lang.StringUtils; import com.product.core.cache.util.RedisUtil; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.core.service.support.AbstractBaseService; import com.product.core.service.support.QueryFilterService; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.core.transfer.Transactional; import com.product.util.BaseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; /** * 表单配置业务层 * * @author cheng */ @Service public class SystemFaceService extends AbstractBaseService implements ISystemFaceService { /** * 缓存起始Key */ public static final String FACE_LIST_KEY = "face:fieldList:"; @Autowired QueryFilterService queryFilterService; @Autowired RolesService rolesService; /** * 获取模块功能树 * * @return * @throws BaseException */ @Override public DataTableEntity getModuleFunctionTree() throws BaseException { return rolesService.getModuleFunctions(); } /** * 表单列表 * * @param fse * @return * @throws BaseException */ @Override public DataTableEntity getFaceList(FieldSetEntity fse) throws BaseException { String queryFilter = queryFilterService.getQueryFilter(fse); String filter = fse.getString("filter"); if (StringUtils.isEmpty(filter)) { filter = queryFilter; } else if (!StringUtils.isEmpty(queryFilter)) { filter += " and (" + queryFilter + ") "; } DataTableEntity dataTableEntity = getBaseDao().listTable(CmnConst.PRODUCT_SYS_FACE, filter, new Object[]{}, null, null, fse.getInteger(CmnConst.PAGESIZE), fse.getInteger(CmnConst.CPAGE)); getBaseDao().loadPromptData(dataTableEntity); return dataTableEntity; } /** * 获取表单详情根据uuid * * @param fse * @return * @throws BaseException */ @Override public FieldSetEntity getFaceInfoByUuid(FieldSetEntity fse) throws BaseException { return getBaseDao().getFieldSetEntity(CmnConst.PRODUCT_SYS_FACE, fse.getUUID(), true); } /** * 保存表单详情根据uuid * * @param fse * @return * @throws BaseException */ @Override @Transactional public String saveFaceInfo(FieldSetEntity fse) throws BaseException { BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fse); Map subData = fse.getSubData(); subData.forEach((k, v) -> { BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), v); }); getBaseDao().saveFieldSetEntity(fse); this.initialFieldCache(fse.getUUID()); return fse.getUUID(); } /** * 删除表单详情根据uuid * * @param uuids * @return * @throws BaseException */ @Override @Transactional public boolean deleteFaceInfoByUuids(String[] uuids) throws BaseException { boolean delete = getBaseDao().delete(CmnConst.PRODUCT_SYS_FACE, uuids); deleteFieldCache(uuids); return delete; } @Override public FaceListEntity getFaceFieldList(String face_uuid) throws BaseException { if (StringUtils.isEmpty(face_uuid)) { return null; } if (!RedisUtil.exists(this.FACE_LIST_KEY + face_uuid)) { this.initialFieldCache(face_uuid); } FaceListEntity faceListEntity = (FaceListEntity) RedisUtil.get(this.FACE_LIST_KEY + face_uuid); if (faceListEntity == null) { initialFieldCache(face_uuid); faceListEntity = (FaceListEntity) RedisUtil.get(this.FACE_LIST_KEY + face_uuid); } return faceListEntity; } /** * 获取列表过滤条件 * * @param aliasTable 表别名集合 * @param face_uuid 表单uuid * @param val 模糊搜索值 * @return sql过滤条件 * @throws BaseException */ @Override public String getListFilter(Map> aliasTable, Map> aliasField, String face_uuid, String val) throws BaseException { if (StringUtils.isEmpty(val)) { return ""; } FaceListEntity face = (FaceListEntity) RedisUtil.get(this.FACE_LIST_KEY + face_uuid); if (face != null) { String tableAlias = null; String tableName = face.getTableName(); List t = aliasTable.get(tableName); if (t != null && t.size() > 0) { tableAlias = t.get(0); } Map> params = face.getFilters(tableAlias, aliasField); List fieldNames = params.get("fields"); List filters = params.get("filter"); String filter = ""; for (int i = 0; i < fieldNames.size(); i++) { if (i > 0) { filter += " or "; } filter += " " + fieldNames.get(i) + " LIKE BINARY concat('%','" + val + "','%')"; } for (int i = 0; i < filters.size(); i++) { if (!"".equals(filter)) { filter += " or "; } filter += filters.get(i).replace("~val~", val); } return "".equals(filter) ? "" : "( " + filter + " )"; } return ""; } /** * 删除表单字段缓存根据表单uuid * * @param uuid */ private void deleteFieldCache(String[] uuid) { if (uuid != null && uuid.length > 0) { String[] keys = new String[uuid.length]; for (int i = 0; i < uuid.length; i++) { keys[i] = this.FACE_LIST_KEY + uuid[i]; } if (keys.length > 0) { RedisUtil.del(keys); } } } /** * 初始化表单字段缓存 * * @param faceUuids 表单uuid 多个用逗号分割 传入null 则初始化所有 */ private void initialFieldCache(String faceUuids) { StringBuilder sql = new StringBuilder(); sql.append(" SELECT "); sql.append(" ifnull(d.field_name,a.field_name) field_name,a.field_alias, "); sql.append(" d.field_reference, "); sql.append(" d.uuid field_uuid, "); sql.append(" b.face_name, "); sql.append(" b.table_uuid, "); sql.append(" a.face_uuid, "); sql.append(" column_name, "); sql.append(" column_width, "); sql.append(" sequence "); sql.append(" FROM "); sql.append(" product_sys_face_list a "); sql.append(" RIGHT JOIN product_sys_face b ON a.face_uuid = b.uuid "); sql.append(" LEFT JOIN product_sys_datamodel_field d ON a.field_name = d.field_name and b.table_uuid=d.table_uuid"); sql.append(" WHERE "); sql.append(" a.is_used = 1 "); Object[] objects = {}; if (!StringUtils.isEmpty(faceUuids)) { sql.append(" AND ( "); objects = faceUuids.split(","); sql.append(BaseUtil.buildQuestionMarkFilter("b.uuid", objects.length, true)); sql.append(" ) "); } sql.append(" ORDER BY face_uuid,sequence "); DataTableEntity dt = getBaseDao().listTable(sql.toString(), objects); Map faceListEntityMap = Maps.newHashMap(); if (!BaseUtil.dataTableIsEmpty(dt)) { for (int i = 0; i < dt.getRows(); i++) { String face_uuid = dt.getString(i, "face_uuid"); FaceListEntity faceListEntity = faceListEntityMap.get(face_uuid); if (faceListEntity == null) { faceListEntity = new FaceListEntity(); faceListEntity.setFaceName(face_uuid); faceListEntity.setTableUuid(dt.getString(i, CmnConst.TABLE_UUID)); faceListEntity.setUuid(dt.getString(i, "face_uuid")); faceListEntityMap.put(face_uuid, faceListEntity); } faceListEntity.addField(dt.getString(i, CmnConst.FIELD_NAME), dt.getString(i, "field_uuid"), dt.getString(i, "column_name"), dt.getString(i, "column_width"), dt.getInt(i, CmnConst.SEQUENCE), dt.getString(i, "field_reference")); } if (faceListEntityMap.size() > 0) { faceListEntityMap.forEach((f, m) -> { RedisUtil.set(FACE_LIST_KEY + m.getUuid(), m); }); } } } }