AitableServiceImpl.java 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055
  1. package com.malk.eastar.service.impl;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.malk.eastar.model.AITableParam;
  5. import com.malk.eastar.model.AITableResult;
  6. import com.malk.eastar.service.MDTableClient;
  7. import com.malk.eastar.service.AitableService;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Service;
  12. import java.util.*;
  13. import java.util.regex.Matcher;
  14. import java.util.regex.Pattern;
  15. /**
  16. * 专用于AI表格复杂逻辑处理的接口服务
  17. * add by Jason 20260409
  18. */
  19. @Slf4j
  20. @Service
  21. public class AitableServiceImpl implements AitableService {
  22. @Autowired
  23. private MDTableClient mdTableClient;
  24. @Override
  25. public List<Map> querySys1CustomerData() throws Exception {
  26. /*
  27. 参数定义
  28. */
  29. List<Map> customerData = new ArrayList<>(); // 客户数据
  30. List<Map> customerDataDeduplicate = new ArrayList<>(); // 客户数据(去重)
  31. String baseId; //AI表格文档ID
  32. String sheetIdOrName; //数据表ID或数据表名称
  33. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  34. AITableParam aiTableParam = new AITableParam(); //HTTP请求体
  35. boolean hasMore; //是否还有下一页
  36. int pageNo; //当前页码
  37. int pageSize; //每页获取的数据量(上限100)
  38. AITableResult aiTableResult; //请求返回内容
  39. JSONArray records; //每页记录数据
  40. JSONArray allRecords = new JSONArray(); //所有记录数据
  41. String aiTableId; //AI表格ID
  42. JSONObject fields; //字段数据
  43. String customerName; //客户名称
  44. JSONArray businessUserJSONArray; //业务【人事】
  45. String businessUserUnionId; //业务员unionId
  46. String businessUserName; //业务员姓名
  47. String kp; //KP
  48. boolean isCustomerNameEmpty; //客户名称是否为空
  49. boolean isBusinessUserEmpty; //业务员是否为空
  50. boolean isKpEmpty; //KP是否为空
  51. int customerEmptyCount = 0; //客户名称为空的记录数
  52. Map<String,String> customerRecord; //客户记录
  53. Map<String, Long> customerNameCountMap = new HashMap<>(); //客户名称与出现的次数映射
  54. String customerLevel; //客户分级
  55. String newOrOld; //新老客户
  56. String testUseFlag; //测试使用标识
  57. /*
  58. 项目总表
  59. */
  60. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  61. sheetIdOrName = "E6RcJi3";
  62. /*
  63. 项目总表副本-20260409
  64. */
  65. // baseId = "GZLxjv9VGqBAMDOoHYzrPZzE86EDybno";
  66. // sheetIdOrName = "E6RcJi3";
  67. /*
  68. 初始化参数值
  69. */
  70. hasMore = true; //第一页默认有数据
  71. pageNo = 1;
  72. pageSize = 100;
  73. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  74. aiTableParam.setMaxResults(pageSize);
  75. /*
  76. 翻页获取数据
  77. */
  78. while(hasMore){
  79. aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
  80. hasMore = aiTableResult.getHasMore();
  81. log.info("当前第"+pageNo+"页");
  82. log.info("记录数="+aiTableResult.getRecords().size());
  83. records = aiTableResult.getRecords();
  84. for(int i=0;i<records.size();i++){
  85. allRecords.add(records.getJSONObject(i));
  86. }
  87. log.info("是否有更多数据:"+hasMore);
  88. pageNo++;
  89. aiTableParam.setNextToken(aiTableResult.getNextToken());
  90. }
  91. /*
  92. 请求记录数据处理
  93. */
  94. log.info("所有记录数量="+allRecords.size());
  95. for(int i=0;i<allRecords.size();i++){
  96. /*
  97. 重置是否为空标识
  98. */
  99. isCustomerNameEmpty = false;
  100. isBusinessUserEmpty = false;
  101. isKpEmpty = false;
  102. customerName = "";
  103. businessUserUnionId = "";
  104. businessUserName = "";
  105. kp = "";
  106. testUseFlag = "";
  107. //获取AI表格ID
  108. aiTableId = allRecords.getJSONObject(i).getString("id");
  109. //解析字段数据
  110. fields = allRecords.getJSONObject(i).getJSONObject("fields");
  111. /*
  112. 获取客户名称数据
  113. */
  114. if(fields.get("客户公司名【基础】") == null){
  115. isCustomerNameEmpty = true;
  116. }else{
  117. customerName = fields.getString("客户公司名【基础】");
  118. customerName = customerName.replace("\n",""); //去除换行符
  119. customerName = customerName.trim(); //去除空格
  120. if(StringUtils.isEmpty(customerName)){
  121. isCustomerNameEmpty = true;
  122. }
  123. }
  124. if(isCustomerNameEmpty){
  125. customerEmptyCount++;
  126. // throw new RuntimeException("客户公司名【基础】字段为空");
  127. continue;
  128. }else{
  129. // System.out.println("客户名称="+customerName);
  130. }
  131. /*
  132. 获取业务员数据
  133. */
  134. if(fields.get("业务【人事】") == null){
  135. isBusinessUserEmpty = true;
  136. }else{
  137. businessUserJSONArray = fields.getJSONArray("业务【人事】");
  138. if(businessUserJSONArray.isEmpty()){
  139. isBusinessUserEmpty = true;
  140. }else{
  141. if(businessUserJSONArray.size()>1){ //一个客户有多个业务员负责对接
  142. log.info("客户名称="+customerName+",业务员数量="+businessUserJSONArray.size());
  143. }
  144. businessUserUnionId = businessUserJSONArray.getJSONObject(0).getString("unionId");
  145. businessUserName = businessUserJSONArray.getJSONObject(0).getString("name");
  146. }
  147. }
  148. // System.out.println("业务员是否为空="+isBusinessUserEmpty);
  149. if(isBusinessUserEmpty){
  150. // throw new RuntimeException("业务【人事】字段为空");
  151. }else{
  152. // System.out.println("业务员="+businessUser);
  153. }
  154. /*
  155. 获取客户分级
  156. */
  157. customerLevel = "";
  158. if(fields.get("客户分级【客户】") != null){
  159. customerLevel = fields.getJSONObject("客户分级【客户】").getString("name");
  160. if(
  161. "A".equals(customerLevel)
  162. ||"潜A".equals(customerLevel)
  163. ||"B".equals(customerLevel)
  164. ||"潜B".equals(customerLevel)
  165. ||"C".equals(customerLevel)
  166. ||"潜C".equals(customerLevel)
  167. ||"D".equals(customerLevel)
  168. ||"潜D".equals(customerLevel)
  169. ||"E".equals(customerLevel)
  170. ||"保稳E".equals(customerLevel)
  171. ){
  172. //不变
  173. }else{
  174. customerLevel = "";
  175. }
  176. }
  177. /*
  178. 获取新老客户
  179. */
  180. newOrOld = "";
  181. if(fields.get("新老客户?【客户】") != null){
  182. newOrOld = fields.getJSONObject("新老客户?【客户】").getString("name");
  183. if(newOrOld.contains("新")){
  184. newOrOld = "新";
  185. }
  186. if(newOrOld.contains("老")){
  187. newOrOld = "老";
  188. }
  189. if(newOrOld.contains("不合作")){
  190. newOrOld = "不合作";
  191. }
  192. }
  193. /*
  194. 获取KP数据
  195. */
  196. /*
  197. if(fields.get("一把手KP") == null){
  198. isKpEmpty = true;
  199. }else{
  200. kp = fields.getString("一把手KP");
  201. }
  202. // System.out.println("KP是否为空="+isKpEmpty);
  203. if(isKpEmpty){
  204. // throw new RuntimeException("一把手KP字段为空");
  205. }else{
  206. // System.out.println("KP="+kp);
  207. }
  208. */
  209. /*
  210. 获取新老客户
  211. */
  212. if(fields.get("测试使用") != null){
  213. testUseFlag = fields.getJSONObject("测试使用").getString("name");
  214. }
  215. /*
  216. 汇总客户数据
  217. */
  218. customerRecord = new HashMap<>();
  219. customerRecord.put("aiTableId",aiTableId);
  220. customerRecord.put("customerName",customerName);
  221. customerRecord.put("businessUserName",businessUserName);
  222. customerRecord.put("businessUserUnionId",businessUserUnionId);
  223. // customerRecord.put("kp",kp);
  224. // System.out.println(JSONObject.toJSONString(customerRecord));
  225. customerRecord.put("customerLevel",customerLevel);
  226. customerRecord.put("newOrOld",newOrOld);
  227. // System.out.println(aiTableId+","+customerLevel+","+newOrOld);
  228. customerRecord.put("testUseFlag",testUseFlag);
  229. customerData.add(customerRecord);
  230. }
  231. log.info("客户名称为空的记录数="+customerEmptyCount);
  232. /*
  233. 排除有重复的客户
  234. */
  235. for (Map<String, String> record : customerData) {
  236. customerName = record.get("customerName");
  237. customerNameCountMap.merge(customerName, 1L, Long::sum);
  238. }
  239. for (Map.Entry<String, Long> entry : customerNameCountMap.entrySet()) {
  240. if (entry.getValue() > 1) {
  241. System.out.println("客户名称="+entry.getKey()+",重复次数="+ entry.getValue());
  242. }
  243. }
  244. for (Map<String, String> record : customerData) {
  245. customerName = record.get("customerName");
  246. if(customerNameCountMap.get(customerName)==1){
  247. customerDataDeduplicate.add(record);
  248. }
  249. }
  250. /*
  251. 返回客户数据(去重)
  252. */
  253. return customerDataDeduplicate;
  254. }
  255. @Override
  256. public List<Map> querySys1AllSaleData() throws Exception {
  257. /*
  258. 参数定义
  259. */
  260. List<Map> saleData = new ArrayList<>(); //售前台账数据
  261. String baseId; //AI表格文档ID
  262. String sheetIdOrName; //数据表ID或数据表名称
  263. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  264. AITableParam aiTableParam = new AITableParam(); //HTTP请求体
  265. boolean hasMore; //是否还有下一页
  266. int pageNo; //当前页码
  267. int pageSize; //每页获取的数据量(上限100)
  268. AITableResult aiTableResult; //请求返回内容
  269. JSONArray records; //每页记录数据
  270. JSONArray allRecords = new JSONArray(); //所有记录数据
  271. String aiTableId; //AI表格ID
  272. JSONObject fields; //字段数据
  273. Map<String,Object> saleRecord; //售前台账记录
  274. String piCode; //原PI号
  275. String projectName; //项目名称
  276. String projectEnName; //项目英文名
  277. String pName; //项目名称缩写
  278. Double projectAmount; //预计销售项目金额
  279. JSONArray linkedRecordIds; //客户公司名 - S1【基础】
  280. String customerId; //客户ID
  281. Long expectedCloseDate; //预计成单日期
  282. Long actualCloseDate; //实际成单日期
  283. JSONArray unionIdJSONArray; //业务 - S1【人事】
  284. String unionId; //业务员ID
  285. String clearLevelFlag; //是否计算为通关项目
  286. String dealStatus; //成单状态
  287. String orderStatus; //订单状态
  288. String opportunityStatus; //商机阶段
  289. /*
  290. 项目总表 - 【表1】售前台账
  291. */
  292. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  293. sheetIdOrName = "C1mtX34";
  294. /*
  295. 初始化参数值
  296. */
  297. hasMore = true; //第一页默认有数据
  298. pageNo = 1;
  299. pageSize = 100;
  300. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  301. aiTableParam.setMaxResults(pageSize);
  302. JSONObject filter = new JSONObject();
  303. filter.put("combination","and");
  304. JSONArray conditions = new JSONArray();
  305. JSONObject condition1 = new JSONObject();
  306. condition1.put("field","Parent Record");
  307. condition1.put("operator","empty");
  308. conditions.add(condition1);
  309. filter.put("conditions",conditions);
  310. aiTableParam.setFilter(filter);
  311. /*
  312. 翻页获取数据
  313. */
  314. while(hasMore){
  315. aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
  316. hasMore = aiTableResult.getHasMore();
  317. log.info("当前第"+pageNo+"页");
  318. log.info("记录数="+aiTableResult.getRecords().size());
  319. records = aiTableResult.getRecords();
  320. for(int i=0;i<records.size();i++){
  321. allRecords.add(records.getJSONObject(i));
  322. }
  323. log.info("是否有更多数据:"+hasMore);
  324. pageNo++;
  325. aiTableParam.setNextToken(aiTableResult.getNextToken());
  326. }
  327. /*
  328. 请求记录数据处理
  329. */
  330. log.info("所有记录数量="+allRecords.size());
  331. for(int i=0;i<allRecords.size();i++){
  332. //重置变量
  333. piCode = "";
  334. projectName = "";
  335. projectEnName = "";
  336. pName = "";
  337. customerId = "";
  338. unionId = "";
  339. projectAmount = null;
  340. expectedCloseDate = null;
  341. actualCloseDate = null;
  342. clearLevelFlag = null;
  343. dealStatus = null;
  344. orderStatus = null;
  345. opportunityStatus = null;
  346. //获取AI表格ID
  347. aiTableId = allRecords.getJSONObject(i).getString("id");
  348. //解析字段数据
  349. fields = allRecords.getJSONObject(i).getJSONObject("fields");
  350. if(fields.get("项目编号 - S1【基础】") != null){
  351. piCode = fields.getString("项目编号 - S1【基础】");
  352. piCode = piCode.replace("\n",""); //去除换行符
  353. piCode = piCode.trim(); //去除空格
  354. Matcher matcher = Pattern.compile("Eastar-?([A-Za-z]+)").matcher(piCode);
  355. if (matcher.find()) {
  356. pName = matcher.group(1);
  357. if(pName != null && pName.length()>0){
  358. pName = pName.toUpperCase(); //转大写
  359. if(pName.length()>5){
  360. pName = pName.substring(0,5); //最大5个字符
  361. }
  362. }
  363. }
  364. }
  365. if(fields.get("项目名称 - S1【基础】") != null){
  366. projectName = fields.getString("项目名称 - S1【基础】");
  367. projectName = projectName.replace("\n",""); //去除换行符
  368. projectName = projectName.trim(); //去除空格
  369. }
  370. if(fields.get("项目英文名 - S1【基础") != null){
  371. projectEnName = fields.getString("项目英文名 - S1【基础");
  372. projectEnName = projectEnName.replace("\n",""); //去除换行符
  373. projectEnName = projectEnName.trim(); //去除空格
  374. }
  375. if(fields.get("订单金额 - S2~3【销售数据】") != null){
  376. projectAmount = fields.getDouble("订单金额 - S2~3【销售数据】");
  377. }
  378. if(fields.get("客户公司名 - S1【基础】") != null){
  379. linkedRecordIds = fields.getJSONObject("客户公司名 - S1【基础】").getJSONArray("linkedRecordIds");
  380. if(linkedRecordIds!=null && !linkedRecordIds.isEmpty()){
  381. customerId = linkedRecordIds.getString(0);
  382. }
  383. }
  384. if(fields.get("预计成单日期 - S1~2【商机进度】") != null){
  385. expectedCloseDate = fields.getLong("预计成单日期 - S1~2【商机进度】");
  386. }
  387. if(fields.get("实际成单日期 - S3【销售数据】") != null){
  388. actualCloseDate = fields.getLong("实际成单日期 - S3【销售数据】");
  389. }
  390. if(fields.get("业务 - S1【人事】") != null){
  391. unionIdJSONArray = fields.getJSONArray("业务 - S1【人事】");
  392. if(unionIdJSONArray!=null && !unionIdJSONArray.isEmpty()){
  393. unionId = unionIdJSONArray.getJSONObject(0).getString("unionId");
  394. }
  395. }
  396. if(fields.get("是否计算为通关项目") != null){
  397. clearLevelFlag = fields.getJSONObject("是否计算为通关项目").getString("name");
  398. }
  399. if(fields.get("成单情况【商机进度】") != null){
  400. dealStatus = fields.getJSONObject("成单情况【商机进度】").getString("name");
  401. }
  402. if(fields.get("订单状态 - S1~3【商机进度】") != null){
  403. orderStatus = fields.getJSONObject("订单状态 - S1~3【商机进度】").getString("name");
  404. }
  405. if(fields.get("商机阶段 - S1~3【商机进度】") != null){
  406. opportunityStatus = fields.getJSONObject("商机阶段 - S1~3【商机进度】").getString("name");
  407. }
  408. saleRecord = new HashMap<>();
  409. saleRecord.put("aiTableId",aiTableId);
  410. saleRecord.put("piCode",piCode);
  411. saleRecord.put("projectName",projectName);
  412. saleRecord.put("projectEnName",projectEnName);
  413. saleRecord.put("pName",pName);
  414. saleRecord.put("projectAmount",projectAmount);
  415. saleRecord.put("customerId",customerId);
  416. saleRecord.put("expectedCloseDate",expectedCloseDate);
  417. saleRecord.put("actualCloseDate",actualCloseDate);
  418. saleRecord.put("unionId",unionId);
  419. saleRecord.put("clearLevelFlag",clearLevelFlag);
  420. saleRecord.put("dealStatus",dealStatus);
  421. saleRecord.put("orderStatus",orderStatus);
  422. saleRecord.put("opportunityStatus",opportunityStatus);
  423. saleData.add(saleRecord);
  424. }
  425. return saleData;
  426. }
  427. @Override
  428. public List<Map> querySys1SaleData() throws Exception {
  429. /*
  430. 参数定义
  431. */
  432. List<Map> saleData = new ArrayList<>(); //售前台账数据
  433. String baseId; //AI表格文档ID
  434. String sheetIdOrName; //数据表ID或数据表名称
  435. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  436. AITableParam aiTableParam = new AITableParam(); //HTTP请求体
  437. boolean hasMore; //是否还有下一页
  438. int pageNo; //当前页码
  439. int pageSize; //每页获取的数据量(上限100)
  440. AITableResult aiTableResult; //请求返回内容
  441. JSONArray records; //每页记录数据
  442. JSONArray allRecords = new JSONArray(); //所有记录数据
  443. String aiTableId; //AI表格ID
  444. JSONObject fields; //字段数据
  445. Map<String,Object> saleRecord; //售前台账记录
  446. String piCode; //原PI号
  447. String projectName; //项目名称
  448. String projectEnName; //项目英文名
  449. String pName; //项目名称缩写
  450. Double projectAmount; //预计销售项目金额
  451. JSONArray linkedRecordIds; //客户公司名 - S1【基础】
  452. String customerId; //客户ID
  453. Long expectedCloseDate; //预计成单日期
  454. Long actualCloseDate; //实际成单日期
  455. JSONArray unionIdJSONArray; //业务 - S1【人事】
  456. String unionId; //业务员ID
  457. /*
  458. 项目总表 - 【表1】售前台账
  459. */
  460. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  461. sheetIdOrName = "C1mtX34";
  462. /*
  463. 初始化参数值
  464. */
  465. hasMore = true; //第一页默认有数据
  466. pageNo = 1;
  467. pageSize = 100;
  468. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  469. aiTableParam.setMaxResults(pageSize);
  470. JSONObject filter = new JSONObject();
  471. filter.put("combination","and");
  472. JSONArray conditions = new JSONArray();
  473. JSONObject condition1 = new JSONObject();
  474. condition1.put("field","商机阶段 - S1~3【商机进度】");
  475. condition1.put("operator","equal");
  476. condition1.put("value",new String[]{"已成单"});
  477. conditions.add(condition1);
  478. JSONObject condition2 = new JSONObject();
  479. condition2.put("field","项目编号 - S1【基础】");
  480. condition2.put("operator","notEmpty");
  481. conditions.add(condition2);
  482. filter.put("conditions",conditions);
  483. JSONObject condition3 = new JSONObject();
  484. condition3.put("field","Parent Record");
  485. condition3.put("operator","empty");
  486. conditions.add(condition3);
  487. filter.put("conditions",conditions);
  488. aiTableParam.setFilter(filter);
  489. /*
  490. 翻页获取数据
  491. */
  492. while(hasMore){
  493. aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
  494. hasMore = aiTableResult.getHasMore();
  495. log.info("当前第"+pageNo+"页");
  496. log.info("记录数="+aiTableResult.getRecords().size());
  497. records = aiTableResult.getRecords();
  498. for(int i=0;i<records.size();i++){
  499. allRecords.add(records.getJSONObject(i));
  500. }
  501. log.info("是否有更多数据:"+hasMore);
  502. pageNo++;
  503. aiTableParam.setNextToken(aiTableResult.getNextToken());
  504. }
  505. /*
  506. 请求记录数据处理
  507. */
  508. log.info("所有记录数量="+allRecords.size());
  509. for(int i=0;i<allRecords.size();i++){
  510. //重置变量
  511. piCode = "";
  512. projectName = "";
  513. projectEnName = "";
  514. pName = "";
  515. projectAmount = null;
  516. customerId = "";
  517. expectedCloseDate = null;
  518. actualCloseDate = null;
  519. unionId = "";
  520. //获取AI表格ID
  521. aiTableId = allRecords.getJSONObject(i).getString("id");
  522. //解析字段数据
  523. fields = allRecords.getJSONObject(i).getJSONObject("fields");
  524. if(fields.get("项目编号 - S1【基础】") != null){
  525. piCode = fields.getString("项目编号 - S1【基础】");
  526. piCode = piCode.replace("\n",""); //去除换行符
  527. piCode = piCode.trim(); //去除空格
  528. Matcher matcher = Pattern.compile("Eastar-?([A-Za-z]+)").matcher(piCode);
  529. if (matcher.find()) {
  530. pName = matcher.group(1);
  531. if(pName != null && pName.length()>0){
  532. pName = pName.toUpperCase(); //转大写
  533. if(pName.length()>5){
  534. pName = pName.substring(0,5); //最大5个字符
  535. }
  536. }
  537. }
  538. }
  539. if(fields.get("项目名称 - S1【基础】") != null){
  540. projectName = fields.getString("项目名称 - S1【基础】");
  541. projectName = projectName.replace("\n",""); //去除换行符
  542. projectName = projectName.trim(); //去除空格
  543. }
  544. if(fields.get("项目英文名 - S1【基础") != null){
  545. projectEnName = fields.getString("项目英文名 - S1【基础");
  546. projectEnName = projectEnName.replace("\n",""); //去除换行符
  547. projectEnName = projectEnName.trim(); //去除空格
  548. }
  549. if(fields.get("订单金额 - S2~3【销售数据】") != null){
  550. projectAmount = fields.getDouble("订单金额 - S2~3【销售数据】");
  551. }
  552. if(fields.get("客户公司名 - S1【基础】") != null){
  553. linkedRecordIds = fields.getJSONObject("客户公司名 - S1【基础】").getJSONArray("linkedRecordIds");
  554. if(linkedRecordIds!=null && !linkedRecordIds.isEmpty()){
  555. customerId = linkedRecordIds.getString(0);
  556. }
  557. }
  558. if(fields.get("预计成单日期 - S1~2【商机进度】") != null){
  559. expectedCloseDate = fields.getLong("预计成单日期 - S1~2【商机进度】");
  560. }
  561. if(fields.get("实际成单日期 - S3【销售数据】") != null){
  562. actualCloseDate = fields.getLong("实际成单日期 - S3【销售数据】");
  563. }
  564. if(fields.get("业务 - S1【人事】") != null){
  565. unionIdJSONArray = fields.getJSONArray("业务 - S1【人事】");
  566. if(unionIdJSONArray!=null && !unionIdJSONArray.isEmpty()){
  567. unionId = unionIdJSONArray.getJSONObject(0).getString("unionId");
  568. }
  569. }
  570. saleRecord = new HashMap<>();
  571. saleRecord.put("aiTableId",aiTableId);
  572. saleRecord.put("piCode",piCode);
  573. saleRecord.put("projectName",projectName);
  574. saleRecord.put("projectEnName",projectEnName);
  575. saleRecord.put("pName",pName);
  576. saleRecord.put("projectAmount",projectAmount);
  577. saleRecord.put("customerId",customerId);
  578. saleRecord.put("expectedCloseDate",expectedCloseDate);
  579. saleRecord.put("actualCloseDate",actualCloseDate);
  580. saleRecord.put("unionId",unionId);
  581. // System.out.println(JSONObject.toJSONString(saleRecord));
  582. saleData.add(saleRecord);
  583. }
  584. return saleData;
  585. }
  586. @Override
  587. public List<Map> querySys1SaleData(Map<String, String> params) throws Exception {
  588. /*
  589. 参数定义
  590. */
  591. List<Map> saleData = new ArrayList<>(); //售前台账数据
  592. String baseId; //AI表格文档ID
  593. String sheetIdOrName; //数据表ID或数据表名称
  594. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  595. AITableParam aiTableParam = new AITableParam(); //HTTP请求体
  596. boolean hasMore; //是否还有下一页
  597. int pageNo; //当前页码
  598. int pageSize; //每页获取的数据量(上限100)
  599. AITableResult aiTableResult; //请求返回内容
  600. JSONArray records; //每页记录数据
  601. JSONArray allRecords = new JSONArray(); //所有记录数据
  602. String aiTableId; //AI表格ID
  603. JSONObject fields; //字段数据
  604. Map<String,Object> saleRecord; //售前台账记录
  605. String projectStage; //商机阶段 - S1~3【商机进度】
  606. String projectCode; //项目编号 - S1【基础】
  607. String getRfqDate; //实际收到RFQ日期
  608. /*
  609. 项目总表 - 【表1】售前台账
  610. */
  611. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  612. sheetIdOrName = "C1mtX34";
  613. /*
  614. 初始化参数值
  615. */
  616. hasMore = true; //第一页默认有数据
  617. pageNo = 1;
  618. pageSize = 100;
  619. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  620. aiTableParam.setMaxResults(pageSize);
  621. JSONObject filter = new JSONObject();
  622. filter.put("combination","and");
  623. JSONArray conditions = new JSONArray();
  624. JSONObject condition1 = new JSONObject();
  625. condition1.put("field","项目编号 - S1【基础】");
  626. condition1.put("operator","notEmpty");
  627. conditions.add(condition1);
  628. filter.put("conditions",conditions);
  629. aiTableParam.setFilter(filter);
  630. /*
  631. 翻页获取数据
  632. */
  633. while(hasMore){
  634. aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
  635. hasMore = aiTableResult.getHasMore();
  636. log.info("当前第"+pageNo+"页");
  637. log.info("记录数="+aiTableResult.getRecords().size());
  638. records = aiTableResult.getRecords();
  639. for(int i=0;i<records.size();i++){
  640. allRecords.add(records.getJSONObject(i));
  641. }
  642. log.info("是否有更多数据:"+hasMore);
  643. pageNo++;
  644. aiTableParam.setNextToken(aiTableResult.getNextToken());
  645. }
  646. /*
  647. 请求记录数据处理
  648. */
  649. log.info("所有记录数量="+allRecords.size());
  650. for(int i=0;i<allRecords.size();i++){
  651. //重置变量
  652. projectStage = "";
  653. projectCode = "";
  654. getRfqDate = "";
  655. //获取AI表格ID
  656. aiTableId = allRecords.getJSONObject(i).getString("id");
  657. //解析字段数据
  658. fields = allRecords.getJSONObject(i).getJSONObject("fields");
  659. if(fields.get("商机阶段 - S1~3【商机进度】") != null){
  660. projectStage = fields.getJSONObject("商机阶段 - S1~3【商机进度】").getString("name");
  661. }
  662. if(fields.get("项目编号 - S1【基础】") != null){
  663. projectCode = fields.getString("项目编号 - S1【基础】");
  664. }
  665. if(fields.get("实际收到RFQ日期") != null){
  666. getRfqDate = fields.getString("实际收到RFQ日期");
  667. }
  668. saleRecord = new HashMap<>();
  669. saleRecord.put("aiTableId",aiTableId);
  670. saleRecord.put("projectStage",projectStage);
  671. saleRecord.put("projectCode",projectCode);
  672. saleRecord.put("getRfqDate",getRfqDate);
  673. // System.out.println(JSONObject.toJSONString(saleRecord));
  674. saleData.add(saleRecord);
  675. }
  676. return saleData;
  677. }
  678. @Override
  679. public Map querySys1SaleRecordByID(String id) throws Exception {
  680. /*
  681. 参数定义
  682. */
  683. Map<String,String> saleRecord = new HashMap<String,String>(); //售前台账记录
  684. String baseId; //AI表格文档ID
  685. String sheetIdOrName; //数据表ID或数据表名称
  686. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  687. JSONObject fields; //字段数据
  688. String yidaGetRfqDate; //实际收到RFQ日期
  689. String yidaRfqType; //RFQ来源
  690. /*
  691. 初始化参数值
  692. */
  693. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  694. /*
  695. 项目总表 - 【表1】售前台账
  696. */
  697. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  698. sheetIdOrName = "C1mtX34";
  699. /*
  700. 获取数据
  701. */
  702. String queryResult = mdTableClient.queryOneRecord(baseId,sheetIdOrName,id,param);
  703. /*
  704. 请求记录数据处理
  705. */
  706. log.info("查询结果:");
  707. log.info(queryResult);
  708. JSONObject queryResultJson = JSONObject.parseObject(queryResult);
  709. fields = queryResultJson.getJSONObject("fields");
  710. if(fields.get("实际收到RFQ日期") != null){
  711. yidaGetRfqDate = fields.getString("实际收到RFQ日期");
  712. saleRecord.put("yidaGetRfqDate",yidaGetRfqDate);
  713. }
  714. if(fields.get("RFQ来源") != null){
  715. yidaRfqType = fields.getString("RFQ来源");
  716. saleRecord.put("yidaRfqType",yidaRfqType);
  717. }
  718. return saleRecord;
  719. }
  720. @Override
  721. public String querySys1CustomerIdByName(String customerName) throws Exception {
  722. /*
  723. 参数定义
  724. */
  725. String baseId; //AI表格文档ID
  726. String sheetIdOrName; //数据表ID或数据表名称
  727. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  728. AITableParam aiTableParam = new AITableParam(); //HTTP请求体
  729. AITableResult aiTableResult; //请求返回内容
  730. JSONArray records; //记录数据
  731. String customerId = ""; //客户名册记录ID
  732. /*
  733. 项目总表
  734. */
  735. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  736. sheetIdOrName = "E6RcJi3";
  737. /*
  738. 项目总表副本-20260409
  739. */
  740. // baseId = "GZLxjv9VGqBAMDOoHYzrPZzE86EDybno";
  741. // sheetIdOrName = "E6RcJi3";
  742. /*
  743. 初始化参数值
  744. */
  745. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  746. JSONObject filter = new JSONObject();
  747. JSONArray conditions = new JSONArray();
  748. JSONObject condition = new JSONObject();
  749. condition.put("field","20rO7zS");
  750. condition.put("operator","equal");
  751. condition.put("value",new String[]{customerName});
  752. conditions.add( condition);
  753. filter.put("conditions",conditions);
  754. aiTableParam.setFilter(filter);
  755. /*
  756. 获取数据
  757. */
  758. log.info(JSONObject.toJSONString(aiTableParam));
  759. aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
  760. log.info(JSONObject.toJSONString(aiTableResult));
  761. records = aiTableResult.getRecords();
  762. if(records!=null && !records.isEmpty()){
  763. customerId = records.getJSONObject(0).getString("id");
  764. }
  765. return customerId;
  766. }
  767. @Override
  768. public String addSys1CustomerData(Map<String, Object> fields) throws Exception {
  769. /*
  770. 参数定义
  771. */
  772. String baseId; //AI表格文档ID
  773. String sheetIdOrName; //数据表ID或数据表名称
  774. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  775. JSONObject insertData = new JSONObject(); //HTTP请求体
  776. JSONArray insertRecords = new JSONArray(); //新增记录集合
  777. JSONObject insertRecord = new JSONObject(); //新增记录行数据
  778. String result; //返回结果
  779. JSONObject resultJSONObject;
  780. JSONArray aitableIdJSONArray;
  781. String aitableId = ""; //AI表格记录ID
  782. /*
  783. 项目总表
  784. */
  785. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  786. sheetIdOrName = "E6RcJi3";
  787. /*
  788. 初始化参数值
  789. */
  790. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  791. insertRecord.put("fields",fields);
  792. insertRecords.add(insertRecord);
  793. insertData.put("records",insertRecords);
  794. /*
  795. 新增数据
  796. */
  797. log.info(JSONObject.toJSONString(insertData));
  798. result = mdTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
  799. log.info(result);
  800. resultJSONObject = JSONObject.parseObject(result);
  801. aitableIdJSONArray = resultJSONObject.getJSONArray("value");
  802. if(aitableIdJSONArray!=null || !aitableIdJSONArray.isEmpty()){
  803. aitableId = aitableIdJSONArray.getJSONObject(0).getString("id");
  804. }
  805. return aitableId;
  806. }
  807. @Override
  808. public String updateSys1CustomerData(String id,Map<String, Object> fields) throws Exception {
  809. /*
  810. 参数定义
  811. */
  812. String baseId; //AI表格文档ID
  813. String sheetIdOrName; //数据表ID或数据表名称
  814. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  815. JSONObject updateData = new JSONObject(); //HTTP请求体
  816. JSONArray updateRecords = new JSONArray(); //更新记录集合
  817. JSONObject updateRecord = new JSONObject(); //更新记录行数据
  818. String result; //返回结果
  819. /*
  820. 项目总表
  821. */
  822. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  823. sheetIdOrName = "E6RcJi3";
  824. /*
  825. 初始化参数值
  826. */
  827. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  828. updateRecord.put("id",id);
  829. updateRecord.put("fields",fields);
  830. updateRecords.add(updateRecord);
  831. updateData.put("records",updateRecords);
  832. /*
  833. 更新数据
  834. */
  835. log.info(JSONObject.toJSONString(updateData));
  836. result = mdTableClient.modifyMultiRecords(baseId,sheetIdOrName,param,updateData);
  837. log.info(result);
  838. return result;
  839. }
  840. @Override
  841. public String addSys1SaleData(Map<String,Object> fields) throws Exception {
  842. /*
  843. 参数定义
  844. */
  845. String baseId; //AI表格文档ID
  846. String sheetIdOrName; //数据表ID或数据表名称
  847. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  848. JSONObject insertData = new JSONObject(); //HTTP请求体
  849. JSONArray insertRecords = new JSONArray(); //新增记录集合
  850. JSONObject insertRecord = new JSONObject(); //新增记录行数据
  851. String result; //返回结果
  852. JSONObject resultJSONObject;
  853. JSONArray aitableIdJSONArray;
  854. String aitableId = ""; //AI表格记录ID
  855. /*
  856. 项目总表
  857. */
  858. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  859. sheetIdOrName = "C1mtX34";
  860. /*
  861. 项目总表副本-20260409
  862. */
  863. // baseId = "GZLxjv9VGqBAMDOoHYzrPZzE86EDybno";
  864. // sheetIdOrName = "C1mtX34"; //售前台账
  865. /*
  866. 初始化参数值
  867. */
  868. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  869. insertRecord.put("fields",fields);
  870. insertRecords.add(insertRecord);
  871. insertData.put("records",insertRecords);
  872. /*
  873. 新增数据
  874. */
  875. log.info(JSONObject.toJSONString(insertData));
  876. result = mdTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
  877. log.info(result);
  878. resultJSONObject = JSONObject.parseObject(result);
  879. aitableIdJSONArray = resultJSONObject.getJSONArray("value");
  880. if(aitableIdJSONArray!=null || !aitableIdJSONArray.isEmpty()){
  881. aitableId = aitableIdJSONArray.getJSONObject(0).getString("id");
  882. }
  883. return aitableId;
  884. }
  885. @Override
  886. public String updateSys1SaleData(String id,Map<String, Object> fields) throws Exception {
  887. /*
  888. 参数定义
  889. */
  890. String baseId; //AI表格文档ID
  891. String sheetIdOrName; //数据表ID或数据表名称
  892. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  893. JSONObject updateData = new JSONObject(); //HTTP请求体
  894. JSONArray updateRecords = new JSONArray(); //更新记录集合
  895. JSONObject updateRecord = new JSONObject(); //更新记录行数据
  896. String result; //返回结果
  897. /*
  898. 项目总表
  899. */
  900. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  901. sheetIdOrName = "C1mtX34";
  902. /*
  903. 初始化参数值
  904. */
  905. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  906. updateRecord.put("id",id);
  907. updateRecord.put("fields",fields);
  908. updateRecords.add(updateRecord);
  909. updateData.put("records",updateRecords);
  910. /*
  911. 更新数据
  912. */
  913. log.info(JSONObject.toJSONString(updateData));
  914. result = mdTableClient.modifyMultiRecords(baseId,sheetIdOrName,param,updateData);
  915. log.info(result);
  916. return result;
  917. }
  918. @Override
  919. public String addCustomerABDevData(Map<String, Object> fields) throws Exception {
  920. /*
  921. 参数定义
  922. */
  923. String baseId; //AI表格文档ID
  924. String sheetIdOrName; //数据表ID或数据表名称
  925. Map<String,Object> param = new HashMap<>(); //HTTP请求参数
  926. JSONObject insertData = new JSONObject(); //HTTP请求体
  927. JSONArray insertRecords = new JSONArray(); //新增记录集合
  928. JSONObject insertRecord = new JSONObject(); //新增记录行数据
  929. String result; //返回结果
  930. JSONObject resultJSONObject;
  931. JSONArray aitableIdJSONArray;
  932. String aitableId = ""; //AI表格记录ID
  933. /*
  934. 项目总表
  935. */
  936. baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
  937. sheetIdOrName = "S4bMyJU";
  938. /*
  939. 初始化参数值
  940. */
  941. param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE"); //操作人(Jason)的unionId
  942. insertRecord.put("fields",fields);
  943. insertRecords.add(insertRecord);
  944. insertData.put("records",insertRecords);
  945. /*
  946. 新增数据
  947. */
  948. log.info(JSONObject.toJSONString(insertData));
  949. result = mdTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
  950. log.info(result);
  951. resultJSONObject = JSONObject.parseObject(result);
  952. aitableIdJSONArray = resultJSONObject.getJSONArray("value");
  953. if(aitableIdJSONArray!=null || !aitableIdJSONArray.isEmpty()){
  954. aitableId = aitableIdJSONArray.getJSONObject(0).getString("id");
  955. }
  956. return aitableId;
  957. }
  958. }