|
@@ -75,6 +75,7 @@ import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.boot.context.properties.ConfigurationProperties;
|
|
|
import org.springframework.http.*;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -88,6 +89,10 @@ import java.io.*;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.BigInteger;
|
|
|
import java.math.RoundingMode;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.security.KeyFactory;
|
|
|
+import java.security.PrivateKey;
|
|
|
+import java.security.spec.PKCS8EncodedKeySpec;
|
|
|
import java.text.ParseException;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
@@ -231,6 +236,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
|
|
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
|
|
|
|
|
|
+ /**
|
|
|
+ * 签名算法
|
|
|
+ */
|
|
|
+ public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
|
|
|
|
|
|
/**
|
|
|
* 查询详情主表
|
|
@@ -9220,5 +9229,195 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
|
|
|
return AjaxResult.success("转航次成功");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 凯和设备交接单新增、修改(押箱)接口
|
|
|
+ *
|
|
|
+ * @param tWarehouseBills
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public AjaxResult receipt(TWarehouseBills tWarehouseBills,LoginUser loginUser) {
|
|
|
+ List<JoabBoxVo> receipt = tWarehousebillsCntritemsMapper.receipt(tWarehouseBills.getOrderList());
|
|
|
+ if (CollectionUtils.isEmpty(receipt)) {
|
|
|
+ throw new SecurityException("未找到设备交接单信息");
|
|
|
+ }else {
|
|
|
+ receipt.stream().forEach(item ->{
|
|
|
+ item.setContPerson(loginUser.getUsername());//押箱操作人姓名
|
|
|
+ item.setPrintPerson(loginUser.getUsername());//打印操作员姓名
|
|
|
+ });
|
|
|
+ }
|
|
|
+ String json = JSONObject.toJSONString(receipt);
|
|
|
+ // 请求路径 (测试)
|
|
|
+ String postUrl = "https://api.qingdao-port.net/container/web/eir/eir/Shipping/insertEir.do";
|
|
|
+ // 请求路径 (正式)
|
|
|
+ //String postUrl = "https://api.qingdao-port.net/container/web/wlds_eir/edo/shipagent/insertEir.do";
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
+ map.put("customerCode", "A00001");
|
|
|
+ map.put("data", json);
|
|
|
+ //获取数字签名所需的数据
|
|
|
+ String formatUrlMap = TWarehouseBillsServiceImpl.formatUrlMap(map, false, false);
|
|
|
+ //获取数字签名
|
|
|
+ String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKkgGJtjBAHHXylZ7SjHiTRf4uU/R8uzEnx4YJgAdMMEcBMAgsdXpkMjuVPeMzksHpWTfpdhnf307l2lE4NgZ2txUJZivAQDP9MquH4jQDym0zPLjXGPYykxO0FqQdIYcjXM9doygz5GcXtTGQDz+6Btz4XWBQC18mOsygaxa6qpAgMBAAECgYA58z17QNpGocIBsUaKCpUA1ToxwxUevyU+cSDn9IANsp+UY0BsfaQCrWL7Uc/Lb0qrhfaCeHhiZGKow7+D7KyCm/DynU7WcW0Z0JLlG2nwQBT/Opwg2WDF7wHnlf0Y5QmArZ8ioabagKWBTyJr358xCC3NNZ8AYQB5ToDdYXOO4QJBAPKieA0v0pUii/3lnPDs83IxMEDy9rAW5OsPzt/De5Rk8k3TwN9kJcrv6toVcU3OsZWqkLy9CvBmn7X05otlp0sCQQCycQfT2Ad5kLN06OKs0Y6WEQNFtW+XgSu+ X7is6feklUUOmAS0UwhYfClFoB5Ddija5MgwZeWJtWr2zsnYrLlbAkBDsSglJa5uhRDhaOn8HV9eAHMh66b/QaPkIKjqrLMRl4gyRl2M9XfFwmGXLlxKBNxukQOIZIVkxHzSWtznDxk5AkARfE3+Dk89NFbBgAimUqqcPfKKJCtZN0koEI0yNIMV16K6uV7MpM5OjWwl7HjKt4ttV7neND337pUatkzFNLe9AkEA7EzVn6WL45D4gaDwp6sRGTOMuyC9GyE1U4Vi 4eRLBpTGdPJTJYz3Pgg4Pr0Sp+1x7bxOaQ/V1XyiL3AMxKfWnw==";
|
|
|
+ String sign = TWarehouseBillsServiceImpl.sign(formatUrlMap, privateKey, "UTF-8");
|
|
|
+ // 请求参数
|
|
|
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
+ params.add("customerCode", "A00001");
|
|
|
+ params.add("data", json);
|
|
|
+ params.add("sign", sign);
|
|
|
+ TResponseVo responseVo = sendPostRequest(postUrl, params);
|
|
|
+ if (!responseVo.isSuccess()) {
|
|
|
+ throw new WarehouseException(responseVo.getMessage().get("msg"));
|
|
|
+ }else {
|
|
|
+ return AjaxResult.success(responseVo.getMessage().get("msg"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * RSA 签名
|
|
|
+ *
|
|
|
+ * @param content 待签名数据
|
|
|
+ * @param privateKey 商户私钥
|
|
|
+ * @param encode 字符集编码
|
|
|
+ * @return 签名值
|
|
|
+ */
|
|
|
+ public static String sign(String content, String privateKey, String encode) {
|
|
|
+ try {
|
|
|
+ byte[] decode = Base64.getMimeDecoder().decode(privateKey);
|
|
|
+ PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.getMimeDecoder().decode(privateKey));
|
|
|
+ KeyFactory keyf = KeyFactory.getInstance("RSA");
|
|
|
+ PrivateKey priKey = keyf.generatePrivate(priPKCS8);
|
|
|
+ java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
|
|
|
+ signature.initSign(priKey);
|
|
|
+ signature.update(content.getBytes(encode));
|
|
|
+ byte[] signed = signature.sign();
|
|
|
+ return Base64.getEncoder().encodeToString(signed);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成 url 参数串
|
|
|
+ *
|
|
|
+ * @param paraMap 要排序的 Map 对象
|
|
|
+ * @param urlEncode 是否需要 URLENCODE
|
|
|
+ * @param keyToLower 是否需要将 Key 转换为全小写 true:key 转化成小写,false:不转化
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) {
|
|
|
+ String buff = "";
|
|
|
+ Map<String, String> tmpMap = paraMap;
|
|
|
+ try {
|
|
|
+ List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());
|
|
|
+ // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
|
|
|
+ Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
|
|
|
+ @Override
|
|
|
+ public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
|
|
|
+ return (o1.getKey()).toString().compareTo(o2.getKey());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 构造 URL 键值对的格式
|
|
|
+ StringBuilder buf = new StringBuilder();
|
|
|
+ for (Map.Entry<String, String> item : infoIds) {
|
|
|
+ if (StringUtils.isNotBlank(item.getKey())) {
|
|
|
+ String key = item.getKey();
|
|
|
+ String val = item.getValue();
|
|
|
+ if (urlEncode) {
|
|
|
+ val = URLEncoder.encode(val, "utf-8");
|
|
|
+ }
|
|
|
+ if (keyToLower) {
|
|
|
+ buf.append(key.toLowerCase() + "=" + val);
|
|
|
+ } else {
|
|
|
+ buf.append(key + "=" + val);
|
|
|
+ }
|
|
|
+ buf.append("&");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ buff = buf.toString();
|
|
|
+ if (buff.isEmpty() == false) {
|
|
|
+ buff = buff.substring(0, buff.length() - 1);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return buff;
|
|
|
+ }
|
|
|
+ //测试设备单新增 接口
|
|
|
+ public static void main(String[] args) {
|
|
|
+ List<JoabBoxVo> list = new ArrayList<>();
|
|
|
+
|
|
|
+ JoabBoxVo joabBoxVo = new JoabBoxVo();
|
|
|
+ joabBoxVo.setContainerNo("TEMU2945451");//箱号 必填
|
|
|
+ joabBoxVo.setBillOfLadingNo("AEL0725208K");//提单号 必填
|
|
|
+ joabBoxVo.setEirId("123456");//设备交接单编号 不必填
|
|
|
+ joabBoxVo.setTradeFlag("W"); // 内外贸,N-内贸,W-外贸 必填
|
|
|
+ joabBoxVo.setVesselNameCn("长江号 6");//中文船名 必填
|
|
|
+ joabBoxVo.setVesselNameEn("MAERSK ABERDEEN");//英文船名 必填
|
|
|
+ joabBoxVo.setVesselNameCode("WTYHKL");// 船名代码,码头统一分配的3位代码(一般情况) 不必填
|
|
|
+ //joabBoxVo.setImo("");//IMO号,外贸须填写,内贸可以不填
|
|
|
+ joabBoxVo.setVoyageNumber("802B");//进口航次 必填
|
|
|
+ joabBoxVo.setContainerType("GP");//箱型(例如GP) 必填
|
|
|
+ joabBoxVo.setContainerSize("20");//尺寸,加规则校验,限制2位数字 必填
|
|
|
+ joabBoxVo.setContainerUser("TSL"); //箱属公司代码(船代上传的原始箱属公司码),请各船代以附件《箱属代码》为准进行转换 必填
|
|
|
+ joabBoxVo.setArriveAim("进场"); //进场目的,简单描述,比如返空、退租 不必填
|
|
|
+ joabBoxVo.setArriveState("E");//进场状态,E-空箱,F-重箱,默认为E 不必填
|
|
|
+ joabBoxVo.setArriveTime("2018-03-06 14:08:08");//到港时间,精确到秒,用于计算免费箱使期的起始时间 必填
|
|
|
+ joabBoxVo.setContState("0");// 押箱状态,0-未押箱,1-已押箱,默认已押箱 必填
|
|
|
+ joabBoxVo.setEmf("0");// EMF,0-无,1-有 不必填
|
|
|
+ joabBoxVo.setShippingNote("无"); // 船公司备注 不必填
|
|
|
+ joabBoxVo.setRemark("无要求"); // 船公司特殊要求 不必填
|
|
|
+ joabBoxVo.setContEnterprise("青岛押箱有限公司测");//押箱企业全称(船公司、船代、场站押箱点在云港通注册时填写的准确全称) 必填
|
|
|
+ joabBoxVo.setContEnterpriseNo("56565"); //押箱企业社会统一编码(船公司、船代、场站押箱点在云港通注册时填写的社会统一编码) 必填
|
|
|
+ joabBoxVo.setContTime("2018-03-09 06:08:08");//押箱时间,精确到秒 必填
|
|
|
+ joabBoxVo.setContPerson("张三测");//押箱操作人姓名 必填
|
|
|
+ joabBoxVo.setUseEnterprise("青岛用箱企业公司测");//用箱企业全称(货代企业在云港通注册时填写的准确全称)必填
|
|
|
+ joabBoxVo.setUseEnterpriseNo("91370213MA3RE74912");//用箱企业社会统一编码(货代企业在云港通注册时填写的社会统一编码) 必填
|
|
|
+ joabBoxVo.setUsePerson("武安国测");//经办人姓名(货代企业经办人) 不必填
|
|
|
+ joabBoxVo.setFreeTimePeriod("26 天");//免费箱使期(天数),描述性文字,比如5天 不必填
|
|
|
+ joabBoxVo.setFreeTime("2018-03-31 14:08:08");//免费箱使期到期日期,精确到日,比如2018-03-06 不必填
|
|
|
+ joabBoxVo.setPlaceOfDelivery("青岛港码头");//提箱地点,提箱码头名称 不必填
|
|
|
+ joabBoxVo.setPlaceOfDeliveryCode("2333");//提箱码头代码(QQCT、QQCTU、QQCTN) 必填
|
|
|
+ joabBoxVo.setLoadingPort("连云港");// 装货港,港口名称 不必填
|
|
|
+ joabBoxVo.setDischargePort("天津港");// 卸货港,港口名称 不必填
|
|
|
+ joabBoxVo.setDischargeFactory("青岛港");// 卸货厂家 不必填
|
|
|
+ joabBoxVo.setSealNo("QF9981");//铅封号 不必填
|
|
|
+ joabBoxVo.setPlaceOfReturn("东港总站");//必填 返空场站名称(填写云港通平台统一发放的场站代码表中返空分站名称)
|
|
|
+ joabBoxVo.setPlaceOfReturnCode("DGGZZ"); // 必填 返空场站代码(填写云港通平台统一发放的场站代码表中五位返空分站代码,如果是退租业务,请务必选择退租场站代码,平台为每个场站都分配了一个退租场站代码)
|
|
|
+ joabBoxVo.setForeignReturnContFlag("0");//不必填 是否异地还箱场站,0-否,1-是,默认为否
|
|
|
+ joabBoxVo.setForeignReturnStation("异地场站");//不必填 异地还箱场站名称
|
|
|
+ joabBoxVo.setShippingValidateCode("WERr");// 不必填 验证码(4位数字),有需要的船公司、船代或者场站押箱点,可以在上传信息时同时生成验证码,货主货代去结算中心办理提单手续时,需要提供此验证码
|
|
|
+ joabBoxVo.setContExitState("E");// 不必填 出港状态出场的状态,E-空箱,F-满箱,默认为F,司机提箱出闸的状态
|
|
|
+ joabBoxVo.setContExitRecord("12");// 不必填 出港检查记录出场检查记录,简单描述集装箱出港时的检查情况,比如正常、异常、是否有割伤、是否有破洞等等
|
|
|
+ joabBoxVo.setPrintEnterprise("4");//) 必填 打印企业全称(船公司、船代、场站押箱点在云港通注册时填写的准确全称)注:生成电子设备交接单的企业
|
|
|
+ joabBoxVo.setPrintEnterpriseNo("4");// 必填 打印企业社会统一编码(船公司、船代、场站押箱点在云港通注册时填写的社会统一编码)
|
|
|
+ joabBoxVo.setPrintPerson("小明测");// 必填 打印操作员姓名注:生成电子设备交接单企业的操作员姓名
|
|
|
+ joabBoxVo.setShippingEmergFlag("0");// 不必填 船代应急标记,0-否,1-是取消船代应急,该字段可传,也可不传,如果不传,会将该字段置为0
|
|
|
+ joabBoxVo.setUploadTime("2018-03-12 13:08:08"); // 必填 上传时间,打印操作员点击上传调用接口的系统时间,精确到秒
|
|
|
+ list.add(joabBoxVo);
|
|
|
+ String json = JSONObject.toJSONString(list);
|
|
|
+ // 请求路径 (测试)
|
|
|
+ String postUrl = "https://api.qingdao-port.net/container/web/eir/eir/Shipping/insertEir.do";
|
|
|
+ // 请求路径 (正式)
|
|
|
+ //String postUrl = "https://api.qingdao-port.net/container/web/wlds_eir/edo/shipagent/insertEir.do";
|
|
|
+
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
+ map.put("customerCode", "A00001");
|
|
|
+ map.put("data", json);
|
|
|
+ //获取数字签名所需的数据
|
|
|
+ String formatUrlMap = TWarehouseBillsServiceImpl.formatUrlMap(map, false, false);
|
|
|
+ //获取数字签名
|
|
|
+ String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKkgGJtjBAHHXylZ7SjHiTRf4uU/R8uzEnx4YJgAdMMEcBMAgsdXpkMjuVPeMzksHpWTfpdhnf307l2lE4NgZ2txUJZivAQDP9MquH4jQDym0zPLjXGPYykxO0FqQdIYcjXM9doygz5GcXtTGQDz+6Btz4XWBQC18mOsygaxa6qpAgMBAAECgYA58z17QNpGocIBsUaKCpUA1ToxwxUevyU+cSDn9IANsp+UY0BsfaQCrWL7Uc/Lb0qrhfaCeHhiZGKow7+D7KyCm/DynU7WcW0Z0JLlG2nwQBT/Opwg2WDF7wHnlf0Y5QmArZ8ioabagKWBTyJr358xCC3NNZ8AYQB5ToDdYXOO4QJBAPKieA0v0pUii/3lnPDs83IxMEDy9rAW5OsPzt/De5Rk8k3TwN9kJcrv6toVcU3OsZWqkLy9CvBmn7X05otlp0sCQQCycQfT2Ad5kLN06OKs0Y6WEQNFtW+XgSu+ X7is6feklUUOmAS0UwhYfClFoB5Ddija5MgwZeWJtWr2zsnYrLlbAkBDsSglJa5uhRDhaOn8HV9eAHMh66b/QaPkIKjqrLMRl4gyRl2M9XfFwmGXLlxKBNxukQOIZIVkxHzSWtznDxk5AkARfE3+Dk89NFbBgAimUqqcPfKKJCtZN0koEI0yNIMV16K6uV7MpM5OjWwl7HjKt4ttV7neND337pUatkzFNLe9AkEA7EzVn6WL45D4gaDwp6sRGTOMuyC9GyE1U4Vi 4eRLBpTGdPJTJYz3Pgg4Pr0Sp+1x7bxOaQ/V1XyiL3AMxKfWnw==";
|
|
|
+ String sign = TWarehouseBillsServiceImpl.sign(formatUrlMap, privateKey, "UTF-8");
|
|
|
+ // 请求参数
|
|
|
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
+ params.add("customerCode", "A00001");
|
|
|
+ params.add("data", json);
|
|
|
+ params.add("sign", sign);
|
|
|
+ TResponseVo responseVo = sendPostRequest(postUrl, params);
|
|
|
+ System.err.println(responseVo);
|
|
|
+ if (!responseVo.isSuccess()) {
|
|
|
+ throw new WarehouseException(responseVo.getMessage().get("msg"));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|