From 2d95605efd098e1b1c80f80021b259314b10f204 Mon Sep 17 00:00:00 2001
From: k94314517 <8417338+k94314517@user.noreply.gitee.com>
Date: 星期五, 01 三月 2024 10:41:14 +0800
Subject: [PATCH] ERP接口

---
 server/dmvisit_service/src/main/resources/application-testHS.yml                                   |    2 
 server/dmvisit_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java             |    8 
 server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java |   16 ++
 server/dmvisit_admin/src/main/java/com/doumee/api/common/PublicController.java                     |  151 +++++++++++++-----
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java       |  113 ++++++++++++-
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java  |   11 
 server/dmvisit_admin/src/main/resources/application.yml                                            |    2 
 server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java                         |    1 
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java       |    5 
 server/openapi/src/main/java/com/doumee/api/web/BizResourceController.java                         |   16 ++
 server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java                          |   11 
 server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigDTO.java              |    2 
 server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java                     |    2 
 server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java                |    3 
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java      |    3 
 server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpWithVisitDTO.java               |   47 +++++
 server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpVisitDTO.java                   |   74 +++++++++
 17 files changed, 394 insertions(+), 73 deletions(-)

diff --git a/server/dmvisit_admin/src/main/java/com/doumee/api/common/PublicController.java b/server/dmvisit_admin/src/main/java/com/doumee/api/common/PublicController.java
index d69c175..7801a67 100644
--- a/server/dmvisit_admin/src/main/java/com/doumee/api/common/PublicController.java
+++ b/server/dmvisit_admin/src/main/java/com/doumee/api/common/PublicController.java
@@ -6,6 +6,7 @@
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.FtpUtil;
 import com.doumee.core.utils.aliyun.ALiYunUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -14,20 +15,21 @@
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.PrintWriter;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
 
 /**
  * @author Eva.Caesar Liu
@@ -45,52 +47,113 @@
     private SystemDictDataBiz systemDictDataBiz;
 
 
-
-    @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.OSS,Constants.BUCKETNAME).getCode(),
-            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
-            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
-            systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
-            systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
-    }
+//    @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.OSS,Constants.BUCKETNAME).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
+//    }
+//
+//
+//    @ApiOperation(value = "涓婁紶鍥剧墖", notes = "涓婁紶鍥剧墖", httpMethod = "POST", position = 6)
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+//    })
+//    @PostMapping(value = "/uploadPicture", headers = "content-type=multipart/form-data")
+//    public void uploadPicture(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
+//        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+//        Iterator<String> fileNames = multipartRequest.getFileNames();
+//        Map<String, Object> context = new HashMap<>();
+//        while (fileNames.hasNext()){
+//            MultipartFile file = multipartRequest.getFile(fileNames.next());
+//            String fileName = file.getOriginalFilename();
+//            String suffix = fileName.substring(fileName.lastIndexOf("."));
+//            if ( !StringUtils.equalsIgnoreCase(suffix, ".jpg") || !StringUtils.equalsIgnoreCase(suffix, ".png")) {
+//                context.put("code", 0);
+//                context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡涓婁紶鏈夎锛�");
+//            }
+//        }
+//        upload(multipartRequest, response, folder + "/",
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
+//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
+//    }
 
 
-    @ApiOperation(value = "涓婁紶鍥剧墖", notes = "涓婁紶鍥剧墖", httpMethod = "POST", position = 6)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "folder", value = "banner/ 锛堣疆鎾級goods/ (鍟嗗搧)member/ (鐢ㄦ埛锛塻hop/ 锛堝簵閾猴級system/ (绯荤粺閰嶇疆绛夛級activity/ 锛堝彂鐜帮級commet/ (璇勮锛塷ther/ 锛堝叾浠栵級aftersale/锛堝敭鍚庯級", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
-    })
-    @PostMapping(value = "/uploadPicture", headers = "content-type=multipart/form-data")
-    public void uploadPicture(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
-        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-        Iterator<String> fileNames = multipartRequest.getFileNames();
+
+
+    public static FtpUtil ftp  = null;
+
+    @ApiOperation(value = "涓婁紶鏂囦欢鍒癋TP")
+    @RequestMapping(method= RequestMethod.POST,value="upload")
+    @ResponseBody
+    public void upload(HttpServletRequest request, HttpServletResponse response, String folder) throws Exception {
+//        folder = systemDictDataBiz.queryByCode(Constants.FTP,folder).getCode();
+        String prefixPath = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode();
+        InputStream is = null;
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("text/html;charset=UTF-8");
         Map<String, Object> context = new HashMap<>();
-        while (fileNames.hasNext()){
-            MultipartFile file = multipartRequest.getFile(fileNames.next());
-            String fileName = file.getOriginalFilename();
-            String suffix = fileName.substring(fileName.lastIndexOf("."));
-            if ( !StringUtils.equalsIgnoreCase(suffix, ".jpg") || !StringUtils.equalsIgnoreCase(suffix, ".png")) {
-                context.put("code", 0);
-                context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡涓婁紶鏈夎锛�");
+        try {
+            if(ftp == null){
+                ftp = new FtpUtil(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode(),
+                        Integer.parseInt(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PORT).getCode()),
+                        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_USERNAME).getCode(),
+                        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PWD).getCode());
+            }else{
+                ftp.connect();
             }
+
+            CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
+            if (multipartResovler.isMultipart(request)) {
+                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+                Iterator<String> it = multipartRequest.getFileNames();
+                while (it.hasNext()) {
+                    MultipartFile file = multipartRequest.getFile(it.next());
+                    is = file.getInputStream();
+                    String date = DateUtil.getNowShortDate();
+                    String fName =  date+"/"+ UUID.randomUUID()+".jpg";
+                    String fileName = folder+fName;
+                    boolean r = ftp.uploadInputstream(is,fileName);
+                    if(r){
+                        context.put("success", true);
+                        context.put("code", 200);
+                        context.put("errno",0);
+                        JSONObject fileJSON = new JSONObject();
+                        fileJSON.put("halfPath", fName);
+                        fileJSON.put("prefixPath", prefixPath);
+                        fileJSON.put("folder", folder);
+                        context.put("data",fileJSON);
+                        context.put("message","璇锋眰鎴愬姛");
+                        writerJson(response, context);
+                        return;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("銆愪笂浼燜TP澶辫触銆�======================"+e.getMessage());
         }
-        upload(multipartRequest, response, folder + "/",
-                systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(),
-                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
-                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode(),
-                systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode(),
-                systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode());
+        context.put("code", 0);
+        context.put("message", "涓婁紶澶辫触");
+        context.put("errno",0);
+        writerJson(response, context);
+        return;
     }
+
 
 
     public void upload(HttpServletRequest request, HttpServletResponse response, String folder, String bucketName,
-        String access_id, String access_key, String resourcePath, String endpoint) throws Exception {
+                       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<>();
@@ -182,6 +245,8 @@
             e.printStackTrace();
         }
     }
+
+
 
 
     public void uploadFileLocal(HttpServletRequest request, String folder, HttpServletResponse response, String rootPath,String dir) throws Exception {
@@ -308,6 +373,4 @@
         writerJson(response, context);
         return;
     }
-
-
 }
diff --git a/server/dmvisit_admin/src/main/resources/application.yml b/server/dmvisit_admin/src/main/resources/application.yml
index f31fd8b..a91f8c2 100644
--- a/server/dmvisit_admin/src/main/resources/application.yml
+++ b/server/dmvisit_admin/src/main/resources/application.yml
@@ -67,7 +67,7 @@
   compression:
     enabled: true
     mime-types: application/json
-  port: 10033
+  port: 10028
   tomcat:
     max-swallow-size: -1
   servlet:
diff --git a/server/dmvisit_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java b/server/dmvisit_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
index c224704..980f2c7 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.biz.system.SystemUserBiz;
 import com.doumee.core.annotation.excel.ExcelImporter;
 import com.doumee.core.exception.BusinessException;
@@ -46,6 +47,8 @@
     @Autowired
     private SystemDepartmentService systemDepartmentService;
 
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
 
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     @Override
@@ -111,13 +114,12 @@
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public void create(CreateSystemUserDTO systemUser) {
         // 楠岃瘉鐢ㄦ埛鍚�
-        systemUser.setUsername(systemUser.getMobile());
         SystemUser queryUserDto = new SystemUser();
         queryUserDto.setUsername(systemUser.getUsername());
         queryUserDto.setDeleted(Boolean.FALSE);
         SystemUser user = systemUserService.findOne(queryUserDto);
         if (user != null) {
-            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鐢佃瘽銆�"+systemUser.getUsername()+"銆戜笉鑳介噸澶�");
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鐢ㄦ埛鍚嶃��"+systemUser.getUsername()+"銆戜笉鑳介噸澶�");
         }
         // 楠岃瘉宸ュ彿
        if (StringUtils.isNotBlank(systemUser.getEmpNo())) {
@@ -132,7 +134,7 @@
         // 鐢熸垚瀵嗙爜鐩�
         String salt = RandomStringUtils.randomAlphabetic(6);
         // 鐢熸垚瀵嗙爜
-        systemUser.setPassword(Utils.Secure.encryptPassword(systemUser.getMobile().substring(5), salt));
+        systemUser.setPassword(Utils.Secure.encryptPassword(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.INITIAL_PASSWORD).getCode(), salt));
         systemUser.setSalt(salt);
 
         // 鍒涘缓鐢ㄦ埛璁板綍
diff --git a/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java b/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
index 6cb05a2..bc5f931 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -45,9 +45,12 @@
     public static final String EDS_PWD ="!@#$%^&QWERTY" ;
     public static final String ROOT_PATH = "";
     public static final String FILE_DIR = "";
+    public static final String INITIAL_PASSWORD = "INITIAL_PASSWORD";
+
     // 璁垮鏉ヨ閰嶇疆
     public static final String VISIT_CONFIG = "VISIT_CONFIG";
     public static final String MEMBER_IMG = "MEMBER_IMG";
+    public static final String VISIT_NOTICE = "VISIT_NOTICE";
     //鍋ュ悍璇侀厤缃�
     public static final String LW_HEALTH_CARD = "LW_HEALTH_CARD";
     public static final String HEALTH_CARD = "HEALTH_CARD";
@@ -388,7 +391,7 @@
          * 灏忓瀷鏂拌兘婧愯溅
          * 1銆佸尮閰嶆柊鑳芥簮杞﹁締6浣嶈溅鐗�
          */
