فهرست منبع

vgm调用相关

liyuan 23 ساعت پیش
والد
کامیت
eefca10ab7

+ 98 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/vgm/VgmDeclaration.java

@@ -0,0 +1,98 @@
+package org.springblade.los.vgm;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * VGM申报
+ * @author Rain
+ */
+@Data
+public class VgmDeclaration implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 港区代码 (QWG003/QDDG008)
+	 */
+	private String port;
+
+	/**
+	 * 箱号
+	 */
+	private String xh;
+
+	/**
+	 * 尺寸
+	 */
+	private String cc;
+
+	/**
+	 * 箱型
+	 */
+	private String xx;
+
+	/**
+	 * 订舱公司代码
+	 */
+	private String xsgsm;
+
+	/**
+	 * 码头代码
+	 */
+	private String mtdm;
+
+	/**
+	 * 场站代码
+	 */
+	private String czdm;
+
+	/**
+	 * 申报人
+	 */
+	private String applyPerson;
+
+	/**
+	 * 申报人手机号码
+	 */
+	private String applyPhone;
+
+	/**
+	 * VGM重量
+	 */
+	private String weight;
+
+	/**
+	 * 重量单位 (默认kgs)
+	 */
+	private String weightUnit;
+
+	/**
+	 * 用户名
+	 */
+	private String userName;
+
+	/**
+	 * 联系人
+	 */
+	private String linkMan;
+
+	/**
+	 * 联系电话
+	 */
+	private String linkPhone;
+
+	/**
+	 * 联系邮箱
+	 */
+	private String linkMail;
+
+	/**
+	 * 称重方式 (SM1/SM2)
+	 */
+	private String weightMethod;
+
+	/**
+	 * 船公司订舱号
+	 */
+	private String bookingNo;
+}

+ 17 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/vgm/VgmDeclarationSend.java

@@ -0,0 +1,17 @@
+package org.springblade.los.vgm;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Rain
+ */
+@Data
+public class VgmDeclarationSend {
+
+	private String tdh;
+
+	private List<VgmDeclaration> data;
+
+}

+ 35 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/vgm/VgmParamVo.java

@@ -0,0 +1,35 @@
+package org.springblade.los.vgm;
+
+import lombok.Data;
+
+/**
+ * @author Rain
+ */
+@Data
+public class VgmParamVo {
+
+	/**
+	 * 签名
+	 */
+	private String sign;
+
+	/**
+	 * 客户代码
+	 */
+	private String customerCode;
+
+	/**
+	 * 接口类型
+	 */
+	private String type;
+
+	/**
+	 * 数据
+	 */
+	private String data;
+
+
+
+
+
+}

+ 79 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/VgmUtils.java

@@ -0,0 +1,79 @@
+package org.springblade.los.Util;
+
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.asymmetric.Sign;
+import cn.hutool.crypto.asymmetric.SignAlgorithm;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.springblade.common.constant.Constants;
+import org.springblade.los.enums.VgmOperationType;
+import org.springblade.los.vgm.KeyValueVo;
+import org.springblade.los.vgm.VgmParamVo;
+import org.springframework.util.CollectionUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author Rain
+ */
+@Slf4j
+public class VgmUtils {
+
+
+	public static <T> String sendVgmToPlatform(T paramData, VgmOperationType operationType) throws IllegalAccessException, UnsupportedEncodingException {
+		if (Objects.isNull(paramData)) {
+			return "参数不能为空";
+		}
+		String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOTLGHGBjmyJp52KpMX783eY+qGZ6ApFek+tsVEUPMIcstzE2mk7gM0l1I5+SV+ramDWfcmHEu1OZnQXNfocxMgoVFhcbvYZksfJFJWwwRg2qPwQ6+txLoBih4d+IpoMj0Rlv8OlEsvCboQcBaZyfrddjoYN5TlTIsZB/062pqt1AgMBAAECgYBV13GjXLWgOYGfFV6/PcnabJZUvZcXC3xZmtS1k/874WKmfGFqLD4mOnRmxjEnaPwvuypUy44pZUoBcpf48IRP0z7UpBnjeNNYdRw7+ihhExP9VccGKoSesf9CfpcKhI+taJBmlXS18lV+O0itWCy6KTJ6tkm3w6rI1dqLA9WAvQJBAPsblMHJn58AuVETKC/+EfAUDi655nVQXY4rXMTZCFviVTucpMc8aET5qeHSoFYxN4DfSRfKD7FafKyioFzgkO8CQQDpQDg7CN94yB5kojTUuV72r5PXApOPHW8Fuu8/E1tpFhurd3MNfHvssfMcwevARHAxrLA3HouzecLgkXziIkHbAkAT29+M3+Q2z/jX95rjCMXkZcGlYmBegMeVWcqRatSlZ6Xz+/RwKU/ZvKD50g2KI4RPNdly/zD0hsJ7aLUkA0KTAkBY6L7GWfJ84qMbLu0+bM5y76hF29iNQ+Xu5DuP6nv8iY3QhT6Y1GuUZJxLyOtpJW0ysiWVTRJpPi93VF2rAO3jAkEAvLwG/lduFGnOZBos5b1mmTEzgPh7fr884hf5drISYn55NN4PVywmVErQL5HLFMaKH2bGVVxIsWMTbDFUolUtgA==";
+		String paramBody = JSONObject.toJSONString(paramData);
+		Sign sign = SecureUtil.sign(SignAlgorithm.SHA1withRSA, privateKey, null);
+		VgmParamVo vgmParamVo = new VgmParamVo();
+		vgmParamVo.setCustomerCode("92120221660325249F");
+		vgmParamVo.setType(operationType.getSignType());
+		vgmParamVo.setData(paramBody);
+		String signParam = "customerCode=" + URLEncoder.encode(vgmParamVo.getCustomerCode(), "utf-8")  + "&data=" + vgmParamVo.getData() + "&type=" + vgmParamVo.getType();
+		byte[] signedBytes = sign.sign(signParam.getBytes(StandardCharsets.UTF_8));
+		String signature = cn.hutool.core.codec.Base64.encode(signedBytes);
+		vgmParamVo.setSign(signature);
+		HttpPost post = new HttpPost(operationType.getUrl());
+		try {
+			String jsonBody = JSONUtil.toJsonStr(vgmParamVo);
+			StringEntity entity = new StringEntity(jsonBody, ContentType.APPLICATION_JSON);
+			post.setEntity(entity);
+			post.setHeader("Content-Type", "application/json;charset=UTF-8");
+			CloseableHttpClient client = HttpClients.createDefault();
+			CloseableHttpResponse response = client.execute(post);
+			HttpEntity httpEntity = response.getEntity();
+			String result = EntityUtils.toString(httpEntity, Constants.UTF8);
+			Thread.sleep(100);
+			return result;
+		} catch (Exception e1) {
+			log.error(e1.getMessage());
+			return e1.getMessage();
+		}
+	}
+
+
+
+
+}

