This commit is contained in:
linfso 2024-06-13 19:18:16 +08:00
parent b7609be65f
commit 2be6cc183d
13 changed files with 1291 additions and 2 deletions

View File

@ -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: <p> 转件物流信息记录表 控制器 </p>
*/
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<EmisTmsTransferTrace> 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<EmisTmsTransferTrace> list = emisTmsTransferTraceService.selectEmisTmsTransferTraceList(emisTmsTransferTrace);
ExcelUtil<EmisTmsTransferTrace> util = new ExcelUtil<EmisTmsTransferTrace>(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));
}
}

View File

@ -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: <p> 转件物流信息记录表 实体类 </p>
*/
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;
}

View File

@ -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: <p> 转件物流信息记录表 Mapper 接口 </p>
* <span style='color:red'> Warning : This file is generate by ai tools,don't edit!!! </span>
*/
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 <p> 转件物流信息记录表 Mapper 接口 </p>
* @author linfso
* @date 2024-06-13 08:54:23
*/
public interface EmisTmsTransferTraceMapper extends BaseMapper<EmisTmsTransferTrace>
{
/**
* 主键查询
* @param id
* @return
*/
public EmisTmsTransferTrace selectEmisTmsTransferTraceById(Long id);
/**
* 查询列表
*
* @param emisTmsTransferTrace
* @return 集合
*/
public List<EmisTmsTransferTrace> 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);
}

View File

@ -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<EmisTmsTransferTrace> listTrace=emisTmsTransferTraceMapper.selectEmisTmsTransferTraceList(emisTmsTransferTrace);
if(!CollectionUtil.isEmpty(listTrace)){
return listTrace.get(0);
}else{
return null;
}
}
/**
* 获取第三方转件记录
* @param billCode
* @return
*/
public List<EmisTmsScanRecord> cvtTransferTraceToScanRecord(String billCode) {
List<EmisTmsScanRecord> 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<EmisTmsTransferTrace> 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<EmisWaybillTransfer> 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 获取单号信息

View File

@ -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: <p> 转件物流信息记录表 服务类接口 </p>
*/
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<EmisTmsTransferTrace> 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);
}

View File

@ -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<EmisTmsScanRecord> getTraceListByBillCode(String billCode) {
return emisTmsScanRecordMapper.selectTraceListByBillCode(billCode);
List<EmisTmsScanRecord> listTraces = emisTmsScanRecordMapper.selectTraceListByBillCode(billCode);
List<EmisTmsScanRecord> transferList=cvtTransferTraceToScanRecord(billCode);
if(!CollectionUtil.isEmpty(transferList)){
listTraces.addAll(transferList);
}
return listTraces;
}
// 获取物流跟踪列表

View File

@ -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: <p> 转件物流信息记录表 实体类 </p>
*/
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<EmisTmsTransferTrace> 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);
}
}

View File

@ -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);
}
}

View File

@ -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<Cookie> getCookies2(){
List<Cookie> 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<String, Object> params,Map<String, Object> 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<String, String> 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<String, Object> params,Map<String, String> 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;
}
}

View File

@ -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<String, String> 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<String, String> 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();
}
}
}

View File

