Compare commits

...

2 Commits
master ... dev

Author SHA1 Message Date
lzq 2f8281179a 政务平台上传数据 2025-12-17 09:43:16 +08:00
lzq fd8f41ef08 政务平台上传数据 2025-12-16 20:55:44 +08:00
13 changed files with 1168 additions and 39 deletions

View File

@ -0,0 +1,163 @@
package com.njzscloud.common.core.utils;
import com.njzscloud.common.core.ex.Exceptions;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
public class ImgUtil {
// 最小缩放比例(防止无限缩小,可根据需求调整)
private static final double MIN_SCALE = 0.1;
// 最低质量压缩值(防止质量过低导致图片损坏)
private static final float MIN_QUALITY = 0.1f;
// 压缩衰减系数(每次递归压缩时,缩放/质量的衰减幅度)
private static final double COMPRESS_ATTENUATION = 0.8;
/**
*
*/
public static ByteArrayOutputStream compressByQuality(InputStream in, float quality, String format) throws IOException {
BufferedImage bufferedImage = ImageIO.read(in);
if (bufferedImage == null) {
throw new IOException("读取图片流失败,图片格式不支持或流已关闭");
}
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(format);
if (!writers.hasNext()) {
throw new IOException("不支持的图片格式:" + format);
}
ImageWriter writer = writers.next();
ImageWriteParam param = writer.getDefaultWriteParam();
if (param.canWriteCompressed()) {
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// 确保质量不低于最小值
param.setCompressionQuality(Math.max(quality, MIN_QUALITY));
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (ImageOutputStream ios = ImageIO.createImageOutputStream(out)) {
writer.setOutput(ios);
writer.write(null, new IIOImage(bufferedImage, null, null), param);
return out;
} finally {
writer.dispose();
// 关闭输入流,避免内存泄漏
in.close();
}
}
/**
*
*/
public static ByteArrayOutputStream compressByScale(InputStream in, double scale, String format) throws IOException {
BufferedImage srcImage = ImageIO.read(in);
if (srcImage == null) {
throw new IOException("读取图片流失败,图片格式不支持或流已关闭");
}
// 确保缩放比例不低于最小值
double actualScale = Math.max(scale, MIN_SCALE);
int newWidth = Math.max(1, (int) (srcImage.getWidth() * actualScale));
int newHeight = Math.max(1, (int) (srcImage.getHeight() * actualScale));
BufferedImage destImage = new BufferedImage(newWidth, newHeight, srcImage.getType());
Graphics2D g = destImage.createGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(srcImage, 0, 0, newWidth, newHeight, null);
g.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(destImage, format, out);
// 关闭输入流
in.close();
return out;
}
/**
*
*
* @param in
* @param initialScale +
* @param format jpg/png
* @param sizeThreshold 1024*100 100KB
* @return
*/
public static ByteArrayOutputStream compress(InputStream in, double initialScale, String format, long sizeThreshold) {
try {
// ========== 核心新增:第一步先校验原始图片大小 ==========
byte[] originalBytes = readBytes(in);
// 若原始体积已满足阈值,直接返回字节流,不执行任何压缩
if (originalBytes.length <= sizeThreshold) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(originalBytes);
return out;
}
// 原始体积不满足阈值,执行第一次组合压缩(质量+尺寸)
ByteArrayOutputStream qualityOut = compressByQuality(
new ByteArrayInputStream(originalBytes),
(float) initialScale,
format
);
ByteArrayOutputStream scaleOut = compressByScale(
new ByteArrayInputStream(qualityOut.toByteArray()),
initialScale,
format
);
// 校验压缩后的体积是否满足阈值
long currentSize = scaleOut.size();
if (currentSize <= sizeThreshold) {
return scaleOut; // 满足阈值,直接返回
}
// 计算下一次压缩的比例(衰减)
double nextScale = initialScale * COMPRESS_ATTENUATION;
// 边界校验:防止无限递归
if (nextScale < MIN_SCALE) {
// 已达到最小压缩比例,返回当前结果(避免图片失效)
return scaleOut;
}
// 递归调用:使用衰减后的比例继续压缩
return compress(
new ByteArrayInputStream(scaleOut.toByteArray()),
nextScale,
format,
sizeThreshold
);
} catch (IOException e) {
throw Exceptions.error(e, "图片压缩失败");
}
}
/**
*
*/
private static byte[] readBytes(InputStream in) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] temp = new byte[1024];
int len;
while ((len = in.read(temp)) != -1) {
buffer.write(temp, 0, len);
}
in.close();
return buffer.toByteArray();
}
}

View File

