jiangping
2023-10-11 0803e188cc84b0971d13b5746df63ca2418b9236
接口整理
已添加4个文件
已修改11个文件
469 ■■■■■ 文件已修改
server/platform/src/main/java/com/doumee/api/business/RefundController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/api/business/SitesController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/dingding/DingDingNotice.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/SitesMapper.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/request/SitesMonitorBikeDTO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/request/SitesMonitorDTO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/BikeRepairService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/SitesService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/mappers/SitesMapper.xml 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/BusinessApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/api/business/RefundController.java
@@ -76,8 +76,8 @@
    public ApiResponse<PageData<Refund>> findPage (@RequestBody PageWrap<Refund> pageWrap) {
        return ApiResponse.success(refundService.findPage(pageWrap));
    }
    @ApiOperation("后台结算记录_分页查询")
    @PostMapping("/pagePlat")
    @ApiOperation("后台结算记录")
    @PostMapping("/findPlatPage")
    @RequiresPermissions("business:refund:query")
    public ApiResponse<PageData<Refund>> findPlatPage (@RequestBody PageWrap<Refund> pageWrap) {
        return ApiResponse.success(refundService.findPlatPage(pageWrap));
server/platform/src/main/java/com/doumee/api/business/SitesController.java
@@ -7,6 +7,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Sites;
import com.doumee.dao.business.web.request.SitesMonitorBikeDTO;
import com.doumee.dao.business.web.request.SitesMonitorDTO;
import com.doumee.service.business.SitesService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -87,4 +89,19 @@
    public ApiResponse findById(@PathVariable String id) {
        return ApiResponse.success(sitesService.findById(id));
    }
    @ApiOperation("站点储车监控")
    @PostMapping("/findSitesMonitorDTOPage")
    @RequiresPermissions("business:sites:query")
    public ApiResponse<PageData<SitesMonitorDTO>> findSitesMonitorDTOPage(@RequestBody PageWrap<SitesMonitorDTO> pageWrap){
        return ApiResponse.success(sitesService.findSitesMonitorDTOPage(pageWrap));
    }
    @ApiOperation("实时车位信息")
    @PostMapping("/findSitesMonitorDTOPage")
    @RequiresPermissions("business:sites:query")
    public ApiResponse<PageData<SitesMonitorBikeDTO>> getSitesMonitorBikeDTO(@RequestBody PageWrap<SitesMonitorDTO> pageWrap){
        return ApiResponse.success(sitesService.getSitesMonitorBikeDTO(pageWrap));
    }
}
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -23,6 +23,7 @@
  public static final String FALSE = "f";
  public static final String TOKEN ="TOKEN" ;
    public static final String SYSTEM ="SYSTEM" ;
    public static final String DINGDING ="DINGDING" ;
    public static final String MINI_PROGRAMME ="MINI_PROGRAMME" ;
    public static final String IMG_DIR = "IMG_DIR";
    public static final String FILE_DIR ="FILE_DIR" ;
@@ -109,6 +110,16 @@
        //小程序每日服务结束时间
        public static final String BUSINESS_ENDTIME = "BUSINESS_ENDTIME";
        //钉钉通知地址
        public static final String DINGDING_URL = "DINGDING_URL";
        //钉钉签名
        public static final String DINGDING_SECRET = "DINGDING_SECRET";
        //小程序满载预警(%)最大值
        public static final String WARN_MAX = "WARN_MAX";
        //小程序满载预警(%)最小值
        public static final String WARN_MIN = "WARN_MIN";
        public static final String FILES_DIR = "FILES_DIR";
        public static final String SCRATCH_REDIRECT_URL = "SCRATCH_REDIRECT_URL";
server/services/src/main/java/com/doumee/core/dingding/DingDingNotice.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.doumee.core.dingding;
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.model.BikeRepair;
import com.doumee.dao.business.web.request.RepairRequest;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2022/12/7 11:16
 */
