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