@ -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<Cookie> cache = new ArrayList<>();
public List<Cookie> getCacheCookies(){
return cache;
}
// Http请求结束,Response中有Cookie时候回调
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
System.out.println(JSON.toJSONString(cookies));
//内存中缓存Cookie
cache.addAll(cookies);
}
//Http发送请求前回调,Request中设置Cookie
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
//过期的Cookie
List<Cookie> invalidCookies = new ArrayList<>();
//有效的Cookie
List<Cookie> 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<Cookie>让Request进行设置
return validCookies;
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xdadan.erp.emis.mapper.EmisTmsTransferTraceMapper">
<resultMap type="EmisTmsTransferTrace" id="EmisTmsTransferTraceResult">
<result property="id" column="id" />
<result property="billCode" column="bill_code" />
<result property="lastTraceDate" column="last_trace_date" />
<result property="lastWaybliiStatus" column="last_wayblii_status" />
<result property="traceInfo" column="trace_info" />
<result property="chId" column="ch_id" />
<result property="transferBillCode" column="transfer_bill_code" />
<result property="transferExpress" column="transfer_express" />
</resultMap>
<sql id="selectEmisTmsTransferTraceVo">
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
</sql>
<select id="selectEmisTmsTransferTraceList" parameterType="EmisTmsTransferTrace" resultMap="EmisTmsTransferTraceResult">
<include refid="selectEmisTmsTransferTraceVo"/>
<where>
del_flag='0'
<if test="id != null "> and id = #{id}</if>
<if test="billCode != null and billCode != ''"> and bill_code =#{billCode}</if>
<if test="lastTraceDate != null "> and last_trace_date = #{lastTraceDate}</if>
<if test="lastWaybliiStatus != null and lastWaybliiStatus != ''"> and last_wayblii_status=#{lastWaybliiStatus}</if>
<if test="traceInfo != null and traceInfo != ''"> and trace_info like concat('%', #{traceInfo}, '%')</if>
<if test="chId != null and chId != ''"> and ch_id like concat('%', #{chId}, '%')</if>
<if test="transferBillCode != null and transferBillCode != ''"> and transfer_bill_code=#{transferBillCode}</if>
<if test="transferExpress != null and transferExpress != ''"> and transfer_express=#{transferExpress}</if>
<if test="remark != null and remark != ''"> and remark like concat('%', #{remark}, '%')</if>
<if test="delFlag != null and delFlag != ''"> and del_flag like concat('%', #{delFlag}, '%')</if>
<if test="createBy != null and createBy != ''"> and create_by like concat('%', #{createBy}, '%')</if>
<if test="createTime != null "> and create_time = #{createTime}</if>
<if test="updateBy != null and updateBy != ''"> and update_by like concat('%', #{updateBy}, '%')</if>
<if test="updateTime != null "> and update_time = #{updateTime}</if>
<if test="createSite != null and createSite != ''"> and create_site like concat('%', #{createSite}, '%')</if>
<if test="updateSite != null and updateSite != ''"> and update_site like concat('%', #{updateSite}, '%')</if>
<if test="createTime != null "> and create_time = #{createTime}</if>
<if test="params.beginLastTraceDate != null and params.beginLastTraceDate != ''">
and last_trace_date <![CDATA[ >= ]]> #{params.beginLastTraceDate}
</if>
<if test="params.endLastTraceDate != null and params.endLastTraceDate != ''">
and last_trace_date <![CDATA[ <= ]]> #{params.endLastTraceDate}
</if>
<if test="params.needTrace != null and params.needTrace != '1'">
and last_wayblii_status != '50'
and DATE_SUB(CURDATE(), INTERVAL 30 DAY) <![CDATA[ <= ]]> date(last_trace_date)
</if>
</where>
order by last_trace_date asc
</select>
<select id="checkUnique" parameterType="EmisTmsTransferTrace" resultType="int">
select count(1) from emis_tms_transfer_trace
where del_flag='0'
and bill_code = #{billCode}
<if test="transferExpress != null and transferExpress != ''">
and transfer_express = #{transferExpress}
</if>
<if test="transferBillCode != null and transferBillCode != ''">
and transfer_bill_code = #{transferBillCode}
</if>
limit 1
</select>
<select id="selectEmisTmsTransferTraceById" parameterType="Long" resultMap="EmisTmsTransferTraceResult">
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 a
where a.id = #{id}
</select>
<insert id="insertEmisTmsTransferTrace" parameterType="EmisTmsTransferTrace" useGeneratedKeys="true" keyProperty="id">
insert into emis_tms_transfer_trace
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="billCode != null and billCode != ''">bill_code,</if>
<if test="lastTraceDate != null">last_trace_date,</if>
<if test="lastWaybliiStatus != null and lastWaybliiStatus != ''">last_wayblii_status,</if>
<if test="traceInfo != null and traceInfo != ''">trace_info,</if>
<if test="chId != null and chId != ''">ch_id,</if>
<if test="transferBillCode != null and transferBillCode != ''">transfer_bill_code,</if>
<if test="transferExpress != null and transferExpress != ''">transfer_express,</if>
<if test="remark != null and remark != ''">remark,</if>
<if test="delFlag != null and delFlag != ''">del_flag,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null and updateBy != ''">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="createSite != null and createSite != ''">create_site,</if>
<if test="updateSite != null and updateSite != ''">update_site,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="billCode != null and billCode != ''">#{billCode},</if>
<if test="lastTraceDate != null">#{lastTraceDate},</if>
<if test="lastWaybliiStatus != null and lastWaybliiStatus != ''">#{lastWaybliiStatus},</if>
<if test="traceInfo != null and traceInfo != ''">#{traceInfo},</if>
<if test="chId != null and chId != ''">#{chId},</if>
<if test="transferBillCode != null and transferBillCode != ''">#{transferBillCode},</if>
<if test="transferExpress != null and transferExpress != ''">#{transferExpress},</if>
<if test="remark != null and remark != ''">#{remark},</if>
<if test="delFlag != null and delFlag != ''">#{delFlag},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null and updateBy != ''">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="createSite != null and createSite != ''">#{createSite},</if>
<if test="updateSite != null and updateSite != ''">#{updateSite},</if>
</trim>
</insert>
<update id="updateEmisTmsTransferTrace" parameterType="EmisTmsTransferTrace">
update emis_tms_transfer_trace
<trim prefix="SET" suffixOverrides=",">
<if test="billCode != null and billCode != ''">bill_code = #{billCode},</if>
<if test="lastTraceDate != null">last_trace_date = #{lastTraceDate},</if>
<if test="lastWaybliiStatus != null and lastWaybliiStatus != ''">last_wayblii_status = #{lastWaybliiStatus},</if>
<if test="traceInfo != null and traceInfo != ''">trace_info = #{traceInfo},</if>
<if test="chId != null and chId != ''">ch_id = #{chId},</if>
<if test="transferBillCode != null and transferBillCode != ''">transfer_bill_code = #{transferBillCode},</if>
<if test="transferExpress != null and transferExpress != ''">transfer_express = #{transferExpress},</if>
<if test="remark != null and remark != ''">remark = #{remark},</if>
<if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if>
<if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="createSite != null and createSite != ''">create_site = #{createSite},</if>
<if test="updateSite != null and updateSite != ''">update_site = #{updateSite},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteEmisTmsTransferTraceById" parameterType="Long">
delete from emis_tms_transfer_trace where id = #{id}
</delete>
<delete id="deleteEmisTmsTransferTraceByIds" parameterType="String">
delete from emis_tms_transfer_trace where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>