package com.zy.common.web; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.controller.AbstractBaseController; import com.core.exception.CoolException; import com.zy.asrs.entity.Node; import com.zy.asrs.entity.Tag; import com.zy.asrs.service.NodeService; import com.zy.asrs.service.TagService; import com.zy.system.entity.User; import com.zy.system.entity.UserLogin; import com.zy.system.service.UserLoginService; import com.zy.system.service.UserService; import io.swagger.annotations.ApiModelProperty; import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.math.BigDecimal; import java.math.BigInteger; import java.time.temporal.Temporal; import java.util.*; /** * Created by vincent on 2019-09-09 */ public class BaseController extends AbstractBaseController { protected static final String RANGE_TIME_LINK = " - "; @Autowired protected HttpServletRequest request; @Autowired private UserService userService; @Autowired private TagService tagService; @Autowired private NodeService nodeService; @Autowired private UserLoginService userLoginService; protected Node getOriginNode(){ Node node = nodeService.getTop(); if (node == null) { throw new CoolException("库区数据错误"); } return node; } protected Long getHostId(){ if (getUserId() == 9527) { return null; } User user = getUser(); if (user.getRoleId() == 1) { String hostId = String.valueOf(request.getAttribute("hostId")); if (Cools.isEmpty(hostId)) { UserLogin userLogin = userLoginService.selectOne(new EntityWrapper().eq("user_id", user.getId())); if (userLogin != null) { return userLogin.getHostId(); } } return Long.parseLong(hostId); } else { return user.getHostId(); } } protected Long getUserId(){ return Long.parseLong(String.valueOf(request.getAttribute("userId"))); } protected User getUser(){ User user = userService.selectById(getUserId()); if (null == user) { throw new CoolException(BaseRes.DENIED); } return user; } protected String getComment(Class cls, String fieldName){ Field[] fields = Cools.getAllFields(cls); for (Field field : fields){ if (fieldName.equals(field.getName())){ return field.getAnnotation(ApiModelProperty.class).value(); } } return ""; } protected Tag getOriginTag(){ return tagService.getTop(); } protected void hostEq(EntityWrapper wrapper){ Long hostId = getHostId(); if (hostId != null) { wrapper.eq("host_id", hostId); } } /** * 分页组装 * @param pageNumber * @param pageSize * @param map * @param cls * @param * @return */ protected Page toPage(Integer pageNumber, Integer pageSize, Map map, Class cls){ // 分页索引和单页数量组装 pageNumber = Optional.ofNullable(pageNumber).orElse(1); pageSize = Optional.ofNullable(pageSize).orElse(10); Page page = new Page<>(pageNumber, pageSize); map.put("pageNumber", pageNumber); map.put("pageSize", pageSize); // 全字段模糊搜索 todo if (!Cools.isEmpty(map.get("condition"))) { Set columns = new HashSet<>(); for (Field field : Cools.getAllFields(cls)){ if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers()) || Modifier.isTransient(field.getModifiers())){ continue; } String column = null; if (field.isAnnotationPresent(TableField.class)) { column = field.getAnnotation(TableField.class).value(); } if (Cools.isEmpty(column)) { column = field.getName(); } if (!map.keySet().contains(column)) { columns.add(column); } } columns.forEach(col->map.put(col, map.get("condition"))); } page.setCondition(map); return page; } /** * 全字段模糊搜索 * @param cls 模型类 * @param set 排除字段集合 * @param condition 搜索内容 */ protected void allLike(Class cls, Set set, EntityWrapper wrapper, String condition){ if (Cools.isEmpty(condition)) { return; } String keyword = String.valueOf(condition).trim(); if (keyword.isEmpty()) { return; } boolean appended = false; for (Field field :Cools.getAllFields(cls)){ if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers()) || Modifier.isTransient(field.getModifiers())){ continue; } String column = null; if (field.isAnnotationPresent(TableField.class)) { column = field.getAnnotation(TableField.class).value(); } if (Cools.isEmpty(column)) { column = field.getName(); } if (!set.contains(column)) { if (supportsLikeSearch(field.getType())) { if (!appended) { wrapper.andNew(); } else { wrapper.or(); } wrapper.like(column, keyword); appended = true; continue; } Object exactValue = parseExactSearchValue(field.getType(), keyword); if (exactValue != null) { if (!appended) { wrapper.andNew(); } else { wrapper.or(); } wrapper.eq(column, exactValue); appended = true; } } } } private boolean supportsLikeSearch(Class fieldType) { return CharSequence.class.isAssignableFrom(fieldType) || fieldType == Character.class || fieldType == char.class || Date.class.isAssignableFrom(fieldType) || Temporal.class.isAssignableFrom(fieldType); } private Object parseExactSearchValue(Class fieldType, String keyword) { if (!isNumericField(fieldType)) { return null; } try { BigDecimal numericValue = new BigDecimal(keyword); if (fieldType == Integer.class || fieldType == int.class) { return numericValue.stripTrailingZeros().scale() <= 0 ? numericValue.intValueExact() : null; } if (fieldType == Long.class || fieldType == long.class) { return numericValue.stripTrailingZeros().scale() <= 0 ? numericValue.longValueExact() : null; } if (fieldType == Short.class || fieldType == short.class) { return numericValue.stripTrailingZeros().scale() <= 0 ? numericValue.shortValueExact() : null; } if (fieldType == Byte.class || fieldType == byte.class) { return numericValue.stripTrailingZeros().scale() <= 0 ? numericValue.byteValueExact() : null; } if (fieldType == BigInteger.class) { return numericValue.stripTrailingZeros().scale() <= 0 ? numericValue.toBigIntegerExact() : null; } if (fieldType == Float.class || fieldType == float.class) { float value = numericValue.floatValue(); return Float.isFinite(value) ? value : null; } if (fieldType == Double.class || fieldType == double.class) { double value = numericValue.doubleValue(); return Double.isFinite(value) ? value : null; } if (fieldType == BigDecimal.class) { return numericValue; } } catch (Exception ignored) { return null; } return null; } private boolean isNumericField(Class fieldType) { return Number.class.isAssignableFrom(fieldType) || fieldType == byte.class || fieldType == short.class || fieldType == int.class || fieldType == long.class || fieldType == float.class || fieldType == double.class; } }