+ 80 - 0
blade-service/blade-los/src/main/java/org/springblade/los/enums/VgmOperationType.java

@@ -0,0 +1,80 @@
+package org.springblade.los.enums;
+
+import lombok.Getter;
+
+/**
+ * 云港通 VGM 相关操作类型枚举
+ *
+ * @author Rain
+ */
+@Getter
+public enum VgmOperationType {
+
+	/**
+	 * 【平台-云港通】发送VGM申报到云港通
+	 * <p>
+	 * 业务描述:第三方平台将VGM信息发送给云港通,云港通返回该批VGM信息是否保存成功,并返回保存失败的原因。
+	 */
+	RECEIVE_VGM_REPORT(
+		"https://api.qingdao-port.net/gateway/test/third-platform/consumer/receiveVgmReport",
+		"receiveVgmReport"
+	),
+
+	/**
+	 * 【平台-云港通】提交VGM到场站
+	 * <p>
+	 * 业务描述:第三方平台发起VGM提交到场站的请求,云港通返回该批VGM场站是否接收成功,并返回接收失败的原因。
+	 */
+	SUBMIT_VGM_REPORT(
+		"https://api.qingdao-port.net/gateway/test/third-platform/consumer/submitVgmReport",
+		"submitVgmReport"
+	),
+
+	/**
+	 * 【平台-云港通】VGM变更信息保存
+	 * <p>
+	 * 业务描述:第三方平台发起VGM变更请求,首先提交云港通平台,云港通保存VGM变更信息。平台后续再调用提交场站变更接口,发起变更。
+	 */
+	RECEIVE_MODIFY_VGM_REPORT(
+		"https://api.qingdao-port.net/gateway/test/third-platform/consumer/receiveModifyVgmReport",
+		"receiveModifyVgmReport"
+	),
+
+	/**
+	 * 【平台-云港通】平台提交VGM变更到场站
+	 * <p>
+	 * 业务描述:第三方平台发起VGM变更请求,云港通返回该批VGM场站是否接收成功,并返回接收失败的原因。
+	 */
+	SUBMIT_MODIFY_VGM_REPORT(
+		"https://api.qingdao-port.net/gateway/test/third-platform/consumer/submitModifyVgmReport",
+		"submitModifyVgmReport"
+	),
+
+	/**
+	 * 【平台-云港通】平台发起支付请求(云付钱包协议扣款)
+	 * <p>
+	 * 业务描述:第三方平台发起VGM变更请求,云港通返回场站是否接收到此变更信息。返回的信息仅代表场站收到变更信息,云港通会在场站确认该信息后,再次通知第三方平台场站的处理结果。
+	 */
+	REQUEST_PAY_VGM(
+		"https://api.qingdao-port.net/gateway/test/third-platform/consumer/requestPayVgm",
+		"requestPayVgm"
+	);
+
+
+	/**
+	 * 请求地址
+	 */
+	private final String url;
+
+	/**
+	 * 签名类型
+	 */
+	private final String signType;
+
+	VgmOperationType(String url, String signType) {
+		this.url = url;
+		this.signType = signType;
+	}
+
+
+}