-        SMALL_NEW_ENERGY_VEHICLE(5, "灏忓瀷鏂拌兘婧愯溅鐗�", Pattern.compile("^[浜触鍐�鏅嬭挋杈藉悏榛戞勃鑻忔禉鐨栭椊璧i瞾璞剛婀樼菠妗傜惣宸濊吹浜戞笣钘忛檿鐢橀潚瀹佹柊]{1}[A-Z]{1}[DF]{1}[0-9a-zA-Z]{5}$")),
+        SMALL_NEW_ENERGY_VEHICLE(5, "灏忓瀷鏂拌兘婧愯溅鐗�", Pattern.compile("^[浜触鍐�鏅嬭挋杈藉悏榛戞勃鑻忔禉鐨栭椊璧i瞾璞剛婀樼菠妗傜惣宸濊吹浜戞笣钘忛檿鐢橀潚瀹佹柊]{1}[A-Z]{1}[A-Z]{1}[0-9a-zA-Z]{5}$")),
         /**
          * 澶у瀷鏂拌兘婧愯溅
          */
@@ -415,10 +418,10 @@
     }
 
     public static void main(String[] args) {
-        System.out.println(Constants.getVehiclePlateNo("婀楤D40D17").getDescription());
+        System.out.println(Constants.getVehiclePlateNo("鐨朅A10991").getDescription());
 
-        System.out.println(Constants.getVehiclePlateNo("婀楤140D17").getDescription());
-        System.out.println(Constants.getVehiclePlateNo("瀹緼P0637").getDescription());
+//        System.out.println(Constants.getVehiclePlateNo("婀楤140D17").getDescription());
+//        System.out.println(Constants.getVehiclePlateNo("瀹緼P0637").getDescription());
     }
 
 
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigDTO.java b/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigDTO.java
index 303ead0..f26310a 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigDTO.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigDTO.java
@@ -36,4 +36,6 @@
     @ApiModelProperty(value = "绛旈璇存槑")
     private String description;
 