public class DingDingNotice {
    /**
     * é’‰é’‰æœºå™¨äºº åŠ ç­¾
     * @param timestamp
     * @param secret
     * @return
     * @throws Exception
     */
    public static String getSign(Long timestamp, String secret)  throws Exception{
        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
        return sign;
    }
    /**
     * é’‰é’‰é€šçŸ¥ - è½¦è¾†å¼‚常上报
     * @param repairRequest
     * @param ddUrl
     * @throws Exception
     */
    public static void bikeRepair(RepairRequest repairRequest, String ddUrl , String secret)  throws Exception{
        Long timestamp = System.currentTimeMillis();
        Map<String,Object> content = new HashMap<>();
        content.put("msgtype","text");
        Map<String,String> text = new HashMap<>();
        text.put("content","【故障上报】车辆编号:"+repairRequest.getBikeCode()+",位置:"+repairRequest.getAddr()+",联系电话:"+repairRequest.getLinkphone()+",请及时查看处理。");
        content.put("text",text);
        HttpsUtil.post(ddUrl+"&timestamp="+timestamp+"&sign="+getSign(timestamp,secret), JSONObject.toJSONString(content),"application/json",false);
    }
    /**
     * é’‰é’‰é€šçŸ¥ - ç«™ç‚¹å‚¨è½¦å‘Šè­¦
     * @param siteName
     * @param ddUrl
     * @param secret
     * @param type 0=超出 1=低于
     * @param warnVal æŠ¥è­¦å€¼
     * @throws Exception
     */
    public static void reservesNotice(String siteName, String ddUrl , String secret, Integer type, BigDecimal warnVal)  throws Exception{
        Long timestamp = System.currentTimeMillis();
        Map<String,Object> content = new HashMap<>();
        content.put("msgtype","text");
        Map<String,String> text = new HashMap<>();
        //text.put("content","【站点储车告警】"+siteName+",储车量超过80%/低于20%,请及时进行车辆调配");
        text.put("content","【站点储车告警】"+siteName+",储车量"+(type.equals(Constants.ZERO)?"超出":"低于")+warnVal+"%,请及时进行车辆调配");
        content.put("text",text);
        HttpsUtil.post(ddUrl+"&timestamp="+timestamp+"&sign="+getSign(timestamp,secret), JSONObject.toJSONString(content),"application/json",false);
    }
}
server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
package com.doumee.core.utils;
import javax.net.ssl.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class HttpsUtil {
    public static String get(String url,boolean ignoreSSL) {
        return connection(url, "GET", null, null,ignoreSSL);
    }
    public static String post(String url, String data, String contentType, boolean ignoreSSL) {
        return connection(url, "POST", data, contentType, ignoreSSL);
    }
    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
        HttpsURLConnection connection = null;
        try {
            URL _url = new URL(url);
            connection = (HttpsURLConnection) _url.openConnection();
            connection.setRequestMethod(method);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            if(contentType != null){
                connection.setRequestProperty("Content-Type", contentType);
            }
            if(ignoreSSL){
                //信任所有ssl证书和主机
                TrustManager[] trustManagers = {new HttpsTrustManager()};
                SSLContext context = SSLContext.getInstance("TLS");
                context.init(null, trustManagers, new SecureRandom());
                connection.setSSLSocketFactory(context.getSocketFactory());
                connection.setHostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });
            }
            connection.connect();
            if(data != null){
                OutputStream outputStream = connection.getOutputStream();
                outputStream.write(data.getBytes("utf-8"));
                outputStream.close();
            }
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                InputStream is = connection.getInputStream();
                byte[] b = new byte[4096];
                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
                int len;
                while ((len = is.read(b)) != -1) {
                    baos.write(b, 0, len);
                }
                is.close();
                return baos.toString("utf-8");
            }
            return connection.getResponseMessage();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
        }
        return null;
    }
    public static void main(String[] args) {
        //局部信任所有证书和主机
        String result = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do",true);
        System.out.println(result);
        //外部信任所有证书和主机
        HttpsTrustManager.allowAllSSL();
        String response = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do", false);
        System.out.println(result);
    }
}
class HttpsTrustManager implements X509TrustManager {
    private static TrustManager[] trustManagers = {new HttpsTrustManager()};
    @Override
    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
        // TODO Auto-generated method stub
    }
    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
        // TODO Auto-generated method stub
    }
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        // TODO Auto-generated method stub
        return null;
    }
    public static void allowAllSSL() {
        try {
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            e.printStackTrace();
        }
    }
}
server/services/src/main/java/com/doumee/dao/business/SitesMapper.java
@@ -1,8 +1,13 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.dao.business.model.Sites;
import com.doumee.dao.business.web.request.SitesMonitorBikeDTO;
import com.doumee.dao.business.web.request.SitesMonitorDTO;
import com.doumee.dao.system.dto.QuerySystemUserDTO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
@@ -15,16 +20,12 @@
    /**
     * @return
     */
    @Select("SELECT \n" +
            "sites.id,\n" +
            "sites.name as name,\n" +
            "sites.code as code,\n" +
            "count(l.id) as lid,\n" +
            "count(l.bike_code ) as lbikeCount\n" +
            "from \n" +
            "sites sites\n" +
            "LEFT JOIN locks l on sites.id = l.site_id\n" +
            "GROUP BY sites.id ")
    SitesMonitorDTO getSitesMonitorDTO();
    Page<SitesMonitorDTO> getSitesMonitorDTO(IPage page, @Param("code") String code, @Param("name") String name);
    Page<SitesMonitorBikeDTO> getSitesMonitorBikeDTO(IPage page,
                                                     @Param("code") String code,
                                                     @Param("name") String name,
                                                     @Param("lockCode") String lockCode,
                                                     @Param("hasBike") Boolean hasBike   );
}
server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java
@@ -19,9 +19,12 @@
@ApiModel("报修业务请求类")
public class RepairRequest {
    @ApiModelProperty(value = "车辆编码")
    @ApiModelProperty(value = "车辆主键")
    private String binkeId;
    @ApiModelProperty(value = "车辆编码")
    private String bikeCode;
    @ApiModelProperty(value = "经度", example = "1")
    private BigDecimal longitude;
server/services/src/main/java/com/doumee/dao/business/web/request/SitesMonitorBikeDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.dao.business.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author T14
 */
@Data
@ApiModel("站点车辆监控")
public class SitesMonitorBikeDTO {
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "编号")
    private String code;
    @ApiModelProperty(value = "锁止器数")
    private Integer localCode;
    @ApiModelProperty(value = "在架车辆数")
    private Integer bikeCode;
    @ApiModelProperty(value = "车辆类型")
    private String bikeType;
}
server/services/src/main/java/com/doumee/dao/business/web/request/SitesMonitorDTO.java
@@ -32,6 +32,13 @@
    private BigDecimal rate;
    @ApiModelProperty(value = "锁头是否有车")
    private Boolean hasBike ;
    @ApiModelProperty(value = "满架率")
    private String lockCode;
}
server/services/src/main/java/com/doumee/service/business/BikeRepairService.java
@@ -108,5 +108,5 @@
     */
    long count(BikeRepair bikeRepair);
    void saveRepair(RepairRequest repairRequest);
    void saveRepair(RepairRequest repairRequest)  throws Exception;
}
server/services/src/main/java/com/doumee/service/business/SitesService.java
@@ -1,8 +1,14 @@
package com.doumee.service.business;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Sites;
import com.doumee.dao.business.web.request.SitesMonitorBikeDTO;
import com.doumee.dao.business.web.request.SitesMonitorDTO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
@@ -94,4 +100,24 @@
     * @return long
     */
    long count(Sites sites);
    /**
     * ç«™ç‚¹é¢„è­¦
     * @param siteId
     * @throws Exception
     */
    void siteReservesNotice(String siteId) throws Exception;
    /**
     * åˆ†é¡µæŸ¥è¯¢ç«™ç‚¹å‚¨è½¦ç›‘控
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<Sites>
     */
    PageData<SitesMonitorDTO> findSitesMonitorDTOPage(PageWrap<SitesMonitorDTO> pageWrap);
    PageData<SitesMonitorBikeDTO> getSitesMonitorBikeDTO(PageWrap<SitesMonitorDTO> pageWrap);
}
server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java
@@ -2,7 +2,9 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.google.common.collect.Lists;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.dingding.DingDingNotice;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
@@ -49,6 +51,9 @@
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public String create(BikeRepair bikeRepair) {
@@ -157,7 +162,7 @@
    @Override
    public void saveRepair(RepairRequest repairRequest){
    public void saveRepair(RepairRequest repairRequest) throws Exception{
        BikeRepair bikeRepair = new BikeRepair();
        BeanUtils.copyProperties(repairRequest,bikeRepair);
        bikeRepair.setCreateDate(new Date());
@@ -178,6 +183,11 @@
                multifileMapper.insert(multifile);
            }
        }
        //发送钉钉通知
        DingDingNotice.bikeRepair(repairRequest,
                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_URL).getCode(),
                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_SECRET).getCode());
    }
