From 2be6cc183da52324f67186f61197428b45baef52 Mon Sep 17 00:00:00 2001 From: linfso Date: Thu, 13 Jun 2024 19:18:16 +0800 Subject: [PATCH] md --- .../emis/EmisTmsTransferTraceController.java | 134 +++++++++ .../erp/emis/domain/EmisTmsTransferTrace.java | 54 ++++ .../mapper/EmisTmsTransferTraceMapper.java | 79 +++++ .../erp/emis/service/EmisBaseService.java | 99 +++++++ .../service/IEmisTmsTransferTraceService.java | 78 +++++ .../impl/EmisTmsScanRecordServiceImpl.java | 18 +- .../impl/EmisTmsTransferTraceServiceImpl.java | 117 ++++++++ .../xdadan/erp/emis/task/LogisticTask.java | 60 ++++ .../xdadan/erp/emis/utils/HTTPHelperV3.java | 275 ++++++++++++++++++ .../xdadan/erp/emis/utils/Kd100Helper.java | 123 ++++++++ .../utils/okhttp/PersistenceCookieJar.java | 52 ++++ .../emis/utils/okhttp/SSLSocketClient.java | 53 ++++ .../mapper/EmisTmsTransferTraceMapper.xml | 151 ++++++++++ 13 files changed, 1291 insertions(+), 2 deletions(-) create mode 100644 emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsTransferTraceController.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsTransferTrace.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsTransferTraceMapper.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsTransferTraceService.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsTransferTraceServiceImpl.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/task/LogisticTask.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/utils/HTTPHelperV3.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/utils/Kd100Helper.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/PersistenceCookieJar.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/SSLSocketClient.java create mode 100644 emis-biz/src/main/resources/mapper/EmisTmsTransferTraceMapper.xml diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsTransferTraceController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsTransferTraceController.java new file mode 100644 index 000000000..08133ab4e --- /dev/null +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsTransferTraceController.java @@ -0,0 +1,134 @@ + +/** + * @Project: emis + * @Title: EmisTmsTransferTraceController.java + * @author linfso + * @date 2024-06-13 08:54:23 + * @Copyright: ShangHai Duta 2022 All rights reserved. + * @version v1.0 + * @Description:

转件物流信息记录表 控制器

+ */ + +package com.xdadan.erp.web.emis; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.xdadan.erp.common.annotation.Log; +import com.xdadan.erp.common.core.controller.BaseController; +import com.xdadan.erp.common.core.domain.AjaxResult; +import com.xdadan.erp.common.core.page.TableDataInfo; +import com.xdadan.erp.common.enums.BusinessType; +import com.xdadan.erp.common.utils.StringUtils; +import com.xdadan.erp.common.utils.poi.ExcelUtil; + +import com.xdadan.erp.emis.domain.EmisTmsTransferTrace; +import com.xdadan.erp.emis.service.IEmisTmsTransferTraceService; + +/** + * 转件物流信息记录表Controller + * + * @author linfso + * @date 2024-06-13 08:54:23 + */ +@RestController +@RequestMapping("/emis/emisTmsTransferTrace") +public class EmisTmsTransferTraceController extends BaseController +{ + @Autowired + private IEmisTmsTransferTraceService emisTmsTransferTraceService; + + /** + * 查询转件物流信息记录表列表 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsTransferTrace:list')") + @GetMapping("/list") + public TableDataInfo list(EmisTmsTransferTrace emisTmsTransferTrace) + { + startPage(); + List list = emisTmsTransferTraceService.selectEmisTmsTransferTraceList(emisTmsTransferTrace); + return getDataTable(list); + } + + + /** + * 检查是否重复 + * + * @param emisTmsTransferTrace + * @return 数量 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsTransferTrace:list')") + @GetMapping("/checkUnique") + public AjaxResult checkUnique(EmisTmsTransferTrace emisTmsTransferTrace) + { + int cnt=emisTmsTransferTraceService.checkUnique(emisTmsTransferTrace); + return AjaxResult.success("检查成功",cnt); + } + + + /** + * 导出转件物流信息记录表列表 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsTransferTrace:export')") + @Log(title = "转件物流信息记录表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EmisTmsTransferTrace emisTmsTransferTrace) + { + List list = emisTmsTransferTraceService.selectEmisTmsTransferTraceList(emisTmsTransferTrace); + ExcelUtil util = new ExcelUtil(EmisTmsTransferTrace.class); + util.exportExcel(response, list, "转件物流信息记录表数据"); + } + + /** + * 获取转件物流信息记录表详细信息 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsTransferTrace:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(emisTmsTransferTraceService.selectEmisTmsTransferTraceById(id)); + } + + /** + * 新增转件物流信息记录表 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsTransferTrace:add')") + @Log(title = "转件物流信息记录表", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EmisTmsTransferTrace emisTmsTransferTrace) + { + return toAjax(emisTmsTransferTraceService.insertEmisTmsTransferTrace(emisTmsTransferTrace)); + } + + /** + * 修改转件物流信息记录表 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsTransferTrace:edit')") + @Log(title = "转件物流信息记录表", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EmisTmsTransferTrace emisTmsTransferTrace) + { + return toAjax(emisTmsTransferTraceService.updateEmisTmsTransferTrace(emisTmsTransferTrace)); + } + + /** + * 删除转件物流信息记录表 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsTransferTrace:remove')") + @Log(title = "转件物流信息记录表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(emisTmsTransferTraceService.deleteEmisTmsTransferTraceByIds(ids)); + } +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsTransferTrace.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsTransferTrace.java new file mode 100644 index 000000000..3fad7bc49 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsTransferTrace.java @@ -0,0 +1,54 @@ +/** + * @Project: emis + * @Title: EmisTmsTransferTrace.java + * @author linfso + * @date 2024-06-13 08:54:23 + * @Copyright: ShangHai Duta 2022 All rights reserved. + * @version v1.0 + * @Description:

转件物流信息记录表 实体类

+ */ + +package com.xdadan.erp.emis.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xdadan.erp.common.annotation.Excel; +import com.xdadan.erp.common.core.domain.BaseEntity; +import com.xdadan.erp.common.core.domain.TreeEntity; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + + +/** + * @ClassName EmisTmsTransferTrace + * @Description 转件物流信息记录表 + * @author linfso + * @date 2024-06-13 08:54:23 + */ + @Data +public class EmisTmsTransferTrace extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /* id */ + private Long id; + /* 单号 */ + private String billCode; + /* 跟进日期 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastTraceDate; + /* 50-签收 */ + private String lastWaybliiStatus; + /* 轨迹信息 */ + private String traceInfo; + /* 跟进渠道 */ + private String chId; + /* 转件单号 */ + private String transferBillCode; + /* 转件公司 */ + private String transferExpress; + +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsTransferTraceMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsTransferTraceMapper.java new file mode 100644 index 000000000..0b2da505f --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsTransferTraceMapper.java @@ -0,0 +1,79 @@ +/** + * @Project: emis + * @Title: EmisTmsTransferTraceMapper.java + * @author linfso + * @date 2024-06-13 08:54:23 + * @Copyright: ShangHai Doitinfo 2022 All rights reserved. + * @version v1.0 + * @Description:

转件物流信息记录表 Mapper 接口

+ * Warning : This file is generate by ai tools,don't edit!!! + */ +package com.xdadan.erp.emis.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xdadan.erp.emis.domain.EmisTmsTransferTrace; +/** + * @ClassName EmisTmsTransferTraceMapper + * @Description

转件物流信息记录表 Mapper 接口

+ * @author linfso + * @date 2024-06-13 08:54:23 + */ +public interface EmisTmsTransferTraceMapper extends BaseMapper +{ + /** + * 主键查询 + * @param id + * @return + */ + public EmisTmsTransferTrace selectEmisTmsTransferTraceById(Long id); + + /** + * 查询列表 + * + * @param emisTmsTransferTrace + * @return 集合 + */ + public List selectEmisTmsTransferTraceList(EmisTmsTransferTrace emisTmsTransferTrace); + + + /** + * 检查是否重复 + * + * @param emisTmsTransferTrace + * @return 数量 + */ + public int checkUnique(EmisTmsTransferTrace emisTmsTransferTrace); + + /** + * 新增 + * + * @param emisTmsTransferTrace + * @return + */ + public int insertEmisTmsTransferTrace(EmisTmsTransferTrace emisTmsTransferTrace); + + /** + * 修改 + * + * @param emisTmsTransferTrace + * @return + */ + public int updateEmisTmsTransferTrace(EmisTmsTransferTrace emisTmsTransferTrace); + + /** + * 删除 + * + * @param id 主键 + * @return 结果 + */ + public int deleteEmisTmsTransferTraceById(Long id); + + /** + * 批量删除 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmisTmsTransferTraceByIds(Long[] ids); +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java index 58ef131b6..b3e78ff49 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java @@ -15,6 +15,7 @@ package com.xdadan.erp.emis.service; import cn.hutool.core.util.IdUtil; import cn.hutool.db.DbUtil; import com.alibaba.fastjson.JSON; + import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.PropertyFilter; import com.alibaba.fastjson.serializer.SerializeFilter; @@ -38,6 +39,7 @@ package com.xdadan.erp.emis.service; import com.xdadan.erp.emis.service.IEmisWaybillCargoService; import com.xdadan.erp.emis.service.IEmisWaybillFeeitemService; import com.xdadan.erp.emis.service.IEmisWaybillService; + import com.xdadan.erp.emis.utils.Kd100Helper; import com.xdadan.erp.emis.utils.WaybillHelper; import com.xdadan.erp.emis.utils.sensitive.Convert; import com.xdadan.erp.system.mapper.SysUserMapper; @@ -114,6 +116,13 @@ public class EmisBaseService { private EmisWaybillProblemInfoMapper emisWaybillProblemInfoMapper; + @Autowired + private EmisTmsTransferTraceMapper emisTmsTransferTraceMapper; + + @Autowired + private EmisWaybillTransferMapper emisWaybillTransferMapper; + + /** * 获取客户完整手机号 国家+电话 eg: 0086-1381861188 * @param countryCode @@ -355,8 +364,98 @@ public class EmisBaseService { upd.setBlDispFd("1");// 转单标识 emisWaybillMapper.updateTransferInfo(upd); + // 插入跟踪记录表 + EmisTmsTransferTrace emisTmsTransferTrace=new EmisTmsTransferTrace(); + emisTmsTransferTrace.setBillCode(billCode); + emisTmsTransferTrace.setTransferBillCode(transferBillcode); + emisTmsTransferTrace.setTransferExpress(transferCode); + int rst=emisTmsTransferTraceMapper.checkUnique(emisTmsTransferTrace); + if(rst==0){ + emisTmsTransferTraceMapper.insertEmisTmsTransferTrace(emisTmsTransferTrace); + } + } + /** + * 获取三方物流轨迹 + * @param billCode + * @return + */ + public EmisTmsTransferTrace getEmisTmsTransferTraceByBillCode(String billCode){ + + EmisTmsTransferTrace emisTmsTransferTrace = new EmisTmsTransferTrace(); + emisTmsTransferTrace.setBillCode(billCode); + List listTrace=emisTmsTransferTraceMapper.selectEmisTmsTransferTraceList(emisTmsTransferTrace); + if(!CollectionUtil.isEmpty(listTrace)){ + return listTrace.get(0); + }else{ + return null; + } + } + /** + * 获取第三方转件记录 + * @param billCode + * @return + */ + public List cvtTransferTraceToScanRecord(String billCode) { + List recordList= null; + try { + EmisWaybill waybill=getWaybillByBillCode(billCode); + if("1".equals(waybill.getBlDispFd())){ + EmisTmsTransferTrace emisTmsTransferTrace = getEmisTmsTransferTraceByBillCode(billCode); + if(emisTmsTransferTrace!=null){ + if(!StringUtils.isEmpty(emisTmsTransferTrace.getTraceInfo())){ + JSONObject jsonObject = JSONObject.parseObject(emisTmsTransferTrace.getTraceInfo()); + JSONArray steps=jsonObject.getJSONArray("data"); + if(steps!=null && steps.size()>0){ + recordList = new ArrayList<>(); + for (Object obj:steps) { + JSONObject stepItem = (JSONObject)obj; + EmisTmsScanRecord recordItem = new EmisTmsScanRecord(); + recordItem.setBillCode(billCode); + recordItem.setScanDate(stepItem.getDate("time")); + recordItem.setRemark(stepItem.getString("context")); + recordItem.setScanType("81"); + } + } + } + } + } + + + } catch (Exception e) { + e.printStackTrace(); + } + + return recordList; + } + + public void doTransferTraceUpdate() { + EmisTmsTransferTrace emisTmsTransferTrace = new EmisTmsTransferTrace(); + emisTmsTransferTrace.getParams().put("needTrace", "1"); + List list = emisTmsTransferTraceMapper.selectEmisTmsTransferTraceList(emisTmsTransferTrace); + if(!CollectionUtil.isEmpty(list)){ + for(EmisTmsTransferTrace dt:list){ + log.error("===>Start 三方物流跟踪单号:"+dt.getBillCode()+","+dt.getTransferExpress()+" "+dt.getTransferBillCode()); + EmisTmsTransferTrace rstUpd=Kd100Helper.queryTmsTransferTraceByKd100(dt); + // 如果已签收,需要做签收扫描 + if(WaybillStatus.SIGNED.equals(rstUpd.getLastWaybliiStatus())){ + // 查询转件的站点 + EmisWaybillTransfer qEmisWaybillTransfer=new EmisWaybillTransfer(); + qEmisWaybillTransfer.setBillCode(rstUpd.getBillCode()); + List listTransfer = emisWaybillTransferMapper.selectEmisWaybillTransferList(qEmisWaybillTransfer); + if(!CollectionUtil.isEmpty(listTransfer)) { + EmisWaybillTransfer trans0=listTransfer.get(0); + updateSignStatus(rstUpd.getBillCode(),"转件签收",trans0.getCreateBy(),trans0.getCreateSite(),rstUpd.getLastTraceDate(),""); + } + } + emisTmsTransferTraceMapper.updateEmisTmsTransferTrace(rstUpd); + log.error("===>End 三方物流跟踪单号:"+dt.getTraceInfo()); + + } + } + + } /** * 根据billCode 获取单号信息 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsTransferTraceService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsTransferTraceService.java new file mode 100644 index 000000000..a55805ced --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsTransferTraceService.java @@ -0,0 +1,78 @@ + /** + * @Project: emis + * @Title: EmisTmsTransferTraceService.java + * @author linfso + * @date 2024-06-13 08:54:23 + * @Copyright: ShangHai Duta 2022 All rights reserved. + * @version v1.0 + * @Description:

转件物流信息记录表 服务类接口

+ */ +package com.xdadan.erp.emis.service; + +import java.util.List; +import com.xdadan.erp.emis.domain.EmisTmsTransferTrace; + +/** + * @ClassName EmisTmsTransferTraceService + * @Description 转件物流信息记录表 + * @author linfso + * @date 2024-06-13 08:54:23 + */ +public interface IEmisTmsTransferTraceService +{ + /** + * 主键查询 + * @param id + * @return + */ + public EmisTmsTransferTrace selectEmisTmsTransferTraceById(Long id); + + /** + * 查询转件物流信息记录表列表 + * + * @param emisTmsTransferTrace 转件物流信息记录表 + * @return 转件物流信息记录表集合 + */ + public List selectEmisTmsTransferTraceList(EmisTmsTransferTrace emisTmsTransferTrace); + + + /** + * 检查是否重复 + * + * @param emisTmsTransferTrace + * @return 数量 + */ + public int checkUnique(EmisTmsTransferTrace emisTmsTransferTrace); + + /** + * 新增转件物流信息记录表 + * + * @param emisTmsTransferTrace 转件物流信息记录表 + * @return 结果 + */ + public int insertEmisTmsTransferTrace(EmisTmsTransferTrace emisTmsTransferTrace); + + /** + * 修改转件物流信息记录表 + * + * @param emisTmsTransferTrace 转件物流信息记录表 + * @return 结果 + */ + public int updateEmisTmsTransferTrace(EmisTmsTransferTrace emisTmsTransferTrace); + + /** + * 批量删除转件物流信息记录表 + * + * @param ids 需要删除的转件物流信息记录表主键集合 + * @return 结果 + */ + public int deleteEmisTmsTransferTraceByIds(Long[] ids); + + /** + * 删除转件物流信息记录表信息 + * + * @param id 转件物流信息记录表主键 + * @return 结果 + */ + public int deleteEmisTmsTransferTraceById(Long id); +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsScanRecordServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsScanRecordServiceImpl.java index 0f76c6aaa..9f9e83681 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsScanRecordServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsScanRecordServiceImpl.java @@ -13,6 +13,7 @@ package com.xdadan.erp.emis.service.impl; import java.math.BigDecimal; import java.util.*; +import cn.hutool.core.collection.CollectionUtil; import com.xdadan.erp.common.core.domain.entity.SysUser; import com.xdadan.erp.common.utils.DateUtils; import com.xdadan.erp.common.utils.DictUtils; @@ -26,7 +27,9 @@ import com.xdadan.erp.emis.domain.vo.scan.ScanResult; import com.xdadan.erp.emis.domain.vo.scan.ScanResultItem; import com.xdadan.erp.emis.mapper.EmisTmsPackDtlMapper; import com.xdadan.erp.emis.mapper.EmisTmsScanPicInfoMapper; +import com.xdadan.erp.emis.mapper.EmisTmsTransferTraceMapper; import com.xdadan.erp.emis.service.EmisBaseService; +import com.xdadan.erp.emis.utils.Kd100Helper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -51,6 +54,8 @@ public class EmisTmsScanRecordServiceImpl extends EmisBaseService implements IEm @Autowired private EmisTmsPackDtlMapper emisTmsPackDtlMapper; + + /** * 查询TMS扫描记录 * @@ -495,7 +500,7 @@ public class EmisTmsScanRecordServiceImpl extends EmisBaseService implements IEm changeWaybillCurrentSite(emisTmsScanRecord.getBillCode(),emisTmsScanRecord.getScanSiteCode()); } - // 转单扫描 + // 转件扫描 else if(ScanType.TRANSFER.opCode.equals(scanType)){ // "billCode": "T001,T002,T002", // "transferCode": "转单同行快递代码", @@ -510,6 +515,8 @@ public class EmisTmsScanRecordServiceImpl extends EmisBaseService implements IEm emisTmsScanRecord.setPreOrNextStation(destCity); + emisTmsScanRecord.setRemark(transferCode+":"+transferBillcode +" "+destCity); + // 更新waybill做转单 wayBillTransfer(emisTmsScanRecord.getBillCode(),transferCode,transferBillcode,destCity); @@ -709,7 +716,14 @@ public class EmisTmsScanRecordServiceImpl extends EmisBaseService implements IEm */ @Override public List getTraceListByBillCode(String billCode) { - return emisTmsScanRecordMapper.selectTraceListByBillCode(billCode); + + List listTraces = emisTmsScanRecordMapper.selectTraceListByBillCode(billCode); + List transferList=cvtTransferTraceToScanRecord(billCode); + if(!CollectionUtil.isEmpty(transferList)){ + listTraces.addAll(transferList); + } + + return listTraces; } // 获取物流跟踪列表 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsTransferTraceServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsTransferTraceServiceImpl.java new file mode 100644 index 000000000..85bbe9bb2 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsTransferTraceServiceImpl.java @@ -0,0 +1,117 @@ + /** + * @Project: emis + * @Title: EmisTmsTransferTraceServiceImpl.java + * @author linfso + * @date 2024-06-13 08:54:23 + * @Copyright: ShangHai Duta 2022 All rights reserved. + * @version v1.0 + * @Description:

转件物流信息记录表 实体类

+ */ + +package com.xdadan.erp.emis.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xdadan.erp.emis.domain.EmisTmsTransferTrace; +import com.xdadan.erp.emis.mapper.EmisTmsTransferTraceMapper; +import com.xdadan.erp.emis.service.IEmisTmsTransferTraceService; + +/** + * 转件物流信息记录表Service业务层处理 + * + * @author linfso + * @date 2024-06-13 08:54:23 + */ +@Service +public class EmisTmsTransferTraceServiceImpl implements IEmisTmsTransferTraceService +{ + @Autowired + private EmisTmsTransferTraceMapper emisTmsTransferTraceMapper; + + /** + * 查询转件物流信息记录表 + * + * @param id 转件物流信息记录表主键 + * @return 转件物流信息记录表 + */ + @Override + public EmisTmsTransferTrace selectEmisTmsTransferTraceById(Long id) + { + return emisTmsTransferTraceMapper.selectEmisTmsTransferTraceById(id); + } + + + /** + * 查询转件物流信息记录表列表 + * + * @param emisTmsTransferTrace 转件物流信息记录表 + * @return 转件物流信息记录表 + */ + @Override + public List selectEmisTmsTransferTraceList(EmisTmsTransferTrace emisTmsTransferTrace) + { + return emisTmsTransferTraceMapper.selectEmisTmsTransferTraceList(emisTmsTransferTrace); + } + + /** + * 检查是否重复 + * + * @param emisTmsTransferTrace + * @return 数量 + */ + @Override + public int checkUnique(EmisTmsTransferTrace emisTmsTransferTrace) + { + return emisTmsTransferTraceMapper.checkUnique(emisTmsTransferTrace); + } + + /** + * 新增转件物流信息记录表 + * + * @param emisTmsTransferTrace 转件物流信息记录表 + * @return 结果 + */ + @Override + public int insertEmisTmsTransferTrace(EmisTmsTransferTrace emisTmsTransferTrace) + { + return emisTmsTransferTraceMapper.insertEmisTmsTransferTrace(emisTmsTransferTrace); + } + + /** + * 修改转件物流信息记录表 + * + * @param emisTmsTransferTrace 转件物流信息记录表 + * @return 结果 + */ + @Override + public int updateEmisTmsTransferTrace(EmisTmsTransferTrace emisTmsTransferTrace) + { + return emisTmsTransferTraceMapper.updateEmisTmsTransferTrace(emisTmsTransferTrace); + } + + /** + * 批量删除转件物流信息记录表 + * + * @param ids 需要删除的转件物流信息记录表主键 + * @return 结果 + */ + @Override + public int deleteEmisTmsTransferTraceByIds(Long[] ids) + { + return emisTmsTransferTraceMapper.deleteEmisTmsTransferTraceByIds(ids); + } + + /** + * 删除转件物流信息记录表信息 + * + * @param id 转件物流信息记录表主键 + * @return 结果 + */ + @Override + public int deleteEmisTmsTransferTraceById(Long id) + { + return emisTmsTransferTraceMapper.deleteEmisTmsTransferTraceById(id); + } + +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/task/LogisticTask.java b/emis-biz/src/main/java/com/xdadan/erp/emis/task/LogisticTask.java new file mode 100644 index 000000000..949b8df4d --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/task/LogisticTask.java @@ -0,0 +1,60 @@ +package com.xdadan.erp.emis.task; + +import com.xdadan.erp.common.core.redis.RedissonService; +import com.xdadan.erp.emis.service.EmisBaseService; +import com.xdadan.erp.emis.service.IEmisTmsTransferTraceService; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; + +@Slf4j +@Configurable +@EnableScheduling +@EnableAsync +@Component +public class LogisticTask { + private int count=0; + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + + @Autowired + RedissonService redissonService; + + @Autowired + private EmisBaseService emisBaseService; + + + /** + * 自动查询转件物流信息 + */ + @Async + @Scheduled(fixedRate = 1000L * 60 * 5) + public void autoQueryTransferInfo() { + String lockKey="autoQueryTransferInfo"; + log.error("autoQueryTransferInfo start"); + + // 加锁查询 + redissonService.lock(lockKey,300); + try{ + emisBaseService.doTransferTraceUpdate(); + }catch(Exception ex){ + ex.printStackTrace(); + log.error("autoQueryTransferInfo exception:"+ex.getMessage()); + } + log.error("autoQueryTransferInfo end"); + + redissonService.unlock(lockKey); + } + + + + +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/utils/HTTPHelperV3.java b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/HTTPHelperV3.java new file mode 100644 index 000000000..11fc74d70 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/HTTPHelperV3.java @@ -0,0 +1,275 @@ +package com.xdadan.erp.emis.utils; + +import com.xdadan.erp.emis.utils.okhttp.PersistenceCookieJar; +import com.xdadan.erp.emis.utils.okhttp.SSLSocketClient; +import okhttp3.*; +import org.apache.commons.lang3.StringUtils; + +import javax.net.ssl.*; +import java.io.File; +import java.io.IOException; +import java.security.KeyStore; +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class HTTPHelperV3 { + + public static final String CHARSET = "UTF-8"; + private static PersistenceCookieJar persistenceCookieJar = null; + private static OkHttpClient clientWithCookie = null; + static { + + persistenceCookieJar = new PersistenceCookieJar(); + try { + TrustManagerFactory trustManagerFactory = null; + trustManagerFactory = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init((KeyStore) null); + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { + throw new IllegalStateException("Unexpected default trust managers:" + + Arrays.toString(trustManagers)); + } + X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, new TrustManager[]{trustManager}, null); + SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + clientWithCookie = new OkHttpClient.Builder() + .connectTimeout(1000, TimeUnit.SECONDS) + .readTimeout(30000, TimeUnit.SECONDS) + .sslSocketFactory(sslSocketFactory, trustManager) + .hostnameVerifier(SSLSocketClient.getHostnameVerifier()) + .cookieJar(persistenceCookieJar) + .connectionPool(new ConnectionPool(1500, 3, TimeUnit.MINUTES)) + .build(); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static List getCookies2(){ + List cookies = persistenceCookieJar.getCacheCookies(); + return cookies; + } + + public static String get(String url) throws Exception{ + return doGet(url); + } + + public static String post(String url, Map postData) throws Exception{ + return doPost(url, postData,null, CHARSET); + } + + public static String post(String url,Map postData,String contentType) throws Exception{ + Map headers = new HashMap(); + headers.put("Content-Type",contentType); + return doPost(url, postData,headers, CHARSET); + } + + public static String postWithCookieAndHeader2(String url,Map postData,Map headers) throws Exception{ + return doPost(url, postData,headers, CHARSET); + } + + public static String postMultipartFormData(String url, Map postData,Map headers) throws Exception { + return doUploadPost(url, postData,headers, CHARSET); + + } + + public static String postJson(String url,Map headers, String json) throws Exception { + if(headers==null){ + headers=new HashMap(); + } + headers.put("Content-Type","application/json"); + return doPostBody(url, json,headers, CHARSET); + } + + + public static String doGet(String url) throws IOException{ + if (StringUtils.isBlank(url)) { + return null; + } + + String result = null; + Request request = new Request.Builder().url(url).build(); + // 执行请求操作 + Response response = clientWithCookie.newCall(request).execute(); + if(response.isSuccessful()){ + result = response.body().string(); + } + return result; + } + + /** + * HTTP Post 获取内容 + * + * @param url 请求的url地址 ?之前的地址 + * @param params 请求的参数 + * @param charset 编码格式 + * @return 页面内容 + * @throws IOException + */ + private static String doPost(String url, Map params,Map headers, String charset) throws IOException { + if (StringUtils.isBlank(url)) { + return null; + } + + String result = null; + FormBody.Builder builder= null; + + if (params != null && !params.isEmpty()) { + + builder= new FormBody.Builder(); + Iterator iter = params.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + if (entry.getValue() != null) { + String value = entry.getValue().toString(); + builder.add((String)entry.getKey(), value); + } + } + + } + + Request.Builder reqBuilder= new Request.Builder(); + // add headers + if(headers != null) { + if (!headers.isEmpty()) { + Iterator iter = headers.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + String key = (String) entry.getKey(); + String val = ""; + if (entry.getValue() != null) { + val = entry.getValue().toString(); + } + reqBuilder.addHeader(key, val); + } + } + } + + RequestBody body = builder.build(); + // 创建请求方式 + Request request = reqBuilder.url(url).post(body).build();; + + // 执行请求操作 + Response response = clientWithCookie.newCall(request).execute(); + if(response.isSuccessful()){ + result = response.body().string(); + } + return result; + + } + + + private static String doPostBody(String url, String body,Map headers, String charset) throws IOException { + if (StringUtils.isBlank(url)) { + return null; + } + + String result = null; +// String contentType ="application/json; charset="+charset; + String contentType ="application/x-www-form-urlencoded; charset="+charset; + Request.Builder reqBuilder= new Request.Builder(); + // add headers + if(headers != null) { + if (!headers.isEmpty()) { + Iterator iter = headers.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + String key = (String) entry.getKey(); + + + String val = ""; + if (entry.getValue() != null) { + val = entry.getValue().toString(); + } + if("content-type".equals(key.toLowerCase())){ + contentType=val; + } + reqBuilder.addHeader(key, val); + } + } + } + + RequestBody requestBody= RequestBody.create(MediaType.parse(contentType),body); + // 创建请求方式 + Request request = reqBuilder.url(url).post(requestBody).build();; + + // 执行请求操作 + Response response = clientWithCookie.newCall(request).execute(); + if(response.isSuccessful()){ + result = response.body().string(); + } + return result; + } + + /** + * HTTP Upload 获取内容 + * + * @param url 请求的url地址 ?之前的地址 + * @param params 请求的参数 + * @param charset 编码格式 + * @return 页面内容 + * @throws IOException + */ + private static String doUploadPost(String url, Map params,Map headers, String charset) throws IOException { + if (StringUtils.isBlank(url)) { + return null; + } + + String result = null; + + Request.Builder reqBuilder= new Request.Builder(); + // add headers + if(headers != null) { + if (!headers.isEmpty()) { + Iterator iter = headers.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + String key = (String) entry.getKey(); + String val = ""; + if (entry.getValue() != null) { + val = entry.getValue().toString(); + } + reqBuilder.addHeader(key, val); + } + } + } + + MultipartBody.Builder mutiBuilder = new MultipartBody.Builder(); + // 添加请求类型 +// mutiBuilder.setType(MediaType.parse("multipart/form-data")); + mutiBuilder.setType(MultipartBody.ALTERNATIVE); + // 创建请求的请求体 + if (params != null && !params.isEmpty()) { + MediaType type= MediaType.parse("application/octet-stream"); + Iterator iter = params.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + if (entry.getValue() != null) { + Object object = entry.getValue(); + if (object instanceof File) { + File file = (File) object; + mutiBuilder.addFormDataPart((String)entry.getKey(), file.getName(), RequestBody.create(type, file)); + } else { + mutiBuilder.addFormDataPart((String)entry.getKey(), object.toString()); + } + } + } + } + RequestBody body = mutiBuilder.build(); + Request request = reqBuilder.url(url).post(body).build();; + + // 执行请求操作 + Response response = clientWithCookie.newCall(request).execute(); + if(response.isSuccessful()){ + result = response.body().string(); + } + return result; + + } + + +} diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/utils/Kd100Helper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/Kd100Helper.java new file mode 100644 index 000000000..31b40c8f4 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/Kd100Helper.java @@ -0,0 +1,123 @@ +package com.xdadan.erp.emis.utils; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.xdadan.erp.emis.domain.EmisTmsScanRecord; +import com.xdadan.erp.emis.domain.EmisTmsTransferTrace; +import com.xdadan.erp.emis.domain.EmisWaybill; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 快递100 Api + * 请求头必须添加: "Content-type","application/x-www-form-urlencoded;charset=UTF-8” + */ +@SuppressWarnings("all") +@Component +@Slf4j +public class Kd100Helper { + + + private static final String POLL_QUERY_URL = "https://poll.kuaidi100.com/poll/query.do"; + + // 授权码,授权码,请到快递100页面申请企业版接口获取 + private static final String KEY = "UpQfyYaY2889"; + private static final String CUSTOMER = "61B9DD3182821BBC65F4D79A62F378F9"; + + /** + * 快递100 物流查询 + * @param com 快递公司编码 + * @param num 快递单号 + * @return data + */ + public static String queryTraceByMainNoAndCom(String mainNo, String com) throws Exception { + + Map param = new HashMap<>(); + param.put("com", com);//快递公司编码 + param.put("num", mainNo);//快递单号 + param.put("phone", "1234"); + param.put("from", ""); + param.put("to", ""); + param.put("show", "0"); + param.put("order", "desc"); + param.put("resultv2", "1"); + String mgsData = JSON.toJSONString(param); + Map postDataMap = new HashMap<>(); + postDataMap.put("customer", CUSTOMER); // 授权码,请到快递100页面申请企业版接口获取 + postDataMap.put("sign", genDigest(mgsData, KEY, CUSTOMER)); // 数字签名 + postDataMap.put("param", mgsData); + + String allResult=HTTPHelperV3.post(POLL_QUERY_URL,postDataMap,"application/x-www-form-urlencoded"); + + return allResult; + } + + + public static EmisTmsTransferTrace queryTmsTransferTraceByKd100(EmisTmsTransferTrace emisTmsTransferTrace) { + + String rstStr= null; + try { + emisTmsTransferTrace.setChId("KD100"); + rstStr = queryTraceByMainNoAndCom(emisTmsTransferTrace.getTransferBillCode(),emisTmsTransferTrace.getTransferExpress()); + JSONObject jsonObject=JSONObject.parseObject(rstStr); + emisTmsTransferTrace.setTraceInfo(rstStr); + /* + 快递单当前状态,默认为0在途,1揽收,2疑难,3签收,4退签,5派件,8清关,14拒签等10个基础物流状态,如需要返回高级物流状态,请参考 resultv2 传值 + */ + String state=jsonObject.getString("state"); + if("3".equals(state)){ + emisTmsTransferTrace.setLastWaybliiStatus("50"); + } + + JSONArray steps=jsonObject.getJSONArray("data"); + if(steps!=null && steps.size()>0){ + JSONObject lastObj = steps.getJSONObject(0); + emisTmsTransferTrace.setLastTraceDate(new Date(lastObj.getString("time"))); + emisTmsTransferTrace.setRemark(lastObj.getString("context")); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return emisTmsTransferTrace; + } + + + + + + + + /** + * 业务数据加密 --> param + key + customer 的顺序进行MD5加密(注意加密后字符串一定要转大写) + * @param timestamp + * @param mgsData + * @param md5key + * @return + * @throws Exception + */ + private static String genDigest(String mgsData, String key, String customer) { + return DigestUtils.md5Hex(mgsData + key + customer).toUpperCase(); + } + + public static void main(String[] args) { + String rst= null; + try { + rst = queryTraceByMainNoAndCom("SF1532297522428","shunfeng"); + System.out.println(rst); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} + diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/PersistenceCookieJar.java b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/PersistenceCookieJar.java new file mode 100644 index 000000000..76e8fcd81 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/PersistenceCookieJar.java @@ -0,0 +1,52 @@ +package com.xdadan.erp.emis.utils.okhttp; + +import com.alibaba.fastjson.JSON; +import okhttp3.Cookie; +import okhttp3.CookieJar; +import okhttp3.HttpUrl; + +import java.util.ArrayList; +import java.util.List; + +public class PersistenceCookieJar implements CookieJar { + + List cache = new ArrayList<>(); + + public List getCacheCookies(){ + return cache; + } + + // Http请求结束,Response中有Cookie时候回调 + @Override + public void saveFromResponse(HttpUrl url, List cookies) { + System.out.println(JSON.toJSONString(cookies)); + //内存中缓存Cookie + cache.addAll(cookies); + } + + //Http发送请求前回调,Request中设置Cookie + @Override + public List loadForRequest(HttpUrl url) { + //过期的Cookie + List invalidCookies = new ArrayList<>(); + //有效的Cookie + List validCookies = new ArrayList<>(); + + for (Cookie cookie : cache) { + + if (cookie.expiresAt() < System.currentTimeMillis()) { + //判断是否过期 + invalidCookies.add(cookie); + } else if (cookie.matches(url)) { + //匹配Cookie对应url + validCookies.add(cookie); + } + } + + //缓存中移除过期的Cookie + cache.removeAll(invalidCookies); + + //返回List让Request进行设置 + return validCookies; + } +} \ No newline at end of file diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/SSLSocketClient.java b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/SSLSocketClient.java new file mode 100644 index 000000000..8aa48eed7 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/utils/okhttp/SSLSocketClient.java @@ -0,0 +1,53 @@ +package com.xdadan.erp.emis.utils.okhttp; + +import javax.net.ssl.*; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; + + +public class SSLSocketClient { + + //获取这个SSLSocketFactory + public static SSLSocketFactory getSSLSocketFactory() { + try { +// SSLContext sslContext = SSLContext.getInstance("SSL"); + SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); + sslContext.init(null, getTrustManager(), new SecureRandom()); + return sslContext.getSocketFactory(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + //获取TrustManager + private static TrustManager[] getTrustManager() { + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + }; + return trustAllCerts; + } + + //获取HostnameVerifier + public static HostnameVerifier getHostnameVerifier() { + HostnameVerifier hostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }; + return hostnameVerifier; + } +} diff --git a/emis-biz/src/main/resources/mapper/EmisTmsTransferTraceMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsTransferTraceMapper.xml new file mode 100644 index 000000000..0461f0eb2 --- /dev/null +++ b/emis-biz/src/main/resources/mapper/EmisTmsTransferTraceMapper.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + select id, bill_code, last_trace_date, last_wayblii_status, trace_info, ch_id, transfer_bill_code, transfer_express, remark, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_tms_transfer_trace + + + + + + + + + + insert into emis_tms_transfer_trace + + id, + bill_code, + last_trace_date, + last_wayblii_status, + trace_info, + ch_id, + transfer_bill_code, + transfer_express, + remark, + del_flag, + create_by, + create_time, + update_by, + update_time, + create_site, + update_site, + + + #{id}, + #{billCode}, + #{lastTraceDate}, + #{lastWaybliiStatus}, + #{traceInfo}, + #{chId}, + #{transferBillCode}, + #{transferExpress}, + #{remark}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{createSite}, + #{updateSite}, + + + + + update emis_tms_transfer_trace + + bill_code = #{billCode}, + last_trace_date = #{lastTraceDate}, + last_wayblii_status = #{lastWaybliiStatus}, + trace_info = #{traceInfo}, + ch_id = #{chId}, + transfer_bill_code = #{transferBillCode}, + transfer_express = #{transferExpress}, + remark = #{remark}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + create_site = #{createSite}, + update_site = #{updateSite}, + + where id = #{id} + + + + delete from emis_tms_transfer_trace where id = #{id} + + + + delete from emis_tms_transfer_trace where id in + + #{id} + + + \ No newline at end of file