+    @ApiModelProperty(value = "鍏ュ巶椤荤煡")
+    private String visitNotice;
 }
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java b/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
index 7b6ebfe..9068475 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -236,6 +236,8 @@
     @ExcelColumn(name="鍒涘缓浜虹紪鐮侊紙鍏宠仈member琛�)")
     private Integer createMemberId;
 
+    @ApiModelProperty(value = "鏉ユ簮绫诲瀷锛�0=鏈郴缁燂紱1=ERP", example = "1")
+    private Integer sourceType;
 
     @ApiModelProperty(value = "鏅�氳瀹㈢敵璇烽殢璁夸汉鍛�")
     @TableField(exist = false)
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpVisitDTO.java b/server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpVisitDTO.java
new file mode 100644
index 0000000..1eebcab
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpVisitDTO.java
@@ -0,0 +1,74 @@
+package com.doumee.dao.web.reqeust;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.haikang.model.param.BaseRequst;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/2/29 14:26
+ */
+@Data
+@ApiModel("ERP璁垮鐢宠涓荤被")
+public class ErpVisitDTO extends BaseRequst {
+
+    @ApiModelProperty(value = "ERP璁板綍涓婚敭")
+    private String erpId;
+
+    @ApiModelProperty(value = "璁垮濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収")
+    private Integer idcardType;
+
+    @ApiModelProperty(value = "璇佷欢鍙�")
+    private String idcardNo;
+
+    @ApiModelProperty(value = "浜鸿劯鐓х墖")
+    private String faceImg;
+
+    @ApiModelProperty(value = "鍋ュ悍璇�")
+    private String imgurl;
+
+    @ApiModelProperty(value = "鍏徃鍚嶇О")
+    private String companyName;
+
+    @ApiModelProperty(value = "琚浜� erp 涓婚敭 ")
+    private String receptMemberId;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "闂ㄧ鏈夋晥鏈熷紑濮�")
+    private Date starttime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "闂ㄧ鏈夋晥鏈熸埅姝�")
+    private Date endtime;
+
+    @ApiModelProperty(value = "闂ㄧ缂栫爜  娴峰悍绯荤粺涓婚敭 锛屽涓敤鑻辨枃閫楀彿闅斿紑")
+    private String doors;
+
+    @ApiModelProperty(value = "鏉ヨ浜嬬敱")
+    private String reason;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    private String carNos;
+
+    @ApiModelProperty(value = "闅忚浜哄憳淇℃伅")
+    List<ErpWithVisitDTO> erpWithVisitDTOList;
+
+
+}
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpWithVisitDTO.java b/server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpWithVisitDTO.java
new file mode 100644
index 0000000..dea3b32
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ErpWithVisitDTO.java
@@ -0,0 +1,47 @@
+package com.doumee.dao.web.reqeust;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/2/29 14:26
+ */
+@Data
+@ApiModel("ERP璁垮鐢宠 闅忚浜轰俊鎭�")
+public class ErpWithVisitDTO {
+
+    @ApiModelProperty(value = "璁垮濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収")
+    private Integer idcardType;
+
+    @ApiModelProperty(value = "璇佷欢鍙�")
+    private String idcardNo;
+
+    @ApiModelProperty(value = "浜鸿劯鐓х墖")
+    private String faceImg;
+
+    @ApiModelProperty(value = "鍋ュ悍璇�")
+    private String imgurl;
+
+    @ApiModelProperty(value = "鍏徃鍚嶇О")
+    private String companyName;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    private String carNos;
+
+    
+
+}
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
index dd95a92..3d5d37d 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
@@ -4,6 +4,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Visits;
 import com.doumee.dao.web.reqeust.AuditApproveDTO;