server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
@@ -1,5 +1,8 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.dingding.DingDingNotice;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
@@ -7,20 +10,30 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.LocksMapper;
import com.doumee.dao.business.SitesMapper;
import com.doumee.dao.business.model.Locks;
import com.doumee.dao.business.model.Sites;
import com.doumee.dao.business.web.request.SitesMonitorBikeDTO;
import com.doumee.dao.business.web.request.SitesMonitorDTO;
import com.doumee.service.business.SitesService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.checkerframework.checker.units.qual.C;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * ç«™ç‚¹ä¿¡æ¯è¡¨Service实现
@@ -32,6 +45,12 @@
    @Autowired
    private SitesMapper sitesMapper;
    @Autowired
    private LocksMapper locksMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public String create(Sites sites) {
@@ -179,4 +198,37 @@
        QueryWrapper<Sites> wrapper = new QueryWrapper<>(sites);
        return sitesMapper.selectCount(wrapper);
    }
    @Override
    public PageData<SitesMonitorDTO> findSitesMonitorDTOPage(PageWrap<SitesMonitorDTO> pageWrap) {
        IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        Page<SitesMonitorDTO> sitesMonitorDTO = sitesMapper.getSitesMonitorDTO(page, pageWrap.getModel().getCode(), pageWrap.getModel().getName());
        if (!CollectionUtils.isEmpty(sitesMonitorDTO.getRecords())){
            sitesMonitorDTO.getRecords().forEach(s->{
                s.setRate(new BigDecimal(s.getBikeCount()).divide(new BigDecimal(s.getLocalCount()).setScale(2)));
            });
        }
        return PageData.from(sitesMonitorDTO);
    }
    @Override
    public void siteReservesNotice(String siteId) throws Exception {
    }
    @Override
    public PageData<SitesMonitorBikeDTO> getSitesMonitorBikeDTO(PageWrap<SitesMonitorDTO> pageWrap) {
        IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        Page<SitesMonitorBikeDTO> sitesMonitorDTO = sitesMapper.getSitesMonitorBikeDTO(page,
                                                                        pageWrap.getModel().getCode(),
                                                                        pageWrap.getModel().getName(),
                                                                        pageWrap.getModel().getLockCode(),
                                                                        pageWrap.getModel().getHasBike());
        return PageData.from(sitesMonitorDTO);
    }
}
server/services/src/main/resources/mappers/SitesMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.doumee.dao.business.SitesMapper">
    <select id="getSitesMonitorDTO" resultType="com.doumee.dao.business.web.request.SitesMonitorDTO">
        SELECT
            sites.id,
            sites.name as name,
            sites.code as code,
            count(l.id) as lid,
            count(l.bike_code ) as lbikeCount
        from
            sites sites
            LEFT JOIN locks l on sites.id = l.site_id
        <where>
            sites.isdeleted = 0
            <if test="code != null and code != ''">
                and sites.code like LIKE '%'||#{code}||'%'
            </if>
            <if test="name != null and name != ''">
                and sites.name like LIKE '%'||#{name}||'%'
            </if>
        </where>
        GROUP BY sites.id
    </select>
    <select id="getSitesMonitorBikeDTO" resultType="com.doumee.dao.business.web.request.SitesMonitorBikeDTO">
        SELECT
            sites.id,
            sites.name as name,
            sites.code as code,
            l.name as locksName,
            l.bike_code as bike_code,
            bp.name as bikeType
        from
            sites sites
        LEFT JOIN locks l on sites.id = l.site_id
        LEFT JOIN base_param bp on bp.id = l.param_id
        <where>
            sites.isdeleted = 0
            <if test="code != null and code != ''">
                and sites.code like LIKE '%'||#{code}||'%'
            </if>
            <if test="name != null and name != ''">
                and sites.name like LIKE '%'||#{name}||'%'
            </if>
            <if test="lockCode != null and lockCode != ''">
                and l.code like LIKE '%'||#{lockCode}||'%'
            </if>
            <if test="hasBike != null and hasBike != false">
                l.bike_code isnull
            </if>
            <if test="hasBike != null and hasBike != true">
                l.bike_code notnull
            </if>
        </where>
    </select>
</mapper>
server/web/src/main/java/com/doumee/api/web/BusinessApi.java
@@ -135,7 +135,7 @@
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse transactionsPage (@RequestBody RepairRequest repairRequest) {
    public ApiResponse transactionsPage (@RequestBody RepairRequest repairRequest) throws Exception{
        repairRequest.setMemberId(getMemberId());
        bikeRepairService.saveRepair(repairRequest);
        return ApiResponse.success("操作成功");