jiangqs
2023-05-06 43d9975c99cb947b4602f05bc2e513a20de92c38
商户端主流程
46个文件已修改
26个文件已添加
2454 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteMemberService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AppMemberBindingDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/Member.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/pom.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/fliter/ParamsAuthFilter.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/fliter/RepeatedlyRequestWrapper.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/fliter/ResponseWrapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/fliter/ParamsAuthFilter.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/fliter/RepeatedlyRequestWrapper.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/fliter/ResponseWrapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppGoodsController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppOrderController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/AppShoppingCartAddDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/AppShoppingCartChangeDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerOrderPageDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerShopGoodsEditDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/goods/ShopGoods.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppGoodsInfoVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppShoppingCartVo.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppSimpleActivityGoodsVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppSimpleGoodsVo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerGoodsPageVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderGoodsPageVo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderPageVo.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/ParamsAuthFilter.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/RepeatedlyRequestWrapper.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/ResponseWrapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/ShoppingCartMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/ShoppingCartServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/ShoppingCartService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/goods/GoodsMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/ShoppingCartMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerTaskController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/miniapp/AppHomeController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerCreateMemberTaskDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerFollowMemberTaskDto.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerMemberTaskPageDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/task/MemberTaskRecord.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MerMemberTaskPageVo.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MerMemberTaskRecordPageVo.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/ParamsAuthFilter.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/RepeatedlyRequestWrapper.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/ResponseWrapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/MemberTaskMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/MemberTaskRecordMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskRecordServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskServiceImpl.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/TaskFileServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskRecordService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/TaskFileService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/MemberTaskMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/MemberTaskRecordMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppImmediatelyBuyDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/fliter/ParamsAuthFilter.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/fliter/RepeatedlyRequestWrapper.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/fliter/ResponseWrapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteMemberService.java
@@ -2,6 +2,7 @@
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.vo.AppUserCouponVo;
import com.ruoyi.system.api.factory.RemoteMemberFallbackFactory;
@@ -33,4 +34,11 @@
    @PostMapping("/member/listVoUserCouponByUserId")
    public R<List<AppUserCouponVo>> listVoUserCouponByUserId(@RequestBody Long userId);
    /**
     * 更新绑定
     * @param appMemberBindingDto
     * @return
     */
    @PostMapping("/member/updateMemberBinding")
    public R updateMemberBinding(@RequestBody AppMemberBindingDto appMemberBindingDto);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AppMemberBindingDto.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.system.api.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author jqs34
 * @ClassName AppMemberBindingDto
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class AppMemberBindingDto extends AppBaseDto{
    @ApiModelProperty(value = "绑定标记")
    private Integer bindingFlag;
    @ApiModelProperty(value = "商户id")
    private Long shopId;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/Member.java
@@ -126,6 +126,13 @@
     */
    private String avatar;
    /**
     * 绑定标记0否1是
     */
    @TableField("binding_flag")
    private Integer bindingFlag;
    @Override
    protected Serializable pkVal() {
        return this.userId;
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.RemoteMemberService;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.poji.sys.SysFile;
import com.ruoyi.system.api.domain.poji.sys.SysUser;
@@ -51,6 +52,11 @@
            public R<List<AppUserCouponVo>> listVoUserCouponByUserId(Long userId) {
                return R.fail("获取用户优惠券失败:" + throwable.getMessage());
            }
            @Override
            public R updateMemberBinding(AppMemberBindingDto appMemberBindingDto) {
                return R.fail("更新绑定失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-auth/pom.xml
@@ -52,6 +52,8 @@
            <artifactId>ruoyi-common-security</artifactId>
        </dependency>
        <!-- Swagger UI -->
        <dependency>
            <groupId>io.springfox</groupId>
ruoyi-auth/src/main/java/com/ruoyi/auth/fliter/ParamsAuthFilter.java
New file
@@ -0,0 +1,103 @@
package com.ruoyi.auth.fliter;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.utils.StringUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
@Component
@Log4j2
public class ParamsAuthFilter implements Filter {
    // 令牌自定义标识
    //@Value("${token.header}")
    private String header = "Authorization";
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        RepeatedlyRequestWrapper wrapper = new RepeatedlyRequestWrapper(request, response);
        getRequestParams(wrapper);
        ResponseWrapper responseWrapper = new ResponseWrapper(response);
        filterChain.doFilter(wrapper, responseWrapper);
        // 返回的结果
        String content = responseWrapper.getTextContent();
        String requestUrl = request.getRequestURI();
        log.info("-------------------- Response Data ----------------------");
        log.info(requestUrl + " -> " + content);
        response.getOutputStream().write(content.getBytes());
    }
    private void getRequestParams(HttpServletRequest request){
        Map<String, String> params = getUrlParams(request);
        try {
            String requestUrl = request.getRequestURI();
            Map<String, String> urlParams = getUrlParams(request);
            Map<String, String> bodyParams = getBodyParams(request);
            params.putAll(urlParams);
            params.putAll(bodyParams);
            log.info("-------------------- request header ----------------------");
            log.info(header + " -> " + request.getHeader(header));
            log.info("-------------------- request params ----------------------");
            log.info(requestUrl + " -> " + JSONObject.toJSONString(params));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private Map<String, String> getBodyParams(HttpServletRequest request) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        StringBuilder stringBuilder = new StringBuilder();
        String buffer = "";
        while((buffer  = bufferedReader.readLine()) != null){
            stringBuilder.append(buffer);
        }
        String requestBodyStr = stringBuilder.toString();
        if(StringUtils.isNotBlank(requestBodyStr)){
            return JSONObject.parseObject(stringBuilder.toString(), Map.class);
        }
        return new HashMap<>();
    }
    private Map<String, String> getUrlParams(HttpServletRequest request){
        String queryParams = "";
        try {
            queryParams = request.getQueryString();
            if(StringUtils.isNotBlank(queryParams)) {
                queryParams = URLDecoder.decode(request.getQueryString(), "utf-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Map<String, String> result = new HashMap<>();
        if(StringUtils.isNotBlank(queryParams)) {
            String[] spilt = queryParams.split("&");
            for (String s : spilt) {
                int index = s.indexOf("=");
                result.put(s.substring(0, index), s.substring(index + 1));
            }
        }
        return result;
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/fliter/RepeatedlyRequestWrapper.java
New file
@@ -0,0 +1,111 @@
package com.ruoyi.auth.fliter;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
/**
 * 构建可重复读取inputStream的request
 *
 * @author linzhang
 */
@Log4j2
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
{
    private final byte[] body;
    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
    {
        super(request);
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        body = getBodyString(request).getBytes("UTF-8");
    }
    public static String getBodyString(ServletRequest request)
    {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = null;
        try (InputStream inputStream = request.getInputStream())
        {
            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
            String line = "";
            while ((line = reader.readLine()) != null)
            {
                sb.append(line);
            }
        }
        catch (IOException e)
        {
            log.warn("getBodyString出现问题!");
        }
        finally
        {
            if (reader != null)
            {
                try
                {
                    reader.close();
                }
                catch (IOException e)
                {
                    log.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        return sb.toString();
    }
    @Override
    public BufferedReader getReader() throws IOException
    {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
    @Override
    public ServletInputStream getInputStream() throws IOException
    {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream()
        {
            @Override
            public int read() throws IOException
            {
                return bais.read();
            }
            @Override
            public int available() throws IOException
            {
                return body.length;
            }
            @Override
            public boolean isFinished()
            {
                return false;
            }
            @Override
            public boolean isReady()
            {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener)
            {
            }
        };
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/fliter/ResponseWrapper.java
New file
@@ -0,0 +1,63 @@
package com.ruoyi.auth.fliter;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    private PrintWriter printWriter = new PrintWriter(outputStream);
    public ResponseWrapper(HttpServletResponse response) {
        super(response);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        return printWriter;
    }
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setWriteListener(WriteListener listener) {
            }
            @Override
            public void write(int b) throws IOException {
                outputStream.write(b);
            }
        };
    }
    public void flush(){
        try {
            printWriter.flush();
            printWriter.close();
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public ByteArrayOutputStream getByteArrayOutputStream(){
        return outputStream;
    }
    public String getTextContent() {
        flush();
        return outputStream.toString();
    }
}
ruoyi-common/ruoyi-common-core/pom.xml
@@ -113,6 +113,7 @@
            <artifactId>swagger-annotations</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-gateway/pom.xml
@@ -88,6 +88,7 @@
            <version>${swagger.fox.version}</version>
        </dependency>
    </dependencies>
    <build>
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -48,14 +48,14 @@
        ServerHttpRequest.Builder mutate = request.mutate();
        String url = request.getURI().getPath();
        log.info("url"+url);
        log.info("requestUrl---"+url);
        // 跳过不需要验证的路径
        if (StringUtils.matches(url, ignoreWhite.getWhites()))
        {
            return chain.filter(exchange);
        }
        String token = getToken(request);
        log.info("token"+token);
        log.info("requestToken---"+token);
        if (StringUtils.isEmpty(token))
        {
            return unauthorizedResponse(exchange, "令牌不能为空");
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java
@@ -72,4 +72,6 @@
        MerMemberInfoVo merMemberInfo = memberService.getMerMemberInfo(userId);
        return R.ok(merMemberInfo);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java
@@ -5,8 +5,10 @@
import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.member.service.member.MemberService;
import com.ruoyi.member.service.member.UserCouponService;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.vo.AppUserCouponVo;
import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo;
import com.ruoyi.system.api.model.AppMiniLoginDto;
import com.ruoyi.system.api.model.AppMiniLoginVo;
import io.swagger.annotations.ApiOperation;
@@ -33,7 +35,7 @@
    * @date: 2023/4/30 12:49
    */
    @GetMapping("/getMember")
    @PostMapping("/getMember")
    public R<Member> getMember(@RequestBody Long userId)
    {
        Member member = memberService.getByUserId(userId);
@@ -70,4 +72,11 @@
        List<AppUserCouponVo> appUserCouponVoList = userCouponService.listVoUserCouponByUserId(userId);
        return R.ok(appUserCouponVoList);
    }
    @PostMapping("/updateMemberBinding")
    public R updateMemberBinding(@RequestBody AppMemberBindingDto appMemberBindingDto)
    {
        memberService.updateMemberBinding(appMemberBindingDto);
        return R.ok();
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/fliter/ParamsAuthFilter.java
New file
@@ -0,0 +1,104 @@
package com.ruoyi.member.fliter;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.utils.StringUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
@Component
@Log4j2
public class ParamsAuthFilter implements Filter {
    // 令牌自定义标识
    //@Value("${token.header}")
    private String header = "Authorization";
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        RepeatedlyRequestWrapper wrapper = new RepeatedlyRequestWrapper(request, response);
        getRequestParams(wrapper);
        ResponseWrapper responseWrapper = new ResponseWrapper(response);
        filterChain.doFilter(wrapper, responseWrapper);
        // 返回的结果
        String content = responseWrapper.getTextContent();
        String requestUrl = request.getRequestURI();
        log.info("-------------------- Response Data ----------------------");
        log.info(requestUrl + " -> " + content);
        response.getOutputStream().write(content.getBytes());
    }
    private void getRequestParams(HttpServletRequest request){
        Map<String, String> params = getUrlParams(request);
        try {
            String requestUrl = request.getRequestURI();
            Map<String, String> urlParams = getUrlParams(request);
            Map<String, String> bodyParams = getBodyParams(request);
            params.putAll(urlParams);
            params.putAll(bodyParams);
            log.info("-------------------- request header ----------------------");
            log.info(header + " -> " + request.getHeader(header));
            log.info("-------------------- request params ----------------------");
            log.info(requestUrl + " -> " + JSONObject.toJSONString(params));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private Map<String, String> getBodyParams(HttpServletRequest request) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        StringBuilder stringBuilder = new StringBuilder();
        String buffer = "";
        while((buffer  = bufferedReader.readLine()) != null){
            stringBuilder.append(buffer);
        }
        String requestBodyStr = stringBuilder.toString();
        log.info("requestBodyStr---"+requestBodyStr);
        if(StringUtils.isNotBlank(requestBodyStr)){
            return JSONObject.parseObject(stringBuilder.toString(), Map.class);
        }
        return new HashMap<>();
    }
    private Map<String, String> getUrlParams(HttpServletRequest request){
        String queryParams = "";
        try {
            queryParams = request.getQueryString();
            if(StringUtils.isNotBlank(queryParams)) {
                queryParams = URLDecoder.decode(request.getQueryString(), "utf-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Map<String, String> result = new HashMap<>();
        if(StringUtils.isNotBlank(queryParams)) {
            String[] spilt = queryParams.split("&");
            for (String s : spilt) {
                int index = s.indexOf("=");
                result.put(s.substring(0, index), s.substring(index + 1));
            }
        }
        return result;
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/fliter/RepeatedlyRequestWrapper.java
New file
@@ -0,0 +1,111 @@
package com.ruoyi.member.fliter;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
/**
 * 构建可重复读取inputStream的request
 *
 * @author linzhang
 */
@Log4j2
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
{
    private final byte[] body;
    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
    {
        super(request);
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        body = getBodyString(request).getBytes("UTF-8");
    }
    public static String getBodyString(ServletRequest request)
    {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = null;
        try (InputStream inputStream = request.getInputStream())
        {
            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
            String line = "";
            while ((line = reader.readLine()) != null)
            {
                sb.append(line);
            }
        }
        catch (IOException e)
        {
            log.warn("getBodyString出现问题!");
        }
        finally
        {
            if (reader != null)
            {
                try
                {
                    reader.close();
                }
                catch (IOException e)
                {
                    log.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        return sb.toString();
    }
    @Override
    public BufferedReader getReader() throws IOException
    {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
    @Override
    public ServletInputStream getInputStream() throws IOException
    {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream()
        {
            @Override
            public int read() throws IOException
            {
                return bais.read();
            }
            @Override
            public int available() throws IOException
            {
                return body.length;
            }
            @Override
            public boolean isFinished()
            {
                return false;
            }
            @Override
            public boolean isReady()
            {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener)
            {
            }
        };
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/fliter/ResponseWrapper.java
New file
@@ -0,0 +1,63 @@
package com.ruoyi.member.fliter;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    private PrintWriter printWriter = new PrintWriter(outputStream);
    public ResponseWrapper(HttpServletResponse response) {
        super(response);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        return printWriter;
    }
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setWriteListener(WriteListener listener) {
            }
            @Override
            public void write(int b) throws IOException {
                outputStream.write(b);
            }
        };
    }
    public void flush(){
        try {
            printWriter.flush();
            printWriter.close();
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public ByteArrayOutputStream getByteArrayOutputStream(){
        return outputStream;
    }
    public String getTextContent() {
        flush();
        return outputStream.toString();
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -23,10 +23,12 @@
import com.ruoyi.system.api.constant.AppErrorConstant;
import com.ruoyi.system.api.constant.SecurityConstant;
import com.ruoyi.system.api.domain.dto.AppEditUserDto;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.poji.sys.SysUser;
import com.ruoyi.system.api.domain.vo.AppOrderTotalVo;
import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo;
import com.ruoyi.system.api.model.AppMiniLoginDto;
import com.ruoyi.system.api.model.AppMiniLoginVo;
import lombok.extern.log4j.Log4j;
@@ -137,6 +139,7 @@
                member.setMemberId(memberId);
                member.setWxUnionid(unionid);
                member.setMiniOpenid(openid);
                member.setBindingFlag(0);
                member.setCreateTime(new Date());
                this.save(member);
@@ -360,4 +363,16 @@
        List<MerCashMemberPageVo> merCashMemberPageVos = memberMapper.pageMerCashMember(page,merCashMemberPageDto);
        return merCashMemberPageVos;
    }
    /**
     *
     * @param appMemberBindingDto
     */
    @Override
    public void updateMemberBinding(AppMemberBindingDto appMemberBindingDto){
        Member member = this.getByUserId(appMemberBindingDto.getUserId());
        member.setBindingFlag(appMemberBindingDto.getBindingFlag());
        member.setRelationShopId(appMemberBindingDto.getShopId());
        this.saveOrUpdate(member);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java
@@ -5,7 +5,9 @@
import com.ruoyi.member.domain.dto.MerMemberPageDto;
import com.ruoyi.member.domain.vo.*;
import com.ruoyi.system.api.domain.dto.AppEditUserDto;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo;
import com.ruoyi.system.api.model.AppMiniLoginDto;
import com.ruoyi.system.api.model.AppMiniLoginVo;
import com.ruoyi.member.domain.dto.AppUserAuthorizeDto;
@@ -80,4 +82,10 @@
     * @return
     */
    List<MerCashMemberPageVo> pageMerCashMember(Page page, MerCashMemberPageDto merCashMemberPageDto);
    /**
     *
     * @param appMemberBindingDto
     */
    void updateMemberBinding(AppMemberBindingDto appMemberBindingDto);
}
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml
@@ -23,10 +23,11 @@
        <result property="updateUserId"    column="update_user_id"    />
        <result property="userTags"    column="user_tags"    />
        <result property="avatar"    column="avatar"    />
        <result property="bindingFlag"    column="binding_flag"    />
    </resultMap>
    <sql id="selectMemberVo">
        select user_id, del_flag, member_id, member_no, wx_openid, mini_openid, wx_unionid, relation_shop_id, real_name, mobile, gender, referrer, customer_source, level, birthday, create_time, update_time, update_user_id, user_tags, avatar from t_member
        select user_id, del_flag, member_id, member_no, wx_openid, mini_openid, wx_unionid, relation_shop_id, real_name, mobile, gender, referrer, customer_source, level, birthday, create_time, update_time, update_user_id, user_tags, avatar, binding_flag from t_member
    </sql>
    <select id="selectMemberList" parameterType="com.ruoyi.system.api.domain.poji.member.Member" resultMap="MemberResult">
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java
@@ -109,5 +109,15 @@
        return R.ok();
    }
    @RequestMapping(value = "/pageMerOrder", method = RequestMethod.POST)
    @ApiOperation(value = "获取商户端订单列表")
    public R<Page<MerOrderPageVo>> pageMerOrder(@RequestBody MerOrderPageDto merOrderPageDto) {
        Long userId = SecurityUtils.getUserId();
        merOrderPageDto.setUserId(userId);
        Page<MerOrderPageVo> page = new Page<>();
        page.setSize(merOrderPageDto.getPageSize());
        page.setCurrent(merOrderPageDto.getPageNum());
        List<MerOrderPageVo> merOrderPageVoList = orderService.pageMerOrder(page,merOrderPageDto);
        return R.ok(page.setRecords(merOrderPageVoList));
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppGoodsController.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.domain.vo.AppShoppingCartVo;
import com.ruoyi.system.api.domain.dto.AppBaseBathDto;
import com.ruoyi.order.domain.dto.AppGoodsInfoGetDto;
import com.ruoyi.order.domain.dto.AppShoppingCartAddDto;
@@ -11,6 +12,7 @@
import com.ruoyi.order.service.goods.GoodsService;
import com.ruoyi.order.service.order.ShoppingCartService;
import com.ruoyi.system.api.RemoteMemberService;
import com.ruoyi.system.api.domain.dto.AppBaseDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -19,6 +21,8 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author jqs34
@@ -55,6 +59,16 @@
        return R.ok(appGoodsInfoVo);
    }
    @RequestMapping(value = "/listShoppingCart", method = RequestMethod.POST)
    @ApiOperation(value = "获取购物车列表")
    public R<List<AppShoppingCartVo>> listShoppingCart() {
        Long userId = SecurityUtils.getUserId();
        Member member = memberService.getMember(userId).getData();
        Long shopId = member.getRelationShopId();
        List<AppShoppingCartVo> appShoppingCartVoList = shoppingCartService.listShoppingCartVo(userId, shopId);
        return R.ok(appShoppingCartVoList);
    }
    @RequestMapping(value = "/addShoppingCart", method = RequestMethod.POST)
    @ApiOperation(value = "添加购物车")
    public R addShoppingCart(@RequestBody AppShoppingCartAddDto appShoppingCartAddDto) {
@@ -89,10 +103,7 @@
    @ApiOperation(value = "删除购物车")
    public R changeShoppingCart(@RequestBody AppBaseBathDto appBaseBathDto) {
        Long userId = SecurityUtils.getUserId();
        if(userId!=null){
            Member member = memberService.getMember(userId).getData();
            appBaseBathDto.setUserId(userId);
        }
        shoppingCartService.deleteShoppingCart(appBaseBathDto);
        return R.ok();
    }
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppOrderController.java
@@ -9,6 +9,7 @@
import com.ruoyi.order.service.order.OrderService;
import com.ruoyi.system.api.RemoteMemberService;
import com.ruoyi.system.api.domain.dto.AppBaseGetDto;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -64,6 +65,14 @@
            if(member!=null&&member.getRelationShopId()!=null){
                appPlaceOrderDto.setShopId(member.getRelationShopId());
            }
            if(member.getBindingFlag()!=1){
                //绑定商户
                AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto();
                appMemberBindingDto.setShopId(appPlaceOrderDto.getShopId());
                appMemberBindingDto.setUserId(userId);
                appMemberBindingDto.setBindingFlag(1);
                memberService.updateMemberBinding(appMemberBindingDto);
            }
        }
        AppPlaceOrderVo appPlaceOrderVo = orderService.placeOrder(appPlaceOrderDto);
        return R.ok(appPlaceOrderVo);
@@ -80,6 +89,7 @@
                appUserOrderPageDto.setShopId(member.getRelationShopId());
            }
        }
        logger.info("appUserOrderPageDto:"+appUserOrderPageDto.toString());
        Page<AppUserOrderPageVo> page = new Page<>();
        page.setSize(appUserOrderPageDto.getPageSize());
        page.setCurrent(appUserOrderPageDto.getPageNum());
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/AppShoppingCartAddDto.java
@@ -14,11 +14,11 @@
@Data
public class AppShoppingCartAddDto extends AppBaseDto {
    @ApiModelProperty(value = "shopId",hidden = true)
    @ApiModelProperty(value = "商户id")
    private Long shopId;
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    private String goodsId;
    @ApiModelProperty(value = "购买数量")
    private Integer buyNum;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/AppShoppingCartChangeDto.java
@@ -17,8 +17,8 @@
    @ApiModelProperty(value = "shopId",hidden = true)
    private Long shopId;
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    @ApiModelProperty(value = "购物车id")
    private Long shoppingCartId;
    @ApiModelProperty(value = "变化后数量")
    private Integer buyNum;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerOrderPageDto.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.order.domain.dto;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author jqs34
 * @ClassName MerMemberNoClearOrderDto
 * @description: TODO
 * @date 2023年05月05日
 * @version: 1.0
 */
@Data
public class MerOrderPageDto extends MerPageDto {
    @ApiModelProperty(value = "搜索关键词")
    private String keyword;
    @ApiModelProperty(value = "1.全部2.待核销3.已核销")
    private Integer type;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerShopGoodsEditDto.java
@@ -17,7 +17,7 @@
public class MerShopGoodsEditDto extends MerBaseDto {
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    private String goodsId;
    @ApiModelProperty(value = "售价")
    private BigDecimal salePrice;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/goods/ShopGoods.java
@@ -45,7 +45,7 @@
     * 商品id
     */
    @TableField("goods_id")
    private Long goodsId;
    private String goodsId;
    /**
     * 商户售价
     */
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppGoodsInfoVo.java
@@ -17,7 +17,7 @@
public class AppGoodsInfoVo {
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppShoppingCartVo.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.order.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author jqs34
 * @ClassName AppShoppingCartVo
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class AppShoppingCartVo {
    @ApiModelProperty(value = "购物车id")
    private Long shoppingCartId;
    @ApiModelProperty(value = "商品id")
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "商品简介")
    private String goodsIntroduction;
    @ApiModelProperty(value = "商品图片")
    private String goodsPicture;
    @ApiModelProperty(value = "商品类型1周期2服务3体验4单品")
    private Integer goodsType;
    @ApiModelProperty(value = "商品标签")
    private String goodsTag;
    @ApiModelProperty(value = "商品调理问题")
    private String goodsNurses;
    @ApiModelProperty(value = "商品售价")
    private BigDecimal salesPrice;
    @ApiModelProperty(value = "购买数量")
    private Integer buyNum;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppSimpleActivityGoodsVo.java
@@ -16,7 +16,7 @@
public class AppSimpleActivityGoodsVo {
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppSimpleGoodsVo.java
@@ -16,7 +16,7 @@
public class AppSimpleGoodsVo {
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
@@ -34,7 +34,7 @@
    private String goodsTag;
    @ApiModelProperty(value = "商品调理问题")
    private BigDecimal goodsNurses;
    private String goodsNurses;
    @ApiModelProperty(value = "商品售价")
    private BigDecimal salesPrice;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerGoodsPageVo.java
@@ -17,7 +17,7 @@
public class MerGoodsPageVo {
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderGoodsPageVo.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.order.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author jqs34
 * @ClassName MerOrderGoodsVo
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class MerOrderGoodsPageVo {
    @ApiModelProperty("商品名字")
    private String goodsName;
    @ApiModelProperty("购买数量")
    private Integer buyNum;
    @ApiModelProperty(value = "商品类型1周期2服务3体验4单品")
    private Integer goodsType;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderPageVo.java
New file
@@ -0,0 +1,54 @@
package com.ruoyi.order.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * @author jqs34
 * @ClassName MerMemberUnclearOrder
 * @description: TODO
 * @date 2023年05月05日
 * @version: 1.0
 */
@Data
public class MerOrderPageVo {
    @ApiModelProperty(value = "用户id")
    private Long userId;
    @ApiModelProperty(value = "订单id")
    private String orderId;
    @ApiModelProperty("订单编号")
    private String orderNo;
    @ApiModelProperty(value = "订单状态0.已取消1.待支付2.待核销3.已完成")
    private Integer orderStatus;
    @ApiModelProperty(value = "商品总价")
    private BigDecimal orderGoodsMoney;
    @ApiModelProperty(value = "优惠券抵扣")
    private BigDecimal couponDiscount;
    @ApiModelProperty("应收金额")
    private BigDecimal receivableMoney;
    @ApiModelProperty("应收订金")
    private BigDecimal receivableDeposit;
    @ApiModelProperty("订单实际支付金额")
    private BigDecimal payMoney;
    @ApiModelProperty("订单未支付金额")
    private BigDecimal unPaidMoney;
    @ApiModelProperty("订单备注")
    private String orderRemark;
    @ApiModelProperty("订单商品列表")
    private List<MerOrderGoodsPageVo> merOrderGoodsVoList;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/ParamsAuthFilter.java
New file
@@ -0,0 +1,103 @@
package com.ruoyi.order.fliter;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.utils.StringUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
@Component
@Log4j2
public class ParamsAuthFilter implements Filter {
    // 令牌自定义标识
    //@Value("${token.header}")
    private String header = "Authorization";
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        RepeatedlyRequestWrapper wrapper = new RepeatedlyRequestWrapper(request, response);
        getRequestParams(wrapper);
        ResponseWrapper responseWrapper = new ResponseWrapper(response);
        filterChain.doFilter(wrapper, responseWrapper);
        // 返回的结果
        String content = responseWrapper.getTextContent();
        String requestUrl = request.getRequestURI();
        log.info("-------------------- Response Data ----------------------");
        log.info(requestUrl + " -> " + content);
        response.getOutputStream().write(content.getBytes());
    }
    private void getRequestParams(HttpServletRequest request){
        Map<String, String> params = getUrlParams(request);
        try {
            String requestUrl = request.getRequestURI();
            Map<String, String> urlParams = getUrlParams(request);
            Map<String, String> bodyParams = getBodyParams(request);
            params.putAll(urlParams);
            params.putAll(bodyParams);
            log.info("-------------------- request header ----------------------");
            log.info(header + " -> " + request.getHeader(header));
            log.info("-------------------- request params ----------------------");
            log.info(requestUrl + " -> " + JSONObject.toJSONString(params));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private Map<String, String> getBodyParams(HttpServletRequest request) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        StringBuilder stringBuilder = new StringBuilder();
        String buffer = "";
        while((buffer  = bufferedReader.readLine()) != null){
            stringBuilder.append(buffer);
        }
        String requestBodyStr = stringBuilder.toString();
        if(StringUtils.isNotBlank(requestBodyStr)){
            return JSONObject.parseObject(stringBuilder.toString(), Map.class);
        }
        return new HashMap<>();
    }
    private Map<String, String> getUrlParams(HttpServletRequest request){
        String queryParams = "";
        try {
            queryParams = request.getQueryString();
            if(StringUtils.isNotBlank(queryParams)) {
                queryParams = URLDecoder.decode(request.getQueryString(), "utf-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Map<String, String> result = new HashMap<>();
        if(StringUtils.isNotBlank(queryParams)) {
            String[] spilt = queryParams.split("&");
            for (String s : spilt) {
                int index = s.indexOf("=");
                result.put(s.substring(0, index), s.substring(index + 1));
            }
        }
        return result;
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/RepeatedlyRequestWrapper.java
New file
@@ -0,0 +1,111 @@
package com.ruoyi.order.fliter;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
/**
 * 构建可重复读取inputStream的request
 *
 * @author linzhang
 */
@Log4j2
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
{
    private final byte[] body;
    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
    {
        super(request);
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        body = getBodyString(request).getBytes("UTF-8");
    }
    public static String getBodyString(ServletRequest request)
    {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = null;
        try (InputStream inputStream = request.getInputStream())
        {
            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
            String line = "";
            while ((line = reader.readLine()) != null)
            {
                sb.append(line);
            }
        }
        catch (IOException e)
        {
            log.warn("getBodyString出现问题!");
        }
        finally
        {
            if (reader != null)
            {
                try
                {
                    reader.close();
                }
                catch (IOException e)
                {
                    log.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        return sb.toString();
    }
    @Override
    public BufferedReader getReader() throws IOException
    {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
    @Override
    public ServletInputStream getInputStream() throws IOException
    {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream()
        {
            @Override
            public int read() throws IOException
            {
                return bais.read();
            }
            @Override
            public int available() throws IOException
            {
                return body.length;
            }
            @Override
            public boolean isFinished()
            {
                return false;
            }
            @Override
            public boolean isReady()
            {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener)
            {
            }
        };
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/ResponseWrapper.java
New file
@@ -0,0 +1,63 @@
package com.ruoyi.order.fliter;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    private PrintWriter printWriter = new PrintWriter(outputStream);
    public ResponseWrapper(HttpServletResponse response) {
        super(response);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        return printWriter;
    }
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setWriteListener(WriteListener listener) {
            }
            @Override
            public void write(int b) throws IOException {
                outputStream.write(b);
            }
        };
    }
    public void flush(){
        try {
            printWriter.flush();
            printWriter.close();
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public ByteArrayOutputStream getByteArrayOutputStream(){
        return outputStream;
    }
    public String getTextContent() {
        flush();
        return outputStream.toString();
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java
@@ -2,10 +2,12 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.order.domain.dto.AppUserOrderPageDto;
import com.ruoyi.order.domain.dto.MerOrderPageDto;
import com.ruoyi.order.domain.pojo.order.Order;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.domain.vo.AppUserOrderPageVo;
import com.ruoyi.order.domain.vo.MerMemberNoClearOrderVo;
import com.ruoyi.order.domain.vo.MerOrderPageVo;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import org.apache.ibatis.annotations.Param;
@@ -36,4 +38,14 @@
     * @return
     */
    List<MerMemberNoClearOrderVo> pageMerMemberNoClearOrder(Page page,  @Param("userId") Long userId);
    /**
     *
     * @param merOrderPageDto
     * @return
     */
    List<MerOrderPageVo> pageMerOrder(Page page,@Param("param") MerOrderPageDto merOrderPageDto);
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/ShoppingCartMapper.java
@@ -2,6 +2,10 @@
import com.ruoyi.order.domain.pojo.order.ShoppingCart;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.domain.vo.AppShoppingCartVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -18,4 +22,12 @@
     * @param ids
     */
    void deleteShoppingCartByIds(String ids);
    /**
     *
     * @param userId
     * @param shopId
     * @return
     */
    List<AppShoppingCartVo> listShoppingCartVo(@Param("userId") Long userId, @Param("shopId")Long shopId);
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -26,6 +26,8 @@
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.constant.AppErrorConstant;
import com.ruoyi.system.api.domain.dto.AppBaseGetDto;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.poji.sys.SysUser;
import com.ruoyi.system.api.domain.vo.AppOrderTotalVo;
@@ -352,6 +354,7 @@
        this.save(order);
        appPlaceOrderVo.setOrderId(orderId);
        appPlaceOrderVo.setOrderNo(orderNo);
        //调用支付
        return appPlaceOrderVo;
@@ -699,7 +702,7 @@
        order.setDelFlag(0);
        order.setOrderStatus(3);
        order.setOrderNo(orderNo);
        order.setOrderFrom(1);
        order.setOrderFrom(3);
        order.setShopId(merNewOrderDto.getShopId());
        order.setUserId(userId);
        order.setOrderMoney(orderGoodsMoney);
@@ -750,5 +753,26 @@
            consumerGoods.setCreateTime(new Date());
            consumerGoodsService.save(consumerGoods);
        }
        Member member = remoteMemberService.getMember(userId).getData();
        if(member.getBindingFlag()!=1){
            //绑定商户
            AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto();
            appMemberBindingDto.setShopId(merNewOrderDto.getShopId());
            appMemberBindingDto.setUserId(userId);
            appMemberBindingDto.setBindingFlag(1);
            remoteMemberService.updateMemberBinding(appMemberBindingDto);
        }
    }
    /**
     *
     * @param merOrderPageDto
     * @return
     */
    @Override
    public List<MerOrderPageVo> pageMerOrder(Page page, MerOrderPageDto merOrderPageDto){
        List<MerOrderPageVo> merOrderPageVoList = orderMapper.pageMerOrder(page, merOrderPageDto);
        return merOrderPageVoList;
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/ShoppingCartServiceImpl.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.exception.ServiceException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.order.domain.vo.AppShoppingCartVo;
import com.ruoyi.system.api.domain.dto.AppBaseBathDto;
import com.ruoyi.order.domain.dto.AppShoppingCartAddDto;
import com.ruoyi.order.domain.dto.AppShoppingCartChangeDto;
@@ -17,6 +18,7 @@
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
 * <p>
@@ -41,7 +43,7 @@
     */
    @Override
    public void addShoppingCart(AppShoppingCartAddDto appShoppingCartAddDto){
        Long goodsId = appShoppingCartAddDto.getGoodsId();
        String goodsId = appShoppingCartAddDto.getGoodsId();
        Goods goods = goodsService.getById(goodsId);
        if(goods.getGoodsStatus()!=1){
            throw new ServiceException(AppErrorConstant.GOODS_DOWN);
@@ -70,14 +72,13 @@
     */
    @Override
    public void changeShoppingCart(AppShoppingCartChangeDto appShoppingCartChangeDto){
        Long goodsId = appShoppingCartChangeDto.getGoodsId();
        Long shoppingCartId = appShoppingCartChangeDto.getShoppingCartId();
        ShoppingCart shoppingCart = this.getById(shoppingCartId);
        String goodsId = shoppingCart.getGoodsId();
        Goods goods = goodsService.getById(goodsId);
        if(goods.getGoodsStatus()!=1){
            throw new ServiceException(AppErrorConstant.GOODS_DOWN);
        }
        LambdaQueryWrapper<ShoppingCart> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(ShoppingCart::getDelFlag, 0).eq(ShoppingCart::getGoodsId, goodsId);
        ShoppingCart shoppingCart = this.getOne(queryWrapper,false);
        shoppingCart.setBuyNum(appShoppingCartChangeDto.getBuyNum());
        shoppingCart.setUpdateTime(new Date());
        this.saveOrUpdate(shoppingCart);
@@ -92,4 +93,15 @@
        String ids = appBaseBathDto.getIds();
        shoppingCartMapper.deleteShoppingCartByIds(ids);
    }
    /**
     *
     * @param userId
     * @param shopId
     * @return
     */
    @Override
    public List<AppShoppingCartVo> listShoppingCartVo(Long userId, Long shopId){
        return shoppingCartMapper.listShoppingCartVo(userId, shopId);
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
@@ -108,4 +108,11 @@
     */
    void createNewOrder(MerNewOrderDto merNewOrderDto);
    /**
     *
     * @param merOrderPageDto
     * @return
     */
    List<MerOrderPageVo> pageMerOrder(Page page,MerOrderPageDto merOrderPageDto);
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/ShoppingCartService.java
@@ -1,10 +1,13 @@
package com.ruoyi.order.service.order;
import com.ruoyi.order.domain.vo.AppShoppingCartVo;
import com.ruoyi.system.api.domain.dto.AppBaseBathDto;
import com.ruoyi.order.domain.dto.AppShoppingCartAddDto;
import com.ruoyi.order.domain.dto.AppShoppingCartChangeDto;
import com.ruoyi.order.domain.pojo.order.ShoppingCart;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
@@ -33,4 +36,12 @@
     * @param appBaseBathDto
     */
    void deleteShoppingCart(AppBaseBathDto appBaseBathDto);
    /**
     *
     * @param userId
     * @param shopId
     * @return
     */
    List<AppShoppingCartVo> listShoppingCartVo(Long userId, Long shopId);
}
ruoyi-modules/ruoyi-order/src/main/resources/mapper/goods/GoodsMapper.xml
@@ -188,7 +188,7 @@
        FROM t_goods tg
        INNER JOIN t_goods_total tgt ON tg.goods_id = tgt.goods_id
        LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{shopId}
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{param.shopId}
        WHERE tg.del_flag = 0 AND tg.goods_status = 1
        <if test="param.goodsType!=null and param.goodsType != ''">
            AND tg.goods_type = #{param.goodsType}
@@ -242,7 +242,7 @@
        tg.goods_tags goodsNurses
        FROM t_goods tg
        LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{shopId}
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{param.shopId}
        WHERE tg.del_flag = 0 AND tg.goods_status = 1
        <if test="param.keyword!=null and param.keyword != ''">
            AND tg.goods_name LIKE CONCAT('%',#{param.keyword},'%')
@@ -272,7 +272,7 @@
        FROM t_goods tg
        INNER JOIN t_activity_goods tag ON tg.goods_id = tag.goods_id
        LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{shopId}
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{param.shopId}
        WHERE tg.del_flag = 0 AND tg.goods_status = 1
        <if test="param.keyword!=null and param.keyword != ''">
            AND tg.goods_name LIKE CONCAT('%',#{param.keyword},'%')
@@ -301,7 +301,7 @@
        IFNULL(tsg.service_num,tg.service_num) serviceNum
        FROM t_goods tg
        LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{shopId}
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{param.shopId}
        WHERE tg.del_flag = 0 AND tg.goods_status = 1
        <if test="param.goodsType != null">
            AND tg.goods_type = #{param.goodsType}
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -44,6 +44,24 @@
        </collection>
    </resultMap>
    <resultMap id="merOrderResultMap" type="com.ruoyi.order.domain.vo.MerOrderPageVo">
        <result column="userId" property="userId"/>
        <result column="orderId" property="orderId"/>
        <result column="orderStatus" property="orderStatus"/>
        <result column="orderNo" property="orderNo"/>
        <result column="orderGoodsMoney" property="orderGoodsMoney"/>
        <result column="couponDiscount" property="couponDiscount"/>
        <result column="receivableMoney" property="receivableMoney"/>
        <result column="receivableDeposit" property="receivableDeposit"/>
        <result column="payMoney" property="payMoney"/>
        <result column="orderRemark" property="orderRemark" />
        <collection property="merOrderGoodsVoList" ofType="com.ruoyi.order.domain.vo.MerOrderGoodsPageVo">
            <result column="goodsName" property="goodsName"/>
            <result column="goodsType" property="goodsType"/>
            <result column="buyNum" property="buyNum"/>
        </collection>
    </resultMap>
    <sql id="selectOrderVo">
        select order_id, del_flag, order_status, order_no, order_from, shop_id, user_id, order_money, coupon_money, discount_money, receivable_money, pay_type, pay_money, online_pay_money, offline_pay_money, order_remark, goods_info, create_time, pay_time, use_time, cancel_time, use_user_id from t_order
    </sql>
@@ -211,4 +229,38 @@
        WHERE toc.del_flag = 0 AND toc.user_id = #{userId} AND toc.orderStatus = 2 AND toc.close_flag = 0
        ORDER BY toc.create_time DESC
    </select>
    <select id="pageMerOrder" resultMap="merOrderResultMap">
        SELECT
        toc.user_id userId,
        toc.order_id orderId,
        toc.order_no orderNo,
        toc.order_status orderStatus,
        toc.order_money orderGoodsMoney,
        toc.coupon_money couponDiscount,
        toc.receivable_money receivableMoney,
        toc.receivable_deposit receivableDeposit,
        toc.pay_money payMoney,
        toc.order_remark orderRemark,
        tg.goods_name goodsName,
        tog.goods_type goodsType,
        tog.buy_num buyNum
        FROM t_order toc
        INNER JOIN t_order_goods tog ON tog.order_id = toc.order_id
        INNER JOIN t_goods tg ON tg.goods_id = tog.goods_id
        WHERE toc.del_flag = 0
        <if test="param.type != null and param.type ==1 ">
            AND (toc.order_status = 2 OR toc.order_status = 3)
        </if>
        <if test="param.type != null and param.type ==2 ">
            AND toc.order_status = 2
        </if>
        <if test="param.type != null and param.type ==3 ">
            AND toc.order_status = 3
        </if>
        <if test="param.keyword != null and param.keyword != ''">
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR tog.goods_name LIKE CONCAT('%',#{param.keyword},'%'))
        </if>
        ORDER BY toc.create_time DESC
    </select>
</mapper>
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/ShoppingCartMapper.xml
@@ -79,4 +79,27 @@
        </foreach>
    </delete>
    <select id="listShoppingCartVo" resultType="com.ruoyi.order.domain.vo.AppShoppingCartVo">
        SELECT
        tg.goods_id goodsId,
        tg.goods_name goodsName,
        tg.goods_introduction goodsIntroduction,
        tg.goods_type goodsType,
        CASE tg.goods_type
        WHEN 1 THEN "周期"
        WHEN 2 THEN "服务"
        WHEN 3 THEN "体验"
        WHEN 4 THEN "单品"
        END goodsTag,
        IFNULL(tsg.sales_price,tg.sales_price) salesPrice,
        tgf.file_url goodsPicture,
        tg.goods_nurses goodsNurses,
        buy_num buyNum
        FROM t_shopping_cart tsc
        INNER JOIN t_goods tg ON tsc.goods_id = tg.goods_id
        LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1
        LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{shopId}
        WHERE tg.del_flag = 0 AND tsc.shop_id = #{shopId} AND tsc.user_id = #{userId} AND tg.del_flag = 0 AND tg.goods_status = 1 AND tg.recommend_flag = 1
        ORDER BY tg.create_time DESC
    </select>
</mapper>
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerTaskController.java
New file
@@ -0,0 +1,83 @@
package com.ruoyi.shop.controller.business;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.shop.domain.dto.MerCreateMemberTaskDto;
import com.ruoyi.shop.domain.dto.MerFollowMemberTaskDto;
import com.ruoyi.shop.domain.dto.MerMemberTaskPageDto;
import com.ruoyi.shop.domain.vo.MerMemberTaskPageVo;
import com.ruoyi.shop.domain.vo.MerMemberTaskRecordPageVo;
import com.ruoyi.shop.service.task.MemberTaskRecordService;
import com.ruoyi.shop.service.task.MemberTaskService;
import com.ruoyi.system.api.domain.poji.member.Member;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author jqs34
 * @ClassName MerTaskController
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Api(value = "商户端会员相关接口", tags = "商户端会员相关接口", description = "商户端会员相关接口")
@RestController
@RequestMapping("/mer/task")
public class MerTaskController {
    @Autowired
    private MemberTaskService memberTaskService;
    @Autowired
    private MemberTaskRecordService memberTaskRecordService;
    @RequestMapping(value = "/pageMerMemberTask", method = RequestMethod.POST)
    @ApiOperation(value = "分页获取商户会员跟进任务列表")
    public R<Page<MerMemberTaskPageVo>> pageMerMemberTask(@RequestBody MerMemberTaskPageDto merMemberTaskPageDto) {
        Long userId = SecurityUtils.getUserId();
        merMemberTaskPageDto.setUserId(userId);
        Page<MerMemberTaskPageVo> page = new Page<>();
        page.setSize(merMemberTaskPageDto.getPageSize());
        page.setCurrent(merMemberTaskPageDto.getPageNum());
        List<MerMemberTaskPageVo> merMemberTaskPageVoList = memberTaskService.pageMerMemberTask(page,merMemberTaskPageDto);
        return R.ok(page.setRecords(merMemberTaskPageVoList));
    }
    @RequestMapping(value = "/pageMerMemberTaskRecord", method = RequestMethod.POST)
    @ApiOperation(value = "分页获取商户会员跟进任务记录列表")
    public R<Page<MerMemberTaskRecordPageVo>> pageMerMemberTaskRecord(@RequestBody MerMemberTaskPageDto merMemberTaskPageDto) {
        Long userId = SecurityUtils.getUserId();
        merMemberTaskPageDto.setUserId(userId);
        Page<MerMemberTaskRecordPageVo> page = new Page<>();
        page.setSize(merMemberTaskPageDto.getPageSize());
        page.setCurrent(merMemberTaskPageDto.getPageNum());
        List<MerMemberTaskRecordPageVo> merMemberTaskRecordPageVoList = memberTaskRecordService.pageMerMemberTaskRecord(page,merMemberTaskPageDto);
        return R.ok(page.setRecords(merMemberTaskRecordPageVoList));
    }
    @RequestMapping(value = "/createMemberTask", method = RequestMethod.POST)
    @ApiOperation(value = "新建会员跟进任务")
    public R createMemberTask(@RequestBody MerCreateMemberTaskDto merCreateMemberTaskDto) {
        Long userId = SecurityUtils.getUserId();
        merCreateMemberTaskDto.setUserId(userId);
        memberTaskService.createMemberTask(merCreateMemberTaskDto);
        return R.ok();
    }
    @RequestMapping(value = "/followMemberTask", method = RequestMethod.POST)
    @ApiOperation(value = "任务跟进")
    public R followMemberTask(@RequestBody MerFollowMemberTaskDto merFollowMemberTaskDto) {
        Long userId = SecurityUtils.getUserId();
        merFollowMemberTaskDto.setUserId(userId);
        memberTaskService.followMemberTask(merFollowMemberTaskDto);
        return R.ok();
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/miniapp/AppHomeController.java
@@ -11,6 +11,7 @@
import com.ruoyi.system.api.domain.poji.member.Member;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -27,6 +28,7 @@
@Api(value = "小程序首页相关接口", tags = "小程序首页相关接口", description = "小程序首页相关接口")
@RestController
@RequestMapping("/app/home")
@Log4j2
public class AppHomeController {
@@ -40,7 +42,9 @@
    @ApiOperation(value = "获取最近商户")
    public R<AppNearbyShopVo> getNearbyShop(@RequestBody AppNearbyShopDto appNearbyShopDto) {
        Long userId = SecurityUtils.getUserId();
        log.info("userId"+userId);
        Member member = memberService.getMember(userId).getData();
        log.info("member"+member);
        appNearbyShopDto.setUserId(userId);
        AppNearbyShopVo appNearbyShopVo = shopService.getNearbyShop(appNearbyShopDto,member);
        return R.ok(appNearbyShopVo);
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerCreateMemberTaskDto.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.shop.domain.dto;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * @author jqs34
 * @ClassName merCreateMemberTaskDto
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class MerCreateMemberTaskDto extends MerBaseDto {
    @ApiModelProperty(name = "跟进会员用户id")
    private Long memberUserId;
    @ApiModelProperty(name = "任务时间")
    private Date taskDate;
    @ApiModelProperty(name = "任务内容")
    private String taskContent;
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerFollowMemberTaskDto.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.shop.domain.dto;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * @author jqs34
 * @ClassName MerFollowMemberTask
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class MerFollowMemberTaskDto extends MerBaseDto {
    @ApiModelProperty(name = "任务id")
    private String taskId;
    @ApiModelProperty("跟踪类型1电话2手动")
    private Integer followType;
    @ApiModelProperty("拨打电话")
    private String callPhone;
    @ApiModelProperty("电话时间")
    private Date callTime;
    @ApiModelProperty("跟踪内容")
    private String followContent;
    @ApiModelProperty("跟进图片地址 多个,号隔开")
    private String picture;
    @ApiModelProperty("跟进视频地址 多个,号隔开")
    private String video;
    @ApiModelProperty("跟进音频地址 多个,号隔开")
    private String audio;
    @ApiModelProperty("下次任务时间")
    private Date nextTaskDate;
    @ApiModelProperty("下次任务内容")
    private String nextTaskContent;
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerMemberTaskPageDto.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.shop.domain.dto;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author jqs34
 * @ClassName MerMemberTaskPageDto
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class MerMemberTaskPageDto extends MerPageDto {
    @ApiModelProperty(name = "会员用户id")
    private Long memberUserId;
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/task/MemberTaskRecord.java
@@ -46,7 +46,7 @@
    @TableField("user_id")
    private Long userId;
    /**
     * 跟踪类型
     * 跟踪类型1电话2手动
     */
    @TableField("follow_type")
    private Integer followType;
@@ -61,6 +61,11 @@
    @TableField("follow_content")
    private String followContent;
    /**
     * 拨打电话
     */
    @TableField("call_phone")
    private String callPhone;
    @Override
    protected Serializable pkVal() {
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MerMemberTaskPageVo.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.shop.domain.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * @author jqs34
 * @ClassName MerMemberTaskPageVo
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class MerMemberTaskPageVo {
    @ApiModelProperty(name = "任务id")
    private String taskId;
    @ApiModelProperty(name = "任务时间")
    private Date taskDate;
    @ApiModelProperty("任务内容")
    private String taskContent;
    @ApiModelProperty("任务内容")
    private Integer todayFlag;
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MerMemberTaskRecordPageVo.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.shop.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * @author jqs34
 * @ClassName MerMemberTaskRecordPageVo
 * @description: TODO
 * @date 2023年05月06日
 * @version: 1.0
 */
@Data
public class MerMemberTaskRecordPageVo {
    @ApiModelProperty(name = "跟进id")
    private Long followId;
    @ApiModelProperty(name = "任务id")
    private String taskId;
    @ApiModelProperty(name = "任务时间")
    private Date taskDate;
    @ApiModelProperty("跟踪类型1电话2手动")
    private Integer followType;
    @ApiModelProperty("电话时间")
    private Date callTime;
    @ApiModelProperty("跟踪内容")
    private String followContent;
    @ApiModelProperty("拨打电话")
    private String callPhone;
    @ApiModelProperty("跟进图片地址 多个,号隔开")
    private String picture;
    @ApiModelProperty("跟进视频地址 多个,号隔开")
    private String video;
    @ApiModelProperty("跟进音频地址 多个,号隔开")
    private String audio;
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/ParamsAuthFilter.java
New file
@@ -0,0 +1,103 @@
package com.ruoyi.shop.fliter;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.utils.StringUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
@Component
@Log4j2
public class ParamsAuthFilter implements Filter {
    // 令牌自定义标识
    //@Value("${token.header}")
    private String header = "Authorization";
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        RepeatedlyRequestWrapper wrapper = new RepeatedlyRequestWrapper(request, response);
        getRequestParams(wrapper);
        ResponseWrapper responseWrapper = new ResponseWrapper(response);
        filterChain.doFilter(wrapper, responseWrapper);
        // 返回的结果
        String content = responseWrapper.getTextContent();
        String requestUrl = request.getRequestURI();
        log.info("-------------------- Response Data ----------------------");
        log.info(requestUrl + " -> " + content);
        response.getOutputStream().write(content.getBytes());
    }
    private void getRequestParams(HttpServletRequest request){
        Map<String, String> params = getUrlParams(request);
        try {
            String requestUrl = request.getRequestURI();
            Map<String, String> urlParams = getUrlParams(request);
            Map<String, String> bodyParams = getBodyParams(request);
            params.putAll(urlParams);
            params.putAll(bodyParams);
            log.info("-------------------- request header ----------------------");
            log.info(header + " -> " + request.getHeader(header));
            log.info("-------------------- request params ----------------------");
            log.info(requestUrl + " -> " + JSONObject.toJSONString(params));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private Map<String, String> getBodyParams(HttpServletRequest request) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        StringBuilder stringBuilder = new StringBuilder();
        String buffer = "";
        while((buffer  = bufferedReader.readLine()) != null){
            stringBuilder.append(buffer);
        }
        String requestBodyStr = stringBuilder.toString();
        if(StringUtils.isNotBlank(requestBodyStr)){
            return JSONObject.parseObject(stringBuilder.toString(), Map.class);
        }
        return new HashMap<>();
    }
    private Map<String, String> getUrlParams(HttpServletRequest request){
        String queryParams = "";
        try {
            queryParams = request.getQueryString();
            if(StringUtils.isNotBlank(queryParams)) {
                queryParams = URLDecoder.decode(request.getQueryString(), "utf-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Map<String, String> result = new HashMap<>();
        if(StringUtils.isNotBlank(queryParams)) {
            String[] spilt = queryParams.split("&");
            for (String s : spilt) {
                int index = s.indexOf("=");
                result.put(s.substring(0, index), s.substring(index + 1));
            }
        }
        return result;
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/RepeatedlyRequestWrapper.java
New file
@@ -0,0 +1,111 @@
package com.ruoyi.shop.fliter;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
/**
 * 构建可重复读取inputStream的request
 *
 * @author linzhang
 */
@Log4j2
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
{
    private final byte[] body;
    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
    {
        super(request);
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        body = getBodyString(request).getBytes("UTF-8");
    }
    public static String getBodyString(ServletRequest request)
    {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = null;
        try (InputStream inputStream = request.getInputStream())
        {
            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
            String line = "";
            while ((line = reader.readLine()) != null)
            {
                sb.append(line);
            }
        }
        catch (IOException e)
        {
            log.warn("getBodyString出现问题!");
        }
        finally
        {
            if (reader != null)
            {
                try
                {
                    reader.close();
                }
                catch (IOException e)
                {
                    log.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        return sb.toString();
    }
    @Override
    public BufferedReader getReader() throws IOException
    {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
    @Override
    public ServletInputStream getInputStream() throws IOException
    {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream()
        {
            @Override
            public int read() throws IOException
            {
                return bais.read();
            }
            @Override
            public int available() throws IOException
            {
                return body.length;
            }
            @Override
            public boolean isFinished()
            {
                return false;
            }
            @Override
            public boolean isReady()
            {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener)
            {
            }
        };
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/ResponseWrapper.java
New file
@@ -0,0 +1,63 @@
package com.ruoyi.shop.fliter;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    private PrintWriter printWriter = new PrintWriter(outputStream);
    public ResponseWrapper(HttpServletResponse response) {
        super(response);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        return printWriter;
    }
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setWriteListener(WriteListener listener) {
            }
            @Override
            public void write(int b) throws IOException {
                outputStream.write(b);
            }
        };
    }
    public void flush(){
        try {
            printWriter.flush();
            printWriter.close();
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public ByteArrayOutputStream getByteArrayOutputStream(){
        return outputStream;
    }
    public String getTextContent() {
        flush();
        return outputStream.toString();
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/MemberTaskMapper.java
@@ -1,7 +1,14 @@
package com.ruoyi.shop.mapper.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.shop.domain.dto.MerMemberTaskPageDto;
import com.ruoyi.shop.domain.pojo.task.MemberTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.shop.domain.vo.MerMemberTaskPageVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
/**
 * <p>
@@ -13,4 +20,11 @@
 */
public interface MemberTaskMapper extends BaseMapper<MemberTask> {
    /**
     *
     * @param page
     * @param merMemberTaskPageDto
     * @return
     */
    List<MerMemberTaskPageVo> pageMerMemberTask(Page page, @Param("param") MerMemberTaskPageDto merMemberTaskPageDto);
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/MemberTaskRecordMapper.java
@@ -1,7 +1,13 @@
package com.ruoyi.shop.mapper.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.shop.domain.dto.MerMemberTaskPageDto;
import com.ruoyi.shop.domain.pojo.task.MemberTaskRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.shop.domain.vo.MerMemberTaskRecordPageVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -13,4 +19,11 @@
 */
public interface MemberTaskRecordMapper extends BaseMapper<MemberTaskRecord> {
    /**
     *
     * @param page
     * @param merMemberTaskPageDto
     * @return
     */
    List<MerMemberTaskRecordPageVo> pageMerMemberTaskRecord(Page page, @Param("param") MerMemberTaskPageDto merMemberTaskPageDto);
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -12,8 +12,10 @@
import com.ruoyi.shop.service.task.ShopFileService;
import com.ruoyi.shop.util.CodeFactoryUtil;
import com.ruoyi.system.api.RemoteConfigService;
import com.ruoyi.system.api.RemoteMemberService;
import com.ruoyi.system.api.RemoteOrderService;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.poji.config.SysTag;
import com.ruoyi.system.api.domain.poji.member.Member;
@@ -56,6 +58,9 @@
    @Resource
    private RemoteConfigService configService;
    @Resource
    private RemoteMemberService remoteMemberService;
    @Resource
    private RemoteUserService sysUserService;
@@ -339,6 +344,13 @@
            //获取附近商户
            shop = this.getById(1L);
        }
        if(member.getBindingFlag()!=1){
            AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto();
            appMemberBindingDto.setShopId(shop.getShopId());
            appMemberBindingDto.setUserId(member.getUserId());
            appMemberBindingDto.setBindingFlag(0);
            remoteMemberService.updateMemberBinding(appMemberBindingDto);
        }
        appNearbyShopVo.setShopId(shop.getShopId());
        appNearbyShopVo.setShopName(shop.getShopName());
        appNearbyShopVo.setShopAddress(shop.getShopAreaName()+shop.getShopAddress());
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskRecordServiceImpl.java
@@ -1,10 +1,19 @@
package com.ruoyi.shop.service.impl.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.shop.domain.dto.MerMemberTaskPageDto;
import com.ruoyi.shop.domain.pojo.task.MemberTaskRecord;
import com.ruoyi.shop.domain.pojo.task.TaskFile;
import com.ruoyi.shop.domain.vo.MerMemberTaskRecordPageVo;
import com.ruoyi.shop.mapper.task.MemberTaskRecordMapper;
import com.ruoyi.shop.service.task.MemberTaskRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.shop.service.task.TaskFileService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.StringJoiner;
/**
 * <p>
@@ -17,4 +26,53 @@
@Service
public class MemberTaskRecordServiceImpl extends ServiceImpl<MemberTaskRecordMapper, MemberTaskRecord> implements MemberTaskRecordService {
    @Resource
    private MemberTaskRecordMapper memberTaskRecordMapper;
    @Resource
    private TaskFileService taskFileService;
    /**
     *
     * @param page
     * @param merMemberTaskPageDto
     * @return
     */
    @Override
    public List<MerMemberTaskRecordPageVo> pageMerMemberTaskRecord(Page page, MerMemberTaskPageDto merMemberTaskPageDto){
        List<MerMemberTaskRecordPageVo> merMemberTaskRecordPageVoList = memberTaskRecordMapper.pageMerMemberTaskRecord(page, merMemberTaskPageDto);
        if(merMemberTaskRecordPageVoList!=null&&!merMemberTaskRecordPageVoList.isEmpty()){
            Long followId;
            List<TaskFile> taskFileList;
            String picture;
            String video;
            String audio;
            for(MerMemberTaskRecordPageVo merMemberTaskRecordPageVo : merMemberTaskRecordPageVoList){
                followId = merMemberTaskRecordPageVo.getFollowId();
                taskFileList = taskFileService.listByFollowIdAndFollowType(followId,1);
                picture = convertFileListToString(taskFileList);
                taskFileList = taskFileService.listByFollowIdAndFollowType(followId,2);
                video = convertFileListToString(taskFileList);
                taskFileList = taskFileService.listByFollowIdAndFollowType(followId,3);
                audio = convertFileListToString(taskFileList);
                merMemberTaskRecordPageVo.setPicture(picture);
                merMemberTaskRecordPageVo.setVideo(video);
                merMemberTaskRecordPageVo.setAudio(audio);
            }
        }
        return merMemberTaskRecordPageVoList;
    }
    private String convertFileListToString(List<TaskFile> taskFileList){
        StringJoiner sj = new StringJoiner(",");
        if(taskFileList!=null&&!taskFileList.isEmpty()){
            for(TaskFile taskFile : taskFileList){
                sj.add(taskFile.getFileUrl());
            }
            return sj.toString();
        }else{
            return null;
        }
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskServiceImpl.java
@@ -1,10 +1,27 @@
package com.ruoyi.shop.service.impl.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.uuid.IdUtils;
import com.ruoyi.shop.domain.dto.MerCreateMemberTaskDto;
import com.ruoyi.shop.domain.dto.MerFollowMemberTaskDto;
import com.ruoyi.shop.domain.dto.MerMemberTaskPageDto;
import com.ruoyi.shop.domain.pojo.task.MemberTask;
import com.ruoyi.shop.domain.pojo.task.MemberTaskRecord;
import com.ruoyi.shop.domain.pojo.task.TaskFile;
import com.ruoyi.shop.domain.vo.MerMemberTaskPageVo;
import com.ruoyi.shop.mapper.task.MemberTaskMapper;
import com.ruoyi.shop.service.task.MemberTaskRecordService;
import com.ruoyi.shop.service.task.MemberTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.api.RemoteMemberService;
import com.ruoyi.system.api.domain.poji.member.Member;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
 * <p>
@@ -17,4 +34,119 @@
@Service
public class MemberTaskServiceImpl extends ServiceImpl<MemberTaskMapper, MemberTask> implements MemberTaskService {
    @Resource
    private MemberTaskMapper memberTaskMapper;
    @Resource
    private MemberTaskRecordService memberTaskRecordService;
    @Resource
    private RemoteMemberService remoteMemberService;
    /**
     *
     * @param page
     * @param merMemberTaskPageDto
     * @return
     */
    @Override
    public List<MerMemberTaskPageVo> pageMerMemberTask(Page page, MerMemberTaskPageDto merMemberTaskPageDto){
        String today = DateUtils.parseDateToStr("YYYY-MM-DD",new Date());
        List<MerMemberTaskPageVo> merMemberTaskPageVoList = memberTaskMapper.pageMerMemberTask(page, merMemberTaskPageDto);
        if(merMemberTaskPageVoList!=null&&!merMemberTaskPageVoList.isEmpty()){
            Date taskDate;
            for(MerMemberTaskPageVo merMemberTaskPageVo : merMemberTaskPageVoList){
                taskDate = merMemberTaskPageVo.getTaskDate();
                if(today.equals(DateUtils.parseDateToStr("YYYY-MM-DD",taskDate))){
                    merMemberTaskPageVo.setTodayFlag(1);
                }else{
                    merMemberTaskPageVo.setTodayFlag(0);
                }
            }
        }
        return merMemberTaskPageVoList;
    }
    /**
     *
     * @param merCreateMemberTaskDto
     */
    @Override
    public void createMemberTask(MerCreateMemberTaskDto merCreateMemberTaskDto){
        MemberTask memberTask = new MemberTask();
        String taskId = IdUtils.fastUUID();
        memberTask.setTaskId(taskId);
        memberTask.setDelFlag(0);
        memberTask.setShopId(merCreateMemberTaskDto.getShopId());
        memberTask.setUserId(merCreateMemberTaskDto.getMemberUserId());
        memberTask.setTaskDate(merCreateMemberTaskDto.getTaskDate());
        memberTask.setTaskContent(merCreateMemberTaskDto.getTaskContent());
        memberTask.setCreateTime(new Date());
        this.saveOrUpdate(memberTask);
    }
    /**
     *
     * @param merFollowMemberTaskDto
     */
    @Override
    public void followMemberTask(MerFollowMemberTaskDto merFollowMemberTaskDto){
        MemberTaskRecord memberTaskRecord = new MemberTaskRecord();
        MemberTask oldMemberTask = this.getById(merFollowMemberTaskDto.getTaskId());
        memberTaskRecord.setTaskId(merFollowMemberTaskDto.getTaskId());
        memberTaskRecord.setDelFlag(0);
        memberTaskRecord.setUserId(oldMemberTask.getUserId());
        memberTaskRecord.setFollowType(merFollowMemberTaskDto.getFollowType());
        memberTaskRecord.setCallPhone(merFollowMemberTaskDto.getCallPhone());
        memberTaskRecord.setCallTime(merFollowMemberTaskDto.getCallTime());
        memberTaskRecordService.saveOrUpdate(memberTaskRecord);
        String picture = merFollowMemberTaskDto.getPicture();
        String video = merFollowMemberTaskDto.getVideo();
        String audio = merFollowMemberTaskDto.getAudio();
        String[] strArr;
        TaskFile taskFile;
        if(StringUtils.isNotBlank(picture)){
            strArr = picture.split(",");
            for(String str : strArr){
                taskFile = new TaskFile();
                taskFile.setDelFlag(0);
                taskFile.setFollowId(memberTaskRecord.getId());
                taskFile.setFollowFrom(2);
                taskFile.setFileUrl(str);
                taskFile.setFileType(1);
            }
        }
        if(StringUtils.isNotBlank(video)){
            strArr = picture.split(",");
            for(String str : strArr){
                taskFile = new TaskFile();
                taskFile.setDelFlag(0);
                taskFile.setFollowId(memberTaskRecord.getId());
                taskFile.setFollowFrom(2);
                taskFile.setFileUrl(str);
                taskFile.setFileType(2);
            }
        }
        if(StringUtils.isNotBlank(audio)){
            strArr = picture.split(",");
            for(String str : strArr){
                taskFile = new TaskFile();
                taskFile.setDelFlag(0);
                taskFile.setFollowId(memberTaskRecord.getId());
                taskFile.setFollowFrom(2);
                taskFile.setFileUrl(str);
                taskFile.setFileType(3);
            }
        }
        MemberTask memberTask = new MemberTask();
        String taskId = IdUtils.fastUUID();
        memberTask.setTaskId(taskId);
        memberTask.setDelFlag(0);
        memberTask.setShopId(oldMemberTask.getShopId());
        memberTask.setUserId(oldMemberTask.getUserId());
        memberTask.setTaskDate(merFollowMemberTaskDto.getNextTaskDate());
        memberTask.setTaskContent(merFollowMemberTaskDto.getNextTaskContent());
        memberTask.setCreateTime(new Date());
        this.saveOrUpdate(memberTask);
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/TaskFileServiceImpl.java
@@ -1,10 +1,15 @@
package com.ruoyi.shop.service.impl.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.shop.domain.pojo.shop.ShopRelTag;
import com.ruoyi.shop.domain.pojo.task.TaskFile;
import com.ruoyi.shop.mapper.task.TaskFileMapper;
import com.ruoyi.shop.service.task.TaskFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -17,4 +22,17 @@
@Service
public class TaskFileServiceImpl extends ServiceImpl<TaskFileMapper, TaskFile> implements TaskFileService {
    /**
     *
     * @param followId
     * @param followType
     * @return
     */
    @Override
    public List<TaskFile> listByFollowIdAndFollowType(Long followId, Integer followType){
        LambdaQueryWrapper<TaskFile> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(TaskFile::getDelFlag, 0).eq(TaskFile::getFollowId, followId).eq(TaskFile::getFileType, followType);
        return this.list(queryWrapper);
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskRecordService.java
@@ -1,7 +1,12 @@
package com.ruoyi.shop.service.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.shop.domain.dto.MerMemberTaskPageDto;
import com.ruoyi.shop.domain.pojo.task.MemberTaskRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.shop.domain.vo.MerMemberTaskRecordPageVo;
import java.util.List;
/**
 * <p>
@@ -13,4 +18,11 @@
 */
public interface MemberTaskRecordService extends IService<MemberTaskRecord> {
    /**
     *
     * @param page
     * @param merMemberTaskPageDto
     * @return
     */
    List<MerMemberTaskRecordPageVo> pageMerMemberTaskRecord(Page page, MerMemberTaskPageDto merMemberTaskPageDto);
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskService.java
@@ -1,7 +1,14 @@
package com.ruoyi.shop.service.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.shop.domain.dto.MerCreateMemberTaskDto;
import com.ruoyi.shop.domain.dto.MerFollowMemberTaskDto;
import com.ruoyi.shop.domain.dto.MerMemberTaskPageDto;
import com.ruoyi.shop.domain.pojo.task.MemberTask;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.shop.domain.vo.MerMemberTaskPageVo;
import java.util.List;
/**
 * <p>
@@ -13,4 +20,24 @@
 */
public interface MemberTaskService extends IService<MemberTask> {
    /**
     *
     * @param page
     * @param merMemberTaskPageDto
     * @return
     */
    List<MerMemberTaskPageVo> pageMerMemberTask(Page page, MerMemberTaskPageDto merMemberTaskPageDto);
    /**
     *
     * @param merCreateMemberTaskDto
     */
    void createMemberTask(MerCreateMemberTaskDto merCreateMemberTaskDto);
    /**
     *
     * @param merFollowMemberTaskDto
     */
    void followMemberTask(MerFollowMemberTaskDto merFollowMemberTaskDto);
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/TaskFileService.java
@@ -3,6 +3,8 @@
import com.ruoyi.shop.domain.pojo.task.TaskFile;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * 跟进附件 服务类
@@ -13,4 +15,12 @@
 */
public interface TaskFileService extends IService<TaskFile> {
    /**
     *
     * @param followId
     * @param followType
     * @return
     */
    List<TaskFile> listByFollowIdAndFollowType(Long followId, Integer followType);
}
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/MemberTaskMapper.xml
@@ -77,4 +77,14 @@
        </foreach>
    </delete>
    <select id="pageMerMemberTask" resultType="com.ruoyi.shop.domain.vo.MerMemberTaskPageVo">
        SELECT
        task_id taskId,
        task_date taskDate,
        task_content taskContent
        FROM t_member_task
        WHERE delFlag = 0 AND shop_id = #{param.shopId} AND user_id = #{param.memberUserId}
        ORDER BY tmt.task_date DESC
    </select>
</mapper>
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/MemberTaskRecordMapper.xml
@@ -76,4 +76,19 @@
        </foreach>
    </delete>
    <select id="pageMerMemberTaskRecord" resultType="com.ruoyi.shop.domain.vo.MerMemberTaskRecordPageVo">
        SELECT
        tmtr.id followId,
        tmtr.task_id taskId,
        tmt.task_date taskDate,
        tmtr.followType followType,
        tmtr.callTime callTime,
        tmtr.followContent followContent,
        tmtr.callPhone callPhone
        FROM t_member_task tmt
        INNER JOIN t_member_task_record tmtr ON tmtr.task_id = tmt.task_id
        WHERE delFlag = 0 AND shop_id = #{param.shopId} AND user_id = #{param.memberUserId}
        ORDER BY tmt.task_date DESC
    </select>
</mapper>
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AppImmediatelyBuyDto.java
@@ -15,7 +15,7 @@
public class AppImmediatelyBuyDto extends AppBaseDto {
    @ApiModelProperty(value = "商品id")
    private Long goodsId;
    private String goodsId;
    @ApiModelProperty(value = "购买数量")
    private Integer buyNum;
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/fliter/ParamsAuthFilter.java
New file
@@ -0,0 +1,103 @@
package com.ruoyi.system.fliter;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.utils.StringUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
@Component
@Log4j2
public class ParamsAuthFilter implements Filter {
    // 令牌自定义标识
    //@Value("${token.header}")
    private String header = "Authorization";
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        RepeatedlyRequestWrapper wrapper = new RepeatedlyRequestWrapper(request, response);
        getRequestParams(wrapper);
        ResponseWrapper responseWrapper = new ResponseWrapper(response);
        filterChain.doFilter(wrapper, responseWrapper);
        // 返回的结果
        String content = responseWrapper.getTextContent();
        String requestUrl = request.getRequestURI();
        log.info("-------------------- Response Data ----------------------");
        log.info(requestUrl + " -> " + content);
        response.getOutputStream().write(content.getBytes());
    }
    private void getRequestParams(HttpServletRequest request){
        Map<String, String> params = getUrlParams(request);
        try {
            String requestUrl = request.getRequestURI();
            Map<String, String> urlParams = getUrlParams(request);
            Map<String, String> bodyParams = getBodyParams(request);
            params.putAll(urlParams);
            params.putAll(bodyParams);
            log.info("-------------------- request header ----------------------");
            log.info(header + " -> " + request.getHeader(header));
            log.info("-------------------- request params ----------------------");
            log.info(requestUrl + " -> " + JSONObject.toJSONString(params));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private Map<String, String> getBodyParams(HttpServletRequest request) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        StringBuilder stringBuilder = new StringBuilder();
        String buffer = "";
        while((buffer  = bufferedReader.readLine()) != null){
            stringBuilder.append(buffer);
        }
        String requestBodyStr = stringBuilder.toString();
        if(StringUtils.isNotBlank(requestBodyStr)){
            return JSONObject.parseObject(stringBuilder.toString(), Map.class);
        }
        return new HashMap<>();
    }
    private Map<String, String> getUrlParams(HttpServletRequest request){
        String queryParams = "";
        try {
            queryParams = request.getQueryString();
            if(StringUtils.isNotBlank(queryParams)) {
                queryParams = URLDecoder.decode(request.getQueryString(), "utf-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Map<String, String> result = new HashMap<>();
        if(StringUtils.isNotBlank(queryParams)) {
            String[] spilt = queryParams.split("&");
            for (String s : spilt) {
                int index = s.indexOf("=");
                result.put(s.substring(0, index), s.substring(index + 1));
            }
        }
        return result;
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/fliter/RepeatedlyRequestWrapper.java
New file
@@ -0,0 +1,111 @@
package com.ruoyi.system.fliter;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
/**
 * 构建可重复读取inputStream的request
 *
 * @author linzhang
 */
@Log4j2
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
{
    private final byte[] body;
    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
    {
        super(request);
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        body = getBodyString(request).getBytes("UTF-8");
    }
    public static String getBodyString(ServletRequest request)
    {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = null;
        try (InputStream inputStream = request.getInputStream())
        {
            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
            String line = "";
            while ((line = reader.readLine()) != null)
            {
                sb.append(line);
            }
        }
        catch (IOException e)
        {
            log.warn("getBodyString出现问题!");
        }
        finally
        {
            if (reader != null)
            {
                try
                {
                    reader.close();
                }
                catch (IOException e)
                {
                    log.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        return sb.toString();
    }
    @Override
    public BufferedReader getReader() throws IOException
    {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
    @Override
    public ServletInputStream getInputStream() throws IOException
    {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream()
        {
            @Override
            public int read() throws IOException
            {
                return bais.read();
            }
            @Override
            public int available() throws IOException
            {
                return body.length;
            }
            @Override
            public boolean isFinished()
            {
                return false;
            }
            @Override
            public boolean isReady()
            {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener)
            {
            }
        };
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/fliter/ResponseWrapper.java
New file
@@ -0,0 +1,63 @@
package com.ruoyi.system.fliter;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    private PrintWriter printWriter = new PrintWriter(outputStream);
    public ResponseWrapper(HttpServletResponse response) {
        super(response);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        return printWriter;
    }
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setWriteListener(WriteListener listener) {
            }
            @Override
            public void write(int b) throws IOException {
                outputStream.write(b);
            }
        };
    }
    public void flush(){
        try {
            printWriter.flush();
            printWriter.close();
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public ByteArrayOutputStream getByteArrayOutputStream(){
        return outputStream;
    }
    public String getTextContent() {
        flush();
        return outputStream.toString();
    }
}