+import com.doumee.dao.web.reqeust.ErpVisitDTO;
 import com.doumee.dao.web.reqeust.VisitRecordDTO;
 import com.doumee.dao.web.response.VisitDetailVO;
 import com.doumee.dao.web.response.VisitRecordVO;
@@ -27,6 +28,8 @@
 
     Integer createFk(Visits visits);
 
+    void createFKForErp(ErpVisitDTO erpVisitDTO);
+
     /**
      * 涓婚敭鍒犻櫎
      *
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java
index 1fba2a7..1fd3fbf 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java
@@ -118,9 +118,10 @@
         queryWrapper
                /* .eq(Empower::getIsdeleted, Constants.ZERO)*/
                 .and(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()), ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
-                .or().like(Member::getPhone,pageWrap.getModel().getCompanyName()));
+                .or().like(Member::getPhone,pageWrap.getModel().getMemberName()));
         queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getSendStatus()),Empower::getSendStatus,pageWrap.getModel().getSendStatus());
         queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyId()),Company::getId,pageWrap.getModel().getCompanyId());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName());
         queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getSendStartDate()),Empower::getSendDate,pageWrap.getModel().getSendStartDate());
         queryWrapper.le(Objects.nonNull(pageWrap.getModel().getSendEndDate()),Empower::getSendDate,pageWrap.getModel().getSendEndDate());
 
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index f9a1579..5f44246 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -1031,7 +1031,10 @@
                 .exists(" select 1 from park_book p where p.origin = 0 and p.car_code = retention.car_no and p.ISDELETED = 0  ")
         ));
         stagingHeadVO.setVisitorCarCount(stagingHeadVO.getPresenceCarCount() - stagingHeadVO.getLongCarCount());
