From bde8258f7de3dfc5cbf0fc59f2b74ed0fd073df7 Mon Sep 17 00:00:00 2001 From: shikeying <shikeying@163.com> Date: 星期日, 31 三月 2024 11:11:20 +0800 Subject: [PATCH] 添加milvus代码示例 --- deploy-jar-template/src/main/java/com/iplatform/api/MilvusChatApi.java | 217 +++++++++++++++++++++ deploy-jar-template/pom.xml | 13 + iplatform-pay-server/doc/支付中台设计.EAP | 0 iplatform-file-server/src/main/java/com/iplatform/file/FileEngineFactory.java | 5 iplatform-file-server/src/main/java/com/iplatform/file/util/FileStoreUtils.java | 2 deploy-jar-template/src/main/resources/application-dev.yml | 6 deploy-jar-template/src/main/java/com/iplatform/milvus/MilvusEngine.java | 152 +++++++++++++++ deploy-jar-template/src/main/java/com/iplatform/milvus/ParamList.java | 35 +++ deploy-jar-template/src/test/java/com/iplatform/milvus/TestMilvus.java | 37 +++ deploy-jar-template/src/main/java/com/iplatform/milvus/EventVo.java | 54 +++++ deploy-jar-template/src/main/java/com/iplatform/milvus/service/EventServiceImpl.java | 46 ++++ 11 files changed, 564 insertions(+), 3 deletions(-) diff --git a/deploy-jar-template/pom.xml b/deploy-jar-template/pom.xml index 1a2533b..75ada2a 100644 --- a/deploy-jar-template/pom.xml +++ b/deploy-jar-template/pom.xml @@ -17,6 +17,13 @@ </properties> <dependencies> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.iplatform</groupId> <artifactId>iplatform-base</artifactId> @@ -198,6 +205,12 @@ <!-- <artifactId>iplatform-report</artifactId>--> <!-- </dependency>--> + <!-- 2024-03-28 娴嬭瘯涓�閿~宸ュ崟锛岄渶瑕佽亰澶╁垎鏋愮浉浼煎害 --> + <dependency> + <groupId>com.walkersoft</groupId> + <artifactId>walker-support-milvus</artifactId> + </dependency> + </dependencies> <build> diff --git a/deploy-jar-template/src/main/java/com/iplatform/api/MilvusChatApi.java b/deploy-jar-template/src/main/java/com/iplatform/api/MilvusChatApi.java new file mode 100644 index 0000000..79483b2 --- /dev/null +++ b/deploy-jar-template/src/main/java/com/iplatform/api/MilvusChatApi.java @@ -0,0 +1,217 @@ +package com.iplatform.api; + +import com.iplatform.base.SystemController; +import com.iplatform.milvus.EventVo; +import com.iplatform.milvus.MilvusEngine; +import com.iplatform.milvus.ParamList; +import com.iplatform.milvus.service.EventServiceImpl; +import com.walker.infrastructure.utils.StringUtils; +import com.walker.web.ResponseValue; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@RestController +@RequestMapping("/test/milvus") +public class MilvusChatApi extends SystemController { + + private EventServiceImpl eventService; + private RestTemplate restTemplate; + private MilvusEngine milvusEngine; + + private Long existId = 4048L; + private boolean isBreak = false; + + private static final String URL_EMBEDDING = "http://120.26.128.84:7003/ai/text/embedding"; + private static final String URL_MILVUS = "120.26.128.84"; + + @Autowired + public MilvusChatApi(EventServiceImpl eventService, RestTemplate restTemplate){ + this.eventService = eventService; + this.restTemplate = restTemplate; + if(this.milvusEngine == null){ + MilvusEngine engine = new MilvusEngine(URL_MILVUS, 19530); + this.milvusEngine = engine; + logger.info("milvus engine ok!"); + } + } + + @RequestMapping("/embedding") + public ResponseValue testHttpEmbedding(){ + List<EventVo> data = new ArrayList(8); + EventVo eventVo = new EventVo(); + eventVo.setContent("绗竴鍙�"); + data.add(eventVo); + + eventVo = new EventVo(); + eventVo.setContent("绗簩鍙�"); + data.add(eventVo); + + boolean success = this.acquireEmbedding(data); + this.milvusEngine.insertTestData(); + + return ResponseValue.success("缁撴灉鏄細" + success); + } + + @RequestMapping("/write") + public ResponseValue testWriteMilvus(){ + Collection<EventVo> eventVoList = this.acquireEventVoList(); + if(eventVoList == null){ + return ResponseValue.error("娌℃湁鍔犺浇鍒版暟鎹�"); + } + logger.info("鍔犺浇浜� event vo: {}涓�", eventVoList.size()); + + new Thread(new WriteTask(eventVoList)).start(); + return ResponseValue.success(); + } + + @RequestMapping("/query") + public ResponseValue testQueryMilvus(String text){ + + return ResponseValue.success(); + } + + private boolean acquireEmbedding(List<EventVo> batchData){ + ParamList paramList = new ParamList(); + for(EventVo eventVo : batchData){ + paramList.add(eventVo.getContent()); + } + try{ + ResponseEntity<ResponseValue> responseEntity = this.restTemplate.postForEntity(URL_EMBEDDING, paramList, ResponseValue.class); + if(responseEntity.getStatusCode() == HttpStatus.OK){ + List<List<Float>> data = (List<List<Float>>)responseEntity.getBody().getData(); +// double[] one = null; + List<Float> vector = null; + for(int i=0; i<data.size(); i++){ + vector = data.get(i); +// one = new double[vector.size()]; +// for(int j=0; j< vector.size(); j++){ +// one[j] = vector.get(j); +// } + +// logger.debug("data = {}", vector); +// logger.debug("class type = {}", vector.getClass().getName()); + batchData.get(i).setEmbedding(this.transfer2FloatList(vector)); + } + return true; + } else { + logger.error("http 杩斿洖閿欒锛歿}", responseEntity.getBody()); + } + return false; + } catch (Exception cause){ + logger.error("鑾峰彇鍚戦噺鍑虹幇閿欒锛歿}" + cause.getMessage(), cause); + return false; + } + } + + private List<Float> transfer2FloatList(List<?> list){ + List<Float> vector = new ArrayList<>(768); + for(int i=0; i<list.size(); i++){ + vector.add(Float.parseFloat(list.get(i).toString())); + } + return vector; + } + + private class WriteTask implements Runnable{ + + private Collection<EventVo> eventVoList; + + public WriteTask(Collection<EventVo> eventVoList){ + this.eventVoList = eventVoList; + } + + @Override + public void run() { + logger.info(".......... start task ..."); + + // 澶嶄綅鐘舵�� + isBreak = false; + + int count = 0; + List<EventVo> batchData = new ArrayList<>(); + for(EventVo eventVo : this.eventVoList){ + // 宸插瓨鍦ㄤ笂娆″姞杞借褰曪紝宸插啓鍏ョ殑涓嶅湪閲嶆柊澶勭悊 + if(existId != null && eventVo.getId() < existId.longValue()){ + continue; + } + + if(isBreak){ + break; + } + + if(count == 0){ + logger.info("1) 寮�濮嬶紙鎴栫户缁級閲囬泦绗� {} 璁板綍", eventVo.getId()); + } + + if(count >= 8){ + // 瑙﹀彂涓�娆℃壒閲忓啓鍏� + logger.info("2) 瑙﹀彂涓�娆¤皟鐢細{}", batchData.get(7).getId()); + try { + boolean successEmbedding = acquireEmbedding(batchData); + if(!successEmbedding){ + logger.error("鑾峰彇鍚戦噺澶辫触锛屼换鍔$粨鏉�"); + break; + } + + // 鑾峰彇鍚戦噺锛屽啓鍏ユ暟鎹簱 + milvusEngine.insertEventVoList(batchData); + + } catch (Exception ex){ + logger.error("error = " + ex.getMessage(), ex); +// existId = eventVo.getId(); + isBreak = true; + logger.error("3) 閲囬泦浠诲姟寮傚父锛� 褰撳墠 id = {}", existId == null ? "" : existId); + break; + + } finally { + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + // 娓呯悊鏈鏁版嵁 + batchData.clear(); + count = 0; + } + batchData.add(eventVo); + count ++; + } + logger.info(".......... end task ..."); + } + } + + private Collection<EventVo> acquireEventVoList(){ + List<EventVo> data = null; +// if(this.isBreak){ +// data = this.eventService.queryEventAll(existId); +// } else { +// data = this.eventService.queryEventAll(null); +// } + data = this.eventService.queryEventAll(null); + if(StringUtils.isEmptyList(data)){ + return null; + } + + // 杩囨护鎺� content 閲嶅鐨勬暟鎹褰� + LinkedHashMap<String, EventVo> cache = new LinkedHashMap(); + EventVo temp = null; + for(EventVo e : data){ + temp = cache.get(e.getContent()); + if(temp == null){ + cache.put(e.getContent(), e); + } + } + return cache.values(); + } +} diff --git a/deploy-jar-template/src/main/java/com/iplatform/milvus/EventVo.java b/deploy-jar-template/src/main/java/com/iplatform/milvus/EventVo.java new file mode 100644 index 0000000..bfa4b0c --- /dev/null +++ b/deploy-jar-template/src/main/java/com/iplatform/milvus/EventVo.java @@ -0,0 +1,54 @@ +package com.iplatform.milvus; + +import java.util.List; + +public class EventVo { + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public List<Float> getEmbedding() { + return embedding; + } + + public void setEmbedding(List<Float> embedding) { + this.embedding = embedding; + } + + public String getAnswer() { + return answer; + } + + public void setAnswer(String answer) { + this.answer = answer; + } + + private long id; + private String title; + private String content; +// private double[] embedding; +// private List<Double> embedding; + private List<Float> embedding; + private String answer; // 涓嶅瓨鍏ilvus锛屼粎鍦ㄧ紦瀛樹腑鐢ㄤ簬杩斿洖闂瓟缁撴灉 +} diff --git a/deploy-jar-template/src/main/java/com/iplatform/milvus/MilvusEngine.java b/deploy-jar-template/src/main/java/com/iplatform/milvus/MilvusEngine.java new file mode 100644 index 0000000..8cabab4 --- /dev/null +++ b/deploy-jar-template/src/main/java/com/iplatform/milvus/MilvusEngine.java @@ -0,0 +1,152 @@ +package com.iplatform.milvus; + +import com.walker.infrastructure.utils.StringUtils; +import com.walker.support.milvus.DataSet; +import com.walker.support.milvus.DataType; +import com.walker.support.milvus.FieldType; +import com.walker.support.milvus.MetricType; +import com.walker.support.milvus.OperateService; +import com.walker.support.milvus.Table; +import com.walker.support.milvus.engine.DefaultOperateService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MilvusEngine { + + protected final transient Logger logger = LoggerFactory.getLogger(this.getClass()); + + public MilvusEngine(String ip, int port){ + DefaultOperateService service = new DefaultOperateService(); + service.connect(ip, port); + this.operateService = service; + logger.info("connect milvus: {}:{}", ip, port); + } + + public void close(){ + if(this.operateService != null){ + this.operateService.close(); + } + } + + /** + * 鍒涘缓琛細娴嬭瘯浠庤亰澶╀竴閿彁鍙栧伐鍗曞唴瀹逛娇鐢ㄣ�� + * <pre> + * 1) 浠庡巻鍙插伐鍗曟暟鎹腑锛屾敹闆嗙敤鎴锋彁闂唴瀹癸紝鏁寸悊鍒拌〃涓� + * 2) 鎶婅繖浜涙暟鎹�氳繃鍚戦噺杞寲锛屽啓鍏ilvus鏁版嵁搴撱�� + * </pre> + * @date 2024-03-28 + */ + public void createChatSimilarTable(){ + Table chatSimilarTable = new Table(); + chatSimilarTable.setCollectionName("chat_similar"); + chatSimilarTable.setDescription("鑱婂ぉ鎻愬彇宸ュ崟鎽樿鍘嗗彶鏁版嵁"); + chatSimilarTable.setShardsNum(1); + chatSimilarTable.setDimension(768); // 杩欎釜鏄牴鎹娇鐢ㄥ悜閲忔ā鍨嬬淮搴﹀畾鐨� + + // 璁剧疆瀛楁 + FieldType id = FieldType.newBuilder() + .withName("id").withPrimaryKey(true).withMaxLength(18).withDataType(DataType.Long).build(); + FieldType title = FieldType.newBuilder() + .withName("title").withPrimaryKey(false).withMaxLength(180).withDataType(DataType.VarChar).build(); + FieldType content = FieldType.newBuilder() + .withName("content").withPrimaryKey(false).withMaxLength(255).withDataType(DataType.VarChar).build(); + FieldType answer = FieldType.newBuilder() + .withName("answer").withPrimaryKey(false).withMaxLength(255).withDataType(DataType.VarChar).build(); + FieldType embedding = FieldType.newBuilder() + .withName("embedding").withPrimaryKey(false).withDataType(DataType.FloatVector).withDimension(768).build(); + + List<FieldType> fieldTypeList = new ArrayList<>(8); + fieldTypeList.add(id); + fieldTypeList.add(title); + fieldTypeList.add(content); + fieldTypeList.add(answer); + fieldTypeList.add(embedding); + chatSimilarTable.setFieldTypes(fieldTypeList); + + this.operateService.createTable(chatSimilarTable); + logger.info("鍒涘缓浜� table = {}", chatSimilarTable.getCollectionName()); + + // 鍒涘缓绱㈠紩 + this.operateService.createIndex(chatSimilarTable.getCollectionName() + , "embedding", "HNSW", "{\"nlist\":16384, \"efConstruction\":128, \"M\":8}", MetricType.NLP); + logger.info("鍒涘缓浜� index = {}", chatSimilarTable.getCollectionName() + "_index"); + } + + public void dropChatSimilarTable(){ + this.operateService.dropTable("chat_similar"); + } + + public void insertTestData(){ + DataSet dataSet = new DataSet(); + dataSet.setTableName("chat_similar"); + + List<List<Float>> vectorList = new ArrayList<>(); + vectorList.add(Arrays.asList(mockVector)); + vectorList.add(Arrays.asList(mockVector)); + + Map<String, List<?>> fieldMap = new HashMap(); + fieldMap.put("id", Arrays.asList(new Long[]{1L, 2L})); + fieldMap.put("title", Arrays.asList(new String[]{"绗竴涓爣棰�", "绗簩涓爣棰�"})); + fieldMap.put("content", Arrays.asList(new String[]{"绗竴涓唴瀹�", "2222"})); + fieldMap.put("answer", Arrays.asList(new String[]{"绗竴涓瓟妗�", "22222222"})); + fieldMap.put("embedding", vectorList); + dataSet.setFields(fieldMap); + this.operateService.insertDataSet(dataSet); + logger.info("鍐欏叆浜嗘祴璇曟暟鎹�: {}", dataSet); + } + + public void insertEventVoList(List<EventVo> batchData){ + if(StringUtils.isEmptyList(batchData)){ + return; + } + List<Long> ids = new ArrayList<>(8); + List<String> titles = new ArrayList<>(8); + List<String> contents = new ArrayList<>(8); + List<String> answers = new ArrayList<>(8); + List<List<Float>> vectorSet = new ArrayList<>(8); + + for(EventVo vo : batchData){ + ids.add(vo.getId()); + vectorSet.add(vo.getEmbedding()); + if(StringUtils.isNotEmpty(vo.getTitle())){ + titles.add(vo.getTitle()); + } else { + titles.add("none"); + } + if(StringUtils.isNotEmpty(vo.getAnswer())){ + answers.add(vo.getAnswer()); + } else { + answers.add("none"); + } + if(vo.getContent().length() > 200){ + contents.add(vo.getContent().substring(0, 200)); + } else { + contents.add(vo.getContent()); + } + } + + DataSet dataSet = new DataSet(); + dataSet.setTableName("chat_similar"); + + Map<String, List<?>> fieldMap = new HashMap(); + fieldMap.put("id", ids); + fieldMap.put("title", titles); + fieldMap.put("content", contents); + fieldMap.put("answer", answers); + fieldMap.put("embedding", vectorSet); + dataSet.setFields(fieldMap); + this.operateService.insertDataSet(dataSet); + logger.info("鍐欏叆浜�: {}", ids); + } + + private OperateService operateService; + +// private Double[] mockVector = new Double[]{-0.051114246249198914, 0.889954432}; + private Float[] mockVector = new Float[]{-0.051114246249198914f, 0.889954432f}; +} diff --git a/deploy-jar-template/src/main/java/com/iplatform/milvus/ParamList.java b/deploy-jar-template/src/main/java/com/iplatform/milvus/ParamList.java new file mode 100644 index 0000000..52dad6b --- /dev/null +++ b/deploy-jar-template/src/main/java/com/iplatform/milvus/ParamList.java @@ -0,0 +1,35 @@ +package com.iplatform.milvus; + +import java.util.ArrayList; +import java.util.List; + +/** + * 璇锋眰鍙傛暟锛岃皟鐢ㄥ悜閲忕敓鎴愭湇鍔°�� + * @date 2024-03-29 + */ +public class ParamList { + + public void add(String text){ + if(this.list == null){ + this.list = new ArrayList<>(8); + } + this.list.add(text); + } + + public List<String> getList() { + return list; + } + + public void setList(List<String> list) { + this.list = list; + } + + private List<String> list; + + @Override + public String toString() { + return "ParamList{" + + "list=" + list + + '}'; + } +} diff --git a/deploy-jar-template/src/main/java/com/iplatform/milvus/service/EventServiceImpl.java b/deploy-jar-template/src/main/java/com/iplatform/milvus/service/EventServiceImpl.java new file mode 100644 index 0000000..eb347ce --- /dev/null +++ b/deploy-jar-template/src/main/java/com/iplatform/milvus/service/EventServiceImpl.java @@ -0,0 +1,46 @@ +package com.iplatform.milvus.service; + +import com.iplatform.milvus.EventVo; +import com.walker.jdbc.service.BaseServiceImpl; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class EventServiceImpl extends BaseServiceImpl { + + private final EventVoMapper eventVoMapper = new EventVoMapper(); + + public List<EventVo> queryEventAll(Long existId){ + if(existId == null){ + return this.select("select * from event_history order by id asc", new Object[]{}, this.eventVoMapper); + } else { + return this.select("select * from event_history where id > ? order by id asc", new Object[]{existId}, this.eventVoMapper); + } + } + + private static class EventVoMapper implements RowMapper<EventVo> { + @Override + public EventVo mapRow(ResultSet rs, int rowNum) throws SQLException { + EventVo e = new EventVo(); + e.setId(rs.getLong("id")); + e.setContent(rs.getString("content")); + String title = rs.getString("title"); + if(title.length() > 200){ + title = title.substring(0, 200); + } + e.setTitle(title); + if(rs.getObject("answer") != null){ + String answer = rs.getString("answer"); + if(answer.length() > 180){ + answer = answer.substring(0,180); + } + e.setAnswer(answer); + } + return e; + } + } +} diff --git a/deploy-jar-template/src/main/resources/application-dev.yml b/deploy-jar-template/src/main/resources/application-dev.yml index e4c35a8..d0d3ca4 100644 --- a/deploy-jar-template/src/main/resources/application-dev.yml +++ b/deploy-jar-template/src/main/resources/application-dev.yml @@ -424,11 +424,11 @@ # 绌洪棽杩炴帴鏁伴噺锛岄粯璁わ細200涓� max-idle-connections: 200 # 杩炴帴瓒呮椂锛岄粯璁わ細2绉� - connect-timeout-seconds: 2 + connect-timeout-seconds: 20 # 璇昏秴鏃讹紝榛樿3绉� - read-timeout-seconds: 3 + read-timeout-seconds: 30 # 鍐欒秴鏃讹紝榛樿3绉� - write-timeout-seconds: 3 + write-timeout-seconds: 30 # 闆嗙兢鏀寔鐩稿叧閰嶇疆锛�2023-09-29 lb: diff --git a/deploy-jar-template/src/test/java/com/iplatform/milvus/TestMilvus.java b/deploy-jar-template/src/test/java/com/iplatform/milvus/TestMilvus.java new file mode 100644 index 0000000..883114a --- /dev/null +++ b/deploy-jar-template/src/test/java/com/iplatform/milvus/TestMilvus.java @@ -0,0 +1,37 @@ +package com.iplatform.milvus; + +import org.junit.Test; +import org.springframework.web.client.RestTemplate; + +public class TestMilvus { + + /** + * 鍒涘缓鑱婂ぉ涓彁鍙栧伐鍗曟憳瑕佸姛鑳斤紝milvus娴嬭瘯琛ㄥ垱寤恒�� + * <p>绗竴姝ワ細鍒涘缓琛ㄥ拰绱㈠紩</p> + */ +// @Test + public void createTable(){ + this.acquireMilvusEngine(); + this.milvusEngine.createChatSimilarTable(); + } + + /** + * 娴嬭瘯锛氬啓鍏ヤ竴涓ā鎷熸暟鎹� + */ +// @Test + public void insertTestMockData(){ + this.acquireMilvusEngine(); + this.milvusEngine.insertTestData(); + } + + + private void acquireMilvusEngine(){ + if(this.milvusEngine == null){ + MilvusEngine engine = new MilvusEngine("120.26.128.84", 19530); + this.milvusEngine = engine; + } + } + + private RestTemplate restTemplate = new RestTemplate(); + private MilvusEngine milvusEngine; +} diff --git a/iplatform-file-server/src/main/java/com/iplatform/file/FileEngineFactory.java b/iplatform-file-server/src/main/java/com/iplatform/file/FileEngineFactory.java index d4e2d0a..d1d64bc 100644 --- a/iplatform-file-server/src/main/java/com/iplatform/file/FileEngineFactory.java +++ b/iplatform-file-server/src/main/java/com/iplatform/file/FileEngineFactory.java @@ -256,6 +256,11 @@ if(StringUtils.isNotEmpty(fileUrlPrefixConfig)){ FileStoreUtils.fileStoreTypeUrlPrefix.put(FileStoreType.OssAli.getIndex(), fileUrlPrefixConfig); } + // 2024-02-23 s3瀵硅薄涓婁紶 + fileUrlPrefixConfig = this.getFileUrlPrefix(FileStoreType.OssAws.getIndex()); + if(StringUtils.isNotEmpty(fileUrlPrefixConfig)){ + FileStoreUtils.fileStoreTypeUrlPrefix.put(FileStoreType.OssAws.getIndex(), fileUrlPrefixConfig); + } } /** diff --git a/iplatform-file-server/src/main/java/com/iplatform/file/util/FileStoreUtils.java b/iplatform-file-server/src/main/java/com/iplatform/file/util/FileStoreUtils.java index 9111c49..17ef26e 100644 --- a/iplatform-file-server/src/main/java/com/iplatform/file/util/FileStoreUtils.java +++ b/iplatform-file-server/src/main/java/com/iplatform/file/util/FileStoreUtils.java @@ -38,6 +38,8 @@ uploadUrl = ArgumentsConstants.CONFIG_AL_UPLOAD_URL; } else if(fileStoreType.equals("4") || fileStoreType.equals(FileStoreType.INDEX_OSS_TX)){ uploadUrl = ArgumentsConstants.CONFIG_TX_UPLOAD_URL; + } else if(fileStoreType.equals("5") || fileStoreType.equals(FileStoreType.INDEX_OSS_AWS)){ + uploadUrl = ArgumentsConstants.CONFIG_S3_UPLOAD_URL; } else if(fileStoreType.equals(FileStoreType.INDEX_FTP)){ // throw new UnsupportedOperationException("ftp瀛樺偍鏂瑰紡鏈缃弬鏁帮紒"); uploadUrl = ArgumentsConstants.CONFIG_FTP_UPLOAD_URL; diff --git "a/iplatform-pay-server/doc/\346\224\257\344\273\230\344\270\255\345\217\260\350\256\276\350\256\241.EAP" "b/iplatform-pay-server/doc/\346\224\257\344\273\230\344\270\255\345\217\260\350\256\276\350\256\241.EAP" index cab22ac..8f3562e 100644 --- "a/iplatform-pay-server/doc/\346\224\257\344\273\230\344\270\255\345\217\260\350\256\276\350\256\241.EAP" +++ "b/iplatform-pay-server/doc/\346\224\257\344\273\230\344\270\255\345\217\260\350\256\276\350\256\241.EAP" Binary files differ -- Gitblit v1.9.1