rk
2026-01-28 96fb28f4813edd207161769f03967b37d02f0207
bug 修复
已添加6个文件
已删除16个文件
已修改7个文件
1771 ■■■■■ 文件已修改
server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/MemberController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/pom.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/api/common/PublicCloudController.java 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/api/common/PublicController.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUploadMediaResponse.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-dev.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-pro.yml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-test.yml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java
@@ -22,7 +22,7 @@
 * @author doumee
 * @date 2026-01-27 16:02:37
 */
@Api(tags = "tableName接口")
@Api(tags = "分类信息表接口")
@RestController
@RequestMapping("/business/importRecord")
public class ImportRecordController extends BaseController {
server/admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -22,7 +22,7 @@
 * @author doumee
 * @date 2026-01-27 16:02:37
 */
@Api(tags = "tableName接口")
@Api(tags = "会员信息表接口")
@RestController
@RequestMapping("/business/member")
public class MemberController extends BaseController {
server/services/pom.xml
@@ -10,6 +10,16 @@
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>com.tianyiyun</groupId>
      <artifactId>zob</artifactId>
      <version>1.0</version>
      <scope>system</scope>
      <!--本地的jacob.jar的路径-->
      <systemPath>${project.basedir}/lib/zos-sdk.jar</systemPath>
    </dependency>
  </dependencies>
  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/api/common/PublicController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
package com.doumee.api.common;
import com.alibaba.fastjson.JSONObject;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.core.utils.tyyun.TyyZosUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
/**
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
@Api(tags = "公共接口")
@Trace(exclude = true)
@RestController
@RequestMapping("/public")
@Slf4j
public class PublicController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    public static FtpUtil ftp  = null;
    @ApiOperation(value = "上传", notes = "上传", httpMethod = "POST", position = 6)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "folder", value = "文件夹", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
    })
    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
    public void uploadMobile(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        upload(multipartRequest, response, folder + "/",
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.BUCKETNAME).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_ID).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_KEY).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ENDPOINT).getCode());
    }
    public void upload(HttpServletRequest request, HttpServletResponse response, String folder, String bucketName,
                       String access_id, String access_key, String resourcePath, String endpoint) throws Exception {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        Map<String, Object> context = new HashMap<>();
        CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
        if (multipartResovler.isMultipart(request)) {
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            Iterator<String> it = multipartRequest.getFileNames();
            while (it.hasNext()) {
                MultipartFile file = multipartRequest.getFile((String) it.next());// file
                // multipartRequest.getFile((String)
                // it.next());
                if (file != null) {
                    // 1、上传到服务器临时文件夹
                    String uploadFileName = file.getOriginalFilename();
                    String originname = uploadFileName;
                    if (originname.lastIndexOf("/") >= 0) {
                        originname = originname.substring(originname.lastIndexOf("/") + 1);
                    }
                    String nfix = "";// åŽç¼€å
                    if (StringUtils.isNotBlank(uploadFileName)) {
                        nfix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
                    }
                    if (StringUtils.equalsIgnoreCase(nfix, ".exe")) {
                        context.put("code", 4000);
                        context.put("message", "对不起,文件格式\".exe\"上传有误!");
                        return;
                    }
                    if (StringUtils.equalsIgnoreCase(nfix, ".dll")) {
                        context.put("code", 4000);
                        context.put("message", "对不起,文件格式\".dll\"上传有误!");
                        return;
                    }
                    if (StringUtils.equalsIgnoreCase(nfix, ".so")) {
                        context.put("code", 4000);
                        context.put("message", "对不起,文件格式\".so\"上传有误!");
                        return;
                    }
                    String nowDate = DateUtil.getNowShortDate();// å½“前时间(年月日)
                    String fileName = UUID.randomUUID().toString() + nfix;
                    String tempFileName = nowDate + "/" + fileName;
                    String key = folder + tempFileName;// æ–‡ä»¶å
                    TyyZosUtil obs = new TyyZosUtil(endpoint,access_id, access_key);
                    if (obs.uploadInputstreamObject(file.getInputStream(),bucketName, key)) {
                        // ç§»åŠ¨æˆåŠŸ,返回文件名
                        // sendSuccessMessage(response, resourcePath+key);
                        context.put("success", true);
                        context.put("code", 200);
                        context.put("errno",0);
                        JSONObject fileJSON = new JSONObject();
                        fileJSON.put("url", resourcePath + key);
                        fileJSON.put("imgaddr", tempFileName);
                        fileJSON.put("imgname", fileName);
                        fileJSON.put("originname", originname);
                        context.put("data",fileJSON);
                        context.put("message","请求成功");
                        writerJson(response, context);
                        return;
                    } else {
                        // ç§»åŠ¨å¤±è´¥
                        context.put("code", 0);
                        context.put("message", "上传失败");
                        writerJson(response, context);
                        return;
                    }
                }
            }
        }
        context.put("code", 0);
        context.put("message", "上传失败");
        context.put("errno",0);
        writerJson(response, context);
        return;
    }
    public static void writerJson(HttpServletResponse response, Object object) {
        response.setContentType("application/json");
        writer(response, JSONObject.toJSONString(object));
    }
    private static void writer(HttpServletResponse response, String str) {
        try {
            StringBuffer result = new StringBuffer();
            //设置页面不缓存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = null;
            out = response.getWriter();
            out.print(str);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -57,6 +57,14 @@
    public static final String AUTO_DISPATCH_DISTANCE ="AUTO_DISPATCH_DISTANCE" ;
    public static final String AUTO_CONFIRM ="AUTO_CONFIRM" ;
    public static final String AUTO_CANCEL_WAIT_PAY ="AUTO_CANCEL_WAIT_PAY" ;
    public static final String ACCESS_ID="ACCESS_ID";
    public static final String BUCKETNAME = "BUCKETNAME";
    public static final String ACCESS_KEY = "ACCESS_KEY";
    public static final String ENDPOINT = "ENDPOINT";
    public static final String UTF = "UTF-8";
    public static final String QYWX = "QYWX";
    public static final  Integer ONE = 1;
@@ -73,6 +81,7 @@
    public static final String ZBOM_PARAM ="ZBOM_PARAM" ;
    public static final String ZBOM_UK_ERROR_URL ="ZBOM_UK_ERROR_URL" ;
    public static final String ZBOM_TICKET_LOGIN_URL ="ZBOM_TICKET_LOGIN_URL" ;
    public static final String OBJCET_STORAGE = "OBJCET_STORAGE";
    public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
    public static  boolean DEALING_COMPANY_SYNC = false ;
    public static  boolean DEALING_MEMBER_SYNC = false ;
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUploadMediaResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
package com.doumee.core.utils.tyyun;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.URL;
@Slf4j
public class TyyZosUtil {
    private AmazonS3 client;
    // public static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
    public TyyZosUtil(String END_POINT, String ACCESS_KEY, String SECRET_KEY) {
        try {
            AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY,SECRET_KEY);
            ClientConfiguration awsClientConfig = new ClientConfiguration();
            awsClientConfig.setSignerOverride("AWSS3V4SignerType");
            awsClientConfig.setProtocol(Protocol.HTTP);
            client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new
                            AWSStaticCredentialsProvider(credentials))
                    .withClientConfiguration(awsClientConfig)
                    .withEndpointConfiguration(new
                            AwsClientBuilder.EndpointConfiguration(END_POINT, ""))
                    .disableChunkedEncoding()
                    .enablePathStyleAccess()
                    .build();
        }catch (Exception e){
                log.error("对象存储====================连接天翼云ZOS失败"+e.getMessage());
        }
    }
    /**
     * ä¸Šä¼ æ–‡ä»¶
     *
     * @param bucketName äº‘端存放bucket名称
     * @param key        é‡æ–°å‘½åçš„æ–‡ä»¶å
     * @param filepath   å°†è¦ä¸Šä¼ çš„æ–‡ä»¶åç§°
     * @throws FileNotFoundException
     */
    public void uploadObject(String bucketName, String key, String filepath,
                             String mime){
        try {
            File file= new File(filepath);
            PutObjectRequest request = new PutObjectRequest(bucketName, key, file);
            PutObjectResult result = client.putObject(request);
        }catch (Exception e){
            log.error("对象存储===================="+filepath+"文件上传失败"+e.getMessage());
        }finally {
            shutDown();
        }
    }
    /**
     * è®²key文件存储在本地filename目标文件中
     * @param bucketName
     * @param key
     * @param filename
     */
    public void getObject(String bucketName, String key, String filename ){
        try {
            GetObjectRequest request = new GetObjectRequest(bucketName, key);
            S3Object result = client.getObject(request);
            System.out.print("=====request success=====\n");
            try {
                InputStream in = result.getObjectContent();
                File outputFile = new File(filename);
                FileOutputStream outputStream = new
                        FileOutputStream(outputFile);
                byte[] read_buf = new byte[1024 * 1024];
                int read_len = 0;
                while ((read_len = in.read(read_buf)) > 0) {
                    outputStream.write(read_buf, 0, read_len);
                }
                in.close();
                outputStream.close();
            } catch (IOException e){
                e.printStackTrace();
            }
        }catch (Exception e){
            log.error("对象存储===================="+filename+"文件读取失败"+e.getMessage());
        }finally {
            shutDown();
        }
    }
    public void deleteObject(String bucketName, String key  ){
        try {
            DeleteObjectRequest request = new DeleteObjectRequest(bucketName, key);
            client.deleteObject(request);
            System.out.print("=====request deleteObject success=====");
        }catch (Exception e){
            log.error("对象存储===================="+key+"文件删除失败"+e.getMessage());
        }finally {
            shutDown();
        }
    }
    /**
     * å…³é—­
     *
     * @throws FileNotFoundException
     */
    public void shutDown() {
        if (client != null) {
            // å…³é—­client
            client.shutdown();
        }
    }
    public static void main(String[] args) {
        TyyZosUtil aLiYunUtil = new TyyZosUtil("", "uc4nnpsqep1i9fijqr37nokh",
                "/rp41xCx/XdGEVCptdH6v7xpc9w=");
        // aLiYunUtil.uploadObject("pongto", "work/li2.txt", "D://哈.txt",
        // ".html,.html text/html");D://装机软件/办公学习
        // aLiYunUtil.partUploadObject("pongto", "work/ps.exe",
        // "D://装机软件/办公学习/Adobe_Illustrator_CS6_XiaZaiBa.exe",
        // ".html,.html text/html");
        // aLiYunUtil.deleteBucket("pongto");
    }
    /**
     * ä¸Šä¼ ç½‘络文件
     *
     * @param bucketName äº‘端存放bucket名称
     * @param key        é‡æ–°å‘½åçš„æ–‡ä»¶å
     *                   å°†è¦ä¸Šä¼ çš„æ–‡ä»¶åç§°
     * @throws IOException
     */
    public boolean uploadOnlineObject(String url, String bucketName, String key )     {
        try {
            InputStream inputStream = new URL(url).openStream();
            if (inputStream != null) {
                ObjectMetadata metadata = new ObjectMetadata();
                PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream,metadata);
                PutObjectResult result = client.putObject(request);
            }else {
                log.error("对象存储===================="+url+"网络文件上传失败,网络文件读取失败");
            }
        }catch (Exception e){
            log.error("对象存储===================="+url+"网络文件上传失败"+e.getMessage());
        }finally {
            shutDown();
        }
        return false;
    }
    public boolean uploadInputstreamObject(InputStream inputStream, String bucketName, String key )     {
        try {
            if (inputStream != null) {
                ObjectMetadata metadata = new ObjectMetadata();
                metadata.setContentLength(inputStream.available());
                PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream,metadata);
                request.setCannedAcl(CannedAccessControlList.PublicRead);
                PutObjectResult result = client.putObject(request);
                return true;
            }
        }catch (Exception e){
            log.error("对象存储==================== æ–‡ä»¶ä¸Šä¼ å¤±è´¥"+e.getMessage());
        }finally {
            shutDown();
        }
        return false;
    }
}
server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.InterfaceLog;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface InterfaceLogMapper extends BaseMapper<InterfaceLog> {
}
server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * ä¸‰æ–¹å¹³å°æŽ¥å£äº¤äº’记录
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Data
@ApiModel("三方平台接口交互记录")
@TableName("`interface_log`")
public class InterfaceLog{
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "类型 0调用 1推送接受", example = "1")
    @ExcelColumn(name="类型 0调用 1推送接受")
    private Integer type;
    @ApiModelProperty(value = "接口名称")
    @ExcelColumn(name="接口名称")
    private String name;
    @ApiModelProperty(value = "地址信息")
    @ExcelColumn(name="地址信息")
    private String url;
    @ApiModelProperty(value = "请求参数")
    @ExcelColumn(name="请求参数")
    private String request;
    @ApiModelProperty(value = "响应参数")
    @ExcelColumn(name="响应参数")
    private String repose;
    @ApiModelProperty(value = "调用结果 0成功 1失败", example = "1")
    @ExcelColumn(name="调用结果 0成功 1失败")
    private Integer success;
    @ApiModelProperty(value = "平台 0海康安防平台 1ERP系统", example = "1")
    @ExcelColumn(name="平台 0海康安防平台 1ERP系统")
    private Integer plat;
    @ApiModelProperty(value = "关联对象类型  0组织 1人员 2门禁事件 3设备", example = "1")
    @ExcelColumn(name="关联对象类型  0组织 1人员 2门禁事件 3设备")
    private Integer objType;
    @ApiModelProperty(value = "关联对象编码(多个用英文逗号隔开)")
    @ExcelColumn(name="关联对象编码(多个用英文逗号隔开)")
    private String objId;
    @ApiModelProperty(value = "开始时间")
    @TableField(exist = false)
    private Date startDate;
    @ApiModelProperty(value = "结束时间")
    @TableField(exist = false)
    private Date endDate;
}
server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.InterfaceLog;
import java.util.List;
/**
 * ä¸‰æ–¹å¹³å°æŽ¥å£äº¤äº’记录Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface InterfaceLogService {
    /**
     * åˆ›å»º
     *
     * @param interfaceLog å®žä½“对象
     * @return Integer
     */
    Integer create(InterfaceLog interfaceLog);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * åˆ é™¤
     *
     * @param interfaceLog å®žä½“对象
     */
    void delete(InterfaceLog interfaceLog);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param interfaceLog å®žä½“对象
     */
    void updateById(InterfaceLog interfaceLog);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
     * @param interfaceLogs å®žä½“集
     */
    void updateByIdInBatch(List<InterfaceLog> interfaceLogs);
    /**
     * ä¸»é”®æŸ¥è¯¢
     *
     * @param id ä¸»é”®
     * @return InterfaceLog
     */
    InterfaceLog findById(Integer id);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
     * @param interfaceLog å®žä½“对象
     * @return InterfaceLog
     */
    InterfaceLog findOne(InterfaceLog interfaceLog);
    void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone,int type);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     *
     * @param interfaceLog å®žä½“对象
     * @return List<InterfaceLog>
     */
    List<InterfaceLog> findList(InterfaceLog interfaceLog);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<InterfaceLog>
     */
    PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
     * @param interfaceLog å®žä½“对象
     * @return long
     */
    long count(InterfaceLog interfaceLog);
    void clearThreeMonthLog();
}
server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
package com.doumee.service.business.impl;
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 com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.InterfaceLogMapper;
import com.doumee.dao.business.model.InterfaceLog;
import com.doumee.service.business.InterfaceLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
/**
 * ä¸‰æ–¹å¹³å°æŽ¥å£äº¤äº’记录Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
public class InterfaceLogServiceImpl implements InterfaceLogService {
    @Autowired
    private InterfaceLogMapper interfaceLogMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(InterfaceLog interfaceLog) {
        interfaceLogMapper.insert(interfaceLog);
        return interfaceLog.getId();
    }
    @Override
    public void deleteById(Integer id) {
        interfaceLogMapper.deleteById(id);
    }
    @Override
    public void delete(InterfaceLog interfaceLog) {
        UpdateWrapper<InterfaceLog> deleteWrapper = new UpdateWrapper<>(interfaceLog);
        interfaceLogMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        interfaceLogMapper.deleteBatchIds(ids);
    }
    @Override
    public void updateById(InterfaceLog interfaceLog) {
        interfaceLogMapper.updateById(interfaceLog);
    }
    @Override
    public void updateByIdInBatch(List<InterfaceLog> interfaceLogs) {
        if (CollectionUtils.isEmpty(interfaceLogs)) {
            return;
        }
        for (InterfaceLog interfaceLog: interfaceLogs) {
            this.updateById(interfaceLog);
        }
    }
    @Override
    public InterfaceLog findById(Integer id) {
        return interfaceLogMapper.selectById(id);
    }
    @Override
    public InterfaceLog findOne(InterfaceLog interfaceLog) {
        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
        return interfaceLogMapper.selectOne(wrapper);
    }
    @Override
    public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone,int type){
        if(interfaceLogMapper ==null){
            return;
        }
        InterfaceLog log = new InterfaceLog();
        log.setCreateDate(new Date());
        log.setUrl(url);
        log.setEditDate(log.getCreateDate());
        log.setPlat(Constants.ZERO);
        log.setName(name);
        log.setIsdeleted(Constants.ZERO);
        log.setRequest(param);
        log.setType(type);
        log.setSuccess(success);
        log.setRepose(respone);
        interfaceLogMapper.insert(log);
    }
    @Override
    public List<InterfaceLog> findList(InterfaceLog interfaceLog) {
        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
        return interfaceLogMapper.selectList(wrapper);
    }
    @Override
    public PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap) {
        IPage<InterfaceLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<InterfaceLog> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(InterfaceLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(InterfaceLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(InterfaceLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getStartDate() != null) {
            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, pageWrap.getModel().getStartDate());
        }
        if (pageWrap.getModel().getEndDate() != null) {
            queryWrapper.lambda().le(InterfaceLog::getCreateDate, pageWrap.getModel().getEndDate());
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getType, pageWrap.getModel().getType());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().like(InterfaceLog::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getUrl() != null) {
            queryWrapper.lambda().like(InterfaceLog::getUrl, pageWrap.getModel().getUrl());
        }
        if (pageWrap.getModel().getRequest() != null) {
            queryWrapper.lambda().like(InterfaceLog::getRequest, pageWrap.getModel().getRequest());
        }
        if (pageWrap.getModel().getRepose() != null) {
            queryWrapper.lambda().like(InterfaceLog::getRepose, pageWrap.getModel().getRepose());
        }
        if (pageWrap.getModel().getSuccess() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getSuccess, pageWrap.getModel().getSuccess());
        }
        if (pageWrap.getModel().getPlat() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getPlat, pageWrap.getModel().getPlat());
        }
        if (pageWrap.getModel().getObjType() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getObjType, pageWrap.getModel().getObjType());
        }
        if (pageWrap.getModel().getObjId() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getObjId, pageWrap.getModel().getObjId());
        }
        queryWrapper.lambda().orderByDesc(InterfaceLog::getCreateDate);
        return PageData.from(interfaceLogMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(InterfaceLog interfaceLog) {
        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
        return interfaceLogMapper.selectCount(wrapper);
    }
    @Override
    public void clearThreeMonthLog() {
         int days =15;
         try {
//             days = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.HK_LOG_DEL_DAYS_LIMIT).getCode());
         }catch (Exception e){}
          interfaceLogMapper.delete(new UpdateWrapper<InterfaceLog>().lambda()
                  .apply("to_days(create_date)+"+days+" < to_days(now())") );
    }
}
server/services/src/main/resources/application-dev.yml
@@ -69,9 +69,6 @@
    username: admin
    password: 111111
qiwei:
  serviceurl: https://qyapi.weixin.qq.com
aes:
  encrypt:
    open: true # æ˜¯å¦å¼€å¯åР坆 true  or  false
server/services/src/main/resources/application-pro.yml
@@ -49,49 +49,8 @@
    enable: true
    username: admin
    password: doumee@168
########################微信支付相关配置########################
wx:
  pay:
    #服务商---------start------- å‚数详解地址 https://pay.weixin.qq.com/doc/v3/partner/4013080340
    mchId: 1700071922    #服务商在微信支付侧的唯一身份标识
    appId: wx6cc1087ca79db7f6    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #商户/平台支付公钥id
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxPayNotify
    refundNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxRefundNotify
    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #商户支付公钥
    #服务商-------------end---
    #商户信息
    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #商户/平台支付公钥id
    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    existsSub: 1
    appSecret:
    #子商户------------start----
    subMchId: 1723326069    #子商户号
    subAppId: wx332441ae5b12be7d #小程序id
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: jinkuai
upload:
  type: blob
qiwei:
  serviceurl: https://wecom-qyapi.unilever-china.com/
project:
server/services/src/main/resources/application-test.yml
@@ -69,51 +69,10 @@
    username: admin
    password: 111111
########################微信支付相关配置########################
########################微信支付相关配置########################
wx:
  pay:
    #服务商---------start------- å‚数详解地址 https://pay.weixin.qq.com/doc/v3/partner/4013080340
    mchId: 1700071922    #服务商在微信支付侧的唯一身份标识
    appId: wx6cc1087ca79db7f6    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #商户/平台支付公钥id
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://test.doumee.cn/zbom_dianjiang_admin/web/wxPayNotify
    refundNotifyUrl: https://test.doumee.cn/zbom_dianjiang_admin/web/wxRefundNotify
    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #商户支付公钥
    #服务商-------------end---
    #商户信息
    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #商户/平台支付公钥id
    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    existsSub: 1
    appSecret:
    #子商户------------start----
    subMchId: 1723326069    #子商户号
    subAppId: wx332441ae5b12be7d #小程序id
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: jinkuai
upload:
  type: blob
qiwei:
  serviceurl: https://qyapi.weixin.qq.com
project:
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development