-        stagingHeadVO.setSupplierCount(companyMapper.selectCount(new QueryWrapper<Company>().lambda().eq(Company::getIsdeleted,Constants.ZERO)));
+        stagingHeadVO.setSupplierCount(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
+                .eq(Company::getIsdeleted,Constants.ZERO)
+                .eq(Company::getType,Constants.ZERO)
+        ));
         return stagingHeadVO;
     }
 
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
index b98b25a..7dd65c1 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -34,6 +34,8 @@
 import com.doumee.dao.business.join.VisitsJoinMapper;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.web.reqeust.AuditApproveDTO;
+import com.doumee.dao.web.reqeust.ErpVisitDTO;
+import com.doumee.dao.web.reqeust.ErpWithVisitDTO;
 import com.doumee.dao.web.reqeust.VisitRecordDTO;
 import com.doumee.dao.web.response.InternalHomeVO;
 import com.doumee.dao.web.response.VisitDetailVO;
@@ -94,11 +96,92 @@
     @Autowired
     private WxPlatNotice wxPlatNotice;
 
+    @Autowired
+    private InterfaceLogService interfaceLogService;
+
+
     @Override
     public Integer create(Visits visits) {
         visitsMapper.insert(visits);
         return visits.getId();
     }
+
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void createFKForErp(ErpVisitDTO erpVisitDTO){
+        try {
+
+            if (Objects.isNull(erpVisitDTO)
+                    || StringUtils.isBlank(erpVisitDTO.getName())
+                    || StringUtils.isBlank(erpVisitDTO.getPhone())
+                    || Objects.isNull(erpVisitDTO.getIdcardType())
+                    || StringUtils.isBlank(erpVisitDTO.getIdcardNo())
+                    || Objects.isNull(erpVisitDTO.getStarttime())
+                    || Objects.isNull(erpVisitDTO.getEndtime())
+                    || StringUtils.isBlank(erpVisitDTO.getFaceImg())
+                    || Objects.isNull(erpVisitDTO.getReceptMemberId())
+                    || Objects.isNull(erpVisitDTO.getErpId())
+            ) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝淇℃伅濉啓涓嶆纭紒");
+            }
+            if (erpVisitDTO.getEndtime().getTime() <= erpVisitDTO.getStarttime().getTime()) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝棰勭害缁撴潫鏃堕棿蹇呴』澶т簬寮�濮嬫椂闂达紒");
+            }
+            if (Constants.equalsInteger(Constants.ZERO, erpVisitDTO.getIdcardType()) && erpVisitDTO.getIdcardNo().length() != 18
+                //&&!IdcardUtil.isValidCard(visits.getIdcardNo())
+            ) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝韬唤璇佸彿鐮佹湁璇紝璇锋牳瀹炲悗閲嶈瘯锛�");
+            }
+
+            Visits visits = new Visits();
+            //鏍规嵁琚闂汉ERP涓婚敭鏌ヨ绯荤粺鍐呬汉鍛樹富閿俊鎭�
+            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                    .eq(Member::getIsdeleted, Constants.ZERO).eq(Member::getType, Constants.memberType.internal)
+                    .eq(Member::getErpId, erpVisitDTO.getReceptMemberId()).last("limit 1"));
+            if (Objects.isNull(member)) {
+                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏈煡璇㈠埌琚闂汉淇℃伅");
+            }
+            if (Objects.isNull(member.getCanVisit()) || member.getCanVisit().equals(Constants.ZERO)) {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠琚闂汉鏃犳硶琚闂�");
+            }
+            BeanUtils.copyProperties(erpVisitDTO, visits);
+            //璁剧疆鍐呴儴绯荤粺浜哄憳涓婚敭
+            visits.setReceptMemberId(member.getId());
+            visits.setSourceType(Constants.ONE);
+            List<ErpWithVisitDTO> erpWithVisitDTOList = erpVisitDTO.getErpWithVisitDTOList();
+            if (CollectionUtils.isNotEmpty(erpWithVisitDTOList)) {
+                List<Visits> visitsList = new ArrayList<>();
+                for (ErpWithVisitDTO erpWithVisitDTO : erpWithVisitDTOList) {
+                    Visits withVisits = new Visits();
+                    BeanUtils.copyProperties(erpWithVisitDTO, withVisits);
+                    visitsList.add(withVisits);
+                }
+                visits.setWithUserList(visitsList);
+            }
+            this.createFk(visits);
+        }catch (BusinessException e){
+            throw e;
+        }finally {
+            saveInterfaceLog(erpVisitDTO,"/visitBiz/resource/crateVisit",null,Constants.ZERO);
+        }
+    }
+
+    private void saveInterfaceLog(Object param, String path,String result,Integer type) {
+        InterfaceLog interfaceLog=new InterfaceLog();
+        interfaceLog.setType(type);
+        interfaceLog.setCreateDate(new Date());
+        interfaceLog.setIsdeleted(Constants.ZERO);
+        if(param!=null){
+            interfaceLog.setRequest(JSONObject.toJSONString(param));
+        }
+        interfaceLog.setPlat(Constants.ONE);
+        interfaceLog.setRepose(result);
+        interfaceLog.setName(path);
+        interfaceLog.setUrl(path);
+        interfaceLogService.create(interfaceLog);
+    }
+
 
     /**
      * 鏅�氳瀹㈢敵璇�
@@ -135,22 +218,27 @@
         initVisitInfo(visits,date);
         visitsMapper.insert(visits);
         //鍙戣捣ERP瀹℃壒鐢宠
-        String erpId = startSendErpCheck(visits,visitMember);
-        if(StringUtils.isNotBlank(erpId)){
-            visits.setErpId(erpId);
-            visits.setStatus(Constants.VisitStatus.submitCheck);
-            visitsMapper.updateById(visits);
+        if(visits.getSourceType().equals(Constants.ZERO)){
+            String erpId = startSendErpCheck(visits,visitMember);
+            if(StringUtils.isNotBlank(erpId)){
+                visits.setErpId(erpId);
+                visits.setStatus(Constants.VisitStatus.submitCheck);
+                visitsMapper.updateById(visits);
+            }else{
+                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鍙戣捣鎷滆瀹℃壒鐢宠澶辫触锛�");
+            }
+            //鍙戦�佸井淇″叕浼楀彿閫氱煡
+            wxPlatNotice.sendVisitAuditTemplateNotice(visits,
+                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
+                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
         }else{
-            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鍙戣捣鎷滆瀹℃壒鐢宠澶辫触锛�");
+            visits.setStatus(Constants.VisitStatus.pass);
+            visitsMapper.updateById(visits);
         }
         initWithVisitInfo(visits);
         updateProblemLog(visits,problemLog,member);
         //鍒涘缓瀹℃壒璁板綍
 //        createApprove(visits,visitMember);
-        //鍙戦�佸井淇″叕浼楀彿閫氱煡
-        wxPlatNotice.sendVisitAuditTemplateNotice(visits,
-                systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
-                systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
 
         return visits.getId();
     }
@@ -554,7 +642,8 @@
                 v.setDoors(visits.getDoors());
                 v.setType(visits.getType());
                 v.setVisitType(visits.getVisitType());
-                v.setStatus(Constants.VisitStatus.submitCheck);
+                v.setStatus(visits.getStatus());
+                v.setSourceType(visits.getSourceType());
             }
             //鎵归噺鎻掑叆鏁版嵁
             visitsMapper.insertBatchSomeColumn(visits.getWithUserList());
@@ -833,7 +922,7 @@
 
     private ProblemLog isValidProblemLog(Visits visits) {
         String required = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PROBLEM_VISIT_REQUIRED).getCode();
-        if(StringUtils.equals(required,Constants.ONE+"")){
+        if(StringUtils.equals(required,Constants.ONE+"")&&visits.getSourceType()==Constants.ZERO){
             //濡傛灉蹇呴』绛旈锛屾煡鎵剧瓟棰樿褰�
             if(visits.getUserAnswerId() == null){
                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝璇峰厛鎸夎姹傝繘琛屽畨鍏ㄧ煡璇嗙瓟棰橈紒");
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
index 126cbfd..3c3e1e5 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -340,11 +340,11 @@
         Date date = new Date();
         int num =0;
         for(ErpUserListResponse response : list){
-            if(isDebug){
-                response.setPhone("1534569100"+num);
-                response.setFaceImg("20223402/DM1005.png");
-                response.setIdNo("34112219880427200"+num);
-            }
+//            if(isDebug){
+//                response.setPhone("1534569100"+num);
+//                response.setFaceImg("20223402/DM1005.png");
+//                response.setIdNo("34112219880427200"+num);
+//            }
             num++;
             Company company =  new Company();
             if(StringUtils.isNotBlank(response.getOrgId())){
@@ -1074,7 +1074,6 @@
                 ){
 
             }
-
             if(Objects.isNull(param)
                     ||Objects.isNull(param.getId())
                     ||Objects.isNull(param.getStatus())){
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java
index 76d4642..65edb21 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java
@@ -167,11 +167,18 @@
             throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"璁垮绛旈涓婚 瀛楀吀涓嶅瓨鍦�");
         }
         visitConfigDTO.setTheme(theme.getCode());
+
         SystemDictData description = systemDictList.stream().filter(m->m.getLabel().equals(Constants.DESCRIPTION)).findFirst().get();
         if(Objects.isNull(description)){
             throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"璁垮绛旈璇存槑 瀛楀吀涓嶅瓨鍦�");
         }
         visitConfigDTO.setDescription(description.getCode());
+
+        SystemDictData visitNotice = systemDictList.stream().filter(m->m.getLabel().equals(Constants.VISIT_NOTICE)).findFirst().get();
+        if(Objects.isNull(visitNotice)){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"鍏ュ巶椤荤煡 瀛楀吀涓嶅瓨鍦�");
+        }
+        visitConfigDTO.setVisitNotice(visitNotice.getCode());
         return visitConfigDTO;
     }
 
@@ -223,11 +230,19 @@
             throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"璁垮绛旈涓婚 瀛楀吀涓嶅瓨鍦�");
         }
         theme.setCode(visitConfigDTO.getTheme());
+
         SystemDictData description = systemDictList.stream().filter(m->m.getLabel().equals(Constants.DESCRIPTION)).findFirst().get();
         if(Objects.isNull(description)){
             throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"璁垮绛旈璇存槑 瀛楀吀涓嶅瓨鍦�");
         }
         description.setCode(visitConfigDTO.getDescription());
+
+        SystemDictData visitNotice = systemDictList.stream().filter(m->m.getLabel().equals(Constants.VISIT_NOTICE)).findFirst().get();
+        if(Objects.isNull(visitNotice)){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"鍏ュ巶椤荤煡 瀛楀吀涓嶅瓨鍦�");
+        }
+        visitNotice.setCode(visitConfigDTO.getVisitNotice());
+
 
         systemDictDataMapper.updateById(reservationWay);
         systemDictDataMapper.updateById(checkVisit);
@@ -235,6 +250,7 @@
         systemDictDataMapper.updateById(isAnswer);
         systemDictDataMapper.updateById(theme);
         systemDictDataMapper.updateById(description);
+        systemDictDataMapper.updateById(visitNotice);
 
     }
 
diff --git a/server/dmvisit_service/src/main/resources/application-testHS.yml b/server/dmvisit_service/src/main/resources/application-testHS.yml
index 5ff9fb2..4a9264d 100644
--- a/server/dmvisit_service/src/main/resources/application-testHS.yml
+++ b/server/dmvisit_service/src/main/resources/application-testHS.yml
@@ -38,7 +38,7 @@
   title: ${project.name}鎺ュ彛鏂囨。
   description: ${project.name}鎺ュ彛鏂囨。
   enabled: true
-  context-path: /erp_api
+  context-path: /erp_interface
   # 绂佺敤swagger鏃剁殑閲嶅畾鍚戝湴鍧�
   redirect-uri: /
 
diff --git a/server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java b/server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
index 970d608..717c757 100644
--- a/server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
+++ b/server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
@@ -63,6 +63,7 @@
     @ApiOperation(value = "璁垮璁板綍鎻愪氦", notes = "璁垮鎻愪氦")
     @PostMapping("/createFk")
     public ApiResponse createFk(@RequestBody Visits visits) {
+        visits.setSourceType(Constants.ZERO);
         return ApiResponse.success("鏌ヨ鎴愬姛", visitsService.createFk(visits));
     }
 
diff --git a/server/openapi/src/main/java/com/doumee/api/web/BizResourceController.java b/server/openapi/src/main/java/com/doumee/api/web/BizResourceController.java
index c7b1c55..8de719e 100644
--- a/server/openapi/src/main/java/com/doumee/api/web/BizResourceController.java
+++ b/server/openapi/src/main/java/com/doumee/api/web/BizResourceController.java
@@ -8,6 +8,8 @@
 import com.doumee.core.erp.model.openapi.request.*;
 import com.doumee.core.erp.model.openapi.response.*;
 import com.doumee.core.utils.Constants;
+import com.doumee.dao.web.reqeust.ErpVisitDTO;
+import com.doumee.service.business.VisitsService;
 import com.doumee.service.business.ext.ERPSyncService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -39,6 +41,9 @@
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private VisitsService visitsService;
 
 
     @ApiOperation(value = "璋冪敤鍑嵁鑾峰彇鎺ュ彛", notes = "璁垮绔彁渚涳紝渚汦RP绔皟鐢紝鍚慐RP鎻愪緵缁熸帴鍙h皟鐢ㄥ嚟璇�")
@@ -155,6 +160,17 @@
         return  ApiResponse.success(null);
     }
 
+    @ErpLoginRequired
+    @ApiOperation(value = "鍙戣捣璁垮鐢宠", notes = "璁垮绔彁渚涳紝渚汦RP绔皟鐢紝ERP绔彂璧疯瀹㈢敵璇�")
+    @PostMapping("/resource/createVisit")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鎺堟潈token鍊�", required = true)
+    })
+    public ApiResponse  createVisit(@RequestBody ErpVisitDTO param) {
+        param.setToken(this.getToken());
+        visitsService.createFKForErp(param);
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
 
 
     @ApiOperation(value = "FTP璐︽埛淇℃伅", notes = "璁垮绔彁渚涳紝渚汦RP绔皟鐢紝FTP璐︽埛淇℃伅,鍏朵腑銆怓TP璧勬簮璁块棶鏄犲皠鍦板潃銆戠敤浜庡浘鐗囧洖鏄句娇鐢紝" +

--
Gitblit v1.9.3