feat(可回溯): 重构

处理类型映射
This commit is contained in:
BrandWang
2023-05-09 11:03:31 +08:00
parent dbaab0484b
commit 875a14f2b7
11 changed files with 142 additions and 69 deletions
@@ -1,7 +0,0 @@
package com.wabestway.recall;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
@@ -0,0 +1,43 @@
package com.wabestway.recall.api.dto;
import lombok.Data;
@Data
public class TraceRecord {
/**
* 业务订单ID
*/
private String orderId;
/**
* 产品编码
*/
private String supplierProductCode;
/**
* 产品名称
*/
private String supplierProductName;
/**
* 保单号
*/
private String policyNo;
/**
* 投保人名称
*/
private String holderName;
/**
* 投保人手机号
*/
private String holderPhone;
/**
* 保险公司名称
*/
private String supplierName;
/**
* 保单起始日期
*/
private String startDate;
/**
* 保单结束日期
*/
private String endDate;
}
@@ -11,24 +11,3 @@ public class TraceUpDTO {
List<TraceRecord> records; List<TraceRecord> records;
} }
@Data
class TraceRecord {
/** 业务订单ID */
private String orderId;
/** 产品编码 */
private String supplierProductCode;
/** 产品名称 */
private String supplierProductName;
/** 保单号 */
private String policyNo;
/** 投保人名称 */
private String holderName;
/** 投保人手机号 */
private String holderPhone;
/** 保险公司名称 */
private String supplierName;
/** 保单起始日期 */
private String startDate;
/** 保单结束日期 */
private String endDate;
}
@@ -48,4 +48,6 @@ public interface RecallRecordDao extends BaseMapper<RecallRecordEntity> {
* @return * @return
*/ */
RecallRecordVO queryRecallRecordById(@Param("id") String id); RecallRecordVO queryRecallRecordById(@Param("id") String id);
List<RecallRecordVO> queryTraceRecords(@Param("traceId") String traceId);
} }
@@ -1,6 +1,10 @@
package com.wabestway.recall.trace.handler; package com.wabestway.recall.trace.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wabestway.recall.trace.entity.RecallRecordEntity;
import com.wabestway.recall.trace.vo.RecallRecordVO; import com.wabestway.recall.trace.vo.RecallRecordVO;
import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedJdbcTypes;
@@ -11,32 +15,62 @@ import java.sql.CallableStatement;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@MappedTypes(value = {RecallRecordVO.class}) @MappedTypes(value = {List.class})
@MappedJdbcTypes(value = {JdbcType.LONGNVARCHAR}) @MappedJdbcTypes(value = {JdbcType.BLOB})
public class ListTypeHandler implements TypeHandler<List<String>> { public class ListTypeHandler implements TypeHandler<List<String>> {
private ObjectMapper objectMapper = new ObjectMapper();
@Override @Override
public void setParameter(PreparedStatement ps, int i, List<String> strings, JdbcType jdbcType) throws SQLException { public void setParameter(PreparedStatement ps, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.join(",", strings)); String jsonStr = null;
try {
jsonStr = objectMapper.writeValueAsString(strings);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
ps.setString(i, jsonStr);
} }
@Override @Override
public List<String> getResult(ResultSet rs, String s) throws SQLException { public List<String> getResult(ResultSet rs, String s) throws SQLException {
String str = rs.getString(s); String str = rs.getString(s);
return Arrays.asList(str.split(",")); List<String> newList = new ArrayList<>();
try {
newList = objectMapper.readValue(str, new TypeReference<List<String>>() {
});
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
return newList;
} }
@Override @Override
public List<String> getResult(ResultSet rs, int i) throws SQLException { public List<String> getResult(ResultSet rs, int i) throws SQLException {
String str = rs.getString(i); String str = rs.getString(i);
return Arrays.asList(str.split(",")); List<String> newList = new ArrayList<>();
try {
newList = objectMapper.readValue(str, new TypeReference<List<String>>() {
});
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
return newList;
} }
@Override @Override
public List<String> getResult(CallableStatement cs, int i) throws SQLException { public List<String> getResult(CallableStatement cs, int i) throws SQLException {
String str = cs.getString(i); String str = cs.getString(i);
return Arrays.asList(str.split(",")); List<String> newList = new ArrayList<>();
try {
newList = objectMapper.readValue(str, new TypeReference<List<String>>() {
});
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
return newList;
} }
} }
@@ -44,5 +44,12 @@ public interface RecallRecordService extends IService<RecallRecordEntity> {
* @return * @return
*/ */
RecallRecordVO queryRecallRecordById(String id); RecallRecordVO queryRecallRecordById(String id);
/**
* 根据traceId 查询列表
* @param traceId
* @return
*/
List<RecallRecordVO> queryTraceRecords(String traceId);
} }
@@ -53,7 +53,7 @@ public class RecallOrderServiceImpl extends ServiceImpl<RecallOrderDao, RecallOr
@Override @Override
public RecallOrderEntity queryRecallOrderByTraceId(String traceId) { public RecallOrderEntity queryRecallOrderByTraceId(String traceId) {
LambdaQueryWrapper<RecallOrderEntity> orderQuery = Wrappers.lambdaQuery(); LambdaQueryWrapper<RecallOrderEntity> orderQuery = Wrappers.lambdaQuery();
orderQuery.eq(RecallOrderEntity::getOrderId, traceId); orderQuery.eq(RecallOrderEntity::getTraceId, traceId);
orderQuery.last("limit 1"); orderQuery.last("limit 1");
return baseMapper.selectOne(orderQuery); return baseMapper.selectOne(orderQuery);
} }
@@ -43,4 +43,9 @@ public class RecallRecordServiceImpl extends ServiceImpl<RecallRecordDao, Recall
public RecallRecordVO queryRecallRecordById(String id ) { public RecallRecordVO queryRecallRecordById(String id ) {
return baseMapper.queryRecallRecordById(id); return baseMapper.queryRecallRecordById(id);
} }
@Override
public List<RecallRecordVO> queryTraceRecords(String traceId) {
return baseMapper.queryTraceRecords(traceId);
}
} }
@@ -2,7 +2,10 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wabestway.recall.trace.dao.RecallRecordDao"> <mapper namespace="com.wabestway.recall.trace.dao.RecallRecordDao">
<resultMap id="queryOrderRecordMap" type="com.wabestway.recall.trace.vo.RecallRecordVO">
<result column="events" property="events"
typeHandler="com.wabestway.recall.trace.handler.ListTypeHandler"></result>
</resultMap>
<sql id="queryRecallRecordSql"> <sql id="queryRecallRecordSql">
t.id id, t.id id,
t.product_code productCode, t.product_code productCode,
@@ -18,11 +21,11 @@
<select id="queryRecallRecordByCondition" <select id="queryRecallRecordByCondition"
parameterType="com.wabestway.recall.trace.dto.RecallRecordDTO" parameterType="com.wabestway.recall.trace.dto.RecallRecordDTO"
resultType="com.wabestway.recall.trace.vo.RecallRecordVO"> resultType="com.wabestway.recall.trace.vo.RecallRecordVO">
select select
<include refid="queryRecallRecordSql"/> <include refid="queryRecallRecordSql"/>
from from
recall_record t recall_record t
where 1 = 1 where 1 = 1
<if test="recallRecordDTO.id != null and recallRecordDTO.id != '' "> <if test="recallRecordDTO.id != null and recallRecordDTO.id != '' ">
and t.id = #{recallRecordDTO.id} and t.id = #{recallRecordDTO.id}
@@ -50,10 +53,10 @@
<select id="queryRecallRecordListNoPage" <select id="queryRecallRecordListNoPage"
parameterType="com.wabestway.recall.trace.dto.RecallRecordDTO" parameterType="com.wabestway.recall.trace.dto.RecallRecordDTO"
resultType="com.wabestway.recall.trace.vo.RecallRecordVO"> resultType="com.wabestway.recall.trace.vo.RecallRecordVO">
select select
<include refid="queryRecallRecordSql"/> <include refid="queryRecallRecordSql"/>
from recall_record t from recall_record t
where 1 = 1 where 1 = 1
<if test="recallRecordDTO.id != null and recallRecordDTO.id != '' "> <if test="recallRecordDTO.id != null and recallRecordDTO.id != '' ">
and t.id = #{recallRecordDTO.id} and t.id = #{recallRecordDTO.id}
@@ -79,10 +82,10 @@
</select> </select>
<select id="queryRecallRecordById" resultType="com.wabestway.recall.trace.vo.RecallRecordVO"> <select id="queryRecallRecordById" resultType="com.wabestway.recall.trace.vo.RecallRecordVO">
select select
<include refid="queryRecallRecordSql"/> <include refid="queryRecallRecordSql"/>
from recall_record t from recall_record t
where t.id= #{id} where t.id= #{id}
</select> </select>
<update id="updateRecallRecordById" parameterType="com.wabestway.recall.trace.entity.RecallRecordEntity"> <update id="updateRecallRecordById" parameterType="com.wabestway.recall.trace.entity.RecallRecordEntity">
@@ -114,4 +117,13 @@
where t.id= #{recallRecord.id} where t.id= #{recallRecord.id}
</update> </update>
<select id="queryTraceRecords" resultMap="queryOrderRecordMap">
select
<include refid="queryRecallRecordSql"/>
from recall_record t
where t.trace_id = #{traceId}
order by t.create_time asc
</select>
</mapper> </mapper>
@@ -15,7 +15,9 @@ import com.wabestway.recall.trace.entity.RecallOrderEntity;
import com.wabestway.recall.trace.entity.RecallRecordEntity; import com.wabestway.recall.trace.entity.RecallRecordEntity;
import com.wabestway.recall.trace.service.RecallOrderService; import com.wabestway.recall.trace.service.RecallOrderService;
import com.wabestway.recall.trace.service.RecallRecordService; import com.wabestway.recall.trace.service.RecallRecordService;
import com.wabestway.recall.trace.vo.RecallRecordVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import com.wabestway.recall.trace.dto.RecallOrderDTO; import com.wabestway.recall.trace.dto.RecallOrderDTO;
import com.wabestway.recall.trace.vo.RecallOrderVO; import com.wabestway.recall.trace.vo.RecallOrderVO;
@@ -55,13 +57,13 @@ public class RecallOrderApiServiceImpl implements RecallOrderApiService {
@Override @Override
public ResObj<RecallOrderVO> getRecallOrderByOrderId(String orderId) { public ResObj<RecallOrderVO> getRecallOrderByOrderId(String orderId) {
RecallOrderVO recallOrderVO = recallOrderService.queryRecallOrderById(orderId); RecallOrderVO recallOrderVO = new RecallOrderVO();
if (recallOrderVO != null) { RecallOrderEntity recallOrderEntity = recallOrderService.queryRecallOrderByOrderId(orderId);
LambdaQueryWrapper<RecallRecordEntity> recordQuery = Wrappers.lambdaQuery(); if (recallOrderEntity != null) {
recordQuery.eq(RecallRecordEntity::getTraceId, recallOrderVO.getTraceId()); BeanUtils.copyProperties(recallOrderEntity, recallOrderVO);
recordQuery.orderByAsc(RecallRecordEntity::getCreateTime);
List<RecallRecordEntity> recordList = recallRecordService.getBaseMapper().selectList(recordQuery);
List<RecallRecordVO> recordList = recallRecordService.queryTraceRecords(recallOrderEntity.getTraceId());
log.info(JSON.toJSONString(recordList));
List<String> events = recordList.stream() List<String> events = recordList.stream()
.flatMap(entity -> entity.getEvents().stream()) .flatMap(entity -> entity.getEvents().stream())
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -2,6 +2,7 @@ package com.wabestway.recall.trace.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.wabestway.commons.http.ResObj; import com.wabestway.commons.http.ResObj;
import com.wabestway.recall.trace.dto.TraceDTO; import com.wabestway.recall.trace.dto.TraceDTO;
import com.wabestway.recall.trace.entity.RecallOrderEntity; import com.wabestway.recall.trace.entity.RecallOrderEntity;
@@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.wabestway.recall.trace.service.RecallRecordApiService; import com.wabestway.recall.trace.service.RecallRecordApiService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@@ -33,18 +35,15 @@ public class RecallRecordApiServiceImpl implements RecallRecordApiService {
@Override @Override
public ResObj save(TraceDTO record) { public ResObj save(TraceDTO record) {
String orderId = record.getOrderId(); Objects.requireNonNull(record);
String traceId = Optional.ofNullable(orderId)
.map(recallOrderService::queryRecallOrderByOrderId)
.map(RecallOrderEntity::getTraceId)
.orElse(UUID.randomUUID().toString().replace("-", ""));
log.info(traceId);
record.setTraceId(traceId);
boolean isLastEvent = record.isLast();
RecallOrderEntity order = Optional.ofNullable(orderId) String orderId = StringUtils.isBlank(record.getOrderId()) ? UUID.randomUUID().toString().replace("-", "") : record.getOrderId();
.flatMap(id -> Optional.ofNullable(recallOrderService.queryRecallOrderByOrderId(id)))
.orElseGet(() -> { String traceId = StringUtils.isBlank(record.getTraceId()) ? UUID.randomUUID().toString().replace("-", "") : record.getTraceId();
boolean isLastEvent = record.isLast();
RecallOrderEntity order = Optional.ofNullable(recallOrderService.queryRecallOrderByOrderId(orderId))
.orElseGet(() -> Optional.ofNullable(recallOrderService.queryRecallOrderByTraceId(traceId)).orElseGet(() -> {
RecallOrderEntity newOrder = new RecallOrderEntity(); RecallOrderEntity newOrder = new RecallOrderEntity();
newOrder.setId(UUID.randomUUID().toString().replace("-", "")); newOrder.setId(UUID.randomUUID().toString().replace("-", ""));
newOrder.setOrderId(orderId); newOrder.setOrderId(orderId);
@@ -60,19 +59,16 @@ public class RecallRecordApiServiceImpl implements RecallRecordApiService {
newOrder.setCompleteDate(System.currentTimeMillis()); newOrder.setCompleteDate(System.currentTimeMillis());
} }
recallOrderService.save(newOrder); recallOrderService.save(newOrder);
record.setTraceId(traceId);
record.setOrderId(orderId);
return newOrder; return newOrder;
}); }));
if (isLastEvent && !"1".equals(order.getComplete())) {
if (isLastEvent) {
order.setComplete("1"); order.setComplete("1");
order.setCompleteDate(System.currentTimeMillis()); order.setCompleteDate(System.currentTimeMillis());
order.setUpdateTime(System.currentTimeMillis()); order.setUpdateTime(System.currentTimeMillis());
recallOrderService.updateRecallOrderById(order); recallOrderService.updateRecallOrderById(order);
} }
record.setTraceId(traceId);
record.setOrderId(orderId);
RecallRecordEntity recallRecord = new RecallRecordEntity(); RecallRecordEntity recallRecord = new RecallRecordEntity();
BeanUtils.copyProperties(record, recallRecord); BeanUtils.copyProperties(record, recallRecord);
recallRecord.setId(UUID.randomUUID().toString().replace("-", "")); recallRecord.setId(UUID.randomUUID().toString().replace("-", ""));