CropLandService.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.sysu.admin.controller.crop;
  2. import com.mysql.jdbc.StringUtils;
  3. import com.querydsl.core.types.Projections;
  4. import com.querydsl.core.types.QBean;
  5. import com.querydsl.core.types.QList;
  6. import com.querydsl.jpa.impl.JPAQuery;
  7. import com.sysu.admin.controller.city.*;
  8. import com.sysu.admin.controller.crop.images.CropImage;
  9. import com.sysu.admin.controller.crop.images.CropImageService;
  10. import com.sysu.admin.controller.crop.images.ImageType;
  11. import com.sysu.admin.controller.crop.range.AutoTableNameInterceptor;
  12. import com.sysu.admin.controller.crop.range.LandRangeIndexService;
  13. import com.sysu.admin.controller.geo.land.LandTaskStatus;
  14. import com.sysu.admin.support.base.BaseService;
  15. import com.sysu.admin.support.system.config.ConfigContext;
  16. import com.sysu.admin.support.system.user.User;
  17. import com.sysu.admin.utils.TextUtil;
  18. import com.sysu.admin.utils.file.FileUtil;
  19. import com.sysu.admin.utils.shape.GeoCastUtil;
  20. import com.sysu.admin.utils.shape.ShapeReader;
  21. import com.xiesx.fastboot.base.result.BaseResult;
  22. import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
  23. import org.apache.commons.codec.binary.Base64;
  24. import org.apache.commons.lang3.ObjectUtils;
  25. import org.geolatte.geom.crs.CoordinateReferenceSystems;
  26. import org.locationtech.jts.geom.Geometry;
  27. import org.locationtech.jts.geom.Point;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;
  30. import javax.transaction.Transactional;
  31. import java.io.File;
  32. import java.io.IOException;
  33. import java.nio.file.Files;
  34. import java.nio.file.Paths;
  35. import java.nio.file.StandardOpenOption;
  36. import java.util.*;
  37. @Service
  38. public class CropLandService extends BaseService<CropLand, Long> {
  39. @Autowired
  40. CropImageService cropImageService;
  41. @Autowired
  42. ConfigContext configContext;
  43. @Autowired
  44. ProvinceRepository provinceRepository;
  45. @Autowired
  46. CityRepository cityRepository;
  47. @Autowired
  48. DistrictRepository districtRepository;
  49. @Autowired
  50. LandRangeIndexService landRangeIndexService;
  51. @Override
  52. public CropLand findOne(Long aLong) {
  53. AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(aLong));
  54. CropLand bean = super.findOne(aLong);
  55. return bean;
  56. }
  57. @Override
  58. public <S extends CropLand> S save(S entity) {
  59. AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(entity.getId()));
  60. return super.save(entity);
  61. }
  62. public List<CropPoint> findByBuffer(Double[] point, Integer meter){
  63. AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(point));
  64. double degree = meter / (2 * Math.PI * 6371004) * 360;
  65. return mCropPointRepository.findByBufferAndStatus("Point("+point[0]+" "+point[1]+")",degree, new Integer[]{
  66. LandTaskStatus.published.ordinal(),LandTaskStatus.receive.ordinal()
  67. });
  68. }
  69. public List<CropLand> findIdAndNameByExecutor(Long executor){
  70. QCropLand qCropLand = QCropLand.cropLand;
  71. QBean<CropLand> selectBean = Projections.fields(qCropLand, qCropLand.id, qCropLand.name, qCropLand.updateDate);
  72. JPAQuery<CropLand> jpaQuery = mJPAQueryFactory.select(selectBean)
  73. .from(qCropLand)
  74. .where(qCropLand.executor.eq(executor));
  75. return jpaQuery.fetch();
  76. }
  77. public CropLand findByPoint(Double[] point){
  78. CropLand cityLand = mCropLandRepository.findByPoint("Point("+point[0]+" "+point[1]+")");
  79. return cityLand;
  80. }
  81. public String getBuffer(Double[] point, Integer meter){
  82. double degree = meter / (2 * Math.PI * 6371004) * 360;
  83. return mCropPointRepository.getBuffer("Point("+point[0]+" "+point[1]+")", degree);
  84. }
  85. public List<CropPoint> findCropLandNoGeomByTableNamesAndBBox(String tableNames, Double x1, Double y1, Double x2, Double y2){
  86. String wkt = bboxToWkt(x1, y1 , x2, y2);
  87. AutoTableNameInterceptor.myTable.set(tableNames);
  88. List<CropPoint> cropLandList = mCropPointRepository.findCropLandNoGeomByWkt(wkt);
  89. return cropLandList;
  90. }
  91. @Transactional
  92. public void updateStatus(Long id, Integer status, Long updateUserId){
  93. CropLand bean = mCropLandRepository.findOne(id);
  94. bean.setStatus(status);
  95. if(status.equals(LandTaskStatus.receive.ordinal())) {
  96. bean.setReceiveDate(new Date());
  97. bean.setReceiver(updateUserId);
  98. }
  99. mCropLandRepository.save(bean);
  100. }
  101. @Transactional
  102. public int updateCenterPoint(Long id){
  103. return mCropLandRepository.updateCenterPoint(id);
  104. }
  105. public Point getCenterPoint(Long id){
  106. return (Point)GeoCastUtil.wktToGeom(mCropLandRepository.getCenterPoint(id));
  107. }
  108. public Point getCenterPoint(Geometry geometry){
  109. geometry.setSRID(4326);
  110. return (Point)GeoCastUtil.wktToGeom(mCropLandRepository.getCenterPoint(geometry));
  111. }
  112. public void setCity(CropLand bean, District district){
  113. bean.setProvince(((int)(district.getCode() / 10000)) * 10000);
  114. bean.setCity(((int)(district.getCode() / 100)) * 100);
  115. bean.setDistrict(district.getCode());
  116. }
  117. @Transactional
  118. public void saveCropAndImages(CropLand bean){
  119. CropImage fay = bean.getFay();
  120. CropImage center = bean.getCenter();
  121. CropImage near = bean.getNear();
  122. saveImage(fay, bean.getId(), ImageType.fay, bean.getExecutor());
  123. saveImage(center, bean.getId(), ImageType.center, bean.getExecutor());
  124. saveImage(near, bean.getId(), ImageType.near, bean.getExecutor());
  125. mCropLandRepository.save(bean);
  126. }
  127. private void saveImage(CropImage image, Long cropId, ImageType type, Long userId){
  128. if(ObjectUtils.isNotEmpty(image)) {
  129. cropImageService.deleteAll(cropImageService.findByCropIdAndType(cropId, type));
  130. image.setType(type.ordinal());
  131. image.setFilename(decryptByBase64(image.getBase64(), type.name(), userId));
  132. image.setCropId(cropId);
  133. cropImageService.save(image);
  134. }
  135. }
  136. /**
  137. * 把base64转化为文件.
  138. *
  139. * @param base64 base64
  140. * @return boolean isTrue
  141. */
  142. public String decryptByBase64(String base64, String sign, Long userId) {
  143. if (StringUtils.isNullOrEmpty(base64)) {
  144. return null;
  145. }
  146. int index = base64.indexOf(",");
  147. if(index > -1){
  148. base64 = base64.substring(index + 1);
  149. }
  150. String imageDirPath = configContext.getImageDirPath();
  151. String newFileName = System.currentTimeMillis() + "_" + userId+"_"+sign+".jpg";
  152. try {
  153. Files.write(Paths.get(imageDirPath+ newFileName),
  154. Base64.decodeBase64(base64), StandardOpenOption.CREATE);
  155. } catch (IOException e) {
  156. e.printStackTrace();
  157. }
  158. return newFileName;
  159. }
  160. public static String bboxToWkt(Double x1, Double y1, Double x2, Double y2){
  161. return "POLYGON (("+x1+" "+y1+", "+x1+" "+y2+", "+x2+" "+y2+", "+x2+" "+y1+", "+x1+" "+y1+"))";
  162. }
  163. @Transactional
  164. public void exec(String sql){
  165. mEntityManager.createNativeQuery(sql).executeUpdate();
  166. }
  167. @Override
  168. public JpaPlusRepository<CropLand, Long> r() {
  169. return mCropLandRepository;
  170. }
  171. }