浏览代码

添加平台端交易管理页面

qrs 3 月之前
父节点
当前提交
241c9dcfb9

+ 61 - 0
alien-entity/src/main/java/shop/alien/entity/second/SecondTradeOperation.java

@@ -0,0 +1,61 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SecondTradeOperation对象", description="二手交易操作表")
+public class SecondTradeOperation extends Model<SecondTradeOperation> {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @TableField("trade_id")
+    @ApiModelProperty(value = "交易ID")
+    private Integer tradeId;
+
+    @TableField("user_id")
+    @ApiModelProperty(value = "操作人ID")
+    private Integer userId;
+
+    @TableField("type")
+    @ApiModelProperty(value = "操作类型  1-发起交易  2-拒绝交易  3-确认交易  4-签到  5-交易成功  6-交易失败  7-交易取消")
+    private Integer type;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    private Integer deleteFlag;
+
+    @TableField("created_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("created_user_id")
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @TableField("updated_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @TableField("updated_user_id")
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+}

+ 4 - 1
alien-entity/src/main/java/shop/alien/entity/second/SecondTradeRecord.java

@@ -8,7 +8,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -40,6 +39,10 @@ public class SecondTradeRecord extends Model<SecondTradeRecord> {
     @TableField("goods_id")
     private Integer goodsId;
 
+    @ApiModelProperty(value = "商品记录表id")
+    @TableField("goods_record_id")
+    private Integer goodsRecordId;
+
     @ApiModelProperty(value = "买家id")
     @TableField("buyer_id")
     private Integer buyerId;

+ 17 - 1
alien-entity/src/main/java/shop/alien/entity/second/vo/SecondTradeRecordVo.java

@@ -1,6 +1,6 @@
 package shop.alien.entity.second.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
+import com.alibaba.fastjson2.JSONObject;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
 import shop.alien.entity.second.SecondTradeRecord;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 @JsonInclude
@@ -16,6 +17,12 @@ import java.math.BigDecimal;
 @ApiModel(value = "SecondTradeRecordVo对象", description = "二手商品交易vo")
 public class SecondTradeRecordVo extends SecondTradeRecord {
 
+    @ApiModelProperty(value = "分页页数")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "分页条数")
+    private Integer pageSize;
+
     @ApiModelProperty(value = "商品标题")
     private String title;
 
@@ -33,4 +40,13 @@ public class SecondTradeRecordVo extends SecondTradeRecord {
 
     @ApiModelProperty(value = "当前时间是否超过交易时间  0-否  1-是")
     private String timeOutFlag;
+
+    @ApiModelProperty(value = "商品标签")
+    private String goodsLabel;
+
+    @ApiModelProperty(value = "交易流程")
+    private List<JSONObject> operationJsonList;
+
+    @ApiModelProperty(value = "商品信息")
+    private SecondGoodsVo goodsInfo;
 }

+ 9 - 0
alien-entity/src/main/java/shop/alien/mapper/second/SecondTradeOperationMapper.java

@@ -0,0 +1,9 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.second.SecondTradeOperation;
+
+@Mapper
+public interface SecondTradeOperationMapper extends BaseMapper<SecondTradeOperation> {
+}

+ 17 - 0
alien-entity/src/main/java/shop/alien/mapper/second/SecondTradeRecordMapper.java

@@ -3,7 +3,9 @@ package shop.alien.mapper.second;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -31,4 +33,19 @@ public interface SecondTradeRecordMapper extends BaseMapper<SecondTradeRecord> {
             "left join second_goods goods on goods.id = trade.goods_id " +
             "${ew.customSqlSegment} ")
     List<SecondTradeRecordVo> getTradeRecord(@Param(Constants.WRAPPER) QueryWrapper<SecondTradeRecord> wrapper);
+
+    @Select("select trade.id, goods.title, goods.home_image, goods.price, trade.transaction_amount, trade.trade_status, trade.transaction_time, trade.seller_id, " +
+            "       trade.transaction_latitude_longitude, trade.transaction_latitude_longitude_address, trade.transaction_location, trade.created_user_id, " +
+            "       if (now() >= trade.transaction_time, 1, 0) timeOutFlag " +
+            "from second_trade_record trade " +
+            "left join second_goods goods on goods.id = trade.goods_id " +
+            "${ew.customSqlSegment} ")
+    IPage<SecondTradeRecordVo> getTradeRecordPage(IPage<SecondTradeRecord> page, @Param(Constants.WRAPPER) QueryWrapper<SecondTradeRecord> wrapper);
+
+    @Select("select trade.*, buyer.user_name buyerName, buyer.user_phone buyerPhone, seller.user_name sellerName, seller.user_phone sellerPhone " +
+            "from second_trade_record trade " +
+            "left join life_user buyer on buyer.id = trade.buyer_id " +
+            "left join life_user seller on seller.id = trade.seller_id " +
+            "where trade.id = #{id}")
+    SecondTradeRecordVo getTradeRecordById(@Param("id") Integer id);
 }

+ 41 - 0
alien-second/src/main/java/shop/alien/second/platform/PlatformSecondTradeController.java

@@ -0,0 +1,41 @@
+package shop.alien.second.platform;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
+import shop.alien.second.service.PlatformSecondTradeService;
+
+import java.util.List;
+
+@Slf4j
+@Api(tags = {"平台-二手交易记录"})
+@ApiSort(1)
+@CrossOrigin
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/platformSecondTradeController")
+public class PlatformSecondTradeController {
+
+    private final PlatformSecondTradeService secondTradeRecordService;
+
+    @ApiOperation("交易列表")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/getTradeRecordPage")
+    public R<IPage<SecondTradeRecordVo>> getTradeRecordPage(@RequestBody SecondTradeRecordVo vo) throws Exception {
+        log.info("PlatformSecondTradeController.getTradeRecordPage?vo={}", vo.toString());
+        return R.data(secondTradeRecordService.getTradeRecordPage(vo));
+    }
+
+    @ApiOperation("交易详情")
+    @ApiOperationSupport(order = 2)
+    @PostMapping("/getTradeRecordById")
+    public R<SecondTradeRecordVo> getTradeRecordById(Integer id) throws Exception {
+        log.info("PlatformSecondTradeController.getTradeRecordById?id={}",id);
+        return R.data(secondTradeRecordService.getTradeRecordById(id));
+    }
+
+}

+ 14 - 0
alien-second/src/main/java/shop/alien/second/service/PlatformSecondTradeService.java

@@ -0,0 +1,14 @@
+package shop.alien.second.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
+
+public interface PlatformSecondTradeService extends IService<SecondTradeRecord> {
+
+    IPage<SecondTradeRecordVo> getTradeRecordPage(SecondTradeRecordVo vo) throws Exception;
+
+    SecondTradeRecordVo getTradeRecordById(Integer id) throws Exception;
+
+}

+ 253 - 0
alien-second/src/main/java/shop/alien/second/service/impl/PlatformSecondTradeServiceImpl.java

@@ -0,0 +1,253 @@
+package shop.alien.second.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.second.SecondTradeOperation;
+import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.vo.SecondGoodsVo;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
+import shop.alien.mapper.second.SecondGoodsMapper;
+import shop.alien.mapper.second.SecondTradeOperationMapper;
+import shop.alien.mapper.second.SecondTradeRecordMapper;
+import shop.alien.second.service.PlatformSecondTradeService;
+
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class PlatformSecondTradeServiceImpl extends ServiceImpl<SecondTradeRecordMapper, SecondTradeRecord> implements PlatformSecondTradeService {
+
+    private final SecondTradeRecordMapper secondTradeRecordMapper;
+    private final SecondGoodsMapper secondGoodsMapper;
+    private final SecondTradeOperationMapper secondTradeOperationMapper;
+
+    @Override
+    public IPage<SecondTradeRecordVo> getTradeRecordPage(SecondTradeRecordVo vo) throws Exception {
+        try {
+            Page<SecondTradeRecord> page = new Page<>(vo.getPageNum(), vo.getPageSize());
+            QueryWrapper<SecondTradeRecord> wrapper = new QueryWrapper<>();
+            wrapper.like(null != vo.getGoodsId(), "trade.goods_id", vo.getGoodsId());
+            wrapper.like(StringUtils.isNotBlank(vo.getTradeNo()), "trade.trade_no", vo.getTradeNo());
+            wrapper.eq(null != vo.getTradeStatus(), "trade.trade_status", vo.getTradeStatus());
+            wrapper.eq("trade.delete_flag", 0);
+            wrapper.orderByDesc("trade.created_time");
+            return secondTradeRecordMapper.getTradeRecordPage(page, wrapper);
+        } catch (Exception e) {
+            log.error("PlatformSecondTradeServiceImpl.getTradeRecordPage(): Error Msg={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    @Override
+    public SecondTradeRecordVo getTradeRecordById(Integer id) throws Exception {
+        try {
+            SecondTradeRecordVo vo = secondTradeRecordMapper.getTradeRecordById(id);
+            vo.setOperationJsonList(getOperationJsonList(id));
+
+            QueryWrapper<SecondGoodsVo> wrapper = new QueryWrapper<>();
+            wrapper.eq("sg.id", vo.getGoodsId());
+            vo.setGoodsInfo(secondGoodsMapper.getGoodsDetails(wrapper));
+            return vo;
+        } catch (Exception e) {
+            log.error("PlatformSecondTradeServiceImpl.getTradeRecordById(): Error Msg={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    public List<JSONObject> getOperationJsonList(Integer tradeId) throws Exception {
+        try {
+            List<JSONObject> operationJsonList = new ArrayList<>();
+            SecondTradeRecord record = secondTradeRecordMapper.selectById(tradeId);
+            List<SecondTradeOperation> operationList = secondTradeOperationMapper.selectList(
+                    new QueryWrapper<SecondTradeOperation>().eq("trade_id", tradeId).eq("delete_flag", 0));
+
+            // 发起交易
+            JSONObject createJson = new JSONObject();
+            createJson.put("flag", 1);
+            createJson.put("message", "发起交易");
+            createJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(record.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+            operationJsonList.add(createJson);
+
+            // 发起交易后取消交易
+            if (operationList.size() == 2 && 7 == operationList.get(1).getType()) {
+                JSONObject cancelJson = new JSONObject();
+                cancelJson.put("flag", 1);
+                cancelJson.put("message", "取消交易");
+                cancelJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(operationList.get(1).getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                operationJsonList.add(cancelJson);
+                return operationJsonList;
+            }
+
+            // 拒绝
+            SecondTradeOperation refuse = operationList.stream().filter(item -> 2 == item.getType()).findFirst().orElse(null);
+            if (null != refuse) {
+                JSONObject refuseJson = new JSONObject();
+                refuseJson.put("flag", 1);
+                refuseJson.put("message", "拒绝交易");
+                refuseJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(refuse.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                operationJsonList.add(refuseJson);
+                return operationJsonList;
+            }
+
+            // 确认
+            SecondTradeOperation confirm = operationList.stream().filter(item -> 3 == item.getType()).findFirst().orElse(null);
+            if (null != confirm) {
+                JSONObject confirmJson = new JSONObject();
+                confirmJson.put("flag", 1);
+                confirmJson.put("message", "确认交易");
+                confirmJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(confirm.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                operationJsonList.add(confirmJson);
+            } else {
+                JSONObject confirmJson = new JSONObject();
+                confirmJson.put("flag", 0);
+                confirmJson.put("message", "等待确认交易");
+                confirmJson.put("time", "");
+                operationJsonList.add(confirmJson);
+            }
+
+            // 确认交易后取消交易
+            if (operationList.size() == 3 && 7 == operationList.get(2).getType()) {
+                JSONObject cancelJson = new JSONObject();
+                cancelJson.put("flag", 1);
+                cancelJson.put("message", "取消交易");
+                cancelJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(operationList.get(2).getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                operationJsonList.add(cancelJson);
+                return operationJsonList;
+            }
+
+            // 签到
+            List<SecondTradeOperation> signIn = operationList.stream().filter(item -> 4 == item.getType()).sorted(Comparator.comparing(SecondTradeOperation::getCreatedTime)).collect(Collectors.toList());
+            // 确认交易
+            List<SecondTradeOperation> successFail = operationList.stream().filter(item -> (5 == item.getType() || 6 == item.getType()) && 0 != item.getUserId()).sorted(Comparator.comparing(SecondTradeOperation::getCreatedTime)).collect(Collectors.toList());
+            // 系统确认的交易失败(超过交易时间12小时未确认成功失败,将自动视为失败)
+            SecondTradeOperation systemFail = operationList.stream().filter(item -> 6 == item.getType() && 0 == item.getUserId()).findFirst().orElse(null);
+
+            if (CollectionUtil.isEmpty(signIn)) {
+                JSONObject signInJson = new JSONObject();
+                signInJson.put("flag", CollectionUtil.isEmpty(successFail) && null == systemFail ? 0 : 2);
+                signInJson.put("message", CollectionUtil.isEmpty(successFail) && null == systemFail ? "等待买方签到" : "买方未签到");
+                signInJson.put("time", "");
+                operationJsonList.add(signInJson);
+
+                signInJson = new JSONObject();
+                signInJson.put("flag", CollectionUtil.isEmpty(successFail) && null == systemFail ? 0 : 2);
+                signInJson.put("message", CollectionUtil.isEmpty(successFail) && null == systemFail ? "等待卖方签到" : "卖方未签到");
+                signInJson.put("time", "");
+                operationJsonList.add(signInJson);
+            } else {
+                // 第一个人签到
+                JSONObject signInJson = new JSONObject();
+                signInJson.put("flag", 1);
+                signInJson.put("message", (Objects.equals(record.getBuyerId(), signIn.get(0).getUserId()) ? "买家" : "卖家" ) + "已签到");
+                signInJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(signIn.get(0).getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                operationJsonList.add(signInJson);
+
+                // 第二个人签到
+                if (signIn.size() > 1) {
+                    JSONObject signInJson2 = new JSONObject();
+                    signInJson2.put("flag", 1);
+                    signInJson2.put("message", (Objects.equals(record.getBuyerId(), signIn.get(1).getUserId()) ? "买家" : "卖家" ) + "已签到");
+                    signInJson2.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(signIn.get(1).getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                    operationJsonList.add(signInJson2);
+                } else {
+                    JSONObject signInJson2 = new JSONObject();
+                    signInJson2.put("flag", CollectionUtil.isEmpty(successFail) ? 0 : 2);
+                    signInJson2.put("message", (Objects.equals(record.getBuyerId(), signIn.get(0).getUserId()) ? "卖家" : "买家" ) + "未签到");
+                    signInJson2.put("time", "");
+                    operationJsonList.add(signInJson2);
+                }
+            }
+
+            // 签到后取消交易
+            if (CollectionUtil.isEmpty(successFail) && 7 == operationList.get(operationList.size() - 1).getType()) {
+                JSONObject cancelJson = new JSONObject();
+                cancelJson.put("flag", 1);
+                cancelJson.put("message", "取消交易");
+                cancelJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(operationList.get(operationList.size() - 1).getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                operationJsonList.add(cancelJson);
+                return operationJsonList;
+            }
+
+            // 确认交易
+            if (CollectionUtil.isEmpty(successFail)) {
+                JSONObject signInJson = new JSONObject();
+                signInJson.put("flag", null == systemFail ? 0 : 2);
+                signInJson.put("message", null == systemFail ? "等待买方确认交易" : "买方未确认交易");
+                signInJson.put("time", "");
+                operationJsonList.add(signInJson);
+
+                signInJson = new JSONObject();
+                signInJson.put("flag", null == systemFail ? 0 : 2);
+                signInJson.put("message", null == systemFail ? "等待卖方确认交易" : "卖方未确认交易");
+                signInJson.put("time", "");
+                operationJsonList.add(signInJson);
+            } else {
+                // 第一个人确认交易
+                JSONObject successFailJson = new JSONObject();
+                successFailJson.put("flag", 1);
+                successFailJson.put("message", (Objects.equals(record.getBuyerId(), successFail.get(0).getUserId()) ? "买家" : "卖家" ) + "确认交易" +
+                        (5 == successFail.get(0).getType() ? "成功" : "失败"));
+                successFailJson.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(successFail.get(0).getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                operationJsonList.add(successFailJson);
+
+                // 第二个人确认交易
+                if (successFail.size() > 1) {
+                    JSONObject successFailJson2 = new JSONObject();
+                    successFailJson2.put("flag", 1);
+                    successFailJson2.put("message", (Objects.equals(record.getBuyerId(), successFail.get(1).getUserId()) ? "买家" : "卖家" ) + "确认交易" +
+                            (5 == successFail.get(1).getType() ? "成功" : "失败"));
+                    successFailJson2.put("time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(successFail.get(1).getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
+                    operationJsonList.add(successFailJson2);
+                } else {
+                    JSONObject successFailJson2 = new JSONObject();
+                    successFailJson2.put("flag", Objects.equals(record.getSellerId(), successFail.get(0).getUserId()) ? 2 : 0);
+                    successFailJson2.put("message", (Objects.equals(record.getBuyerId(), successFail.get(0).getUserId()) ? "卖家" : "买家" ) + "未确认交易");
+                    successFailJson2.put("time", "");
+                    operationJsonList.add(successFailJson2);
+                }
+            }
+
+            // 交易完成
+            if (4 == record.getTradeStatus()) {
+                JSONObject finishJson = new JSONObject();
+                finishJson.put("flag", 1);
+                finishJson.put("message", "交易成功");
+                finishJson.put("time", "");
+                operationJsonList.add(finishJson);
+            } else if (5 == record.getTradeStatus()) {
+                JSONObject finishJson = new JSONObject();
+                finishJson.put("flag", 1);
+                finishJson.put("message", "交易失败");
+                finishJson.put("time", "");
+                operationJsonList.add(finishJson);
+            } else {
+                JSONObject finishJson = new JSONObject();
+                finishJson.put("flag", 0);
+                finishJson.put("message", "交易成功");
+                finishJson.put("time", "");
+                operationJsonList.add(finishJson);
+            }
+
+            return operationJsonList;
+        } catch (Exception e) {
+            log.error("PlatformSecondTradeServiceImpl.getOperationJsonList Error Msg={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+}

+ 56 - 8
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -10,6 +10,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.result.BusinessException;
 import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.second.SecondGoodsRecord;
+import shop.alien.entity.second.SecondTradeOperation;
 import shop.alien.entity.second.SecondTradeRecord;
 import shop.alien.entity.second.vo.SecondTradeRecordVo;
 import shop.alien.entity.store.LifeMessage;
@@ -20,6 +22,8 @@ import shop.alien.mapper.LifeMessageMapper;
 import shop.alien.mapper.LifeUserMapper;
 import shop.alien.mapper.StoreDictionaryMapper;
 import shop.alien.mapper.second.SecondGoodsMapper;
+import shop.alien.mapper.second.SecondGoodsRecordMapper;
+import shop.alien.mapper.second.SecondTradeOperationMapper;
 import shop.alien.mapper.second.SecondTradeRecordMapper;
 import shop.alien.second.feign.AlienStoreFeign;
 import shop.alien.second.service.SecondTradeRecordService;
@@ -46,7 +50,9 @@ import java.util.Objects;
 public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordMapper, SecondTradeRecord> implements SecondTradeRecordService {
 
     private final SecondTradeRecordMapper secondTradeRecordMapper;
+    private final SecondTradeOperationMapper secondTradeOperationMapper;
     private final SecondGoodsMapper secondGoodsMapper;
+    private final SecondGoodsRecordMapper secondGoodsRecordMapper;
     private final LifeMessageMapper lifeMessageMapper;
     private final LifeUserMapper lifeUserMapper;
     private final AlienStoreFeign alienStoreFeign;
@@ -66,9 +72,24 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
                 String tradeNo = "S" + now.toString().replace("-", "") + String.format("%05d", count + 1);
                 trade.setTradeNo(tradeNo);
             }
+            LambdaQueryWrapper<SecondGoodsRecord> goodsWrapper = new LambdaQueryWrapper<>();
+            goodsWrapper.eq(SecondGoodsRecord::getGoodsId, trade.getGoodsId());
+            goodsWrapper.eq(SecondGoodsRecord::getGoodsStatus, "3");
+            goodsWrapper.orderByDesc(SecondGoodsRecord::getCreatedTime);
+            goodsWrapper.last(" limit 1 ");
+            SecondGoodsRecord goodsRecord = secondGoodsRecordMapper.selectOne(goodsWrapper);
+            if (null != goodsRecord) trade.setGoodsRecordId(goodsRecord.getId());
             // 保存交易记录
             secondTradeRecordMapper.insert(trade);
 
+            // 保存交易操作表
+            SecondTradeOperation operation = new SecondTradeOperation();
+            operation.setTradeId(trade.getId());
+            operation.setUserId(Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId"));
+            operation.setType(1);
+            operation.setCreatedTime(new Date());
+            secondTradeOperationMapper.insert(operation);
+
             // 商品更新交易id
             SecondGoods goods = new SecondGoods();
             goods.setId(trade.getGoodsId());
@@ -177,15 +198,16 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             // 修改交易状态
             SecondTradeRecord tradeRecord = new SecondTradeRecord();
             tradeRecord.setId(tradeId);
-            if (type == 1) {
-                tradeRecord.setTradeStatus(3);
-                trade.setTradeStatus(3);
-            } else {
-                tradeRecord.setTradeStatus(2);
-                trade.setTradeStatus(2);
-            }
+            tradeRecord.setTradeStatus(type == 1 ? 3 : 2);
             secondTradeRecordMapper.updateById(tradeRecord);
 
+            // 保存交易操作表
+            SecondTradeOperation operation = new SecondTradeOperation();
+            operation.setTradeId(trade.getId());
+            operation.setUserId(Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId"));
+            operation.setType(type == 1 ? 3 : 2);
+            secondTradeOperationMapper.insert(operation);
+
             // 商品信息
             SecondGoods goods = secondGoodsMapper.selectById(trade.getGoodsId());
 
@@ -201,6 +223,7 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             lifeMessageMapper.updateById(message);
 
             // 发送消息
+            trade.setTradeStatus(type == 1 ? 3 : 2);
             sendMsg(goods, trade, trade.getTradeStatus(), "4");
 
             // 发起交易人信息
@@ -249,6 +272,14 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             tradeRecord.setCancelReasonSupplement(cancelReasonSupplement);
             secondTradeRecordMapper.updateById(tradeRecord);
 
+            // 保存交易操作表
+            SecondTradeOperation operation = new SecondTradeOperation();
+            operation.setTradeId(tradeId);
+            operation.setUserId(Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId"));
+            operation.setType(7);
+            operation.setCreatedTime(new Date());
+            secondTradeOperationMapper.insert(operation);
+
             // 交易信息
             SecondTradeRecord trade = secondTradeRecordMapper.selectById(tradeId);
 
@@ -316,7 +347,15 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             }
             secondTradeRecordMapper.updateById(record);
 
-            // 删除签到提醒
+            // 保存交易操作表
+            SecondTradeOperation operation = new SecondTradeOperation();
+            operation.setTradeId(tradeId);
+            operation.setUserId(userId);
+            operation.setType(4);
+            operation.setCreatedTime(new Date());
+            secondTradeOperationMapper.insert(operation);
+
+            // 删除签到提醒消息
             LifeMessage signInMessage = lifeMessageMapper.selectById(messageId);
             if (null == signInMessage) throw new BusinessException("该交易已签到,无需再次签到");
             lifeMessageMapper.deleteById(messageId);
@@ -409,6 +448,15 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
                 return false;
             }
             secondTradeRecordMapper.updateById(record);
+
+            // 保存交易操作表
+            SecondTradeOperation operation = new SecondTradeOperation();
+            operation.setTradeId(tradeId);
+            operation.setUserId(userId);
+            operation.setType(1 == type ? 5 : 6);
+            operation.setCreatedTime(new Date());
+            secondTradeOperationMapper.insert(operation);
+
             return true;
         } catch (Exception e) {
             log.error("SecondTradeRecordServiceImpl.tradeCompleteConfirm(): Error Msg={}", e.getMessage());