@ -25,6 +25,9 @@ public class CompositeInterceptor implements RequestInterceptor, ResponseInterce
@Override @Override
public Object process(RequestInfo requestInfo, ResponseInfo responseInfo, Type responseType) { public Object process(RequestInfo requestInfo, ResponseInfo responseInfo, Type responseType) {
if (requestInfo.contentType != null && requestInfo.contentType.contains("multipart/form-data")) {
log.info("响应拦截器: {}、{}、{}", Jackson.toJsonStr(requestInfo), new String(responseInfo.body), responseType);
}
log.info("响应拦截器: {}、{}、{}", Jackson.toJsonStr(requestInfo), new String(responseInfo.body), responseType); log.info("响应拦截器: {}、{}、{}", Jackson.toJsonStr(requestInfo), new String(responseInfo.body), responseType);
Object data = null; Object data = null;

View File

@ -4,12 +4,10 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import com.njzscloud.common.http.HttpClientDecorator; import com.njzscloud.common.http.HttpClientDecorator;
import com.njzscloud.supervisory.config.AppProperties; import com.njzscloud.supervisory.config.AppProperties;
import com.njzscloud.supervisory.hsoa.pojo.param.LoginParam; import com.njzscloud.supervisory.hsoa.pojo.param.*;
import com.njzscloud.supervisory.hsoa.pojo.param.PushVehicleTrajectoryParam;
import com.njzscloud.supervisory.hsoa.pojo.param.RefreshTokenParam;
import com.njzscloud.supervisory.hsoa.pojo.param.TokenParam;
import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult; import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult;
import com.njzscloud.supervisory.hsoa.pojo.result.LoginResult; import com.njzscloud.supervisory.hsoa.pojo.result.LoginResult;
import com.njzscloud.supervisory.hsoa.pojo.result.UploadResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
@ -21,10 +19,10 @@ public class Hsoa {
private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private static final ReentrantReadWriteLock.ReadLock rlock = rwLock.readLock(); private static final ReentrantReadWriteLock.ReadLock rlock = rwLock.readLock();
private static final ReentrantReadWriteLock.WriteLock wlock = rwLock.writeLock(); private static final ReentrantReadWriteLock.WriteLock wlock = rwLock.writeLock();
private static final AppProperties appProperties;
private static String refTnt = ""; private static String refTnt = "";
private static String tnt = ""; private static String tnt = "";
private static long lastLoginTime = 0; private static long lastLoginTime = 0;
private static AppProperties appProperties;
static { static {
HttpClientDecorator httpClientDecorator = SpringUtil.getBean(HttpClientDecorator.class); HttpClientDecorator httpClientDecorator = SpringUtil.getBean(HttpClientDecorator.class);
@ -51,6 +49,33 @@ public class Hsoa {
} }
} }
public static HsoaResult<?> pushProvincial(PushProvincialSaveParam param) {
login();
try {
rlock.lock();
if (StrUtil.isBlank(tnt) || StrUtil.isBlank(refTnt)) {
return new HsoaResult<>()
.setSuccess(false);
}
return API.pushProvincial(param, new TokenParam().setTnt(tnt).setRefTnt(refTnt));
} finally {
rlock.unlock();
}
}
public static UploadResult upload(PushProvincialUploadParam param) {
login();
try {
rlock.lock();
if (StrUtil.isBlank(tnt) || StrUtil.isBlank(refTnt)) {
return new UploadResult();
}
return API.upload(param, new TokenParam().setTnt(tnt).setRefTnt(refTnt));
} finally {
rlock.unlock();
}
}
public static void login() { public static void login() {
try { try {
wlock.lock(); wlock.lock();

View File

@ -1,12 +1,10 @@
package com.njzscloud.supervisory.hsoa; package com.njzscloud.supervisory.hsoa;
import com.njzscloud.common.http.annotation.*; import com.njzscloud.common.http.annotation.*;
import com.njzscloud.supervisory.hsoa.pojo.param.LoginParam; import com.njzscloud.supervisory.hsoa.pojo.param.*;
import com.njzscloud.supervisory.hsoa.pojo.param.PushVehicleTrajectoryParam;
import com.njzscloud.supervisory.hsoa.pojo.param.RefreshTokenParam;
import com.njzscloud.supervisory.hsoa.pojo.param.TokenParam;
import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult; import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult;
import com.njzscloud.supervisory.hsoa.pojo.result.LoginResult; import com.njzscloud.supervisory.hsoa.pojo.result.LoginResult;
import com.njzscloud.supervisory.hsoa.pojo.result.UploadResult;
@RemoteServer(value = "${hsoa.base-url}") @RemoteServer(value = "${hsoa.base-url}")
public interface HsoaApi { public interface HsoaApi {
@ -14,17 +12,30 @@ public interface HsoaApi {
* *
*/ */
@PostEndpoint("/garbage/mLoginApi/login") @PostEndpoint("/garbage/mLoginApi/login")
HsoaResult<LoginResult> login(@FormBodyParam LoginParam apram); HsoaResult<LoginResult> login(@FormBodyParam LoginParam param);
/** /**
* TOKEN * TOKEN
*/ */
@GetEndpoint("/garbage/mLoginApi/refreshToken") @GetEndpoint("/garbage/mLoginApi/refreshToken")
HsoaResult<LoginResult> refreshToken(@QueryParam RefreshTokenParam apram); HsoaResult<LoginResult> refreshToken(@QueryParam RefreshTokenParam param);
/** /**
* *
*/ */
@PostEndpoint("/garbage/commonApi/pushVehicleTrajectory") @PostEndpoint("/garbage/commonApi/pushVehicleTrajectory")
HsoaResult<Object> pushVehicleTrajectory(@JsonBodyParam PushVehicleTrajectoryParam apram, @QueryParam TokenParam tokenParam); HsoaResult<Object> pushVehicleTrajectory(@JsonBodyParam PushVehicleTrajectoryParam param, @QueryParam TokenParam tokenParam);
/**
*
*/
@PostEndpoint("/garbage/api/pushProvincial/save")
HsoaResult<Object> pushProvincial(@JsonBodyParam PushProvincialSaveParam param, @QueryParam TokenParam tokenParam);
/**
*
*/
@PostEndpoint("/garbage/api/pushProvincial/upload")
UploadResult upload(@MultiBodyParam PushProvincialUploadParam param, @QueryParam TokenParam tokenParam);
} }

View File

@ -2,6 +2,7 @@ package com.njzscloud.supervisory.hsoa.controller;
import com.njzscloud.common.core.utils.R; import com.njzscloud.common.core.utils.R;
import com.njzscloud.supervisory.hsoa.Hsoa; import com.njzscloud.supervisory.hsoa.Hsoa;
import com.njzscloud.supervisory.hsoa.pojo.param.PushProvincialSaveParam;
import com.njzscloud.supervisory.hsoa.pojo.param.PushVehicleTrajectoryParam; import com.njzscloud.supervisory.hsoa.pojo.param.PushVehicleTrajectoryParam;
import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult; import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult;
import com.njzscloud.supervisory.hsoa.service.HsoaService; import com.njzscloud.supervisory.hsoa.service.HsoaService;
@ -15,17 +16,16 @@ public class HsoaController {
private final HsoaService hsoaService; private final HsoaService hsoaService;
@PostMapping("/push") @PostMapping("/push_vehicle_trajectory")
public R<?> push(@RequestBody PushVehicleTrajectoryParam pushVehicleTrajectoryParam) { public R<?> pushVehicleTrajectory(@RequestBody PushVehicleTrajectoryParam pushVehicleTrajectoryParam) {
HsoaResult<?> objectHsoaResult = Hsoa.pushVehicleTrajectory(pushVehicleTrajectoryParam); HsoaResult<?> objectHsoaResult = Hsoa.pushVehicleTrajectory(pushVehicleTrajectoryParam);
if (objectHsoaResult.isSuccess()) { return R.success(objectHsoaResult);
return R.success(objectHsoaResult);
}
return R.failed();
} }
@GetMapping("/push_order") @PostMapping("/push_provincial")
public R<?> pushOrder(@RequestParam Long orderId, @RequestParam Integer count) { public R<?> pushProvincial(@RequestParam PushProvincialSaveParam param) {
return R.success(hsoaService.pushOrder(orderId, count)); HsoaResult<?> hsoaResult = Hsoa.pushProvincial(param);
return R.success(hsoaResult);
} }
} }

View File

@ -0,0 +1,653 @@
package com.njzscloud.supervisory.hsoa.pojo.param;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
*
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class PushProvincialSaveParam {
/**
* DTO
*/
@JsonProperty("handleInfoDTO")
private HandleInfo handleInfo;
/**
* DTO
*/
@JsonProperty("reviewInfoDTO")
private ReviewInfo reviewInfo;
/**
* DTO
*/
@JsonProperty("transportOrderDTO")
private TransportOrder transportOrder;
/**
* DTO
*/
@JsonProperty("transportOrderRecordDTO")
private TransportOrderRecord transportOrderRecord;
/**
* DTO
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public static class HandleInfo {
/**
*
*/
private String approveDate;
/**
*
*/
private String approveUserName;
/**
*
*/
private LocalDateTime createTime;
/**
*
*/
private String createrName;
/**
*
*/
private String disposalSiteCode;
/**
*
*/
private String disposalSiteName;
/**
*
*/
private String handleCraft;
/**
*
*/
private String handleLicenseName;
/**
*
*/
private String handleLicenseNum;
/**
*
*/
private String handleMethod;
/**
*
*/
private String latitude;
/**
*
*/
@JsonProperty("HANDLE_LICENSE_FILE")
private String handleLicenseFile;
/**
*
*/
private String licenseValidEndDate;
/**
*
*/
private String licenseValidStartDate;
/**
*
*/
private String linkPhone;
/**
*
*/
private String longitude;
/**
* ()
*/
private String superviseUnitName;
/**
*
*/
private String updateTime;
/**
*
*/
private String updaterName;
/**
*
*/
@JsonProperty("HANDLE_VOUCHER_FILE")
private String handleVoucherFile;
/**
* :
*/
private String weight;
}
/**
* DTO
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public static class ReviewInfo {
/**
*
*/
private String cgAreaName;
/**
*
*/
private String cgReviewOpinion;
/**
*
*/
private LocalDateTime cgReviewTime;
/**
*
*/
private String cgUnitCode;
/**
*
*/
private String cgUnitName;
/**
* id
*/
private String cgUserId;
/**
*
*/
private String cgUserName;
/**
*
*/
private LocalDateTime createTime;
/**
*
*/
private String createrName;
/**
*
*/
private String jtAreaName;
/**
*
*/
private String jtReviewOpinion;
/**
*
*/
private String jtReviewTime;
/**
*
*/
private String jtUnitCode;
/**
*
*/
private String jtUnitName;
/**
* id
*/
private String jtUserId;
/**
*
*/
private String jtUserName;
/**
*
*/
@JsonProperty("JT_REVIEW_FILE")
private String jtReviewFile;
/**
*
*/
@JsonProperty("CG_REVIEW_FILE")
private String cgReviewFile;
/**
*
*/
private String updateTime;
/**
*
*/
private String updaterName;
}
/**
* DTO
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public static class TransportOrder {
/**
*
*/
private String address;
/**
* yyyy-mm-dd
*/
private String appointmentEndDate;
/**
* hh: mm
*/
private String appointmentEndTime;
/**
* yyyy-mm-dd
*/
private String appointmentStartDate;
/**
* hh: mm
*/
private String appointmentStartTime;
/**
*
*/
private String areaCode;
/**
*
*/
private String areaName;
/**
*
*/
private String cityCode;
/**
*
*/
private String cityName;
/**
* ()
*/
private String constructionLandLicenseNum;
/**
*
*/
private String constructionUnitCreditCode;
/**
*
*/
private String constructionUnitDirector;
/**
*
*/
private String constructionUnitName;
/**
*
*/
private String constructionUnitPhone;
/**
*
*/
private String createTime;
/**
*
*/
private String createrName;
/**
*
*/
private String emissionSource;
/**
*
*/
private String enterpriseHead;
/**
* :
*/
private String estimateWeight;
/**
*
*/
private String garbageProductionLicenseName;
/**
*
*/
private String garbageProductionLicenseNum;
/**
*
*/
@JsonProperty("GARBAGE_SCENE_FILE")
private String garbageSceneFile;
/**
*
*/
private String headContact;
/**
*
*/
private String latitude;
/**
*
*/
private String longitude;
/**
*
*/
private String orderNumber;
/**
* 90:
*/
private Integer orderStatus;
/**
* 1: 2: 3: 沿 4:
*/
private Integer orderType;
/**
*
*/
private String projectName;
/**
*
*/
private String registerAddress;
/**
*
*/
private String sceneLinkName;
/**
*
*/
private String sceneLinkPhone;
/**
*
*/
private String streetCode;
/**
*
*/
private String streetName;
/**
* id
*/
private String transportationEnterpriseId;
/**
*
*/
private String transportationEnterpriseName;
/**
* 1: 2: 3: 4: 5:
*/
private String wasteTypeCode;
/**
* 1: 2: 3: 4: 5:
*/
private String wasteTypeName;
/**
*
*/
private String workUnitCreditCode;
/**
*
*/
private String workUnitDirector;
/**
*
*/
private String workUnitName;
/**
*
*/
private String workUnitPhone;
}
/**
* DTO
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public static class TransportOrderRecord {
/**
*
*/
private String absorptionUnitName;
/**
* 3:
*/
private Integer auditStatus;
/**
*
*/
private String carNo;
/**
* 1: 3: 4:
*/
private String absorptionUnitType;
/**
*
*/
private String absorptionUnitCode;
/**
* yyyy-MM-dd HH: mm: ss
*/
private String createTime;
/**
*
*/
private String driverLicense;
/**
*
*/
private String enterpriseHead;
/**
*
*/
private String enterpriseTransportLicenseName;
/**
*
*/
private String enterpriseTransportLicenseNum;
/**
* :
*/
private String estimateWeight;
/**
*
*/
private LocalDateTime haulageEndTimeStr;
/**
*
*/
private LocalDateTime haulageStartTimeStr;
/**
*
*/
private String headContact;
/**
*
*/
@JsonProperty("TRANS_LICENSE_FILE")
private String transLicenseFile;
/**
*
*/
@JsonProperty("GARBAGE_LOAD_BEFORE_FILE")
private String garbageLoadBeforeFile;
/**
*
*/
@JsonProperty("GARBAGE_LOAD_AFTER_FILE")
private String garbageLoadAfterFile;
/**
* yyyy-MM-dd-yyyy-MM-dd
*/
private String licenseValidityPeriodDateRange;
/**
*
*/
private String licenseValidityPeriodEndDate;
/**
*
*/
private String licenseValidityPeriodStartDate;
/**
* 线
*/
private String route;
/**
* ()
*/
private String superviseUnitName;
/**
* yyyy-MM-dd-yyyy-MM-dd
*/
private String transportDateRange;
/**
*
*/
private String transportEndDate;
/**
*
*/
private String transportStartDate;
/**
* id
*/
private String transportationEnterpriseId;
/**
*
*/
private String transportationEnterpriseName;
/**
*
*/
private String updateTime;
/**
*
*/
private String updaterName;
}
}

View File

@ -0,0 +1,83 @@
package com.njzscloud.supervisory.hsoa.pojo.param;
import com.njzscloud.common.http.annotation.MultiBodyParam;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.InputStream;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class PushProvincialUploadParam {
// 垃圾现场照片
public static final String GARBAGE_SCENE_FILE = "GARBAGE_SCENE_FILE";
// 垃圾产出的许可证照片
public static final String LICENSE_FILE = "LICENSE_FILE";
// 垃圾运输的许可证照片
public static final String TRANS_LICENSE_FILE = "TRANS_LICENSE_FILE";
// 委托书照片
public static final String PROXY_STATEMENT_FILE = "PROXY_STATEMENT_FILE";
// 建筑工地
public static final String CONS_SITE_FILE = "CONS_SITE_FILE";
// 居民小区
public static final String RES_AREA_FILE = "RES_AREA_FILE";
// 沿街商铺
public static final String STREET_SHOP_FILE = "STREET_SHOP_FILE";
// 运输企业
public static final String TRANS_ENTER_FILE = "TRANS_ENTER_FILE";
// 运输车辆
public static final String TRANS_VEHICLE_FILE = "TRANS_VEHICLE_FILE";
// 驾驶员
public static final String TRANS_DRIVER_FILE = "TRANS_DRIVER_FILE";
// 垃圾中转站
public static final String TRANS_STA_FILE = "TRANS_STA_FILE";
// 垃圾存放点
public static final String STO_POINT_FILE = "STO_POINT_FILE";
// 资源利用企业
public static final String RES_UTIL_FILE = "RES_UTIL_FILE";
// 垃圾消纳场所
public static final String CONS_PLACE_FILE = "CONS_PLACE_FILE";
// 垃圾回填场所
public static final String BACKFILL_PLACE_FILE = "BACKFILL_PLACE_FILE";
// 我的意见
public static final String MY_OPINION_FILE = "MY_OPINION_FILE";
// 主管部门审批附件
public static final String ZG_REVIEW_FILE = "ZG_REVIEW_FILE";
// 交通部门审批附件
public static final String JT_REVIEW_FILE = "JT_REVIEW_FILE";
// 城管部门审批附件
public static final String CG_REVIEW_FILE = "CG_REVIEW_FILE";
// 消息资讯附件
public static final String NEWS_INFO_FILE = "NEWS_INFO_FILE";
// 垃圾运输附件
public static final String GARBAGE_TRANS_FILE = "GARBAGE_TRANS_FILE";
// 终端处置场处置许可证附件
public static final String HANDLE_LICENSE_FILE = "HANDLE_LICENSE_FILE";
// 终端处置场处置凭证附件
public static final String HANDLE_VOUCHER_FILE = "HANDLE_VOUCHER_FILE";
// 无人机巡检案件附件/手机端上报案件附件
public static final String INSPECTION_EVENT_FILE = "INSPECTION_EVENT_FILE";
// 垃圾装车前附件
public static final String GARBAGE_LOAD_BEFORE_FILE = "GARBAGE_LOAD_BEFORE_FILE";
// 垃圾装车后附件
public static final String GARBAGE_LOAD_AFTER_FILE = "GARBAGE_LOAD_AFTER_FILE";
// 无人机巡检/手机端案件处置附件
public static final String DISPOSAL_EVENT_FILE = "DISPOSAL_EVENT_FILE";
/**
*
*/
@MultiBodyParam
private InputStream file;
/**
*
*/
@MultiBodyParam
private String uploadPath;
}

View File

@ -0,0 +1,21 @@
package com.njzscloud.supervisory.hsoa.pojo.result;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class UploadResult {
private String msg;
private String flag;
private String id;
private String url;
public boolean isSuccess() {
return "success".equals(flag);
}
}

View File

@ -1,36 +1,39 @@
package com.njzscloud.supervisory.hsoa.service; package com.njzscloud.supervisory.hsoa.service;
import cn.hutool.core.lang.Assert; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapBuilder; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.njzscloud.common.core.jackson.Jackson;
import com.njzscloud.common.core.ex.Exceptions; import com.njzscloud.common.core.tuple.Tuple2;
import com.njzscloud.supervisory.biz.pojo.entity.TruckLocationTrackEntity; import com.njzscloud.common.core.utils.ImgUtil;
import com.njzscloud.supervisory.biz.service.TruckLocationTrackService; import com.njzscloud.common.oss.util.AliOSS;
import com.njzscloud.supervisory.hsoa.Hsoa; import com.njzscloud.supervisory.hsoa.Hsoa;
import com.njzscloud.supervisory.hsoa.pojo.param.PushVehicleTrajectoryParam; import com.njzscloud.supervisory.hsoa.pojo.param.PushProvincialSaveParam;
import com.njzscloud.supervisory.hsoa.pojo.param.PushProvincialUploadParam;
import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult; import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult;
import com.njzscloud.supervisory.hsoa.pojo.result.UploadResult;
import com.njzscloud.supervisory.order.pojo.result.OrderPagingResult; import com.njzscloud.supervisory.order.pojo.result.OrderPagingResult;
import com.njzscloud.supervisory.order.service.OrderInfoService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean; import static com.njzscloud.supervisory.hsoa.pojo.param.PushProvincialUploadParam.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
@Slf4j @Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class HsoaService { public class HsoaService {
private final OrderInfoService orderInfoService; // private final OrderInfoService orderInfoService;
private final TruckLocationTrackService truckLocationTrackService; /* private final TruckLocationTrackService truckLocationTrackService;
private final AtomicBoolean run = new AtomicBoolean(false); private final AtomicBoolean run = new AtomicBoolean(false);
private final AtomicInteger succ = new AtomicInteger(0); private final AtomicInteger succ = new AtomicInteger(0);
private final AtomicInteger fail = new AtomicInteger(0); private final AtomicInteger fail = new AtomicInteger(0);
@ -137,5 +140,140 @@ public class HsoaService {
.put("剩余数量", i1 - i2 - i3) .put("剩余数量", i1 - i2 - i3)
.build(); .build();
} */
public HsoaResult<?> pushProvincialSave(OrderPagingResult detail) {
log.info("上传数据:{}", Jackson.toJsonStr(detail));
return Hsoa.pushProvincial(new PushProvincialSaveParam()
.setHandleInfo(new PushProvincialSaveParam.HandleInfo()
.setApproveDate(detail.getOutTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.setApproveUserName(detail.getCheckerName())
.setCreateTime(detail.getCreateTime())
.setCreaterName(detail.getContacts())
// .setDisposalSiteCode("")
.setDisposalSiteName(detail.getStationName())
// .setHandleCraft("")
// .setHandleLicenseName("")
// .setHandleLicenseNum("")
.setHandleMethod("资源化利用")
.setLongitude(detail.getStationLng().toString())
.setLatitude(detail.getStationLat().toString())
// .setHANDLE_LICENSE_FILE("")
// .setLicenseValidStartDate("")
// .setLicenseValidEndDate("")
.setLinkPhone(detail.getCheckerPhone())
// .setSuperviseUnitName("")
// .setUpdateTime("")
// .setUpdaterName("")
.setHandleVoucherFile(upload(detail.getCheckPhoto(), HANDLE_VOUCHER_FILE))
.setWeight(new BigDecimal(detail.getSettleWeight()).divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP).toPlainString())
)
.setReviewInfo(new PushProvincialSaveParam.ReviewInfo()
.setCgAreaName(detail.getProvinceName() + detail.getCityName() + detail.getAreaName())
.setCgReviewOpinion(StrUtil.isBlank(detail.getAuditMemo()) ? "同意" : detail.getAuditMemo())
.setCgReviewTime(detail.getAuditTime())
// .setCgUnitCode("")
.setCgUnitName(detail.getAreaName() + "城管")
.setCgUserId(detail.getQuAuditUserId() == null ? (detail.getShiAuditUserId() == null ? null : detail.getShiAuditUserId().toString()) : detail.getQuAuditUserId().toString())
.setCgUserName(detail.getQuAuditUserName() == null ? (detail.getShiAuditUserName() == null ? null : detail.getShiAuditUserName()) : detail.getQuAuditUserName())
.setCreateTime(detail.getCreateTime())
.setCreaterName(detail.getContacts())
// .setCG_REVIEW_FILE("")
)
.setTransportOrder(new PushProvincialSaveParam.TransportOrder()
.setAddress(detail.getAddress())
.setAppointmentStartDate(detail.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.setAppointmentStartTime(detail.getCreateTime().format(DateTimeFormatter.ofPattern("HH:mm")))
.setAreaCode(detail.getArea())
.setAreaName(detail.getAreaName())
.setCityCode(detail.getCity())
.setCityName(detail.getCityName())
.setConstructionUnitCreditCode(detail.getUscc())
.setConstructionUnitName(detail.getCompanyName())
.setConstructionUnitDirector(detail.getContacts())
.setConstructionUnitPhone(detail.getPhone())
.setEmissionSource(detail.getCompanyName() == null ? detail.getContacts() : detail.getCompanyName())
.setEstimateWeight(detail.getEstimatedQuantity())
.setGarbageSceneFile(upload(detail.getSitePhotos(), GARBAGE_SCENE_FILE))
.setEnterpriseHead(detail.getTransContacts())
.setHeadContact(detail.getTransPhone())
.setLatitude(detail.getLat() == null ? null : detail.getLat().toString())
.setLongitude(detail.getLng() == null ? null : detail.getLng().toString())
// .setOrderNumber(detail.getArea() + detail.getSn())
.setOrderStatus(90)
.setOrderType(detail.getCompanyName() == null ? 1 : 4)
.setProjectName(detail.getProjectName())
.setRegisterAddress(detail.getTransAddress())
.setSceneLinkName(detail.getContacts())
.setSceneLinkPhone(detail.getPhone())
.setStreetCode(detail.getTown())
.setStreetName(detail.getTownName())
.setTransportationEnterpriseId(detail.getTransCompanyId() == null ? null : detail.getTransCompanyId().toString())
.setTransportationEnterpriseName(detail.getTransCompanyName())
.setWasteTypeCode(detail.getGoodsName().contains("拆除") ? "4" : (detail.getGoodsName().contains("装修") ? "5" : (detail.getGoodsName().contains("建筑") ? "3" : null)))
.setWasteTypeName(detail.getGoodsName())
.setWorkUnitCreditCode(detail.getUscc())
.setWorkUnitDirector(detail.getContacts())
.setWorkUnitPhone(detail.getPhone())
.setWorkUnitName(detail.getCompanyName())
)
.setTransportOrderRecord(new PushProvincialSaveParam.TransportOrderRecord()
.setAbsorptionUnitName(detail.getStationCompanyName())
.setAuditStatus(3)
.setCarNo(detail.getLicensePlate())
.setAbsorptionUnitType("1")
.setAbsorptionUnitCode(detail.getStationUscc())
.setDriverLicense(detail.getDrivingLicenceNo())
.setEnterpriseHead(detail.getDriverName())
.setHeadContact(detail.getDriverPhone())
// .setEnterpriseTransportLicenseName("")
.setEnterpriseTransportLicenseNum(detail.getCertificateSn())
.setEstimateWeight(detail.getEstimatedQuantity())
.setHaulageStartTimeStr(detail.getTransTime())
.setHaulageEndTimeStr(detail.getOutTime())
// .setTRANS_LICENSE_FILE("")
.setGarbageLoadBeforeFile(upload(detail.getCargoPhoto(), GARBAGE_LOAD_BEFORE_FILE))
.setGarbageLoadAfterFile(upload(detail.getCargoPhoto(), GARBAGE_LOAD_AFTER_FILE))
.setLicenseValidityPeriodDateRange(detail.getAuditTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "-" + detail.getAuditTime().plusHours(24).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.setLicenseValidityPeriodStartDate(detail.getAuditTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.setLicenseValidityPeriodEndDate(detail.getAuditTime().plusHours(24).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
// .setRoute("")
.setSuperviseUnitName(detail.getAreaName())
.setTransportDateRange(detail.getTransTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "-" + detail.getOutTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.setTransportStartDate(detail.getTransTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.setTransportEndDate(detail.getOutTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.setTransportationEnterpriseId(detail.getTransCompanyId() == null ? null : detail.getTransCompanyId().toString())
.setTransportationEnterpriseName(detail.getTransCompanyName())
));
}
private String upload(List<String> urls, String uploadPath) {
if (CollUtil.isEmpty(urls)) return null;
String url = urls.get(0);
if (StrUtil.isBlank(url)) return null;
url = url.substring(1);
String[] split = url.split("/");
if (split.length < 2) return null;
Tuple2<InputStream, String> tuple2 = AliOSS.obtainFile(split[0], split[1]);
InputStream in = tuple2.get_0();
try {
ByteArrayOutputStream out = ImgUtil.compress(in, 0.5, FileUtil.extName(split[1]), 1024 * 1024);
byte[] bytes = out.toByteArray();
UploadResult upload = Hsoa.upload(new PushProvincialUploadParam()
.setFile(new ByteArrayInputStream(bytes))
.setUploadPath(uploadPath)
);
if (upload.isSuccess()) {
log.info("图片:{}、{}", uploadPath, upload.getUrl());
return upload.getUrl();
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
IoUtil.close(in);
}
} }
} }

View File

@ -263,6 +263,7 @@ public class OrderInfoController {
/** /**
* *
*
* @param orderId Id * @param orderId Id
*/ */
@GetMapping("/forwarded") @GetMapping("/forwarded")
@ -292,4 +293,9 @@ public class OrderInfoController {
return R.success(); return R.success();
} }
@PostMapping("/hsoa/push_provincial")
public R<?> pushProvincial(@RequestParam("orderId") Long orderId) {
return R.success(orderInfoService.pushProvincial(orderId));
}
} }

View File

@ -145,6 +145,8 @@ public class OrderPagingResult {
*/ */
private String auditMemo; private String auditMemo;
private String checkerName; private String checkerName;
private String checkerPhone;
/** /**
* ; order_category * ; order_category
@ -530,5 +532,7 @@ public class OrderPagingResult {
private String stationUscc; private String stationUscc;
private String stationContacts; private String stationContacts;
private String stationPhone; private String stationPhone;
private Double stationLng;
private Double stationLat;
// endregion // endregion
} }

View File

@ -41,6 +41,7 @@ import com.njzscloud.supervisory.goods.contant.MoneyStrategy;
import com.njzscloud.supervisory.hsoa.Hsoa; import com.njzscloud.supervisory.hsoa.Hsoa;
import com.njzscloud.supervisory.hsoa.pojo.param.PushVehicleTrajectoryParam; import com.njzscloud.supervisory.hsoa.pojo.param.PushVehicleTrajectoryParam;
import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult; import com.njzscloud.supervisory.hsoa.pojo.result.HsoaResult;
import com.njzscloud.supervisory.hsoa.service.HsoaService;
import com.njzscloud.supervisory.money.contant.MoneyChangeCategory; import com.njzscloud.supervisory.money.contant.MoneyChangeCategory;
import com.njzscloud.supervisory.money.pojo.entity.MoneyAccountEntity; import com.njzscloud.supervisory.money.pojo.entity.MoneyAccountEntity;
import com.njzscloud.supervisory.money.pojo.entity.MoneyChangeDetailEntity; import com.njzscloud.supervisory.money.pojo.entity.MoneyChangeDetailEntity;
@ -115,6 +116,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
private final UserService userService; private final UserService userService;
private final BizTruckService bizTruckService; private final BizTruckService bizTruckService;
private final DiscountManageService discountManageService; private final DiscountManageService discountManageService;
private final HsoaService hsoaService;
private final AtomicBoolean test_thread_running = new AtomicBoolean(false); private final AtomicBoolean test_thread_running = new AtomicBoolean(false);
Thread test_thread = null; Thread test_thread = null;
@Value("${app.check-gps:false}") @Value("${app.check-gps:false}")
@ -1274,6 +1276,18 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
log.error("订单状态改变事件发布失败,订单{},状态{}", orderInfoEntity_.getSn(), newOrderStatus, e); log.error("订单状态改变事件发布失败,订单{},状态{}", orderInfoEntity_.getSn(), newOrderStatus, e);
return null; return null;
}); });
CompletableFuture.runAsync(() -> {
OrderPagingResult detail = this.detail(orderId);
HsoaResult<?> result = hsoaService.pushProvincialSave(detail);
if (result == null || !result.isSuccess()) {
Hsoa.relogin();
log.error("推送订单数据失败数据Id{}", entity.getId());
}
}).exceptionally(e -> {
log.error("推送订单数据失败数据Id{}", entity.getId(), e);
return null;
});
// 出厂付费 // 出厂付费
if (MoneyWay.OUT.getVal().equals(entity.getMoneyWay())) { if (MoneyWay.OUT.getVal().equals(entity.getMoneyWay())) {
@ -1696,7 +1710,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
ew.like(StrUtil.isNotBlank(searchParam.getLicensePlate()), "d.license_plate", searchParam.getLicensePlate()); ew.like(StrUtil.isNotBlank(searchParam.getLicensePlate()), "d.license_plate", searchParam.getLicensePlate());
ew.like(StrUtil.isNotBlank(searchParam.getPhone()), "a.phone", searchParam.getPhone()); ew.like(StrUtil.isNotBlank(searchParam.getPhone()), "a.phone", searchParam.getPhone());
ew.like(StrUtil.isNotBlank(searchParam.getNickname()), "a.contacts", searchParam.getNickname()); ew.like(StrUtil.isNotBlank(searchParam.getNickname()), "a.contacts", searchParam.getNickname());
ew.like(StrUtil.isNotBlank(transCompanyName), "g.company_name",transCompanyName); ew.like(StrUtil.isNotBlank(transCompanyName), "g.company_name", transCompanyName);
ew.like(StrUtil.isNotBlank(driverName), "f.driver_name", driverName); ew.like(StrUtil.isNotBlank(driverName), "f.driver_name", driverName);
ew.ge(startTime != null, "a.create_time", startTime); ew.ge(startTime != null, "a.create_time", startTime);
ew.le(endTime != null, "a.create_time", endTime); ew.le(endTime != null, "a.create_time", endTime);
@ -2120,4 +2134,9 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
throw Exceptions.clierr("装货地址不存在"); throw Exceptions.clierr("装货地址不存在");
} }
} }
public HsoaResult<?> pushProvincial(Long orderId) {
OrderPagingResult detail = this.detail(orderId);
return hsoaService.pushProvincialSave(detail);
}
} }

View File

@ -130,6 +130,7 @@
j.company_name, j.company_name,
j.uscc, j.uscc,
k.nickname checker_name, k.nickname checker_name,
k.phone checker_phone,
l.project_name, l.project_name,
m.station_name, m.station_name,
m.company_name station_company_name, m.company_name station_company_name,
@ -137,6 +138,8 @@
m.uscc station_uscc, m.uscc station_uscc,
m.contacts station_contacts, m.contacts station_contacts,
m.phone station_phone, m.phone station_phone,
m.lng station_lng,
m.lat station_lat,
a.contacts, a.contacts,
a.check_time, a.check_time,
a.assignment_trans_time, a.assignment_trans_time,