purchaseServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package com.malk.lanyun.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.malk.lanyun.service.PurchaseService;
  5. import com.malk.server.aliwork.YDConf;
  6. import com.malk.server.aliwork.YDParam;
  7. import com.malk.server.common.McR;
  8. import com.malk.service.aliwork.YDClient;
  9. import com.malk.service.aliwork.YDService;
  10. import com.malk.service.dingtalk.DDClient;
  11. import com.malk.service.dingtalk.DDClient_Personnel;
  12. import com.malk.utils.UtilMap;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.jdbc.core.JdbcTemplate;
  17. import org.springframework.stereotype.Service;
  18. import java.time.LocalDate;
  19. import java.time.LocalDateTime;
  20. import java.time.ZoneId;
  21. import java.util.*;
  22. import java.util.stream.Collectors;
  23. @Service
  24. @Slf4j
  25. public class purchaseServiceImpl implements PurchaseService {
  26. @Value("${dingtalk.appKey}")
  27. private String dingtalkAppKey;
  28. @Value("${dingtalk.appSecret}")
  29. private String dingtalkAppSecret;
  30. @Value("${dingtalk.agentId}")
  31. private Long agentId;
  32. @Autowired
  33. private JdbcTemplate jdbcTemplate;
  34. @Autowired
  35. private YDService ydService;
  36. @Autowired
  37. private YDClient ydClient;
  38. @Autowired
  39. private DDClient ddClient;
  40. @Autowired
  41. private DDClient_Personnel ddClientPersonnel;
  42. @Override
  43. public List<Map> selectAllProcured(Map data) {
  44. List<Map> lastList = new ArrayList<>();
  45. Map<String, Object> param = new HashMap<>();
  46. param.put("selectField_mff51th7","否");
  47. if (ObjectUtil.isNotNull(data.get("gszt"))){
  48. param.put("selectField_ltxstp89",data.get("gszt"));
  49. }
  50. if (ObjectUtil.isNotNull(data.get("gysmc"))){
  51. param.put("textField_ltxstp8h",data.get("gysmc"));
  52. }
  53. if ("物耗/配件".equals(data.get("type"))){
  54. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  55. .appType("APP_ERBDTFS82HOVBPL3NFH0")
  56. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  57. .formUuid("FORM-A8064C8333E24DEA88618D018DE0AE84WJPQ")
  58. .searchFieldJson(JSON.toJSONString(param))
  59. .build());
  60. dataList.forEach(e->{
  61. if (Double.parseDouble(e.get("numberField_ltxyjf0s_value").toString()) > 0){
  62. lastList.add(e);
  63. }
  64. });
  65. }else {
  66. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  67. .appType("APP_ERBDTFS82HOVBPL3NFH0")
  68. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  69. .formUuid("FORM-0E95A616B4A54BBBB42AAEEEDCC4D9206XGA")
  70. .searchFieldJson(JSON.toJSONString(param))
  71. .build());
  72. dataList.forEach(e->{
  73. if (Double.parseDouble(e.get("numberField_ltxyjf0s_value").toString()) > 0){
  74. lastList.add(e);
  75. }
  76. });
  77. }
  78. return lastList;
  79. }
  80. @Override
  81. public void startPurchaseOrder(Map data) {
  82. log.info(":{}",data.get("records"));
  83. // ydClient.operateData(YDParam.builder().userId("026150181237-1254068060")
  84. // .appType("APP_ERBDTFS82HOVBPL3NFH0")
  85. // .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  86. // .formUuid("FORM-A4B37CFEB8524947939C00523373532BT3TH")
  87. // .formDataJson(JSON.toJSONString(UtilMap.map("dateField_ls2u8mbv, departmentSelectField_ls2u8mbw, employeeField_ls2u8mbx, tableField_ls2u8mc6, associationFormField_ls2u8mcb, dateField_ls1ky8c5",
  88. // beginTime,department,header,tableList,jsonArray,sendTime)))
  89. // .build(), YDConf.FORM_OPERATION.start);
  90. }
  91. @Override
  92. public List<Map> selectDegreeTemplate() {
  93. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  94. .appType("APP_ERBDTFS82HOVBPL3NFH0")
  95. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  96. .formUuid("FORM-643380CCDB014FF29AAEF983B52346C6IBXS")
  97. .build());
  98. List<Map> sonList = ydService.queryDetails(YDParam.builder().
  99. appType("APP_ERBDTFS82HOVBPL3NFH0")
  100. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  101. .formInstanceId(dataList.get(0).get("formInstanceId").toString())
  102. .formUuid("FORM-643380CCDB014FF29AAEF983B52346C6IBXS")
  103. .tableFieldId("tableField_lr3hv46q")
  104. .build());
  105. return sonList;
  106. }
  107. @Override
  108. public McR updateProcured(Map data) {
  109. List<Map> mapList = (List<Map>) data.get("records");
  110. mapList.forEach(e->{
  111. Double thisBuyNum = Double.parseDouble(e.get("thisBuyNum").toString());//本次采购数量
  112. Double canBuyNum = Double.parseDouble(e.get("numberField_ltxyjf0s").toString());//可下单数量
  113. Double buyingNum = Double.parseDouble(e.get("numberField_ltxyjf0r").toString());//申请中数量
  114. String isAll = "否";
  115. if (thisBuyNum == canBuyNum){
  116. isAll = "是";
  117. }
  118. ydClient.operateData(YDParam.builder()
  119. .appType("APP_ERBDTFS82HOVBPL3NFH0")
  120. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  121. .formInstanceId(e.get("formInstanceId").toString())
  122. .useLatestVersion(true)
  123. .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_ltxyjf0s, numberField_ltxyjf0r, selectField_mff51th7",canBuyNum-thisBuyNum,buyingNum+buyingNum,isAll)))
  124. .build(), YDConf.FORM_OPERATION.update);
  125. });
  126. return McR.error("400","更新错误");
  127. }
  128. @Override
  129. public List<Map> selectAllProcuredNew(Map data) {
  130. LocalDateTime firstDay = LocalDateTime.now().plusMonths(-1).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
  131. // 获取月份的最后一天
  132. LocalDateTime lastDay = LocalDateTime.now().withDayOfMonth(LocalDate.now().plusMonths(-1).lengthOfMonth())
  133. .withHour(23).withMinute(59).withSecond(59).withNano(999999999);
  134. // 转换回时间戳
  135. long firstDayTimestamp = firstDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  136. long lastDayTimestamp = lastDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  137. List<String> dateList = new ArrayList<>();
  138. dateList.add(String.valueOf(firstDayTimestamp));
  139. dateList.add(String.valueOf(lastDayTimestamp));
  140. //项目点数据
  141. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  142. .appType("APP_ERBDTFS82HOVBPL3NFH0")
  143. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  144. .formUuid("FORM-A8064C8333E24DEA88618D018DE0AE84WJPQ")
  145. .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_ltxstp81",dateList)))
  146. .build());
  147. //过滤参与批量发起为否的数据
  148. dataList = dataList.stream().filter(map -> !"否".equals(map.get("selectField_mgswtsqu"))).collect(Collectors.toList());
  149. return dataList;
  150. }
  151. @Override
  152. public void startPurchaseOrderNew(String formInstanceId) {
  153. LocalDateTime firstDay = LocalDateTime.now().plusYears(-1).plusMonths(-11).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
  154. // 获取月份的最后一天
  155. LocalDateTime lastDay = LocalDateTime.now().plusYears(-1).plusMonths(1).withDayOfMonth(LocalDate.now().lengthOfMonth())
  156. .withHour(23).withMinute(59).withSecond(59).withNano(999999999);
  157. // 转换回时间戳
  158. long firstDayTimestamp = firstDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  159. long lastDayTimestamp = lastDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  160. List<String> dateList = new ArrayList<>();
  161. dateList.add(String.valueOf(firstDayTimestamp));
  162. dateList.add(String.valueOf(lastDayTimestamp));
  163. //项目点数据
  164. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  165. .appType("APP_ERBDTFS82HOVBPL3NFH0")
  166. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  167. .formUuid("FORM-A8064C8333E24DEA88618D018DE0AE84WJPQ")
  168. .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_ltxstp81",dateList)))
  169. .build());
  170. //过滤参与批量发起为否的数据
  171. dataList = dataList.stream().filter(map -> "是".equals(map.get("selectField_mgswtsqu"))).collect(Collectors.toList());
  172. //分组求和
  173. Map<Object, Long> groupCountMap = dataList.stream()
  174. .collect(Collectors.groupingBy(
  175. //成本组织编码 + 供应商编码 + 项目点编号
  176. map -> (String) map.get("textField_lus384vk")
  177. + "-" + map.get("textField_ltxstp8g")
  178. + "=" + map.get("textField_ltxstp86"),
  179. Collectors.counting()
  180. ));
  181. Comparator<Map.Entry<Object, Long>> comparator = Map.Entry.comparingByValue();
  182. // if (!ascending) {
  183. comparator = comparator.reversed();
  184. // }
  185. // 3. 转换为List<Map>格式返回
  186. List<Map<String, Object>> collect = groupCountMap.entrySet().stream()
  187. .sorted(comparator)
  188. .map(entry -> {
  189. Map<String, Object> result = new HashMap<>();
  190. String[] split = entry.getKey().toString().split("=");
  191. result.put("groupBy",split[0]);
  192. result.put("orderNum", split[1]);
  193. result.put("count", entry.getValue());
  194. return result;
  195. })
  196. .collect(Collectors.toList());
  197. // 记录已经处理过的key,避免重复添加
  198. Set<String> processedKeys = new HashSet<>();
  199. List<Map> lastDataList = new ArrayList<>();
  200. for (int i = 0; i < collect.size(); i++) {
  201. String orderNumI = UtilMap.getString(collect.get(i), "orderNum");
  202. //相加成功的作为一个list
  203. if (!processedKeys.contains(orderNumI)) {
  204. processedKeys.add(orderNumI);
  205. List<String> orders = new ArrayList<>();
  206. orders.add(orderNumI);
  207. //第一层的数据条数
  208. int countI = UtilMap.getInt(collect.get(i), "count");
  209. String groupBy = UtilMap.getString(collect.get(i), "groupBy");
  210. if (countI < 100) {
  211. //数据处理
  212. for (int r = collect.size() - 1; r >= 0; r--) {
  213. String orderNumR = UtilMap.getString(collect.get(r), "orderNum");
  214. if (!processedKeys.contains(orderNumR) && groupBy.equals(collect.get(r).get("groupBy"))) {
  215. int countR = UtilMap.getInt(collect.get(r), "count");
  216. if (countI + countR > 100) {
  217. continue;
  218. } else if (countI + countR == 100) {
  219. processedKeys.add(orderNumR);
  220. orders.add(orderNumR);
  221. countI += countR;
  222. break;
  223. } else if (countI + countR < 100) {
  224. processedKeys.add(orderNumR);
  225. orders.add(orderNumR);
  226. countI += countR;
  227. }
  228. }
  229. }
  230. } else if (countI == 100) {
  231. continue;
  232. }
  233. //记录重复key
  234. lastDataList.add(UtilMap.map(groupBy, orders));
  235. // lastDataList.add(UtilMap.map(String.valueOf(UUID.randomUUID()), orders));
  236. }
  237. }
  238. List<Map> finalDataList = dataList;
  239. final int[] totalCount = {0};
  240. final double[] amountSum = {0.0};
  241. final int[] successCount = {0};
  242. final int[] errorCount = {0};
  243. try {
  244. lastDataList.forEach(e->{
  245. //根据第一步拼接好的集合做发起流程操作
  246. List<Map> tableList = new ArrayList<>();
  247. final String[] cbzz = {"",""};
  248. final String[] gys = {"",""};
  249. e.forEach((k,v)->{
  250. List<String> v1 = (List<String>) v;
  251. if (v1.size()>=3){
  252. //供应商数据
  253. String[] split = k.toString().split("-");
  254. List<Map> gysList = ydService.queryFormData_all(YDParam.builder()
  255. .appType("APP_ERBDTFS82HOVBPL3NFH0")
  256. .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  257. .formUuid("FORM-87B1C91392824C5AA9330F574C157622855R")
  258. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lrhgjspd",split[1])))
  259. .build());
  260. List<Map> gysAss = new ArrayList<>();
  261. gysAss.add(UtilMap.map("formType, formUuid, instanceId, appType, title, subTitle", "receipt", "FORM-87B1C91392824C5AA9330F574C157622855R",
  262. gysList.get(0).get("formInstanceId"), "APP_ERBDTFS82HOVBPL3NFH0", gysList.get(0).get("textField_lrhgjspc"), ""));
  263. for (String s : (List<String>) v) {
  264. List<Map> costList = finalDataList.stream().filter(map -> s.equals(map.get("textField_ltxstp86"))
  265. && split[0].equals(map.get("textField_lus384vk"))
  266. && split[1].equals(map.get("textField_ltxstp8g"))).collect(Collectors.toList());
  267. costList.forEach(c->{
  268. gys[0] = UtilMap.getString(c,"textField_ltxstp8g");
  269. gys[1] = UtilMap.getString(c,"textField_ltxstp8h");
  270. cbzz[0] = UtilMap.getString(c,"textField_lus384vk");
  271. cbzz[1] = UtilMap.getString(c,"selectField_ltxstp89");
  272. extracted(totalCount, amountSum, tableList, c);
  273. });
  274. }
  275. /*发起流程*/
  276. // ydClient.operateData(YDParam.builder()
  277. // .appType("APP_ERBDTFS82HOVBPL3NFH0")
  278. // .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  279. // .formUuid("FORM-70F543E10887467188485B1E8AB3FFFDJUGK")
  280. // .formDataJson(JSON.toJSONString(UtilMap.map("selectField_lr26l3h7, textField_lus384vk, selectField_lr26l3h8, " +
  281. // "textField_lr26l3hf, textField_lwg62y7o, numberField_lr26l3hq, numberField_lr26l3hr, tableField_ltxug6h1",
  282. // cbzz[1], cbzz[0], "物耗/配件", gys[0], gysAss, totalCount[0], amountSum[0], tableList)))
  283. // .build(), YDConf.FORM_OPERATION.start);
  284. }
  285. });
  286. successCount[0]++;
  287. });
  288. } catch (Exception ex) {
  289. errorCount[0]++;
  290. ex.printStackTrace();
  291. return;
  292. }
  293. // ydClient.operateData(YDParam.builder()
  294. // .appType("APP_ERBDTFS82HOVBPL3NFH0")
  295. // .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
  296. // .formInstanceId(formInstanceId)
  297. //// .useLatestVersion(true)
  298. //// .updateFormDataJson(JSONObject.toJSONString(new HashMap<>()))
  299. // .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_mhdgj16d, textField_mhdgj16e, textField_mhdgj16f, textField_mhdgj16g",
  300. // lastDataList.size(),successCount[0],errorCount[0],"同步完毕")))
  301. // .build(), YDConf.FORM_OPERATION.update);
  302. log.info("总条数:{} 执行成功条数:{} 失败条数:{}",lastDataList.size(),successCount[0],errorCount[0]);
  303. }
  304. private void extracted(int[] totalCount, double[] amountSum, List<Map> tableList, Map i) {
  305. Map<String, Object> tableData = UtilMap.map("textField_lu22o9f1, textField_ltxug6gp, textField_lus3rn9y, textField_lus3rn9x, " +
  306. "textField_ltxug6gn, numberField_ltxug6gq, numberField_mff54y69, numberField_ltxug6gr, " +
  307. "numberField_ltxug6gs, numberField_lv1rs4aa, numberField_ltxug6gt, numberField_lvvyh9la, " +
  308. "numberField_lyinhl6g, textField_ltxug6gu, textField_lup6gfl1, textField_lu22o9f0, " +
  309. "textField_lu2gyq5g, textField_lu825bqq, addressField_m1mxxnin, textField_ltxug6gw, " +
  310. "textField_lufl71pv, textField_lu825bqp, employeeField_lwa3x3uh, employeeField_lwa3x3ui, " +
  311. "employeeField_lxu7fhde, associationFormField_ltxug6gm",
  312. UtilMap.getString(i, "textField_ltxstp84"), UtilMap.getString(i, "textField_ltxstp8c"),
  313. UtilMap.getString(i, "textField_ltxstp8e"), UtilMap.getString(i, "textField_ltxstp8f"),
  314. UtilMap.getString(i, "textField_ltxstp8a"), UtilMap.getString(i, "buyNum"),
  315. UtilMap.getString(i, "numberField_ltxyjf0s"), UtilMap.getString(i, "numberField_ltxstp8l"),
  316. UtilMap.getString(i, "numberField_ltxstp8d"), UtilMap.getString(i, "numberField_lv1r2pay"),
  317. UtilMap.getString(i, "inTaxAmount"), UtilMap.getString(i, "outTaxAmount"),
  318. UtilMap.getString(i, "taxAmount"), UtilMap.getString(i, "textField_ltxstp8n"),
  319. UtilMap.getString(i, "textField_ltxstp85"), UtilMap.getString(i, "textField_ltxstp86"),
  320. UtilMap.getString(i, "textField_ltxstp88"), UtilMap.getString(i, "textField_luhs4y3r"),
  321. UtilMap.getString(i, "addressField_lt4209fv"), UtilMap.getString(i, "textField_ltxstp87"),
  322. UtilMap.getString(i, "textField_ltxstp8b"), UtilMap.getString(i, "textField_ltxstp7y"),
  323. UtilMap.getString(i, "employeeField_lwa3x3uh"), UtilMap.getString(i, "employeeField_lwa3x3ui"),
  324. UtilMap.getString(i, "employeeField_lx03kyul"),
  325. Arrays.asList(UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_ERBDTFS82HOVBPL3NFH0",
  326. "FORM-0E95A616B4A54BBBB42AAEEEDCC4D9206XGA","receipt", UtilMap.getString(i,"formInstanceId"),
  327. UtilMap.getString(i,"textField_ltxstp8b"), UtilMap.getString(i,"textField_ltxstp84"))));
  328. tableList.add(tableData);
  329. totalCount[0] = totalCount[0] + UtilMap.getInt(i,"numberField_ltxyjf0s");
  330. amountSum[0] = amountSum[0] + UtilMap.getDouble(i,"numberField_ltxstp8l") * UtilMap.getInt(i,"numberField_ltxyjf0s");
  331. }
  332. }