+ 34 - 0
blade-service/blade-los/src/main/java/org/springblade/los/vgm/controller/VgmController.java

@@ -0,0 +1,34 @@
+package org.springblade.los.vgm.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.vgm.service.IVgmService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @author Rain
+ */
+@RestController
+@RequestMapping("/vgm")
+@RequiredArgsConstructor
+public class VgmController {
+
+
+	private final IVgmService vgmService;
+
+
+	@PostMapping("/sendVgm")
+	public R sendVgm(@RequestParam("billId") String billId) throws IllegalAccessException, UnsupportedEncodingException {
+		return vgmService.sendVgm(billId);
+	}
+
+
+
+
+
+}

+ 20 - 0
blade-service/blade-los/src/main/java/org/springblade/los/vgm/service/IVgmService.java

@@ -0,0 +1,20 @@
+package org.springblade.los.vgm.service;
+
+import org.springblade.core.tool.api.R;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @author Rain
+ */
+public interface IVgmService {
+
+
+	/**
+	 * 发送vgm
+	 *
+	 * @param billId 单据id
+	 * @return 结果
+	 */
+	R sendVgm(String billId) throws IllegalAccessException, UnsupportedEncodingException;
+}

+ 81 - 0
blade-service/blade-los/src/main/java/org/springblade/los/vgm/service/impl/VgmServiceImpl.java

@@ -0,0 +1,81 @@
+package org.springblade.los.vgm.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.jsonwebtoken.lang.Collections;
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.Util.VgmUtils;
+import org.springblade.los.business.sea.entity.Bills;
+import org.springblade.los.business.sea.entity.Containers;
+import org.springblade.los.business.sea.mapper.BillsMapper;
+import org.springblade.los.business.sea.mapper.ContainersMapper;
+import org.springblade.los.enums.VgmOperationType;
+import org.springblade.los.vgm.VgmDeclaration;
+import org.springblade.los.vgm.VgmDeclarationSend;
+import org.springblade.los.vgm.service.IVgmService;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author Rain
+ */
+@Service
+@RequiredArgsConstructor
+public class VgmServiceImpl implements IVgmService {
+
+	private final BillsMapper billsMapper;
+
+	private final ContainersMapper containersMapper;
+
+
+	@Override
+	public R sendVgm(String billId) throws IllegalAccessException, UnsupportedEncodingException {
+		BladeUser bladeUser = AuthUtil.getUser();
+		Bills bills = billsMapper.selectOne(new LambdaQueryWrapper<Bills>().eq(Bills::getTenantId, bladeUser.getTenantId())
+			.eq(Bills::getId, billId).eq(Bills::getIsDeleted, 0).last("limit 1"));
+		if (Objects.isNull(bills)) {
+			return R.fail("未找到对应的提单");
+		}
+		List<Containers> containers = containersMapper.selectList(new LambdaQueryWrapper<Containers>()
+			.eq(Containers::getPid, billId).eq(Containers::getIsDeleted, 0).eq(Containers::getTenantId, bladeUser.getTenantId()));
+		if (Collections.isEmpty(containers)) {
+			return R.fail("未找到对应的提单下的箱列表");
+		}
+		List<VgmDeclaration> vgmDeclarationList = new ArrayList<>();
+		VgmDeclarationSend sendData = new VgmDeclarationSend();
+		sendData.setTdh(bills.getBillNo());
+		sendData.setData(vgmDeclarationList);
+		for (Containers container : containers) {
+			String xx = container.getCntrTypeCode().substring(2, 3);
+			String cc = container.getCntrTypeCode().substring(0, 1);
+			VgmDeclaration vgmDeclaration = new VgmDeclaration();
+			vgmDeclarationList.add(vgmDeclaration);
+			vgmDeclaration.setXh(container.getCntrNo());
+			vgmDeclaration.setXx(xx);
+			vgmDeclaration.setCc(cc);
+			vgmDeclaration.setWeight(String.valueOf(container.getVgmWeight()));
+			vgmDeclaration.setCzdm(bills.getPodCyCode());
+			vgmDeclaration.setMtdm(bills.getPortTerminalCyCode());
+			vgmDeclaration.setWeightMethod("SM1");
+			vgmDeclaration.setBookingNo(bills.getBookingNo());
+			vgmDeclaration.setLinkMan(bladeUser.getUserName());
+			vgmDeclaration.setWeightUnit("kgs");
+			vgmDeclaration.setXsgsm("COS");
+
+			vgmDeclaration.setApplyPerson("x");
+			vgmDeclaration.setApplyPhone("x");
+			vgmDeclaration.setUserName("x");
+			vgmDeclaration.setLinkPhone("x");
+			vgmDeclaration.setLinkMail("x");
+
+		}
+		String result = VgmUtils.sendVgmToPlatform(sendData, VgmOperationType.RECEIVE_VGM_REPORT);
+		return R.success(result);
+	}
+}