HeiHuOrderServiceImpl.java 119 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
  1. package com.malk.fenggefushi.service.Impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fasterxml.jackson.core.JacksonException;
  7. import com.fasterxml.jackson.core.JsonProcessingException;
  8. import com.fasterxml.jackson.databind.JsonNode;
  9. import com.fasterxml.jackson.databind.ObjectMapper;
  10. import com.malk.fenggefushi.service.HeiHuOrderService;
  11. import com.malk.server.aliwork.YDConf;
  12. import com.malk.server.aliwork.YDParam;
  13. import com.malk.server.aliwork.YDSearch;
  14. import com.malk.server.common.McR;
  15. import com.malk.server.dingtalk.DDConf;
  16. import com.malk.service.aliwork.YDClient;
  17. import com.malk.service.aliwork.YDService;
  18. import com.malk.utils.UtilHttp;
  19. import com.malk.utils.UtilMap;
  20. import lombok.SneakyThrows;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.stereotype.Service;
  24. import java.time.Instant;
  25. import java.time.LocalDate;
  26. import java.time.LocalDateTime;
  27. import java.time.ZoneId;
  28. import java.time.format.DateTimeFormatter;
  29. import java.util.*;
  30. import java.util.stream.Collectors;
  31. @Slf4j
  32. @Service
  33. public class HeiHuOrderServiceImpl implements HeiHuOrderService {
  34. @Autowired
  35. private YDClient ydClient;
  36. @Autowired
  37. private YDConf ydConf;
  38. @Autowired
  39. private YDService ydService;
  40. @Autowired
  41. private DDConf ddConf;
  42. /*登录获取黑湖登录token*/
  43. @Override
  44. public McR HeiHuAccessToken() throws JacksonException {
  45. HashMap body = new HashMap();
  46. body.put("type",1);//type=1,登录方式为工厂代号+账号+密码
  47. body.put("code","648910");//工厂代号
  48. body.put("username","FGJK");//账号
  49. body.put("password","b715db070346a8a59e0eba5da27f8e4938536bb7867e09592326fde2");//密码加密
  50. HashMap header = new HashMap();
  51. header.put("X-CLIENT","lite-web");//固定
  52. header.put("Content-Type","application/json");
  53. String s = UtilHttp.doPost("https://liteweb.blacklake.cn/api/user/v1/users/_login", header, null, body);
  54. String data = new ObjectMapper().readTree(s).get("data").asText();
  55. return McR.success(data);
  56. }
  57. /*抓取黑湖工单发起宜搭审批流程*/
  58. @Override
  59. public McR StartYidaAproval(String OrderNo,String fromUuid) throws JacksonException {
  60. HashMap header = new HashMap();
  61. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  62. header.put("Content-Type","application/json");
  63. HashMap body = new HashMap();
  64. body.put("orderNo",OrderNo);//订单编码
  65. /*TODO:对json进行处理*/
  66. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body);
  67. JSONObject jsonObject = JSONObject.parseObject(jsonString);
  68. JSONArray dataArray = jsonObject.getJSONArray("data");
  69. //基础信息字段
  70. String orderNo = ""; String customerName = "";Long orderTime = null;Long arrivalPlanTime = null;String contractNo = "";
  71. String operatorName = "";double orderDiscount = 0;String customerCode = "";
  72. // 提取自定义字段
  73. String productPhoto = "";//产品照片:182852
  74. String sampleType = "";//样品类型:69230
  75. String processType = "";//工艺类型:47768
  76. String productType = "";//产品类型:47770
  77. String orderType = "";//订单类型:47771
  78. String department = "";//部门:47777
  79. String season = "";//季节:47778
  80. String expectedOrderQty = "";//预计下单量:59314
  81. double estimatedUnitPrice = 0;//辅料预估单价:161769
  82. String purchaseOrderNumber = "";//对应预采购单号:113495
  83. String qualityConfirmation = "";//品质确认:113119
  84. String materialCycle = "";//物料周期:113086
  85. //产品详情字段
  86. String productCode = "";String productName = "";String productSpec = "";int productStockQty;int qty;
  87. String productUnitName = "";double unitPrice;double amount;double discount;double taxInclusiveAmount;
  88. double taxRate;String productArrivalPlanTime = "";String productOriginType = "";
  89. //其他信息
  90. String contactName = "";String contactNumbers = "";String contactAddress = "";
  91. for (int i = 0; i < dataArray.size(); i++) {
  92. JSONObject data = dataArray.getJSONObject(i);
  93. // 提取订单基本信息
  94. orderNo = data.getString("orderNo");//订单编号:orderNo
  95. customerName = data.getString("customerName");//客户:customerName
  96. orderTime = data.getLong("orderTime");//下单日期:orderTime
  97. arrivalPlanTime = data.getLong("arrivalPlanTime");//计划交货日期:arrivalPlanTime
  98. contractNo = data.getString("contractNo");//合同号:contractNo
  99. operatorName = data.getString("operatorName");//业务员:operatorName
  100. orderDiscount = data.getDoubleValue("orderDiscount")*100;//整单折扣:orderDiscount
  101. customerCode = data.getString("customerCode");//客户名称:customerCode
  102. //提取其他信息
  103. contactName = data.getString("contactName");//联系人
  104. contactNumbers = data.getString("contactNumbers");//联系电话
  105. contactAddress = data.getString("contactAddress");//联系地址
  106. JSONArray customFields = data.getJSONArray("customFieldValues");
  107. if (customFields != null) {
  108. for (int j = 0; j < customFields.size(); j++) {
  109. JSONObject field = customFields.getJSONObject(j);
  110. long fieldId = field.getLongValue("fieldId");
  111. String value = field.getString("value");
  112. switch ((int)fieldId) {
  113. case 70931: productPhoto = value; break;
  114. case 69230: sampleType = value; break;
  115. case 47768: processType = value; break;
  116. case 47770: productType = value; break;
  117. case 47771: orderType = value; break;
  118. case 47777: department = value; break;
  119. case 47778: season = value; break;
  120. case 59314: expectedOrderQty = value;break;
  121. case 161769: estimatedUnitPrice = Double.parseDouble(value);break;
  122. case 113495:purchaseOrderNumber = value;break;
  123. case 113119:qualityConfirmation = value;break;
  124. case 113086:materialCycle = value;break;
  125. }
  126. }
  127. }
  128. }
  129. /*判断订单类型来封装数据*/
  130. HashMap formdata = new HashMap();
  131. /*主表*/
  132. formdata.put("textField_mfqgmwcw",orderNo);
  133. formdata.put("textField_mfqgmwcx",customerName);
  134. formdata.put("dateField_mfqgmwcy",orderTime);
  135. formdata.put("dateField_mfqgmwcz",arrivalPlanTime);
  136. formdata.put("textField_mfqgmwd5",contractNo);
  137. formdata.put("textField_mgc0kc5u",operatorName);
  138. formdata.put("numberField_mfqgmwd7",orderDiscount);
  139. formdata.put("selectField_mg5y3rcr",orderType);
  140. formdata.put("textField_mfqgmwdn",processType);
  141. formdata.put("textField_mfqgmwdo",productType);
  142. formdata.put("textField_mg5y3rda",department);
  143. formdata.put("textField_mfqgmwdx",season);
  144. formdata.put("textField_mfqi6ui8",contactName);
  145. formdata.put("textField_mfqi6ui9",contactNumbers);
  146. formdata.put("textField_mfqi6uia",contactAddress);
  147. List<Map<String, Object>> imageAttachments = new ArrayList<>();
  148. //处理多照片
  149. if(productPhoto != null && productPhoto.contains(",")){
  150. String[] photoUrls = productPhoto.split(",");
  151. for (String url : photoUrls){
  152. String trimmedUrl = url.trim();
  153. if(!trimmedUrl.isEmpty()){
  154. Map<String, Object> imageInfo = new HashMap<>();
  155. imageInfo.put("name",productType);
  156. imageInfo.put("downloadUrl",trimmedUrl);
  157. imageInfo.put("previewUrl",trimmedUrl);
  158. imageInfo.put("url",trimmedUrl);
  159. imageInfo.put("ext","png");
  160. imageAttachments.add(imageInfo);
  161. }
  162. }
  163. }else {
  164. HashMap<String,Object> imageInfo = new HashMap();
  165. imageInfo.put("name",productType);
  166. imageInfo.put("downloadUrl",productPhoto);
  167. imageInfo.put("previewUrl",productPhoto);
  168. imageInfo.put("url",productPhoto);
  169. imageInfo.put("ext","png");
  170. imageAttachments.add(imageInfo);
  171. }
  172. formdata.put("imageField_mfqgmwde",imageAttachments);
  173. if(orderType.equals("样品订单")){
  174. formdata.put("textField_mfqgmwdh",customerCode);
  175. formdata.put("textField_mg5y3rdd",sampleType);
  176. formdata.put("textField_mgc1xl62",expectedOrderQty);
  177. }else if(orderType.equals("贸易公司订单")){
  178. formdata.put("numberField_mg5y3rcx",estimatedUnitPrice);
  179. formdata.put("textField_mg5y3rcy",purchaseOrderNumber);
  180. formdata.put("textField_mg5y3rcz",qualityConfirmation);
  181. formdata.put("textField_mg5y3rd0",materialCycle);
  182. formdata.put("textField_mfqgmwdh",customerCode);
  183. }else{
  184. formdata.put("textField_mfqgmwdh",customerCode);
  185. }
  186. /*子表*/
  187. JSONArray products = jsonObject.getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");
  188. List<Map<String,Object>> tableData = new ArrayList();
  189. if (products != null) {
  190. for (int i = 0; i < products.size(); i++) {
  191. JSONObject detail = products.getJSONObject(i);
  192. HashMap row = new HashMap();
  193. //
  194. String color = "";
  195. JSONArray array1 = detail.getJSONArray("customFieldValues");
  196. color = array1.stream()
  197. .map(obj -> (JSONObject) obj)
  198. .filter(item -> item.getIntValue("fieldId") == 82259)
  199. .map(item -> item.getString("value"))
  200. .findFirst()
  201. .orElse(null);
  202. ArrayList colorList = new ArrayList();
  203. colorList.add(color);
  204. String color_AAA = getProductColor(colorList);
  205. row.put("textField_mk0jz9i1",color_AAA);//中文颜色
  206. row.put("textField_mfqgmwe1",detail.getString("productCode"));//产品编号
  207. row.put("textField_mfqgmwe2",detail.getString("productName"));//产品名称
  208. row.put("textField_mfqgmwe3",detail.getString("productSpec"));//产品规格
  209. row.put("textField_mfqgmwe4","0".equals(detail.getString("productOriginType")) ? "自制" : "其它");//产品属性
  210. row.put("numberField_mfqgmwe5",detail.getIntValue("productStockQty"));//库存数量
  211. row.put("numberField_mfqgmwe6",detail.getIntValue("qty"));//数量
  212. row.put("textField_mfqgmwe7",detail.getString("productUnitName"));//单位
  213. row.put("numberField_mfqgmwe8",detail.getDoubleValue("unitPrice"));//单价
  214. row.put("numberField_mfqgmwe9",detail.getDoubleValue("amount"));//报价金额
  215. row.put("numberField_mfqgmwea",detail.getDoubleValue("discount")*100);//折扣
  216. row.put("numberField_mfqgmweb",detail.getDoubleValue("taxInclusiveAmount"));//折扣
  217. row.put("numberField_mfqgmwec",detail.getDoubleValue("taxRate"));//税率
  218. row.put("dateField_mfqgmwed",detail.getLong("arrivalPlanTime"));//产品交货日期
  219. tableData.add(row);
  220. }
  221. }
  222. formdata.put("tableField_mfqgmwe0",tableData);
  223. System.out.println(formdata);
  224. /*发起流程*/
  225. String userid = getDDToken(operatorName);
  226. String dd = ydClient.operateData(YDParam.builder()
  227. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  228. .formUuid(fromUuid)
  229. .userId(userid)
  230. .formDataJson(JSON.toJSONString(formdata))
  231. .build(), YDConf.FORM_OPERATION.start).toString();
  232. log.info("----------【销售订单】已发起----------");
  233. return McR.success(dd);
  234. }
  235. @Override
  236. public String getDDToken(String Name) {
  237. HashMap body = new HashMap();
  238. body.put("appKey","dingie28nalt6tcnzizl");
  239. body.put("appSecret","Ss7na86M_BWPEXhKffiQDA-8jXvuBhBklfD8C-ot7xGwiDKfFMIf9y00mXYutfCB");
  240. String s = UtilHttp.doPost("https://api.dingtalk.com/v1.0/oauth2/accessToken", null, null, body);
  241. String accessToken = JSONObject.parseObject(s).getString("accessToken");
  242. HashMap header = new HashMap();
  243. header.put("x-acs-dingtalk-access-token",accessToken);
  244. HashMap bodyy = new HashMap();
  245. bodyy.put("queryWord", Name);
  246. bodyy.put("offset",0);
  247. bodyy.put("size",10);
  248. String s1 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/users/search", header, null, bodyy);
  249. List<String> list = JSONObject.parseObject(s1).getJSONArray("list").toJavaList(String.class);
  250. String userId = "";
  251. if(list!= null && !list.isEmpty()){
  252. userId = list.get(0);
  253. }
  254. return userId;
  255. }
  256. @SneakyThrows
  257. @Override
  258. public McR startYidaProcurementAproval(String OrderNo,String FormUuType) throws JsonProcessingException {
  259. HashMap header = new HashMap();
  260. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  261. header.put("Content-Type","application/json");
  262. HashMap body = new HashMap();
  263. body.put("orderCode",OrderNo);//订单编号
  264. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//todo:查询采购订单
  265. JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
  266. //基础信息字段
  267. String orderCode = "";String shortName = "";Long purchaseTime = null;Long planArrivalTime = null;String purchaserName = "";
  268. String gysnumber = "";
  269. double orderDiscount = 0;
  270. //自定义信息
  271. String department = "";//部门:186341
  272. String add = "";//地址:32869
  273. String SalesOrderNumber = "";//销售订单号:59332
  274. String PaymentStatus = "";//付款情况:55674
  275. String PortOfShipment = "";//出运地:42003
  276. String ShippingStatus = "";//出运状态:42002
  277. //产品详情字段
  278. String productCode = "";String productName = "";String productSpec = "";int purchaseNum;
  279. String unitName = "";double purchasePrice;double purchaseAmount;double discount;double taxInclusiveAmount;
  280. double taxRate;Long productArrivalPlanTime = null;
  281. //其他信息
  282. String contactName = "";String contactNumber = "";String contactAddress = "";
  283. for (int i=0;i<dataArray.size();i++){
  284. JSONObject data = dataArray.getJSONObject(i);
  285. //提取订单基本信息
  286. orderCode = data.getString("orderCode");//订单编号:orderCode
  287. shortName = data.getString("shortName");//供应商:shortName
  288. gysnumber = data.getString("vendorCode");//供应商编码:gysnumber
  289. purchaseTime = data.getLong("purchaseTime");//采购日期:purchaseTime
  290. planArrivalTime = data.getLong("planArrivalTime");//计划到货日期:planArrivalTime
  291. purchaserName = data.getString("purchaserName");//采购员:purchaserName
  292. orderDiscount = data.getDouble("orderDiscount");//整单折扣:orderDiscount
  293. //其他信息
  294. contactName = data.getString("contactName");//联系人
  295. contactNumber = data.getString("contactNumber");//联系电话
  296. contactAddress = data.getString("contactAddress");//联系地址
  297. //自定义信息
  298. JSONArray customFields = data.getJSONArray("customFieldValues");
  299. if(customFields != null){
  300. for (int j = 0; j < customFields.size(); j++) {
  301. JSONObject field = customFields.getJSONObject(j);
  302. long fieldId = field.getLongValue("fieldId");
  303. String value = field.getString("value");
  304. switch ((int)fieldId){
  305. case 186341: department = value;break;
  306. case 59391:
  307. JSONObject associatedDetail = field.getJSONObject("associatedObjectValueDetail");
  308. if(associatedDetail != null && !associatedDetail.isEmpty()) {
  309. add = associatedDetail.getString("vendorContactAddress");
  310. }
  311. break;
  312. case 59332: SalesOrderNumber = value;break;
  313. case 55674: PaymentStatus = value;break;
  314. case 42003: PortOfShipment = value;break;
  315. case 42002: ShippingStatus = value;break;
  316. }
  317. }
  318. }
  319. }
  320. /*开始封装数据*/
  321. //采购订单-基础信息
  322. HashMap formdata = new HashMap();
  323. formdata.put("textField_mfqia327",orderCode);
  324. formdata.put("textField_mfqia328",shortName);
  325. formdata.put("textField_mkaudmn6",gysnumber);
  326. formdata.put("dateField_mfqia329",purchaseTime);
  327. formdata.put("dateField_mfqia32a",planArrivalTime);
  328. formdata.put("employeeField_mfqia32g",getDDToken(purchaserName));
  329. formdata.put("numberField_mfqia32h",orderDiscount*100);
  330. //采购订单-自定义
  331. formdata.put("textField_mfqia32o",department);
  332. formdata.put("textField_mfqia32q",add);
  333. formdata.put("textField_mfqia32r",SalesOrderNumber);
  334. formdata.put("textField_mfqia32x",PaymentStatus);
  335. formdata.put("textField_mfqia32y",PortOfShipment);
  336. formdata.put("textField_mfqia32z",ShippingStatus);
  337. //采购订单-其他信息
  338. formdata.put("textField_mg4gqve0",contactName);
  339. formdata.put("textField_mg4gqve1",contactNumber);
  340. formdata.put("textareaField_mg4gqve2",contactAddress);
  341. //采购订单-子表
  342. JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
  343. ArrayList<Map<String,Object>> tableData = new ArrayList();
  344. if(products != null){
  345. for (int i = 0; i < products.size(); i++) {
  346. JSONObject detail = products.getJSONObject(i);
  347. HashMap row = new HashMap();
  348. row.put("textField_mfqia332",detail.getString("productCode"));//产品编码
  349. row.put("textField_mfqia333",detail.getString("productName"));//产品名称
  350. row.put("textField_mfqia334",detail.getString("productSpec"));//产品规格
  351. row.put("numberField_mfqia335",detail.getInteger("purchaseNum"));//采购数量
  352. row.put("textField_mfqia336",detail.getString("unitName"));//单位
  353. row.put("numberField_mfqia337",detail.getDouble("purchasePrice"));//单价
  354. row.put("numberField_mg4gqvdm",detail.getDouble("purchaseAmount"));//报价金额
  355. row.put("numberField_mg4gqvdn",detail.getDouble("discount"));//折扣
  356. row.put("numberField_mg4gqvdo",detail.getDouble("taxInclusiveAmount"));//含税金额
  357. row.put("numberField_mg4gqvdp",detail.getDouble("taxRate"));//税率
  358. row.put("dateField_mg4gqvdq",detail.getLong("productArrivalTime"));//产品到货日期
  359. tableData.add(row);
  360. }
  361. }
  362. /*todo:新版栏目:客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别、生产工厂、采购单价、采购金额、利润率、美金汇率、辅料预估成本*/
  363. String customerName = "",styleNumber = "",productDescription = "",color = "",currency = "";
  364. Double number,unitPrice,salesAmount;
  365. Double rate = 1.00;Double saletotalAmount = 0.00;Double procuretotalAmount = 0.00;Double saletotalnum =0.00;
  366. Double estimatedtotalAmount = 0.00;Double estimatedPrice = 0.00;
  367. Double USDrate = 0.00;Double flygcb = 0.00;
  368. ObjectMapper objectMapper = new ObjectMapper();
  369. JsonNode rootNode = objectMapper.readTree(jsonString);
  370. JsonNode dataNode = rootNode.get("data");
  371. String orderNumber = "";//销售订单编号
  372. if(dataNode != null && dataNode.isArray()){
  373. for(JsonNode item : dataNode){
  374. JsonNode orderNoNode = item.get("orderCode");
  375. JsonNode saleOrders = item.get("relationSaleOrders");
  376. if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
  377. orderNumber = saleOrders.get(0).asText();
  378. }
  379. }
  380. }
  381. HashMap body_A = new HashMap();
  382. body_A.put("orderNo",orderNumber);
  383. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
  384. JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
  385. for(int i=0;i<array.size();i++){
  386. JSONObject data = array.getJSONObject(i);
  387. customerName = data.getString("customerCode");//客户名称
  388. }
  389. ObjectMapper objectMapper2 = new ObjectMapper();
  390. JsonNode dataNode2 = objectMapper2.readTree(jsonString2).get("data");//主表数据
  391. for (JsonNode item : dataNode2){
  392. JsonNode customFieldValues = item.get("customFieldValues");
  393. for (JsonNode field : customFieldValues){
  394. JsonNode fieldIdNode = field.get("fieldId");
  395. if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
  396. JsonNode valueNode = field.get("value");
  397. if(valueNode != null){
  398. estimatedPrice = valueNode.asDouble();//辅料预估单价
  399. break;
  400. }
  401. }
  402. }
  403. }
  404. JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
  405. List<Map<String,String>> tabledata = new ArrayList();
  406. if(products_A != null){
  407. for (int i=0;i<products_A.size();i++){
  408. JSONObject detail = products_A.getJSONObject(i);
  409. HashMap row = new HashMap();
  410. row.put("textField_mhsj6gtn",customerName);//todo:客户
  411. row.put("textField_mhsj6gto",orderNumber);//todo:订单号
  412. styleNumber = detail.getString("productCode");//款号
  413. row.put("textField_mhsj6gtp",styleNumber);//todo:款号
  414. productDescription = detail.getString("productName");//产品描述
  415. row.put("textField_mhsj6gtq",productDescription);//todo:产品描述
  416. JSONArray array1 = detail.getJSONArray("customFieldValues");
  417. color = array1.stream()
  418. .map(obj -> (JSONObject) obj)
  419. .filter(item -> item.getIntValue("fieldId") == 82259)
  420. .map(item -> item.getString("value"))
  421. .findFirst()
  422. .orElse(null);
  423. ArrayList colorList = new ArrayList();
  424. colorList.add(color);
  425. String color_AAA = getProductColor(colorList);
  426. row.put("textField_mhsj6gtr",color_AAA);//todo:颜色
  427. number = detail.getDoubleValue("qty");//数量
  428. row.put("numberField_mhsj6gts",number);//todo:数量
  429. saletotalnum = saletotalnum + number;
  430. unitPrice = detail.getDoubleValue("unitPrice");//销售单价
  431. row.put("numberField_mhsj6gtt",unitPrice);//todo:销售单价
  432. salesAmount = number * unitPrice;//销售金额
  433. row.put("numberField_mhsj6gtu",salesAmount);//todo:销售金额
  434. String customFieldValues = detail.getString("customFieldValues");
  435. ObjectMapper mapper = new ObjectMapper();
  436. JsonNode jsonarray = mapper.readTree(customFieldValues);
  437. for (JsonNode node : jsonarray){
  438. if(node.get("fieldId").asInt() == 47919){
  439. currency = node.get("value").asText();
  440. }else if (node.get("fieldId").asInt() == 165251){
  441. rate = node.get("value").asDouble();
  442. USDrate = rate;
  443. }else if (node.get("fieldId").asInt() == 161783) {
  444. flygcb = node.get("value").asDouble();
  445. }
  446. }
  447. row.put("textField_mhtxft3p",currency);//todo:币别
  448. row.put("numberField_ml85btkc",USDrate);//todo:美金汇率
  449. row.put("numberField_ml85btkd",flygcb);//todo:辅料预估成本
  450. //下面是采购订单的明细数据
  451. row.put("textField_mhsj6gtv",shortName);//todo:生产工厂
  452. for(int j=0;j<products.size();j++){
  453. if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
  454. //找到对应的采购一行数据
  455. row.put("numberField_mhsj6gtw",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
  456. row.put("numberField_mhtxft3q",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
  457. row.put("numberField_mhsj6gtx",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
  458. }
  459. }
  460. //销售总金额 币别:人民币 数量*单价 美元:数量*单价*美元汇率
  461. saletotalAmount = (currency.equals("CNY") ? number*unitPrice : number*unitPrice*rate) + saletotalAmount;
  462. //采购订单总金额 均为人民币不存在汇率
  463. procuretotalAmount = products.getJSONObject(i).getDouble("purchasePrice") * products.getJSONObject(i).getDouble("purchaseNum") + procuretotalAmount;
  464. tabledata.add(row);
  465. }
  466. }
  467. //预估辅料总成本 订单总数量*辅料预估单价
  468. estimatedtotalAmount = saletotalnum * estimatedPrice;
  469. //毛利率 (销售总金额-采购订单总金额-辅料预估总成本)/(销售总金额)
  470. double margin = (saletotalAmount - procuretotalAmount - estimatedtotalAmount) / saletotalAmount;
  471. formdata.put("numberField_mhvp9qy0",margin);
  472. formdata.put("tableField_mhsj6gtm",tabledata);
  473. System.out.println(formdata);
  474. /*发起流程*/
  475. String userId = getDDToken(purchaserName);
  476. String dd = ydClient.operateData(YDParam.builder()
  477. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  478. .formUuid(FormUuType)
  479. .userId(userId)
  480. .formDataJson(JSON.toJSONString(formdata))
  481. .build(), YDConf.FORM_OPERATION.start).toString();
  482. log.info("------------【采购订单】审批已发起-----------");
  483. return McR.success(dd);
  484. }
  485. @SneakyThrows
  486. @Override
  487. public McR SyncOrderStatus(String formInstanceId,String Approvalresult) throws JsonProcessingException {
  488. HashMap header = new HashMap();
  489. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  490. header.put("Content-Type","application/json");
  491. Map formdata = ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
  492. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  493. .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  494. HashMap body = new HashMap();
  495. body.put("orderNo",formdata.get("textField_mfqgmwcw"));//订单编号
  496. body.put("customerCode",formdata.get("textField_mfqgmwdh"));//客户编号(名称)
  497. String aa = formdata.get("dateField_mfqgmwcy").toString();
  498. String xdrq = Instant.ofEpochMilli(Long.parseLong(aa))
  499. .atZone(ZoneId.of("Asia/Shanghai"))
  500. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  501. body.put("orderTime",xdrq);//下单日期
  502. String bb = formdata.get("dateField_mfqgmwcz").toString();
  503. String jhjfrq = Instant.ofEpochMilli(Long.parseLong(bb))
  504. .atZone(ZoneId.of("Asia/Shanghai"))
  505. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  506. body.put("arrivalPlanTime",jhjfrq);//计划交付日期
  507. body.put("operatorName",formdata.get("textField_mgc0kc5u"));//业务人员名称
  508. ArrayList<Map<String,String>> customFiled = new ArrayList();
  509. HashMap field = new HashMap();
  510. field.put("name","销售订单钉钉审批状态");
  511. field.put("value",Approvalresult);//审批状态
  512. customFiled.add(field);
  513. body.put("saleOrderCustomFieldsValue",customFiled);//订单状态明细
  514. String dd = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/update", header, null, body);
  515. log.info("---------【回传销售订单状态完成】----------");
  516. return McR.success(dd);
  517. }
  518. @SneakyThrows
  519. @Override
  520. public McR SyncPurchaseOrderStatus(String formInstanceId,String Approvalresult) throws JsonProcessingException {
  521. HashMap header = new HashMap();
  522. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  523. header.put("Content-Type","application/json");
  524. Map formdata = ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
  525. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  526. .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  527. String jsonString = formdata.get("tableField_ml7ch2pj").toString();
  528. JSONArray tableField_ml7ch2pj = JSON.parseArray(jsonString);
  529. for (int i=0;i<tableField_ml7ch2pj.size();i++){
  530. String poNumber = tableField_ml7ch2pj.getJSONObject(i).getString("textField_ml7ch2pk");//拿到采购订单号
  531. HashMap body = new HashMap();
  532. body.put("orderCode",poNumber);//订单编号
  533. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//todo:查询采购订单
  534. JSONArray dataArray = JSONObject.parseObject(jsonString2).getJSONArray("data");
  535. for (int k=0;k<dataArray.size();k++) {
  536. JSONObject data = dataArray.getJSONObject(k);
  537. //提取订单基本信息 并赋值
  538. HashMap body1 = new HashMap();
  539. body1.put("orderCode",data.getString("orderCode"));//订单编号:orderCode
  540. body1.put("vendorCode",data.getString("vendorCode"));//供应商编码:gysnumber
  541. String aa = data.getLong("purchaseTime").toString();
  542. String purchaseTime = Instant.ofEpochMilli(Long.parseLong(aa))
  543. .atZone(ZoneId.of("Asia/Shanghai"))
  544. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  545. body1.put("purchaseTime",purchaseTime);//采购日期:purchaseTime
  546. String bb = data.getLong("planArrivalTime").toString();
  547. String planArrivalTime = Instant.ofEpochMilli(Long.parseLong(bb))
  548. .atZone(ZoneId.of("Asia/Shanghai"))
  549. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  550. body1.put("planArrivalTime",planArrivalTime);//计划到货日期:planArrivalTime
  551. ArrayList<Map<String,String>> customFiled = new ArrayList();
  552. HashMap field = new HashMap();
  553. field.put("name","采购订单钉钉审批状态");
  554. field.put("value",Approvalresult);//审批状态
  555. customFiled.add(field);
  556. body1.put("purchaseOrderCustomFieldsValue",customFiled);
  557. UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/update", header, null, body1);
  558. log.info("---------【回传,{},采购订单状态完成】-----------",data.getString("orderCode"));
  559. }
  560. }
  561. return McR.success();
  562. }
  563. @Override
  564. @SneakyThrows
  565. public McR salesAproval(Map body) throws JacksonException {
  566. StartYidaAproval(body.get("order").toString(),"FORM-472F0C1BD8DF41FA965A0B4525779B67S421");//todo:发起销售订单流程档案
  567. HashMap formdata = new HashMap();
  568. formdata.put("textField_mgq90lwf",body.get("order").toString());
  569. Instant now = Instant.now();
  570. long timestampMillis = now.toEpochMilli();
  571. formdata.put("dateField_mgq90lwg",timestampMillis);
  572. ydClient.operateData(YDParam.builder()
  573. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  574. .formUuid("FORM-1693380A673E498C827CD0A4C2D8214CIK90")
  575. .userId("3320511511-1158713155")
  576. .formDataJson(JSON.toJSONString(formdata))
  577. .build(), YDConf.FORM_OPERATION.create).toString();//todo:销售合同档案
  578. log.info("[销售订单流程发起,销售汇总表已同步]");
  579. return McR.success();
  580. }
  581. @Override
  582. @SneakyThrows
  583. public McR Procurement(Map body_new) throws JacksonException {
  584. //1、每次创建的时候才去查询宜搭采购订单底表
  585. log.info("【开始查询宜搭采购订单汇总】");
  586. String formUuid = "FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91";
  587. YDParam ydParam = YDParam.builder().formUuid(formUuid).build();
  588. ydParam.setPageSize(1);
  589. long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
  590. List<Map> dataList = new ArrayList<>();
  591. ydParam.setCurrentPage(1);
  592. ydParam.setPageSize(100);
  593. int totalPages = (int) Math.ceil((double) totalCount / ydParam.getPageSize());
  594. for (int page = 1; page <= totalPages; page++) {
  595. ydParam.setCurrentPage(page);
  596. dataList.addAll((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData());
  597. }
  598. int i =0;
  599. String jsonStr = "";
  600. ArrayList<String> procureList = new ArrayList();//采购订单汇总-订单号
  601. for (Map li : dataList) {
  602. i++;
  603. jsonStr = li.get("formData").toString();
  604. String orderNumber = new ObjectMapper().readTree(jsonStr).get("textField_mgq932hi").asText();
  605. procureList.add(orderNumber);
  606. }
  607. //2、其次就是在查询下黑湖工单,时间为当前时间
  608. HashMap header = new HashMap();
  609. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  610. header.put("Content-Type","application/json");
  611. HashMap body = new HashMap();
  612. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  613. LocalDateTime todayMidnight = LocalDate.now().atStartOfDay();
  614. String formattedToday = todayMidnight.format(formatter);
  615. body.put("createdAtGte",formattedToday);//创建时间大于等于
  616. /*TODO:对json进行处理*/
  617. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//TODO:查询采购订单
  618. List<String> orderNoList = new ArrayList<>();//存在这个orderList里面
  619. ObjectMapper objectMapper = new ObjectMapper();
  620. JsonNode rootNode = objectMapper.readTree(jsonString);
  621. JsonNode dataNode = rootNode.get("data");
  622. String orderNumber = "";//销售订单编号
  623. List<String> orderNumberList = new ArrayList<>();//todo:存在关联多个销售订单
  624. String purchaseOrderNo = "";//采购订单编号
  625. String orderType = "";//销售订单类型
  626. if (dataNode != null && dataNode.isArray()) {
  627. for (JsonNode item : dataNode) {
  628. JsonNode orderNoNode = item.get("orderCode");
  629. if (orderNoNode != null) {
  630. purchaseOrderNo = orderNoNode.asText();
  631. }
  632. JsonNode saleOrders = item.get("relationSaleOrders");
  633. if (saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0) {
  634. for (int j = 0; j < saleOrders.size(); j++) {
  635. orderNumberList.add(saleOrders.get(j).asText());
  636. }
  637. orderNumber = saleOrders.get(0).asText();
  638. }
  639. //每次查询下是否为“样品订单”推过来的采购订单
  640. HashMap body2 = new HashMap();
  641. body2.put("orderNo",orderNumber);
  642. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body2);//TODO: 查询销售订单
  643. ObjectMapper objectMapper2 = new ObjectMapper();
  644. JsonNode dataNode2 = objectMapper2.readTree(jsonString2).get("data");
  645. if(dataNode2 != null && dataNode2.isArray()){
  646. for (JsonNode item2 : dataNode2){
  647. JsonNode customFieldValues = item2.get("customFieldValues");
  648. if (customFieldValues != null && customFieldValues.isArray()) {
  649. for (JsonNode field : customFieldValues) {
  650. JsonNode fieldIdNode = field.get("fieldId");
  651. // 查找fieldId为47771的字段:订单类型
  652. if (fieldIdNode != null && fieldIdNode.asInt() == 47771) {
  653. JsonNode valueNode = field.get("value");
  654. if (valueNode != null) {
  655. orderType = valueNode.asText();
  656. break;
  657. }
  658. }
  659. }
  660. }
  661. }
  662. }
  663. if (orderNoNode != null && !orderType.equals("样品订单") ) {
  664. orderNoList.add(orderNoNode.asText());
  665. }
  666. }
  667. }
  668. //3、两者比较[procureList\orderList],差别的一个发起审批流程,排除订单类型为“样品订单”外
  669. Set<String> orderNoSet = new HashSet<>(orderNoList);
  670. Set<String> procureSet = new HashSet<>(procureList);
  671. List<String> onlyInSalesList = new ArrayList<>();
  672. for (String item : procureList) {
  673. if (!orderNoSet.contains(item)) {
  674. onlyInSalesList.add(item);
  675. }
  676. }
  677. List<String> onlyInOrderNoList = new ArrayList<>();
  678. for (String item : orderNoList) {
  679. if (!procureSet.contains(item)) {
  680. onlyInOrderNoList.add(item);
  681. }
  682. }
  683. System.out.println("要发起的采购订单: " + onlyInOrderNoList);//这里的orderNoList中的元素可能为[],为空的话就不发起流程
  684. //4、非样品订单发起宜搭审批流程
  685. if(orderType.equals("样品订单")){
  686. HashMap formdata2 = new HashMap();
  687. formdata2.put("textField_mgq932hi",purchaseOrderNo);
  688. formdata2.put("textField_mhyh7ues",orderNumber);
  689. Instant now = Instant.now();
  690. long timestampMillis = now.toEpochMilli();
  691. formdata2.put("dateField_mgq932hj",timestampMillis);
  692. ydClient.operateData(YDParam.builder()
  693. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  694. .formUuid("FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91")
  695. .userId("3320511511-1158713155")
  696. .formDataJson(JSON.toJSONString(formdata2))
  697. .build(),YDConf.FORM_OPERATION.create).toString();
  698. log.info("[样品订单流程不发起,采购汇总表已同步]");
  699. }
  700. for (int j=0;j< onlyInOrderNoList.size();j++){
  701. String orderNo = onlyInOrderNoList.get(j);
  702. startYidaProcurementAproval(orderNo,"FORM-5BD5B7F6C8B249A5ADD6E1C82DEAA2C086FY");
  703. //5、发起流程写入采购订单汇总表
  704. HashMap formdata = new HashMap();
  705. formdata.put("textField_mgq932hi",orderNo);
  706. formdata.put("textField_mhyh7ues",orderNumber);
  707. Instant now = Instant.now();
  708. long timestampMillis = now.toEpochMilli();
  709. formdata.put("dateField_mgq932hj",timestampMillis);
  710. ydClient.operateData(YDParam.builder()
  711. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  712. .formUuid("FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91")
  713. .userId("3320511511-1158713155")
  714. .formDataJson(JSON.toJSONString(formdata))
  715. .build(), YDConf.FORM_OPERATION.create).toString();
  716. log.info("[采购订单流程发起,采购汇总表已同步]");
  717. }
  718. //6、样品订单也要写入采购订单汇总表内
  719. if(orderType.equals("样品订单")){
  720. HashMap formdata2 = new HashMap();
  721. formdata2.put("textField_mgq932hi",purchaseOrderNo);
  722. formdata2.put("textField_mhyh7ues",orderNumber);
  723. Instant now = Instant.now();
  724. long timestampMillis = now.toEpochMilli();
  725. formdata2.put("dateField_mgq932hj",timestampMillis);
  726. ydClient.operateData(YDParam.builder()
  727. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  728. .formUuid("FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91")
  729. .userId("3320511511-1158713155")
  730. .formDataJson(JSON.toJSONString(formdata2))
  731. .build(),YDConf.FORM_OPERATION.create).toString();
  732. log.info("[样品订单流程不发起,采购汇总表已同步]");
  733. }
  734. return McR.success();
  735. }
  736. // 定义核心字段KEY数组
  737. private static final List<String> CORE_KEY_LIST=Arrays.asList("numberField_mfqgmwe6","numberField_mfqgmwe8","textField_mk0jz9i1");//数量 单价 中文颜色
  738. private static final String MATCH_KEY = "textField_mhsj6gtp";
  739. @Override
  740. public McR salesUpdate(Map body_new) throws JacksonException {
  741. /*todo:1、修改销售明细的颜色、数量、单价(已实现) 2、修改计划交货日期(进行中)*/
  742. // 查询销售订单明细
  743. HashMap head = new HashMap();
  744. head.put("X-AUTH",HeiHuAccessToken().getData().toString());
  745. head.put("Content-Type","application/json");
  746. HashMap bodyy = new HashMap();
  747. bodyy.put("orderNo",body_new.get("order").toString());
  748. String saleDetails = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", head, null, bodyy);
  749. JSONArray datas = JSONObject.parseObject(saleDetails).getJSONArray("data");
  750. JSONArray prods = JSONObject.parseObject(saleDetails).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");
  751. List<Map<String,Object>> tabledata = new ArrayList();
  752. String customerCode = "";String orderNo = "";
  753. String arrivalPlanTime_New = "";
  754. for (int b=0;b< datas.size();b++){
  755. JSONObject object = datas.getJSONObject(b);
  756. customerCode = object.getString("customerCode");//客户
  757. orderNo = object.getString("orderNo");//订单号
  758. arrivalPlanTime_New = object.getString("arrivalPlanTime");//计划交货日期
  759. }
  760. for (int a=0;a< prods.size();a++){
  761. JSONObject detail = prods.getJSONObject(a);
  762. HashMap row = new HashMap();
  763. String productCode = detail.getString("productCode");//款号
  764. String productName = detail.getString("productName");//产品描述
  765. Double qty = detail.getDouble("qty");//数量
  766. Double unitPrice = detail.getDouble("unitPrice");//单价
  767. double saleamount = detail.getDouble("qty") * detail.getDouble("unitPrice");//销售金额
  768. String color = "";
  769. JSONArray array1 = detail.getJSONArray("customFieldValues");
  770. color = array1.stream()
  771. .map(obj -> (JSONObject) obj)
  772. .filter(item -> item.getIntValue("fieldId") == 82259)
  773. .map(item -> item.getString("value"))
  774. .findFirst()
  775. .orElse(null);
  776. String currency = "";
  777. currency = array1.stream()
  778. .map(obj -> (JSONObject) obj)
  779. .filter(item -> item.getIntValue("fieldId") == 47919)
  780. .map(item -> item.getString("value"))
  781. .findFirst()
  782. .orElse(null); //币别
  783. ArrayList colorList = new ArrayList();
  784. colorList.add(color);
  785. String color_AAA = getProductColor(colorList);//颜色
  786. row.put("textField_mhsj6gtn",customerCode);
  787. row.put("textField_mhsj6gto",orderNo);
  788. row.put("textField_mhsj6gtp",productCode);
  789. row.put("textField_mhsj6gtq",productName);
  790. row.put("textField_mk4rrk35",color_AAA);//
  791. row.put("numberField_mk4rrk3b",qty);//
  792. row.put("numberField_mk4rrk3d",unitPrice);//
  793. row.put("numberField_mk4rrk3e",saleamount);//
  794. row.put("textField_mhtxft3p",currency);
  795. tabledata.add(row);
  796. }
  797. // 销售订单明细转换为宜搭表单字段的 formData
  798. HashMap fromdata = new HashMap();
  799. fromdata.put("tableField_mhsj6gtm",tabledata);
  800. log.info("[修改后的销售明细值],{}",tabledata);
  801. // 查询修改前的宜搭数据 formData
  802. List<Map<String,Object>> tabledata_yida = new ArrayList();
  803. List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
  804. .formUuid("FORM-472F0C1BD8DF41FA965A0B4525779B67S421")
  805. .searchCondition(JSONObject.toJSONString(Arrays.asList(new YDSearch(
  806. "textField_mfqgmwcw", orderNo, "订单编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
  807. .build()
  808. ,YDConf.FORM_QUERY.retrieve_list).getData();
  809. String formInstanceId = (String) list.get(0).get("formInstanceId");
  810. Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
  811. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  812. .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  813. String arrivalPlanTime_Old = data.get("dateField_mfqgmwcz").toString();
  814. List<Map<String, Object>> table = (List<Map<String, Object>>) data.get("tableField_mfqgmwe0");
  815. for (Map<String, Object> row : table) {
  816. HashMap row_yida = new HashMap();
  817. row_yida.put("textField_mhsj6gtn",data.get("textField_mfqgmwcx"));
  818. row_yida.put("textField_mhsj6gto",data.get("textField_mfqgmwcw"));
  819. row_yida.put("textField_mhsj6gtp",row.get("textField_mfqgmwe1"));
  820. row_yida.put("textField_mhsj6gtq",row.get("textField_mfqgmwe2"));
  821. row_yida.put("textField_mk4rrk35",row.get("textField_mk0jz9i1"));
  822. row_yida.put("numberField_mk4rrk3b",row.get("numberField_mfqgmwe6"));
  823. row_yida.put("numberField_mk4rrk3d",row.get("numberField_mfqgmwe8"));
  824. row_yida.put("numberField_mk4rrk3e",row.get("numberField_mfqgmweb"));
  825. row_yida.put("textField_mhtxft3p",row.get("textField_mk0xio3b"));
  826. tabledata_yida.add(row_yida);
  827. }
  828. HashMap fromdata_yida = new HashMap();
  829. fromdata_yida.put("tableField_mhsj6gtm",tabledata_yida);
  830. log.info("[修改前的销售明细值],{}",tabledata_yida);
  831. // 对比获取变更的KEY列表 AI
  832. List<Map<String, Object>> result = compareAndGetChanges(tabledata_yida, tabledata);
  833. log.info("[变更的值],{}",result);
  834. // 包含 发起宜搭审批
  835. StartYidaAproval(orderNo,"FORM-9A44F1DA0F5B4D319A6D06692767564CFHDS");
  836. //查找销售订单变更审批的实例id
  837. List<Map> lis = (List<Map>) ydClient.queryData(YDParam.builder()
  838. .formUuid("FORM-9A44F1DA0F5B4D319A6D06692767564CFHDS")
  839. .searchCondition(JSONObject.toJSONString(Arrays.asList(new YDSearch(
  840. "textField_mfqgmwcw", orderNo, "订单编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
  841. .build()
  842. ,YDConf.FORM_QUERY.retrieve_list).getData();
  843. String instanceId = (String) lis.get(0).get("formInstanceId");
  844. log.info("[销售订单审批变更的实例id],{}",instanceId);
  845. //把变更的数据整理去走operateData方法
  846. Map<String, List<Map<String, Object>>> grouped = result.stream()
  847. .collect(Collectors.groupingBy(m -> (String) m.get("billNo")));
  848. List<Map<String, Object>> ret = new ArrayList<>();
  849. for (List<Map<String, Object>> group : grouped.values()) {
  850. Map<String, Object> merged = new LinkedHashMap<>(); // 保持插入顺序(可选)
  851. for (Map<String, Object> item : group) {
  852. String field = (String) item.get("field");
  853. Object oldValue = item.get("oldValue");
  854. merged.put(field, oldValue);
  855. }
  856. ret.add(merged);
  857. }
  858. System.out.println("即将插入的数据" + ret);
  859. Map formdata = new HashMap();
  860. if(!arrivalPlanTime_New.equals(arrivalPlanTime_Old)){
  861. formdata.put("textareaField_mjghnmvv",AAAA(arrivalPlanTime_Old));
  862. }
  863. formdata.put("tableField_mk4rrk3k",ret);
  864. ydClient.operateData(YDParam.builder()
  865. .formInstanceId(instanceId)
  866. .updateFormDataJson(JSONObject.toJSONString(formdata))
  867. .build(),YDConf.FORM_OPERATION.update);
  868. return McR.success();
  869. }
  870. /**
  871. * 对比新旧列表,返回所有变更项(Java 8 兼容)
  872. *
  873. * 返回格式:List<Map<String, Object>>
  874. * 每个 Map 包含:
  875. * - "billNo": 单号(textField_mhsj6gtp 的值)
  876. * - "field": 变更的字段名
  877. * - "oldValue": 旧值
  878. * - "newValue": 新值
  879. */
  880. public static List<Map<String, Object>> compareAndGetChanges(
  881. List<Map<String, Object>> oldList,
  882. List<Map<String, Object>> newList) {
  883. Map<String, Map<String, Object>> oldIndex = toIndex(oldList);
  884. Map<String, Map<String, Object>> newIndex = toIndex(newList);
  885. List<Map<String, Object>> changes = new ArrayList<>();
  886. for (String billNo : oldIndex.keySet()) {
  887. Map<String, Object> oldRow = oldIndex.get(billNo);
  888. Map<String, Object> newRow = newIndex.get(billNo);
  889. if (newRow == null) {
  890. continue;
  891. }
  892. for (Map.Entry<String, Object> entry : oldRow.entrySet()) {
  893. String field = entry.getKey();
  894. Object oldValue = entry.getValue();
  895. Object newValue = newRow.get(field);
  896. if (!Objects.equals(oldValue, newValue)) {
  897. Map<String, Object> change = new HashMap<>();
  898. change.put("billNo", billNo);
  899. change.put("field", field);
  900. change.put("oldValue", oldValue);
  901. change.put("newValue", newValue);
  902. changes.add(change);
  903. }
  904. }
  905. }
  906. return changes;
  907. }
  908. // 构建以 textField_mhsj6gtp 为 key 的索引
  909. private static Map<String, Map<String, Object>> toIndex(List<Map<String, Object>> list) {
  910. Map<String, Map<String, Object>> index = new HashMap<>();
  911. for (Map<String, Object> row : list) {
  912. if (row.containsKey(MATCH_KEY)) {
  913. String key = String.valueOf(row.get(MATCH_KEY));
  914. // 避免重复 key 覆盖(保留第一个)
  915. if (!index.containsKey(key)) {
  916. index.put(key, row);
  917. }
  918. }
  919. }
  920. return index;
  921. }
  922. /*返回备注信息*/
  923. public static String AAAA(String ccc){
  924. String aa = "";
  925. String dd = Instant.ofEpochMilli(Long.parseLong(ccc))
  926. .atZone(ZoneId.of("Asia/Shanghai"))
  927. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  928. aa = "{\"dateField_mfqgmwcz\":\"<article class=\\\"4ever-xarticle\\\"><p style=\\\"text-align:left;text-indent:0;margin-left:0;margin-top:0;margin-bottom:0\\\"><span style=\\\"color:#FE0300\\\">" + dd +"</span></p></article>\"}";
  929. return aa;
  930. }
  931. @Override
  932. public String getProductColor(List list) throws JacksonException {
  933. HashMap header = new HashMap();
  934. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  935. header.put("Content-Type","application/json");
  936. HashMap body = new HashMap();
  937. body.put("type","PRODUCT");
  938. body.put("ids",list);
  939. String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/customField/associatedBusinessObject/entity/queryList", header, null, body);
  940. JSONObject jsonObject = JSONObject.parseObject(doPost);
  941. JSONArray dataArray = jsonObject.getJSONArray("data");
  942. System.out.println(dataArray);
  943. /* String productName = "";
  944. for (int i = 0; i < dataArray.size(); i++) {
  945. JSONObject data = dataArray.getJSONObject(i);
  946. productName = data.getString("productName");
  947. }*/
  948. String colorValue = "";
  949. if (dataArray != null && dataArray.size() > 0) {
  950. JSONObject data = dataArray.getJSONObject(0);
  951. JSONObject customFieldValues = data.getJSONObject("customFieldValues");
  952. if (customFieldValues != null) {
  953. // 直接获取指定字段的值
  954. colorValue = customFieldValues.getString("product1741831360685211");
  955. }
  956. }
  957. return colorValue;
  958. }
  959. @SneakyThrows
  960. @Override
  961. public McR purchaseSchedule(List<Map<String, Object>> dataList) {
  962. HashMap header = new HashMap();
  963. header.put("X-AUTH", HeiHuAccessToken().getData().toString());
  964. header.put("Content-Type", "application/json");
  965. String targetValue = "合同确认,提交审批";
  966. String targetValueUpdate = "合同修改,修改审批";
  967. // 定义一个字符串集合,默认包含两个值:"默认值1"、"默认值2"
  968. List<String> targetValues = new ArrayList() {{
  969. add("合同确认,提交审批");
  970. add("合同修改,修改审批");
  971. }};
  972. Map<String, List<String>> purchaserOrderCodes = new HashMap<>();
  973. if (ObjectUtil.isNotNull(dataList) && dataList.size() > 0) {
  974. for (Map<String, Object> item : dataList) {
  975. String purchaserName = (String) item.get("purchaserName");
  976. if (purchaserName == null) purchaserName = "未知";
  977. // boolean hasTargetStatus = false;
  978. List<Map<String, Object>> customFieldValues = (List<Map<String, Object>>) item.get("customFieldValues");
  979. if (customFieldValues != null) {
  980. for (Map<String, Object> field : customFieldValues) {
  981. if (targetValue.equals(field.get("value") ) || targetValueUpdate.equals(field.get("value"))) {
  982. System.out.println("合同状态类型:"+field.get("value"));
  983. // if (targetValue.equals(field.get("value"))) {
  984. // hasTargetStatus = true;
  985. String orderCode = (String) item.get("orderCode");
  986. if (orderCode != null) {
  987. purchaserOrderCodes.computeIfAbsent(purchaserName + "-" + field.get("value"), k -> new ArrayList<>()).add(orderCode);
  988. }
  989. break;
  990. }
  991. }
  992. }
  993. }
  994. }
  995. // 输出所有采购员的待审批订单
  996. System.out.println("========== 所有采购员的待审批订单统计 ==========");
  997. if (purchaserOrderCodes.isEmpty()) {
  998. System.out.println("没有找到钉钉审批状态为'" + targetValue + "'的订单");
  999. } else {
  1000. int totalPurchasers = purchaserOrderCodes.size();
  1001. int totalOrders = purchaserOrderCodes.values().stream().mapToInt(List::size).sum();
  1002. System.out.println("共找到 " + totalOrders + " 个待审批订单");
  1003. System.out.println("涉及 " + totalPurchasers + " 位采购员");
  1004. System.out.println();
  1005. // 输出每个采购员的情况
  1006. for (Map.Entry<String, List<String>> entry : purchaserOrderCodes.entrySet()) {
  1007. String[] split = entry.getKey().split("-");
  1008. String purchaserName = split[0];
  1009. String type = split[1];
  1010. List<String> orderCodes = entry.getValue();
  1011. int orderCount = orderCodes.size();
  1012. System.out.println("采购员: " + purchaserName);
  1013. System.out.println("待审批订单数量: " + orderCount);
  1014. System.out.println("审批类型: " + type);
  1015. if (orderCount > 1) {
  1016. System.out.println("⚠️ 注意:该采购员有 " + orderCount + " 个待审批订单");
  1017. }
  1018. System.out.println("订单编号: " + String.join(", ", orderCodes));
  1019. }
  1020. // 按订单数量排序输出
  1021. System.out.println("========== 按待审批订单数量排序 ==========");
  1022. purchaserOrderCodes.entrySet().stream()
  1023. .sorted((e1, e2) -> Integer.compare(e2.getValue().size(), e1.getValue().size()))
  1024. .forEach(entry -> {
  1025. String[] split = entry.getKey().split("-");
  1026. String purchaserName = split[0];
  1027. String type = split[1];
  1028. List<String> orderCodes = entry.getValue();
  1029. System.out.println(purchaserName + " (" + orderCodes.size() + "个): " +
  1030. String.join(", ", orderCodes));
  1031. // ========== 修改点1:声明两个列表分别存储不同毛利率的订单数据 ==========
  1032. // 针对同一个采购员,遍历下面的订单编号
  1033. System.out.println("开始处理采购员 " + purchaserName + " 的 " + orderCodes.size() + " 个待审批订单");
  1034. // 高毛利率表单数据 (mlv >= 0.15)
  1035. HashMap formdataHigh = new HashMap();
  1036. List<Map<String,String>> tabledataHigh = new ArrayList();
  1037. // 低毛利率表单数据 (mlv < 0.15)
  1038. HashMap formdataLow = new HashMap();
  1039. List<Map<String,String>> tabledataLow = new ArrayList();
  1040. // ========== 修改点2:为每个订单创建临时存储列表 ==========
  1041. // 用于暂存每个订单的明细数据,等计算出毛利率后再决定添加到哪个列表
  1042. // Map<String, List<Map<String, String>>> tempOrderDataMap = new HashMap<>();
  1043. // 用于存储每个订单的汇总数据,用于计算毛利率
  1044. // Map<String, Map<String, Double>> orderSummaryForMlv = new HashMap<>();
  1045. List<String> oldIds = new ArrayList<>();
  1046. for (String orderCode : orderCodes) {
  1047. System.out.println("正在处理订单: " + orderCode);
  1048. if (type.equals(targetValueUpdate)){
  1049. oldIds.add(orderCode);
  1050. }
  1051. // ========== 修改点3:为当前订单创建临时数据存储 ==========
  1052. List<Map<String, String>> currentOrderRows = new ArrayList<>();
  1053. double orderTotalSalesAmount = 0.0;
  1054. double orderTotalPurchaseAmount = 0.0;
  1055. double orderTotalFlygcb = 0.0;
  1056. //todo:查询订单的销售订单 | 客户 销售订单号 款式 产品描述 颜色 | 数量 销售单价 销售金额 | 币别 美金汇率 辅料预估成本 销售总金额
  1057. String customerName = "",orderNumber ="",styleNumber ="",productDescription = "",color = "";
  1058. Double number,unitPrice,salesAmount;
  1059. String currency = ""; Double USDrate = 0.00; Double flygcb = 0.00; Double saletotalAmount = 0.00;
  1060. Double estimatedPrice = 0.00;//辅料预估单价
  1061. HashMap body = new HashMap();
  1062. body.put("orderCode",orderCode);//订单编号
  1063. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);
  1064. //todo:查询采购订单 生产工厂(供应商)
  1065. String shortName = "";
  1066. JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
  1067. for (int i=0;i<dataArray.size();i++) {
  1068. JSONObject data = dataArray.getJSONObject(i);
  1069. shortName = data.getString("shortName");//供应商:shortName
  1070. }
  1071. JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
  1072. ObjectMapper objectMapper = new ObjectMapper();
  1073. JsonNode rootNode = null;
  1074. try {
  1075. rootNode = objectMapper.readTree(jsonString);
  1076. } catch (JsonProcessingException e) {
  1077. throw new RuntimeException(e);
  1078. }
  1079. JsonNode dataNode = rootNode.get("data");
  1080. if(dataNode != null && dataNode.isArray()){
  1081. for(JsonNode item : dataNode){
  1082. JsonNode orderNoNode = item.get("orderCode");
  1083. JsonNode saleOrders = item.get("relationSaleOrders");
  1084. if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
  1085. orderNumber = saleOrders.get(0).asText();//销售订单号
  1086. }
  1087. }
  1088. }
  1089. HashMap body_A = new HashMap();
  1090. body_A.put("orderNo",orderNumber);
  1091. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
  1092. JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
  1093. for(int i=0;i<array.size();i++){
  1094. JSONObject data = array.getJSONObject(i);
  1095. customerName = data.getString("customerCode");//客户
  1096. }
  1097. ObjectMapper objectMapper2 = new ObjectMapper();
  1098. JsonNode dataNode2 = null;//主表数据
  1099. try {
  1100. dataNode2 = objectMapper2.readTree(jsonString2).get("data");
  1101. } catch (JsonProcessingException e) {
  1102. throw new RuntimeException(e);
  1103. }
  1104. for (JsonNode item : dataNode2){
  1105. JsonNode customFieldValues = item.get("customFieldValues");
  1106. for (JsonNode field : customFieldValues){
  1107. JsonNode fieldIdNode = field.get("fieldId");
  1108. if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
  1109. JsonNode valueNode = field.get("value");
  1110. if(valueNode != null){
  1111. estimatedPrice = valueNode.asDouble();//辅料预估单价
  1112. break;
  1113. }
  1114. }
  1115. }
  1116. }
  1117. JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
  1118. if(products_A != null) {
  1119. for (int i = 0; i < products_A.size(); i++) {
  1120. JSONObject detail = products_A.getJSONObject(i);
  1121. HashMap row = new HashMap();
  1122. row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
  1123. row.put("textField_ml6g7k5e", customerName);//todo:客户
  1124. row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
  1125. styleNumber = detail.getString("productCode");//款号
  1126. row.put("textField_ml7c3yhq", styleNumber);//todo:款号
  1127. productDescription = detail.getString("productName");//产品描述
  1128. row.put("textField_ml7c3yhr", productDescription);//todo:产品描述
  1129. JSONArray array1 = detail.getJSONArray("customFieldValues");
  1130. color = array1.stream()
  1131. .map(obj -> (JSONObject) obj)
  1132. .filter(item -> item.getIntValue("fieldId") == 82259)
  1133. .map(item -> item.getString("value"))
  1134. .findFirst()
  1135. .orElse(null);
  1136. ArrayList colorList = new ArrayList();
  1137. colorList.add(color);
  1138. String color_AAA = null;
  1139. try {
  1140. color_AAA = getProductColor(colorList);
  1141. } catch (JacksonException e) {
  1142. throw new RuntimeException(e);
  1143. }
  1144. row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
  1145. number = detail.getDoubleValue("qty");//数量
  1146. row.put("numberField_ml7c3yht", number);//todo:数量
  1147. unitPrice = detail.getDoubleValue("unitPrice");//销售单价
  1148. row.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
  1149. salesAmount = number * unitPrice;//销售金额
  1150. row.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
  1151. String customFieldValues = detail.getString("customFieldValues");
  1152. ObjectMapper mapper = new ObjectMapper();
  1153. JsonNode jsonarray = null;
  1154. try {
  1155. jsonarray = mapper.readTree(customFieldValues);
  1156. } catch (JsonProcessingException e) {
  1157. throw new RuntimeException(e);
  1158. }
  1159. for (JsonNode node : jsonarray) {
  1160. if (node.get("fieldId").asInt() == 47919) {
  1161. currency = node.get("value").asText();
  1162. } else if (node.get("fieldId").asInt() == 165251) {
  1163. USDrate = node.get("value").asDouble();
  1164. } else if (node.get("fieldId").asInt() == 161783) {
  1165. flygcb = node.get("value").asDouble();
  1166. }
  1167. }
  1168. row.put("textField_ml7c3yhw", currency);//todo:币别
  1169. row.put("numberField_ml86221y", USDrate);//todo:美金汇率
  1170. row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
  1171. if(currency.equals("USD")){
  1172. saletotalAmount = salesAmount * USDrate;
  1173. }else {
  1174. saletotalAmount = salesAmount;
  1175. }
  1176. row.put("numberField_ml862220",saletotalAmount);
  1177. //下面是采购订单的明细数据
  1178. row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
  1179. for(int j=0;j<products.size();j++){
  1180. if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
  1181. //找到对应的采购一行数据
  1182. row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
  1183. row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
  1184. row.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
  1185. }
  1186. }
  1187. // ========== 修改点4:将当前行转换为Map<String,String>并暂存 ==========
  1188. Map<String, String> rowMap = new HashMap<>();
  1189. for (Object key : row.keySet()) {
  1190. Object value = row.get(key);
  1191. rowMap.put(key.toString(), value != null ? value.toString() : "");
  1192. }
  1193. currentOrderRows.add(rowMap);
  1194. // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
  1195. orderTotalSalesAmount += saletotalAmount;
  1196. orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
  1197. orderTotalFlygcb += flygcb;
  1198. }
  1199. }
  1200. // ========== 修改点6:计算当前订单的毛利率 ==========
  1201. double mlv = 0.0;
  1202. if (orderTotalSalesAmount > 0) {
  1203. mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
  1204. }
  1205. System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
  1206. // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
  1207. if (mlv >= 0.15) {
  1208. // 高毛利率订单
  1209. tabledataHigh.addAll(currentOrderRows);
  1210. System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
  1211. } else {
  1212. // 低毛利率订单
  1213. tabledataLow.addAll(currentOrderRows);
  1214. System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
  1215. }
  1216. }
  1217. List<Map<String, Object>> oldList = new ArrayList<>();
  1218. if (type.equals(targetValueUpdate)){
  1219. oldIds.forEach(h->{
  1220. List<Map> oldDataList = ydService.queryFormData_all(YDParam.builder()
  1221. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1222. .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
  1223. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
  1224. .build());
  1225. if (ObjectUtil.isNotNull(oldDataList) && oldDataList.size()>0){
  1226. List<Map> sonList = ydService.queryDetails(YDParam.builder()
  1227. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1228. .formInstanceId(UtilMap.getString(oldDataList.get(0),"textField_mmx9gycu"))
  1229. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
  1230. .tableFieldId("tableField_ml6g7k5d")
  1231. .build());
  1232. if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
  1233. sonList.forEach(s->{
  1234. Map<String, Object> map = new HashMap<>();
  1235. TABLEFIELD_ENUM.forEach((k,v)->{
  1236. map.put(v,UtilMap.getString(s,k));
  1237. });
  1238. oldList.add(map);
  1239. });
  1240. }
  1241. }
  1242. });
  1243. }
  1244. // ========== 修改点8:分别处理高低毛利率的审批 ==========
  1245. // 处理高毛利率的审批 (mlv >= 0.15)
  1246. if (!tabledataHigh.isEmpty()) {
  1247. System.out.println("\n========== 开始处理高毛利率审批(>=15%),共 " + tabledataHigh.size() + " 条明细 ==========");
  1248. //组装数据塞到采购明细表
  1249. formdataHigh.put("tableField_ml6g7k5d", tabledataHigh);
  1250. //组装数据塞到采购审批单号明细
  1251. List<Map<String, String>> orderSummaryListHigh = calculateOrderSummary(tabledataHigh);
  1252. formdataHigh.put("tableField_ml7ch2pj", orderSummaryListHigh);
  1253. formdataHigh.put("tableField_mmx6gata", oldList);
  1254. //数值统计毛利率
  1255. int szHigh = 0;
  1256. for (Map map : orderSummaryListHigh) {
  1257. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1258. log.info((String) numberFieldMm2t71jo);
  1259. szHigh += Integer.parseInt((String) numberFieldMm2t71jo);
  1260. }
  1261. formdataHigh.put("numberField_mm2t71jp", szHigh);
  1262. /*发起流程 - 高毛利率审批*/
  1263. String userId = getDDToken(purchaserName);
  1264. ydClient.operateData(YDParam.builder()
  1265. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1266. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 高毛利率使用原表单
  1267. .userId(userId)
  1268. .formDataJson(JSON.toJSONString(formdataHigh))
  1269. .build(), YDConf.FORM_OPERATION.start).toString();
  1270. /*修改采购订单为审批中*/
  1271. for (Map map : orderSummaryListHigh) {
  1272. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1273. callback(textFieldMl7ch2pk);
  1274. }
  1275. System.out.println("高毛利率审批流程发起完成");
  1276. }
  1277. // 处理低毛利率的审批 (mlv < 0.15)
  1278. if (!tabledataLow.isEmpty()) {
  1279. System.out.println("\n========== 开始处理低毛利率审批(<15%),共 " + tabledataLow.size() + " 条明细 ==========");
  1280. //组装数据塞到采购明细表
  1281. formdataLow.put("tableField_ml6g7k5d", tabledataLow);
  1282. formdataLow.put("tableField_mmx6gata", oldList);
  1283. //组装数据塞到采购审批单号明细
  1284. List<Map<String, String>> orderSummaryListLow = calculateOrderSummary(tabledataLow);
  1285. formdataLow.put("tableField_ml7ch2pj", orderSummaryListLow);
  1286. //数值统计毛利率
  1287. int szLow = 0;
  1288. for (Map map : orderSummaryListLow) {
  1289. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1290. log.info((String) numberFieldMm2t71jo);
  1291. szLow += Integer.parseInt((String) numberFieldMm2t71jo);
  1292. }
  1293. formdataLow.put("numberField_mm2t71jp", szLow);
  1294. /*发起流程 - 低毛利率审批*/
  1295. String userId = getDDToken(purchaserName);
  1296. // ========== 修改点9:如果低毛利率需要不同表单,可以在这里修改formUuid ==========
  1297. ydClient.operateData(YDParam.builder()
  1298. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1299. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 如果需要不同流程,替换这里的UUID
  1300. .userId(userId)
  1301. .formDataJson(JSON.toJSONString(formdataLow))
  1302. .build(), YDConf.FORM_OPERATION.start).toString();
  1303. /*修改采购订单为审批中*/
  1304. for (Map map : orderSummaryListLow) {
  1305. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1306. callback(textFieldMl7ch2pk);
  1307. }
  1308. System.out.println("低毛利率审批流程发起完成");
  1309. }
  1310. });
  1311. }
  1312. return null;
  1313. }
  1314. @SneakyThrows
  1315. @Override
  1316. public List<Map<String, Object>> queryAllPurchase() {
  1317. HashMap header = new HashMap();
  1318. header.put("X-AUTH", HeiHuAccessToken().getData().toString());
  1319. header.put("Content-Type", "application/json");
  1320. boolean hasMoreData = true;
  1321. int pageNum = 1;
  1322. int pageSize = 100;
  1323. List<Map<String, Object>> dataList = new ArrayList<>();
  1324. while (hasMoreData) {
  1325. HashMap body = new HashMap();
  1326. Map<String, Integer> page = new HashMap<>();
  1327. page.put("pageNum", pageNum);
  1328. page.put("pageSize", pageSize);
  1329. List<Integer> status = Arrays.asList(1);
  1330. body.put("page", page);
  1331. body.put("status", status);
  1332. String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//查询采购订单
  1333. log.info("header:",header.toString());
  1334. System.out.println("header:" + header.toString());
  1335. ObjectMapper mapper = new ObjectMapper();
  1336. Map<String, Object> response = mapper.readValue(doPost, Map.class);
  1337. if (!"01000000".equals(response.get("code"))) {
  1338. System.out.println("请求失败: " + response.get("msg"));
  1339. break;
  1340. }
  1341. // dataList.addAll(UtilMap.getList(response,"data"));
  1342. List<Map<String, Object>> mapList = (List<Map<String, Object>>) response.get("data");
  1343. if (ObjectUtil.isNotNull(mapList) && mapList.size() > 0){
  1344. dataList.addAll(mapList);
  1345. hasMoreData = mapList.size() >= pageSize;
  1346. } else {
  1347. hasMoreData = false;
  1348. }
  1349. pageNum++;
  1350. }
  1351. try {
  1352. Thread.sleep(200);
  1353. } catch (InterruptedException e) {
  1354. e.printStackTrace();
  1355. }
  1356. return dataList;
  1357. }
  1358. @Override
  1359. public McR purchaseUpdateSchedule() throws JacksonException {
  1360. HashMap header = new HashMap();
  1361. header.put("X-AUTH", HeiHuAccessToken().getData().toString());
  1362. header.put("Content-Type", "application/json");
  1363. String targetValue = "合同修改,修改审批";
  1364. Map<String, List<String>> purchaserOrderCodes = new HashMap<>();
  1365. int pageNum = 1;
  1366. int pageSize = 100;
  1367. boolean hasMoreData = true;
  1368. while (hasMoreData) {
  1369. HashMap body = new HashMap();
  1370. Map<String, Integer> page = new HashMap<>();
  1371. page.put("pageNum", pageNum);
  1372. page.put("pageSize", pageSize);
  1373. List<Integer> status = Arrays.asList(1);
  1374. body.put("page", page);
  1375. body.put("status", status);
  1376. String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//查询采购订单
  1377. ObjectMapper mapper = new ObjectMapper();
  1378. Map<String, Object> response = mapper.readValue(doPost, Map.class);
  1379. if (!"01000000".equals(response.get("code"))) {
  1380. log.info("请求失败: {}" , response.get("msg"));
  1381. break;
  1382. }
  1383. List<Map<String, Object>> dataList = (List<Map<String, Object>>) response.get("data");
  1384. if (dataList != null) {
  1385. for (Map<String, Object> item : dataList) {
  1386. String purchaserName = (String) item.get("purchaserName");
  1387. if (purchaserName == null) purchaserName = "未知";
  1388. boolean hasTargetStatus = false;
  1389. List<Map<String, Object>> customFieldValues = (List<Map<String, Object>>) item.get("customFieldValues");
  1390. if (customFieldValues != null) {
  1391. for (Map<String, Object> field : customFieldValues) {
  1392. if (targetValue.equals(field.get("value"))) {
  1393. hasTargetStatus = true;
  1394. break;
  1395. }
  1396. }
  1397. }
  1398. if (hasTargetStatus) {
  1399. String orderCode = (String) item.get("orderCode");
  1400. if (orderCode != null) {
  1401. purchaserOrderCodes.computeIfAbsent(purchaserName, k -> new ArrayList<>()).add(orderCode);
  1402. }
  1403. }
  1404. }
  1405. hasMoreData = dataList.size() >= pageSize;
  1406. } else {
  1407. hasMoreData = false;
  1408. }
  1409. pageNum++;
  1410. try {
  1411. Thread.sleep(200);
  1412. } catch (InterruptedException e) {
  1413. e.printStackTrace();
  1414. }
  1415. }
  1416. // 输出所有采购员的待审批订单
  1417. System.out.println("========== 所有采购员的待审批订单统计 ==========");
  1418. if (purchaserOrderCodes.isEmpty()) {
  1419. System.out.println("没有找到钉钉审批状态为'" + targetValue + "'的订单");
  1420. } else {
  1421. int totalPurchasers = purchaserOrderCodes.size();
  1422. int totalOrders = purchaserOrderCodes.values().stream().mapToInt(List::size).sum();
  1423. System.out.println("共找到 " + totalOrders + " 个待审批订单");
  1424. System.out.println("涉及 " + totalPurchasers + " 位采购员");
  1425. System.out.println();
  1426. // 输出每个采购员的情况
  1427. for (Map.Entry<String, List<String>> entry : purchaserOrderCodes.entrySet()) {
  1428. String purchaserName = entry.getKey();
  1429. List<String> orderCodes = entry.getValue();
  1430. int orderCount = orderCodes.size();
  1431. System.out.println("采购员: " + purchaserName);
  1432. System.out.println("待审批订单数量: " + orderCount);
  1433. if (orderCount > 1) {
  1434. System.out.println("⚠️ 注意:该采购员有 " + orderCount + " 个待审批订单");
  1435. }
  1436. System.out.println("订单编号: " + String.join(", ", orderCodes));
  1437. System.out.println();
  1438. }
  1439. // 按订单数量排序输出
  1440. System.out.println("========== 按待审批订单数量排序 ==========");
  1441. purchaserOrderCodes.entrySet().stream()
  1442. .sorted((e1, e2) -> Integer.compare(e2.getValue().size(), e1.getValue().size()))
  1443. .forEach(entry -> {
  1444. String purchaserName = entry.getKey();
  1445. List<String> orderCodes = entry.getValue();
  1446. System.out.println(purchaserName + " (" + orderCodes.size() + "个): " +
  1447. String.join(", ", orderCodes));
  1448. // ========== 修改点1:声明两个列表分别存储不同毛利率的订单数据 ==========
  1449. // 针对同一个采购员,遍历下面的订单编号
  1450. System.out.println("开始处理采购员 " + purchaserName + " 的 " + orderCodes.size() + " 个待审批订单");
  1451. // 高毛利率表单数据 (mlv >= 0.15)
  1452. HashMap formdataHigh = new HashMap();
  1453. List<Map<String,String>> tabledataHigh = new ArrayList();
  1454. // 低毛利率表单数据 (mlv < 0.15)
  1455. HashMap formdataLow = new HashMap();
  1456. List<Map<String,String>> tabledataLow = new ArrayList();
  1457. // ========== 修改点2:为每个订单创建临时存储列表 ==========
  1458. // 用于暂存每个订单的明细数据,等计算出毛利率后再决定添加到哪个列表
  1459. Map<String, List<Map<String, String>>> tempOrderDataMap = new HashMap<>();
  1460. // 用于存储每个订单的汇总数据,用于计算毛利率
  1461. Map<String, Map<String, Double>> orderSummaryForMlv = new HashMap<>();
  1462. List<String> oldHighIds = new ArrayList<>();
  1463. List<String> oldLowIds = new ArrayList<>();
  1464. for (String orderCode : orderCodes) {
  1465. System.out.println("正在处理订单: " + orderCode);
  1466. // ========== 修改点3:为当前订单创建临时数据存储 ==========
  1467. List<Map<String, String>> currentOrderRows = new ArrayList<>();
  1468. double orderTotalSalesAmount = 0.0;
  1469. double orderTotalPurchaseAmount = 0.0;
  1470. double orderTotalFlygcb = 0.0;
  1471. //todo:查询订单的销售订单 | 客户 销售订单号 款式 产品描述 颜色 | 数量 销售单价 销售金额 | 币别 美金汇率 辅料预估成本 销售总金额
  1472. String customerName = "",orderNumber ="",styleNumber ="",productDescription = "",color = "";
  1473. Double number,unitPrice,salesAmount;
  1474. String currency = ""; Double USDrate = 0.00; Double flygcb = 0.00; Double saletotalAmount = 0.00;
  1475. Double estimatedPrice = 0.00;//辅料预估单价
  1476. HashMap body = new HashMap();
  1477. body.put("orderCode",orderCode);//订单编号
  1478. String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);
  1479. //todo:查询采购订单 生产工厂(供应商)
  1480. String shortName = "";
  1481. JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
  1482. for (int i=0;i<dataArray.size();i++) {
  1483. JSONObject data = dataArray.getJSONObject(i);
  1484. shortName = data.getString("shortName");//供应商:shortName
  1485. }
  1486. JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
  1487. ObjectMapper objectMapper = new ObjectMapper();
  1488. JsonNode rootNode = null;
  1489. try {
  1490. rootNode = objectMapper.readTree(jsonString);
  1491. } catch (JsonProcessingException e) {
  1492. throw new RuntimeException(e);
  1493. }
  1494. JsonNode dataNode = rootNode.get("data");
  1495. if(dataNode != null && dataNode.isArray()){
  1496. for(JsonNode item : dataNode){
  1497. JsonNode orderNoNode = item.get("orderCode");
  1498. JsonNode saleOrders = item.get("relationSaleOrders");
  1499. if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
  1500. orderNumber = saleOrders.get(0).asText();//销售订单号
  1501. }
  1502. }
  1503. }
  1504. HashMap body_A = new HashMap();
  1505. body_A.put("orderNo",orderNumber);
  1506. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
  1507. JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
  1508. for(int i=0;i<array.size();i++){
  1509. JSONObject data = array.getJSONObject(i);
  1510. customerName = data.getString("customerCode");//客户
  1511. }
  1512. ObjectMapper objectMapper2 = new ObjectMapper();
  1513. JsonNode dataNode2 = null;//主表数据
  1514. try {
  1515. dataNode2 = objectMapper2.readTree(jsonString2).get("data");
  1516. } catch (JsonProcessingException e) {
  1517. throw new RuntimeException(e);
  1518. }
  1519. for (JsonNode item : dataNode2){
  1520. JsonNode customFieldValues = item.get("customFieldValues");
  1521. for (JsonNode field : customFieldValues){
  1522. JsonNode fieldIdNode = field.get("fieldId");
  1523. if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
  1524. JsonNode valueNode = field.get("value");
  1525. if(valueNode != null){
  1526. estimatedPrice = valueNode.asDouble();//辅料预估单价
  1527. break;
  1528. }
  1529. }
  1530. }
  1531. }
  1532. JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
  1533. if(products_A != null) {
  1534. for (int i = 0; i < products_A.size(); i++) {
  1535. JSONObject detail = products_A.getJSONObject(i);
  1536. HashMap row = new HashMap();
  1537. row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
  1538. row.put("textField_ml6g7k5e", customerName);//todo:客户
  1539. row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
  1540. styleNumber = detail.getString("productCode");//款号
  1541. row.put("textField_ml7c3yhq", styleNumber);//todo:款号
  1542. productDescription = detail.getString("productName");//产品描述
  1543. row.put("textField_ml7c3yhr", productDescription);//todo:产品描述
  1544. JSONArray array1 = detail.getJSONArray("customFieldValues");
  1545. color = array1.stream()
  1546. .map(obj -> (JSONObject) obj)
  1547. .filter(item -> item.getIntValue("fieldId") == 82259)
  1548. .map(item -> item.getString("value"))
  1549. .findFirst()
  1550. .orElse(null);
  1551. ArrayList colorList = new ArrayList();
  1552. colorList.add(color);
  1553. String color_AAA = null;
  1554. try {
  1555. color_AAA = getProductColor(colorList);
  1556. } catch (JacksonException e) {
  1557. throw new RuntimeException(e);
  1558. }
  1559. row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
  1560. number = detail.getDoubleValue("qty");//数量
  1561. row.put("numberField_ml7c3yht", number);//todo:数量
  1562. unitPrice = detail.getDoubleValue("unitPrice");//销售单价
  1563. row.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
  1564. salesAmount = number * unitPrice;//销售金额
  1565. row.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
  1566. String customFieldValues = detail.getString("customFieldValues");
  1567. ObjectMapper mapper = new ObjectMapper();
  1568. JsonNode jsonarray = null;
  1569. try {
  1570. jsonarray = mapper.readTree(customFieldValues);
  1571. } catch (JsonProcessingException e) {
  1572. throw new RuntimeException(e);
  1573. }
  1574. for (JsonNode node : jsonarray) {
  1575. if (node.get("fieldId").asInt() == 47919) {
  1576. currency = node.get("value").asText();
  1577. } else if (node.get("fieldId").asInt() == 165251) {
  1578. USDrate = node.get("value").asDouble();
  1579. } else if (node.get("fieldId").asInt() == 161783) {
  1580. flygcb = node.get("value").asDouble();
  1581. }
  1582. }
  1583. row.put("textField_ml7c3yhw", currency);//todo:币别
  1584. row.put("numberField_ml86221y", USDrate);//todo:美金汇率
  1585. row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
  1586. if(currency.equals("USD")){
  1587. saletotalAmount = salesAmount * USDrate;
  1588. }else {
  1589. saletotalAmount = salesAmount;
  1590. }
  1591. row.put("numberField_ml862220",saletotalAmount);
  1592. //下面是采购订单的明细数据
  1593. row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
  1594. for(int j=0;j<products.size();j++){
  1595. if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
  1596. //找到对应的采购一行数据
  1597. row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
  1598. row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
  1599. row.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
  1600. }
  1601. }
  1602. // ========== 修改点4:将当前行转换为Map<String,String>并暂存 ==========
  1603. Map<String, String> rowMap = new HashMap<>();
  1604. for (Object key : row.keySet()) {
  1605. Object value = row.get(key);
  1606. rowMap.put(key.toString(), value != null ? value.toString() : "");
  1607. }
  1608. currentOrderRows.add(rowMap);
  1609. // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
  1610. orderTotalSalesAmount += saletotalAmount;
  1611. orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
  1612. orderTotalFlygcb += flygcb;
  1613. }
  1614. }
  1615. // ========== 修改点6:计算当前订单的毛利率 ==========
  1616. double mlv = 0.0;
  1617. if (orderTotalSalesAmount > 0) {
  1618. mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
  1619. }
  1620. System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
  1621. // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
  1622. if (mlv >= 0.15) {
  1623. // 高毛利率订单
  1624. tabledataHigh.addAll(currentOrderRows);
  1625. oldHighIds.add(orderCode);
  1626. System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
  1627. } else {
  1628. // 低毛利率订单
  1629. tabledataLow.addAll(currentOrderRows);
  1630. oldLowIds.add(orderCode);
  1631. System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
  1632. }
  1633. }
  1634. // ========== 修改点8:分别处理高低毛利率的审批 ==========
  1635. // 处理高毛利率的审批 (mlv >= 0.15)
  1636. if (!tabledataHigh.isEmpty()) {
  1637. System.out.println("\n========== 开始处理高毛利率审批(>=15%),共 " + tabledataHigh.size() + " 条明细 ==========");
  1638. List<Map<String, Object>> oldList = new ArrayList<>();
  1639. oldHighIds.forEach(h->{
  1640. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  1641. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1642. .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
  1643. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
  1644. .build());
  1645. if (ObjectUtil.isNotNull(dataList) && dataList.size()>0){
  1646. List<Map> sonList = ydService.queryDetails(YDParam.builder()
  1647. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1648. .formInstanceId(UtilMap.getString(dataList.get(0),"textField_mmx9gycu"))
  1649. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
  1650. .tableFieldId("tableField_ml6g7k5d")
  1651. .build());
  1652. if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
  1653. sonList.forEach(s->{
  1654. Map<String, Object> map = new HashMap<>();
  1655. TABLEFIELD_ENUM.forEach((k,v)->{
  1656. map.put(v,UtilMap.getString(s,k));
  1657. });
  1658. oldList.add(map);
  1659. });
  1660. }
  1661. }
  1662. });
  1663. //组装数据塞到采购明细表
  1664. formdataHigh.put("tableField_ml6g7k5d", tabledataHigh);
  1665. formdataHigh.put("tableField_mmx6gata", oldList);
  1666. //组装数据塞到采购审批单号明细
  1667. List<Map<String, String>> orderSummaryListHigh = calculateOrderSummary(tabledataHigh);
  1668. formdataHigh.put("tableField_ml7ch2pj", orderSummaryListHigh);
  1669. //数值统计毛利率
  1670. int szHigh = 0;
  1671. for (Map map : orderSummaryListHigh) {
  1672. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1673. log.info((String) numberFieldMm2t71jo);
  1674. szHigh += Integer.parseInt((String) numberFieldMm2t71jo);
  1675. }
  1676. formdataHigh.put("numberField_mm2t71jp", szHigh);
  1677. /*发起流程 - 高毛利率审批*/
  1678. String userId = getDDToken(purchaserName);
  1679. ydClient.operateData(YDParam.builder()
  1680. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1681. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 高毛利率使用原表单
  1682. .userId(userId)
  1683. .formDataJson(JSON.toJSONString(formdataHigh))
  1684. .build(), YDConf.FORM_OPERATION.start).toString();
  1685. /*修改采购订单为审批中*/
  1686. for (Map map : orderSummaryListHigh) {
  1687. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1688. callback(textFieldMl7ch2pk);
  1689. }
  1690. System.out.println("高毛利率审批流程发起完成");
  1691. }
  1692. // 处理低毛利率的审批 (mlv < 0.15)
  1693. if (!tabledataLow.isEmpty()) {
  1694. System.out.println("\n========== 开始处理低毛利率审批(<15%),共 " + tabledataLow.size() + " 条明细 ==========");
  1695. List<Map<String, Object>> oldList = new ArrayList<>();
  1696. oldLowIds.forEach(h->{
  1697. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  1698. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1699. .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
  1700. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
  1701. .build());
  1702. if (ObjectUtil.isNotNull(dataList) && dataList.size()>0){
  1703. List<Map> sonList = ydService.queryDetails(YDParam.builder()
  1704. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1705. .formInstanceId(UtilMap.getString(dataList.get(0),"textField_mmx9gycu"))
  1706. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
  1707. .tableFieldId("tableField_ml6g7k5d")
  1708. .build());
  1709. if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
  1710. sonList.forEach(s->{
  1711. Map<String, Object> map = new HashMap<>();
  1712. TABLEFIELD_ENUM.forEach((k,v)->{
  1713. map.put(v,UtilMap.getString(s,k));
  1714. });
  1715. oldList.add(map);
  1716. });
  1717. }
  1718. }
  1719. });
  1720. //组装数据塞到采购明细表
  1721. formdataLow.put("tableField_mmx6gata", oldList);
  1722. //组装数据塞到采购明细表
  1723. formdataLow.put("tableField_ml6g7k5d", tabledataLow);
  1724. //组装数据塞到采购审批单号明细
  1725. List<Map<String, String>> orderSummaryListLow = calculateOrderSummary(tabledataLow);
  1726. formdataLow.put("tableField_ml7ch2pj", orderSummaryListLow);
  1727. //数值统计毛利率
  1728. int szLow = 0;
  1729. for (Map map : orderSummaryListLow) {
  1730. Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
  1731. log.info((String) numberFieldMm2t71jo);
  1732. szLow += Integer.parseInt((String) numberFieldMm2t71jo);
  1733. }
  1734. formdataLow.put("numberField_mm2t71jp", szLow);
  1735. /*发起流程 - 低毛利率审批*/
  1736. String userId = getDDToken(purchaserName);
  1737. // ========== 修改点9:如果低毛利率需要不同表单,可以在这里修改formUuid ==========
  1738. ydClient.operateData(YDParam.builder()
  1739. .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
  1740. .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2") // 如果需要不同流程,替换这里的UUID
  1741. .userId(userId)
  1742. .formDataJson(JSON.toJSONString(formdataLow))
  1743. .build(), YDConf.FORM_OPERATION.start).toString();
  1744. /*修改采购订单为审批中*/
  1745. for (Map map : orderSummaryListLow) {
  1746. String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
  1747. callback(textFieldMl7ch2pk);
  1748. }
  1749. System.out.println("低毛利率审批流程发起完成");
  1750. }
  1751. });
  1752. }
  1753. return null;
  1754. }
  1755. private static final Map<String,String> TABLEFIELD_ENUM =new HashMap<>();
  1756. static {
  1757. TABLEFIELD_ENUM.put("textField_mm2t71jm","textField_mmx6gast");
  1758. TABLEFIELD_ENUM.put("textField_ml6g7k5e","textField_mmx6gasu");
  1759. TABLEFIELD_ENUM.put("textField_ml6g7k5f","textField_mmx6gasv");
  1760. TABLEFIELD_ENUM.put("textField_ml7c3yhq","textField_mmx6gasw");
  1761. TABLEFIELD_ENUM.put("textField_ml7c3yhr","textField_mmx6gasx");
  1762. TABLEFIELD_ENUM.put("textField_ml7c3yhs","textField_mmx6gasy");
  1763. TABLEFIELD_ENUM.put("numberField_ml7c3yht","numberField_mmx6gasz");
  1764. TABLEFIELD_ENUM.put("numberField_ml7c3yhu","numberField_mmx6gat0");
  1765. TABLEFIELD_ENUM.put("numberField_ml7c3yhv","numberField_mmx6gat1");
  1766. TABLEFIELD_ENUM.put("textField_ml7c3yhw","textField_mmx6gat2");
  1767. TABLEFIELD_ENUM.put("numberField_ml86221y","numberField_mmx6gat3");
  1768. TABLEFIELD_ENUM.put("numberField_ml86221z","numberField_mmx6gat4");
  1769. TABLEFIELD_ENUM.put("numberField_ml862220","numberField_mmx6gat5");
  1770. TABLEFIELD_ENUM.put("textField_ml7c3yhx","textField_mmx6gat6");
  1771. TABLEFIELD_ENUM.put("numberField_ml7c3yhy","numberField_mmx6gat7");
  1772. TABLEFIELD_ENUM.put("numberField_ml7c3yhz","numberField_mmx6gat8");
  1773. TABLEFIELD_ENUM.put("numberField_ml7c3yi0","numberField_mmx6gat9");
  1774. }
  1775. /**
  1776. * 根据orderCode对tabledata进行分类求和
  1777. * @param tableData 原始明细数据
  1778. * @return 按orderCode汇总后的数据列表(只包含求和结果)
  1779. */
  1780. private List<Map<String, String>> calculateOrderSummary(List<Map<String, String>> tableData) {
  1781. // 使用Map暂存每个orderCode的汇总数据
  1782. Map<String, Map<String, Double>> summaryMap = new LinkedHashMap<>();
  1783. for (Map<String, String> row : tableData) {
  1784. String orderCode = row.get("textField_mm2t71jm"); // 采购订单号
  1785. if (orderCode == null || orderCode.isEmpty()) {
  1786. continue;
  1787. }
  1788. // 获取或创建该订单的汇总Map
  1789. Map<String, Double> orderSum = summaryMap.computeIfAbsent(orderCode,
  1790. k -> {
  1791. Map<String, Double> newMap = new HashMap<>();
  1792. newMap.put("salesAmount", 0.0); // 销售金额总和
  1793. newMap.put("purchaseAmount", 0.0); // 采购金额总和
  1794. newMap.put("flygcb", 0.0); // 辅料预估成本总和
  1795. return newMap;
  1796. });
  1797. // 累加各项金额
  1798. String salesAmountStr = UtilMap.getString(row,"numberField_ml862220");
  1799. String purchaseAmountStr = UtilMap.getString(row,"numberField_ml7c3yi0");
  1800. String flygcbStr = UtilMap.getString(row,"numberField_ml86221z");
  1801. try {
  1802. if (salesAmountStr != null && !salesAmountStr.isEmpty()) {
  1803. orderSum.put("salesAmount",
  1804. orderSum.get("salesAmount") + Double.parseDouble(salesAmountStr));
  1805. }
  1806. if (purchaseAmountStr != null && !purchaseAmountStr.isEmpty()) {
  1807. orderSum.put("purchaseAmount",
  1808. orderSum.get("purchaseAmount") + Double.parseDouble(purchaseAmountStr));
  1809. }
  1810. if (flygcbStr != null && !flygcbStr.isEmpty()) {
  1811. orderSum.put("flygcb",
  1812. orderSum.get("flygcb") + Double.parseDouble(flygcbStr));
  1813. }
  1814. } catch (NumberFormatException e) {
  1815. System.err.println("数字格式错误: " + e.getMessage());
  1816. }
  1817. }
  1818. // 转换为最终的List<Map<String, String>>
  1819. List<Map<String, String>> result = new ArrayList<>();
  1820. for (Map.Entry<String, Map<String, Double>> entry : summaryMap.entrySet()) {
  1821. String orderCode = entry.getKey();
  1822. Map<String, Double> sums = entry.getValue();
  1823. double salesAmount = sums.get("salesAmount");
  1824. double purchaseAmount = sums.get("purchaseAmount");
  1825. double flygcb = sums.get("flygcb");
  1826. // 构建结果行
  1827. Map<String, String> summaryRow = new LinkedHashMap<>();
  1828. summaryRow.put("textField_ml7ch2pk", orderCode);//orderCode:采购审批单单号
  1829. summaryRow.put("numberField_ml862225", formatNumber(salesAmount));//salesAmount:销售总金额
  1830. summaryRow.put("numberField_ml862226", formatNumber(purchaseAmount));//purchaseAmount:采购订单总金额
  1831. summaryRow.put("numberField_ml862228", formatNumber(flygcb));//flygcb:辅料预估总成本
  1832. summaryRow.put("numberField_ml86222d",formatNumber((salesAmount - purchaseAmount - flygcb) / salesAmount));//毛利率
  1833. Double mlv = (salesAmount - purchaseAmount - flygcb) / salesAmount;
  1834. if(mlv >= 0.15){
  1835. summaryRow.put("numberField_mm2t71jo", String.valueOf(1));
  1836. }else {
  1837. summaryRow.put("numberField_mm2t71jo", String.valueOf(0));
  1838. }
  1839. result.add(summaryRow);
  1840. }
  1841. return result;
  1842. }
  1843. /**
  1844. * 格式化数字,去除多余的.0
  1845. */
  1846. private String formatNumber(double number) {
  1847. if (Math.abs(number - Math.round(number)) < 0.000001) {
  1848. return String.valueOf((long) number);
  1849. } else {
  1850. return String.format("%.2f", number);
  1851. }
  1852. }
  1853. /*采购订单发起更新状态*/
  1854. @SneakyThrows
  1855. public McR callback(String orderNum){
  1856. HashMap header = new HashMap();
  1857. header.put("X-AUTH",HeiHuAccessToken().getData().toString());
  1858. header.put("Content-Type","application/json");
  1859. HashMap body = new HashMap();
  1860. body.put("orderCode",orderNum);//订单编号
  1861. String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//todo:查询采购订单
  1862. JSONArray dataArray = JSONObject.parseObject(jsonString2).getJSONArray("data");
  1863. for (int k=0;k<dataArray.size();k++) {
  1864. JSONObject data = dataArray.getJSONObject(k);
  1865. //提取订单基本信息 并赋值
  1866. HashMap body1 = new HashMap();
  1867. body1.put("orderCode",data.getString("orderCode"));//订单编号:orderCode
  1868. body1.put("vendorCode",data.getString("vendorCode"));//供应商编码:gysnumber
  1869. String aa = data.getLong("purchaseTime").toString();
  1870. String purchaseTime = Instant.ofEpochMilli(Long.parseLong(aa))
  1871. .atZone(ZoneId.of("Asia/Shanghai"))
  1872. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  1873. body1.put("purchaseTime",purchaseTime);//采购日期:purchaseTime
  1874. String bb = data.getLong("planArrivalTime").toString();
  1875. String planArrivalTime = Instant.ofEpochMilli(Long.parseLong(bb))
  1876. .atZone(ZoneId.of("Asia/Shanghai"))
  1877. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  1878. body1.put("planArrivalTime",planArrivalTime);//计划到货日期:planArrivalTime
  1879. ArrayList<Map<String,String>> customFiled = new ArrayList();
  1880. HashMap field = new HashMap();
  1881. field.put("name","采购订单钉钉审批状态");
  1882. field.put("value","审批中");//审批状态
  1883. customFiled.add(field);
  1884. body1.put("purchaseOrderCustomFieldsValue",customFiled);
  1885. UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/update", header, null, body1);
  1886. }
  1887. return McR.success();
  1888. }
  1889. /*获取宜搭采购订单汇总*/
  1890. @SneakyThrows
  1891. McR getPurchaseList(){
  1892. log.info("开始查询宜搭采购订单汇总表");
  1893. String formUuid = "FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91";
  1894. YDParam ydParam = YDParam.builder().formUuid(formUuid).build();
  1895. ydParam.setPageSize(1);
  1896. long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
  1897. List<Map> datalist = new ArrayList<>();
  1898. ydParam.setCurrentPage(1);
  1899. ydParam.setPageSize(100);
  1900. int totalPages = (int)Math.ceil((double) totalCount / ydParam.getPageSize());
  1901. for (int page = 1;page <= totalPages;page++){
  1902. ydParam.setCurrentPage(page);
  1903. datalist.addAll((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData());
  1904. }
  1905. int i =0;
  1906. String jsonStr = "";
  1907. Map<String, String> orderMap = new HashMap<>();//格式:采购订单/关联销售订单
  1908. for(Map li : datalist){
  1909. i++;
  1910. // log.info("{}/{}",i,datalist.size());
  1911. jsonStr = li.get("formData").toString();
  1912. String orderNum = new ObjectMapper().readTree(jsonStr).get("textField_mgq932hi").asText();
  1913. String relatedOrderNum = new ObjectMapper().readTree(jsonStr).get("textField_mhyh7ues").asText();
  1914. orderMap.put(orderNum, relatedOrderNum);
  1915. }
  1916. return McR.success(orderMap);
  1917. }
  1918. }