package com.sysu.admin.controller.crop; import com.mysql.jdbc.StringUtils; import com.querydsl.core.types.Projections; import com.querydsl.core.types.QBean; import com.querydsl.core.types.QList; import com.querydsl.jpa.impl.JPAQuery; import com.sysu.admin.controller.city.*; import com.sysu.admin.controller.crop.images.CropImage; import com.sysu.admin.controller.crop.images.CropImageService; import com.sysu.admin.controller.crop.images.ImageType; import com.sysu.admin.controller.crop.range.AutoTableNameInterceptor; import com.sysu.admin.controller.crop.range.LandRangeIndexService; import com.sysu.admin.controller.geo.land.LandTaskStatus; import com.sysu.admin.support.base.BaseService; import com.sysu.admin.support.system.config.ConfigContext; import com.sysu.admin.support.system.user.User; import com.sysu.admin.utils.TextUtil; import com.sysu.admin.utils.file.FileUtil; import com.sysu.admin.utils.shape.GeoCastUtil; import com.sysu.admin.utils.shape.ShapeReader; import com.xiesx.fastboot.base.result.BaseResult; import com.xiesx.fastboot.core.jpa.JpaPlusRepository; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.ObjectUtils; import org.geolatte.geom.crs.CoordinateReferenceSystems; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.*; @Service public class CropLandService extends BaseService { @Autowired CropImageService cropImageService; @Autowired ConfigContext configContext; @Autowired ProvinceRepository provinceRepository; @Autowired CityRepository cityRepository; @Autowired DistrictRepository districtRepository; @Autowired LandRangeIndexService landRangeIndexService; @Override public CropLand findOne(Long aLong) { AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(aLong)); CropLand bean = super.findOne(aLong); return bean; } @Override public S save(S entity) { AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(entity.getId())); return super.save(entity); } public List findByBuffer(Double[] point, Integer meter){ AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(point)); double degree = meter / (2 * Math.PI * 6371004) * 360; return mCropPointRepository.findByBufferAndStatus("Point("+point[0]+" "+point[1]+")",degree, new Integer[]{ LandTaskStatus.published.ordinal(),LandTaskStatus.receive.ordinal() }); } public List findIdAndNameByExecutor(Long executor){ QCropLand qCropLand = QCropLand.cropLand; QBean selectBean = Projections.fields(qCropLand, qCropLand.id, qCropLand.name, qCropLand.updateDate); JPAQuery jpaQuery = mJPAQueryFactory.select(selectBean) .from(qCropLand) .where(qCropLand.executor.eq(executor)); return jpaQuery.fetch(); } public CropLand findByPoint(Double[] point){ CropLand cityLand = mCropLandRepository.findByPoint("Point("+point[0]+" "+point[1]+")"); return cityLand; } public String getBuffer(Double[] point, Integer meter){ double degree = meter / (2 * Math.PI * 6371004) * 360; return mCropPointRepository.getBuffer("Point("+point[0]+" "+point[1]+")", degree); } public List findCropLandNoGeomByTableNamesAndBBox(String tableNames, Double x1, Double y1, Double x2, Double y2){ String wkt = bboxToWkt(x1, y1 , x2, y2); AutoTableNameInterceptor.myTable.set(tableNames); List cropLandList = mCropPointRepository.findCropLandNoGeomByWkt(wkt); return cropLandList; } @Transactional public void updateStatus(Long id, Integer status, Long updateUserId){ CropLand bean = mCropLandRepository.findOne(id); bean.setStatus(status); if(status.equals(LandTaskStatus.receive.ordinal())) { bean.setReceiveDate(new Date()); bean.setReceiver(updateUserId); } mCropLandRepository.save(bean); } @Transactional public int updateCenterPoint(Long id){ return mCropLandRepository.updateCenterPoint(id); } public Point getCenterPoint(Long id){ return (Point)GeoCastUtil.wktToGeom(mCropLandRepository.getCenterPoint(id)); } public Point getCenterPoint(Geometry geometry){ geometry.setSRID(4326); return (Point)GeoCastUtil.wktToGeom(mCropLandRepository.getCenterPoint(geometry)); } public void setCity(CropLand bean, District district){ bean.setProvince(((int)(district.getCode() / 10000)) * 10000); bean.setCity(((int)(district.getCode() / 100)) * 100); bean.setDistrict(district.getCode()); } @Transactional public void saveCropAndImages(CropLand bean){ CropImage fay = bean.getFay(); CropImage center = bean.getCenter(); CropImage near = bean.getNear(); saveImage(fay, bean.getId(), ImageType.fay, bean.getExecutor()); saveImage(center, bean.getId(), ImageType.center, bean.getExecutor()); saveImage(near, bean.getId(), ImageType.near, bean.getExecutor()); mCropLandRepository.save(bean); } private void saveImage(CropImage image, Long cropId, ImageType type, Long userId){ if(ObjectUtils.isNotEmpty(image)) { cropImageService.deleteAll(cropImageService.findByCropIdAndType(cropId, type)); image.setType(type.ordinal()); image.setFilename(decryptByBase64(image.getBase64(), type.name(), userId)); image.setCropId(cropId); cropImageService.save(image); } } /** * 把base64转化为文件. * * @param base64 base64 * @return boolean isTrue */ public String decryptByBase64(String base64, String sign, Long userId) { if (StringUtils.isNullOrEmpty(base64)) { return null; } int index = base64.indexOf(","); if(index > -1){ base64 = base64.substring(index + 1); } String imageDirPath = configContext.getImageDirPath(); String newFileName = System.currentTimeMillis() + "_" + userId+"_"+sign+".jpg"; try { Files.write(Paths.get(imageDirPath+ newFileName), Base64.decodeBase64(base64), StandardOpenOption.CREATE); } catch (IOException e) { e.printStackTrace(); } return newFileName; } public static String bboxToWkt(Double x1, Double y1, Double x2, Double y2){ return "POLYGON (("+x1+" "+y1+", "+x1+" "+y2+", "+x2+" "+y2+", "+x2+" "+y1+", "+x1+" "+y1+"))"; } @Transactional public void exec(String sql){ mEntityManager.createNativeQuery(sql).executeUpdate(); } @Override public JpaPlusRepository r() { return mCropLandRepository; } }