From d3563f0bdb487124d79cdd20d0f8bfc79db31f24 Mon Sep 17 00:00:00 2001
From: xin <1099200748@qq.com>
Date: Fri, 07 Nov 2025 14:18:08 +0800
Subject: [PATCH] Merge branch 'pxb' into xin

---
 oying-system/src/main/java/com/oying/modules/system/service/InvitationsService.java          |   63 +++++++
 oying-system/src/main/java/com/oying/modules/system/mapper/InvitationsMapper.java            |   22 ++
 oying-system/src/main/java/com/oying/modules/system/rest/InvitationsController.java          |   87 +++++++++
 oying-system/src/main/resources/mapper/system/InvitationsMapper.xml                          |   76 ++++++++
 oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsQueryCriteria.java |   57 ++++++
 oying-system/src/main/java/com/oying/modules/system/domain/Invitations.java                  |   71 +++++++
 oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsVo.java            |   27 +++
 oying-system/src/main/java/com/oying/modules/system/service/impl/InvitationsServiceImpl.java |  136 +++++++++++++++
 8 files changed, 539 insertions(+), 0 deletions(-)

diff --git a/oying-system/src/main/java/com/oying/modules/system/domain/Invitations.java b/oying-system/src/main/java/com/oying/modules/system/domain/Invitations.java
new file mode 100644
index 0000000..3b4ce2b
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/system/domain/Invitations.java
@@ -0,0 +1,71 @@
+package com.oying.modules.system.domain;
+
+import com.oying.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+import cn.hutool.core.bean.BeanUtil;
+import io.swagger.annotations.ApiModelProperty;
+import cn.hutool.core.bean.copier.CopyOptions;
+import java.sql.Timestamp;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+/**
+* @description /
+* @author pxb
+* @date 2025-10-20
+**/
+@Getter
+@Setter
+@TableName("sys_invitations")
+public class Invitations extends BaseEntity implements Serializable {
+
+    @TableId(value = "invitations_id", type = IdType.AUTO)
+    @ApiModelProperty(value = "ID")
+    private Long invitationsId;
+
+    @ApiModelProperty(value = "邀请人ID")
+    private Long inviterId;
+
+    @ApiModelProperty(value = "邀请人电话")
+    private String inviterPhone;
+
+    @ApiModelProperty(value = "邀请人姓名")
+    private String inviterName;
+
+    @ApiModelProperty(value = "邀请人openid")
+    private String inviterOpenId;
+
+    @ApiModelProperty(value = "新用户openid")
+    private String newUserOpenId;
+
+    @ApiModelProperty(value = "新用户ID")
+    private Long newUserId;
+
+    @ApiModelProperty(value = "新用户姓名")
+    private String newUserName;
+
+    @ApiModelProperty(value = "新用户电话")
+    private String newUserPhone;
+
+    @ApiModelProperty(value = "记录类型(邀请新用户 YQ)")
+    private String type;
+
+    @ApiModelProperty(value = "用户类型(QS骑手邀请记录,YH买家用户邀请记录,MJ卖家邀请卖家,MJQS卖家邀请骑手,MJYH卖家邀请买家)")
+    private String userType;
+
+    @ApiModelProperty(value = "1成功 0提交 2失败")
+    private String status;
+
+    @ApiModelProperty(value = "奖励数值")
+    private String rewardValue;
+
+    @ApiModelProperty(value = "奖励类型")
+    private String rewardType;
+
+    public void copy(Invitations source){
+        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
+    }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsQueryCriteria.java b/oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsQueryCriteria.java
new file mode 100644
index 0000000..a30aecd
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsQueryCriteria.java
@@ -0,0 +1,57 @@
+package com.oying.modules.system.domain.dto;
+
+import lombok.Data;
+import java.sql.Timestamp;
+import java.util.List;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+* @author pxb
+* @date 2025-10-20
+**/
+@Data
+public class InvitationsQueryCriteria{
+
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer page = 1;
+
+    @ApiModelProperty(value = "每页数据量", example = "10")
+    private Integer size = 10;
+
+    @ApiModelProperty(value = "邀请人ID")
+    private Long inviterId;
+
+    @ApiModelProperty(value = "邀请人电话")
+    private String inviterPhone;
+
+    @ApiModelProperty(value = "邀请人姓名")
+    private String inviterName;
+
+    @ApiModelProperty(value = "邀请人openid")
+    private String inviterOpenId;
+
+    @ApiModelProperty(value = "新用户openid")
+    private String newUserOpenId;
+
+    @ApiModelProperty(value = "新用户ID")
+    private Long newUserId;
+
+    @ApiModelProperty(value = "新用户姓名")
+    private String newUserName;
+
+    @ApiModelProperty(value = "新用户电话")
+    private String newUserPhone;
+
+    @ApiModelProperty(value = "记录类型")
+    private String type;
+
+    @ApiModelProperty(value = "用户类型")
+    private String userType;
+
+    @ApiModelProperty(value = "1success 0pending 2failed")
+    private String status;
+
+    @ApiModelProperty(value = "奖励类型")
+    private String rewardType;
+    private List<Timestamp> createTime;
+}
diff --git a/oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsVo.java b/oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsVo.java
new file mode 100644
index 0000000..94b632c
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/system/domain/dto/InvitationsVo.java
@@ -0,0 +1,27 @@
+package com.oying.modules.system.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+* @description /
+* @author pxb
+* @date 2025-10-20
+**/
+@Data
+public class InvitationsVo implements Serializable {
+
+    @ApiModelProperty(value = "邀请人ID")
+    private Long inviterId;
+
+    @ApiModelProperty(value = "新用户ID")
+    private Long newUserId;
+
+    @ApiModelProperty(value = "用户类型(QS骑手邀请记录,YH买家用户邀请记录,MJ卖家邀请卖家,MJQS卖家邀请骑手,MJYH卖家邀请买家)")
+    private String userType;
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/system/mapper/InvitationsMapper.java b/oying-system/src/main/java/com/oying/modules/system/mapper/InvitationsMapper.java
new file mode 100644
index 0000000..7ff07a5
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/system/mapper/InvitationsMapper.java
@@ -0,0 +1,22 @@
+package com.oying.modules.system.mapper;
+
+import com.oying.modules.system.domain.Invitations;
+import com.oying.modules.system.domain.dto.InvitationsQueryCriteria;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+* @author pxb
+* @date 2025-10-20
+**/
+@Mapper
+public interface InvitationsMapper extends BaseMapper<Invitations> {
+
+    IPage<Invitations> findAll(@Param("criteria") InvitationsQueryCriteria criteria, Page<Object> page);
+
+    List<Invitations> findAll(@Param("criteria") InvitationsQueryCriteria criteria);
+}
diff --git a/oying-system/src/main/java/com/oying/modules/system/rest/InvitationsController.java b/oying-system/src/main/java/com/oying/modules/system/rest/InvitationsController.java
new file mode 100644
index 0000000..ccc24b0
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/system/rest/InvitationsController.java
@@ -0,0 +1,87 @@
+package com.oying.modules.system.rest;
+
+import com.oying.annotation.Log;
+import com.oying.modules.system.domain.Invitations;
+import com.oying.modules.system.domain.dto.InvitationsVo;
+import com.oying.modules.system.service.InvitationsService;
+import com.oying.modules.system.domain.dto.InvitationsQueryCriteria;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.*;
+
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.oying.utils.PageResult;
+
+/**
+ * @author pxb
+ * @date 2025-10-20
+ **/
+@RestController
+@RequiredArgsConstructor
+@Api(tags = "邀请新用户记录")
+@RequestMapping("/api/invitations")
+public class InvitationsController {
+
+    private final InvitationsService invitationsService;
+
+    @ApiOperation("导出数据")
+    @GetMapping(value = "/download")
+    // @PreAuthorize("@el.check('invitations:list')")
+    public void exportInvitations(HttpServletResponse response, InvitationsQueryCriteria criteria) throws IOException {
+        invitationsService.download(invitationsService.queryAll(criteria), response);
+    }
+
+    @GetMapping
+    @ApiOperation("查询邀请新用户记录")
+    // @PreAuthorize("@el.check('invitations:list')")
+    public ResponseEntity<PageResult<Invitations>> queryInvitations(InvitationsQueryCriteria criteria) {
+        Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
+        return new ResponseEntity<>(invitationsService.queryAll(criteria, page), HttpStatus.OK);
+    }
+
+    // @PostMapping
+    // @Log("新增邀请新用户记录")
+    // @ApiOperation("新增邀请新用户记录")
+    // @PreAuthorize("@el.check('invitations:add')")
+    // public ResponseEntity<Object> createInvitations(@Validated @RequestBody Invitations resources){
+    //     invitationsService.create(resources);
+    //     return new ResponseEntity<>(HttpStatus.CREATED);
+    // }
+
+    // @PutMapping
+    // @Log("修改邀请新用户记录")
+    // @ApiOperation("修改邀请新用户记录")
+    // @PreAuthorize("@el.check('invitations:edit')")
+    // public ResponseEntity<Object> updateInvitations(@Validated @RequestBody Invitations resources) {
+    //     invitationsService.update(resources);
+    //     return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    // }
+
+    @DeleteMapping
+    @Log("删除邀请新用户记录")
+    @ApiOperation("删除邀请新用户记录")
+    // @PreAuthorize("@el.check('invitations:del')")
+    public ResponseEntity<Object> deleteInvitations(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) {
+        invitationsService.deleteAll(ids);
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+
+    @PostMapping("addInvitations")
+    @Log("新增邀请新用户记录")
+    @ApiOperation("新增邀请新用户记录")
+    // @PreAuthorize("@el.check('invitations:add')")
+    public ResponseEntity<Object> addInvitations(@RequestBody InvitationsVo invitationsVo) {
+        return new ResponseEntity<>(invitationsService.addInvitations(invitationsVo), HttpStatus.OK);
+    }
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/system/service/InvitationsService.java b/oying-system/src/main/java/com/oying/modules/system/service/InvitationsService.java
new file mode 100644
index 0000000..3980a38
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/system/service/InvitationsService.java
@@ -0,0 +1,63 @@
+package com.oying.modules.system.service;
+
+import com.oying.modules.system.domain.Invitations;
+import com.oying.modules.system.domain.dto.InvitationsQueryCriteria;
+import java.util.Map;
+import java.util.List;
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.oying.modules.system.domain.dto.InvitationsVo;
+import com.oying.utils.PageResult;
+
+/**
+* @description 服务接口
+* @author pxb
+* @date 2025-10-20
+**/
+public interface InvitationsService extends IService<Invitations> {
+
+    /**
+    * 查询数据分页
+    * @param criteria 条件
+    * @param page 分页参数
+    * @return PageResult
+    */
+    PageResult<Invitations> queryAll(InvitationsQueryCriteria criteria, Page<Object> page);
+
+    /**
+    * 查询所有数据不分页
+    * @param criteria 条件参数
+    * @return List<InvitationsDto>
+    */
+    List<Invitations> queryAll(InvitationsQueryCriteria criteria);
+
+    /**
+    * 创建
+    * @param resources /
+    */
+    void create(Invitations resources);
+
+    /**
+    * 编辑
+    * @param resources /
+    */
+    void update(Invitations resources);
+
+    /**
+    * 多选删除
+    * @param ids /
+    */
+    void deleteAll(List<Long> ids);
+
+    /**
+    * 导出数据
+    * @param all 待导出的数据
+    * @param response /
+    * @throws IOException /
+    */
+    void download(List<Invitations> all, HttpServletResponse response) throws IOException;
+
+    Object addInvitations(InvitationsVo invitationsVo);
+}
diff --git a/oying-system/src/main/java/com/oying/modules/system/service/impl/InvitationsServiceImpl.java b/oying-system/src/main/java/com/oying/modules/system/service/impl/InvitationsServiceImpl.java
new file mode 100644
index 0000000..865fe2d
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/system/service/impl/InvitationsServiceImpl.java
@@ -0,0 +1,136 @@
+package com.oying.modules.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.oying.modules.system.domain.Invitations;
+import com.oying.modules.system.domain.User;
+import com.oying.modules.system.domain.dto.InvitationsVo;
+import com.oying.modules.system.mapper.UserMapper;
+import com.oying.utils.FileUtil;
+import com.oying.utils.SecurityUtils;
+import lombok.RequiredArgsConstructor;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.oying.modules.system.service.InvitationsService;
+import com.oying.modules.system.domain.dto.InvitationsQueryCriteria;
+import com.oying.modules.system.mapper.InvitationsMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.oying.utils.PageUtil;
+
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+
+import com.oying.utils.PageResult;
+
+/**
+ * @author pxb
+ * @description 服务实现
+ * @date 2025-10-20
+ **/
+@Service
+@RequiredArgsConstructor
+public class InvitationsServiceImpl extends ServiceImpl<InvitationsMapper, Invitations> implements InvitationsService {
+
+    private final InvitationsMapper invitationsMapper;
+    private final UserMapper userMapper;
+
+    @Override
+    public PageResult<Invitations> queryAll(InvitationsQueryCriteria criteria, Page<Object> page) {
+        return PageUtil.toPage(invitationsMapper.findAll(criteria, page));
+    }
+
+    @Override
+    public List<Invitations> queryAll(InvitationsQueryCriteria criteria) {
+        return invitationsMapper.findAll(criteria);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void create(Invitations resources) {
+        invitationsMapper.insert(resources);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(Invitations resources) {
+        Invitations invitations = getById(resources.getInvitationsId());
+        invitations.copy(resources);
+        invitationsMapper.updateById(invitations);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteAll(List<Long> ids) {
+        invitationsMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void download(List<Invitations> all, HttpServletResponse response) throws IOException {
+        List<Map<String, Object>> list = new ArrayList<>();
+        for (Invitations invitations : all) {
+            Map<String, Object> map = new LinkedHashMap<>();
+            map.put("邀请人ID", invitations.getInviterId());
+            map.put("邀请人电话", invitations.getInviterPhone());
+            map.put("邀请人姓名", invitations.getInviterName());
+            map.put("邀请人openid", invitations.getInviterOpenId());
+            map.put("新用户openid", invitations.getNewUserOpenId());
+            map.put("新用户ID", invitations.getNewUserId());
+            map.put("新用户姓名", invitations.getNewUserName());
+            map.put("新用户电话", invitations.getNewUserPhone());
+            map.put("记录类型", invitations.getType());
+            map.put("用户类型", invitations.getUserType());
+            map.put("1success 0pending 2failed", invitations.getStatus());
+            map.put("奖励数值", invitations.getRewardValue());
+            map.put("奖励类型", invitations.getRewardType());
+            map.put("创建者", invitations.getCreateBy());
+            map.put("更新者", invitations.getUpdateBy());
+            map.put("创建日期", invitations.getCreateTime());
+            map.put("更新时间", invitations.getUpdateTime());
+            list.add(map);
+        }
+        FileUtil.downloadExcel(list, response);
+    }
+
+    @Override
+    public Object addInvitations(InvitationsVo invitationsVo) {
+        // SecurityUtils.getCurrentUserId();
+        // 判断是否为新用户
+        if(userMapper.selectById(invitationsVo.getNewUserId()) == null) {
+            throw new RuntimeException("用户不存在");
+        }
+        Invitations selectOne = invitationsMapper.selectOne(new QueryWrapper<Invitations>().eq("new_user_id", invitationsVo.getNewUserId()));
+        if(selectOne != null) {
+            throw new RuntimeException("用户已被邀请过!");
+        }
+        // 查询邀请人信息
+        User user = userMapper.selectById(invitationsVo.getInviterId());
+        Invitations invitations = new Invitations();
+        invitations.setInviterId(invitationsVo.getInviterId());
+        invitations.setInviterPhone(user.getUsername());
+        invitations.setInviterName(user.getNickName());
+        invitations.setInviterOpenId(user.getOpenid());
+        if(invitationsVo.getUserType().equals("QS") || invitationsVo.getUserType().equals("MJQS")) {
+            invitations.setInviterOpenId(user.getRiderOpenId());
+        }
+        // 查询被邀请人的信息
+        User newUser = userMapper.selectById(invitationsVo.getNewUserId());
+        invitations.setNewUserOpenId(newUser.getOpenid());
+        if(invitationsVo.getUserType().equals("QS") || invitationsVo.getUserType().equals("MJQS")) {
+            invitations.setNewUserOpenId(newUser.getRiderOpenId());
+        }
+        invitations.setNewUserId(invitationsVo.getNewUserId());
+        invitations.setNewUserName(newUser.getNickName());
+        invitations.setNewUserPhone(newUser.getUsername());
+        invitations.setUserType(invitationsVo.getUserType());
+        // 邀请
+        invitations.setType("YQ");
+        invitations.setStatus("1");
+        invitationsMapper.insert(invitations);
+        return invitations;
+    }
+
+}
diff --git a/oying-system/src/main/resources/mapper/system/InvitationsMapper.xml b/oying-system/src/main/resources/mapper/system/InvitationsMapper.xml
new file mode 100644
index 0000000..366bb54
--- /dev/null
+++ b/oying-system/src/main/resources/mapper/system/InvitationsMapper.xml
@@ -0,0 +1,76 @@
+<?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.oying.modules.system.mapper.InvitationsMapper">
+    <resultMap id="BaseResultMap" type="com.oying.modules.system.domain.Invitations">
+        <id column="invitations_id" property="invitationsId"/>
+        <result column="inviter_id" property="inviterId"/>
+        <result column="inviter_phone" property="inviterPhone"/>
+        <result column="inviter_name" property="inviterName"/>
+        <result column="inviter_open_id" property="inviterOpenId"/>
+        <result column="new_user_open_id" property="newUserOpenId"/>
+        <result column="new_user_id" property="newUserId"/>
+        <result column="new_user_name" property="newUserName"/>
+        <result column="new_user_phone" property="newUserPhone"/>
+        <result column="type" property="type"/>
+        <result column="user_type" property="userType"/>
+        <result column="status" property="status"/>
+        <result column="reward_value" property="rewardValue"/>
+        <result column="reward_type" property="rewardType"/>
+        <result column="create_by" property="createBy"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        invitations_id, inviter_id, inviter_phone, inviter_name, inviter_open_id, new_user_open_id, new_user_id, new_user_name, new_user_phone, type, user_type, status, reward_value, reward_type, create_by, update_by, create_time, update_time
+    </sql>
+
+    <select id="findAll" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from sys_invitations
+        <where>
+            <if test="criteria.inviterId != null">
+                and inviter_id = #{criteria.inviterId}
+            </if>
+            <if test="criteria.inviterPhone != null">
+                and inviter_phone like concat('%',#{criteria.inviterPhone},'%')
+            </if>
+            <if test="criteria.inviterName != null">
+                and inviter_name like concat('%',#{criteria.inviterName},'%')
+            </if>
+            <if test="criteria.inviterOpenId != null">
+                and inviter_open_id = #{criteria.inviterOpenId}
+            </if>
+            <if test="criteria.newUserOpenId != null">
+                and new_user_open_id = #{criteria.newUserOpenId}
+            </if>
+            <if test="criteria.newUserId != null">
+                and new_user_id = #{criteria.newUserId}
+            </if>
+            <if test="criteria.newUserName != null">
+                and new_user_name like concat('%',#{criteria.newUserName},'%')
+            </if>
+            <if test="criteria.newUserPhone != null">
+                and new_user_phone like concat('%',#{criteria.newUserPhone},'%')
+            </if>
+            <if test="criteria.type != null">
+                and type = #{criteria.type}
+            </if>
+            <if test="criteria.userType != null">
+                and user_type = #{criteria.userType}
+            </if>
+            <if test="criteria.status != null">
+                and status = #{criteria.status}
+            </if>
+            <if test="criteria.rewardType != null">
+                and reward_type = #{criteria.rewardType}
+            </if>
+            <if test="criteria.createTime != null and criteria.createTime.size() > 0">
+                AND create_time BETWEEN #{criteria.createTime[0]} AND #{criteria.createTime[1]}
+            </if>
+        </where>
+        order by invitations_id desc
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3