JianhuiServiceImpl.java 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395
  1. package com.malk.jianhui.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.google.gson.Gson;
  5. import com.kingdee.bos.webapi.entity.IdentifyInfo;
  6. import com.kingdee.bos.webapi.entity.RepoRet;
  7. import com.malk.jianhui.config.KDWebApiConf;
  8. import com.malk.jianhui.entity.*;
  9. import com.malk.jianhui.service.JianhuiService;
  10. import com.malk.server.aliwork.YDConf;
  11. import com.malk.server.aliwork.YDParam;
  12. import com.malk.server.aliwork.YDSearch;
  13. import com.malk.server.common.McR;
  14. import com.malk.server.dingtalk.DDConf;
  15. import com.malk.server.dingtalk.DDR_New;
  16. import com.malk.service.aliwork.YDClient;
  17. import com.malk.service.dingtalk.DDClient;
  18. import com.malk.utils.UtilHttp;
  19. import com.malk.utils.UtilMap;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.apache.logging.log4j.util.Strings;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.scheduling.annotation.Async;
  24. import org.springframework.stereotype.Service;
  25. import com.kingdee.bos.webapi.sdk.K3CloudApi;
  26. import java.math.BigDecimal;
  27. import java.text.SimpleDateFormat;
  28. import java.time.LocalDateTime;
  29. import java.time.ZoneId;
  30. import java.time.ZonedDateTime;
  31. import java.time.format.DateTimeFormatter;
  32. import java.util.*;
  33. import static org.junit.Assert.fail;
  34. @Slf4j
  35. @Service
  36. public class JianhuiServiceImpl implements JianhuiService {
  37. @Autowired
  38. private KDWebApiConf kdWebApiConf;
  39. @Autowired
  40. private YDClient ydClient;
  41. @Autowired
  42. private DDClient ddClient;
  43. @Autowired
  44. private DDConf ddConf;
  45. //单据状态
  46. private static final Map<String,String> FDOCUMENTSTATUS = new HashMap<>();
  47. static{
  48. FDOCUMENTSTATUS.put("Z","暂存");
  49. FDOCUMENTSTATUS.put("A","创建");
  50. FDOCUMENTSTATUS.put("B","审核中");
  51. FDOCUMENTSTATUS.put("C","已审核");
  52. FDOCUMENTSTATUS.put("D","重新审核");
  53. }
  54. //整单状态
  55. private static final Map<String,String> AUDITSTATUS = new HashMap<>();
  56. static{
  57. AUDITSTATUS.put("U","未审核");
  58. AUDITSTATUS.put("A","已审核");
  59. AUDITSTATUS.put("I","审核中");
  60. AUDITSTATUS.put("P","部分审核");
  61. AUDITSTATUS.put("R","重新审核");
  62. }
  63. //禁用状态
  64. private static final Map<String,String> FFORBIDSTATUS = new HashMap<>();
  65. static{
  66. FFORBIDSTATUS.put("A","否");
  67. FFORBIDSTATUS.put("B","是");
  68. }
  69. private static final Map<String,String> FFORBIDDENSTATUS = new HashMap<>();
  70. static{
  71. FFORBIDDENSTATUS.put("0","否");
  72. FFORBIDDENSTATUS.put("1","是");
  73. }
  74. private static final Map<String,String> FERPCLSID = new HashMap<>();
  75. static {
  76. FERPCLSID.put("10","资产");
  77. FERPCLSID.put("9","配置");
  78. FERPCLSID.put("2","自制");
  79. FERPCLSID.put("11","费用");
  80. FERPCLSID.put("12","模型");
  81. FERPCLSID.put("5","虚拟");
  82. FERPCLSID.put("7","一次性");
  83. FERPCLSID.put("13","产品系列");
  84. FERPCLSID.put("3","委外");
  85. FERPCLSID.put("4","特征");
  86. FERPCLSID.put("6","服务");
  87. FERPCLSID.put("1","外购");
  88. }
  89. private static final Map<String,String> BUSINESS_TYPE = new HashMap<>();
  90. static {
  91. BUSINESS_TYPE.put("8","发货检验");
  92. BUSINESS_TYPE.put("25","生产退料检验");
  93. BUSINESS_TYPE.put("26","委外退料检验");
  94. BUSINESS_TYPE.put("3","产品检验");
  95. BUSINESS_TYPE.put("20","其他检验");
  96. BUSINESS_TYPE.put("6","委外工序");
  97. BUSINESS_TYPE.put("10","受托材料检验");
  98. BUSINESS_TYPE.put("2","委外检验");
  99. BUSINESS_TYPE.put("21","工序巡检");
  100. BUSINESS_TYPE.put("7","退货检验");
  101. BUSINESS_TYPE.put("9","生产线检验");
  102. BUSINESS_TYPE.put("1","采购检验");
  103. BUSINESS_TYPE.put("4","库存检验");
  104. BUSINESS_TYPE.put("5","工序自制");
  105. }
  106. private static final Map<String,String> INSPECT_RESULT = new HashMap<>();
  107. static {
  108. INSPECT_RESULT.put("1","合格");
  109. INSPECT_RESULT.put("2","不合格");
  110. INSPECT_RESULT.put("3","保留");
  111. }
  112. private IdentifyInfo initIden(){
  113. //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
  114. //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
  115. //读取配置,初始化SDK
  116. IdentifyInfo iden = new IdentifyInfo();
  117. iden.setUserName(kdWebApiConf.getXKDApiUserName());
  118. iden.setAppId(kdWebApiConf.getXKDApiAppID());
  119. iden.setdCID(kdWebApiConf.getXKDApiAcctID());
  120. iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
  121. iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
  122. return iden;
  123. }
  124. @Override
  125. //保存销售订单
  126. public McR saveSaleOrder(Map map) {
  127. String formInstId = getString(map.get("formInstId"));
  128. Map formData = ydClient.queryData(YDParam.builder()
  129. .formInstId(formInstId)
  130. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  131. List<Map> details = (List<Map>) formData.get("tableField_m65t6bm5");
  132. //将时间戳转化为字符串 年月日时分秒格式
  133. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  134. SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
  135. //请求参数,要求为json字符串
  136. Save save = new Save();
  137. Model model = new Model();
  138. //基本信息
  139. BillTypeID FBillTypeID = new BillTypeID(getString(formData.get("textField_m6t5hgw2")));//单据类型
  140. FNumber FSaleOrgId = new FNumber(getString(formData.get("textField_m6sqw8k1")));//销售组织
  141. FNumber FCustId = new FNumber(getString(formData.get("textField_m6ahh22d")));//客户
  142. // FNumber FReceiveId = new FNumber(getString(formData.get("textField_m6ahh22d")));//收货方
  143. // FNumber FSaleDeptId = new FNumber(getString(formData.get("textField_m6ahct6n")));//销售部门
  144. FNumber FSalerId = new FNumber(getString(formData.get("textField_m6t5xxrm")));//销售员
  145. // FNumber FSettleId = new FNumber(getString(formData.get("textField_m6ahh22d")));//结算方
  146. // FNumber FChargeId = new FNumber(getString(formData.get("textField_m6ahh22d")));//付款方
  147. //财务信息
  148. SaleOrderFinance saleOrderFinance = new SaleOrderFinance();
  149. saleOrderFinance.setFSettleCurrId(new FNumber(getString(formData.get("textField_m6ahh22i"))));//结算币别
  150. // saleOrderFinance.setFExchangeTypeId(new FNumber(getString(formData.get("textField_m6t6ay5x"))));//汇率类型
  151. saleOrderFinance.setFIsIncludedTax(getString(formData.get("radioField_m6a8ekan")).equals("是"));//是否含税
  152. saleOrderFinance.setFIsPriceExcludeTax(getString(formData.get("radioField_m6ahh22s")).equals("是"));//价外税
  153. /*saleOrderFinance.setFMarginLevel(0);//保证金比例(%)
  154. saleOrderFinance.setFMargin(0);//保证金
  155. saleOrderFinance.setFOverOrgTransDirect(false);//寄售生成跨组织调拨
  156. saleOrderFinance.setFAllDisCount(0);//整单折扣额
  157. saleOrderFinance.setFXPKID_F(0);//变更单主键*/
  158. //明细信息
  159. List<SaleOrderEntry> FSaleOrderEntry = new ArrayList<>();
  160. for (Map detail : details) {
  161. SaleOrderEntry saleOrderEntry = new SaleOrderEntry();
  162. // FNumber FStockOrgId = new FNumber(getString(detail.get("textField_m6sqw8js")));//库存组织
  163. // FNumber FSettleOrgIds = new FNumber(getString(detail.get("textField_m6sqw8jw")));//结算组织
  164. // FNumber FOwnerId = new FNumber(getString(detail.get("textField_m65t6bm9")));//货主
  165. saleOrderEntry.setFMaterialId(new FNumber(getString(detail.get("textField_m6sqw8jq"))));//物料编码
  166. saleOrderEntry.setFUnitID(new FNumber(getString(detail.get("textField_m6sqw8jz"))));//销售单位
  167. saleOrderEntry.setFPriceUnitId(new FNumber(getString(detail.get("textField_m6sqw8jz"))));//计量单位
  168. // saleOrderEntry.setFStockFNumber(FStockOrgId);
  169. // saleOrderEntry.setFSettleOrgIds(FSettleOrgIds);
  170. // saleOrderEntry.setFOwnerId(FOwnerId);
  171. saleOrderEntry.setFQty(new BigDecimal(getString(detail.get("numberField_m65t6bmb"))).doubleValue());//销售数量
  172. // saleOrderEntry.setFPriceUnitQty((int)detail.get("numberField_m65t6bmb"));//计价数量
  173. saleOrderEntry.setFIsFree(getString(detail.get("radioField_m6t6roed")).equals("是"));//是否赠品
  174. if (!getString(detail.get("radioField_m6t6roed")).equals("是")){
  175. // saleOrderEntry.setFPrice(new BigDecimal(getString(detail.get("numberField_m65t6bmd"))).doubleValue());//单价
  176. saleOrderEntry.setFTaxPrice(new BigDecimal(getString(detail.get("numberField_m65t6bme"))).doubleValue());//含税单价
  177. if (Objects.nonNull(detail.get("numberField_m65t6bmf"))){
  178. saleOrderEntry.setFEntryTaxRate(new BigDecimal(getString(detail.get("numberField_m65t6bmf"))).doubleValue());//税率(%)
  179. // saleOrderEntry.setFTaxAmount_LC(new BigDecimal(getString(detail.get("numberField_m65t6bmg"))).doubleValue());//税额(本位币)
  180. }
  181. /* if (Objects.nonNull(detail.get("numberField_m65t6bmh"))){
  182. saleOrderEntry.setFAmount_LC(new BigDecimal(getString(detail.get("numberField_m65t6bmh"))).doubleValue());//金额(本位币)
  183. }
  184. saleOrderEntry.setFAllAmount_LC(new BigDecimal(getString(detail.get("numberField_m65t6bmi"))).doubleValue());//价税合计(本位币)*/
  185. }
  186. saleOrderEntry.setFDeliveryDate(sdf.format(new Date((long) detail.get("dateField_m65t6bmj"))));//要货日期
  187. // saleOrderEntry.setFOwnerTypeId("BD_OwnerOrg");//货主类型
  188. saleOrderEntry.setFEntryNote(getString(detail.get("textareaField_m6t6roeg")));//备注
  189. // saleOrderEntry.setF_WMVJ_Decimal(39913500);//方数
  190. // saleOrderEntry.setF_WMVJ_Amount(111);//金额(配件)
  191. // saleOrderEntry.setF_WMVJ_Qty(12);//即时库存
  192. // saleOrderEntry.setF_WMVJ_CheckBox(getString(detail.get("radioField_m6t6roef")).equals("是"));//是否生产
  193. FSaleOrderEntry.add(saleOrderEntry);
  194. }
  195. // model.setFID(0);//实体主键
  196. model.setFBillTypeID(FBillTypeID);//单据类型
  197. model.setFDate(sdf.format(new Date((long) formData.get("dateField_m65t6bkv"))));//日期
  198. model.setFSaleOrgId(FSaleOrgId);//销售组织
  199. model.setFCustId(FCustId);//客户
  200. // model.setFReceiveId(FReceiveId);//收货方
  201. // model.setFSaleDeptId(FSaleDeptId);//销售部门
  202. model.setFSalerId(FSalerId);//销售员
  203. model.setFNote(getString(formData.get("textareaField_m6sqw8jo")));//备注
  204. // model.setFSettleId(FSettleId);//结算方
  205. // model.setFChargeId(FChargeId);//付款方
  206. // model.setFNetOrderBillId(0);//移动销售订单ID
  207. // model.setFOppID(0);//商机内码
  208. // model.setFISINIT(false);//是否期初单据
  209. // model.setFIsMobile(false);//来自移动(弃用)
  210. // model.setFContractId(0);//销售合同内码
  211. // model.setFIsUseOEMBomPush(false);//生成受托加工材料清单
  212. // model.setFXPKID_H(0);//变更单主键
  213. // model.setFIsUseDrpSalePOPush(false);//生成分销采购订单
  214. // model.setFIsCreateStraightOutIN(false);//生成直运出入库
  215. model.setFSaleOrderFinance(saleOrderFinance);//财务信息
  216. model.setFSaleOrderEntry(FSaleOrderEntry);//订单明细
  217. save.setModel(model);
  218. Gson gson2 = new Gson();
  219. String jsonData = gson2.toJson(save);
  220. // String jsonData = JSONObject.toJSONString(save);
  221. // String jsonData = "{\"Model\":{\"FBillTypeID\":{\"FNUMBER\":\"XSDD01_SYS\"},\"FDate\":\"2025-02-27\",\"FSaleOrgId\":{\"FNumber\":\"100\"},\"FCustId\":{\"FNumber\":\"C0615\"},\"FSalerId\":{\"FNumber\":\"0118_0012_1\"},\"FNote\":\"\",\"FSaleOrderFinance\":{\"FSettleCurrId\":{\"FNumber\":\"PRE001\"},\"FIsIncludedTax\":\"false\"},\"FSaleOrderEntry\":[{\"FMaterialId\":{\"FNumber\":\"C2070502\"},\"FUnitID\":{\"FNumber\":\"Pcs\"},\"FQty\":1,\"FPriceUnitId\":{\"FNumber\":\"Pcs\"},\"FTaxPrice\":115,\"FIsFree\":false,\"FEntryNote\":\"\",\"FEntryTaxRate\":0,\"FDeliveryDate\":\"2025-02-28\",\"FSettleOrgIds\":{\"FNumber\":\"100\"}}]}}";
  222. log.info(jsonData);
  223. try{
  224. K3CloudApi client = new K3CloudApi(initIden());
  225. //业务对象标识
  226. String formId = "SAL_SaleOrder";
  227. //调用接口
  228. String resultJson = client.save(formId,jsonData);
  229. //用于记录结果
  230. Gson gson = new Gson();
  231. //对返回结果进行解析和校验
  232. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  233. if (isTrue(repoRet)){
  234. String id = repoRet.getResult().getId();
  235. Submit submit = new Submit();
  236. submit.setIds(id);
  237. //提交销售订单
  238. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  239. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  240. isTrue(repoRet2);
  241. String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
  242. ydClient.operateData(YDParam.builder()
  243. .formInstId(formInstId)
  244. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6a8ekal",orderCode)))
  245. .build(), YDConf.FORM_OPERATION.update);
  246. if (isTrue(repoRet2)){
  247. Audit audit = new Audit();
  248. audit.setNumbers(Arrays.asList(orderCode));
  249. //审核销售订单
  250. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  251. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  252. isTrue(repoRet3);
  253. }
  254. }
  255. } catch (Exception e) {
  256. fail(e.getMessage());
  257. }
  258. return McR.success();
  259. }
  260. private String getString(Object object){
  261. return object == null ? "" : object.toString();
  262. }
  263. @Override
  264. public McR syncCustomers() {
  265. try {
  266. K3CloudApi client = new K3CloudApi(initIden());
  267. List<Map> result = new ArrayList<>();
  268. List<Map> customerList = new ArrayList<>();
  269. int startRow = 0;
  270. int limit = 2000;
  271. BillQuery billQuery = new BillQuery();
  272. billQuery.setFormId("BD_Customer");
  273. billQuery.setFieldKeys("FNumber,FName,FShortName,FDocumentStatus,FForbidStatus,FUseOrgId,FAPPROVERID,FAPPROVEDATE,FGroup");
  274. List<Map> filterString = new ArrayList<>();
  275. //修改时间为昨天到今天
  276. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  277. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  278. billQuery.setFilterString(filterString);
  279. billQuery.setLimit(limit);
  280. do {
  281. billQuery.setStartRow(startRow);
  282. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  283. result = (List<Map>)JSONObject.parse(s);
  284. customerList.addAll(result);
  285. startRow += limit;
  286. }while (result.size() == limit);
  287. for (Map customer : customerList) {
  288. Map formData = new HashMap();
  289. formData.put("textField_m67c6m6f",customer.get("FNumber"));//客户编码
  290. formData.put("textField_m67c6m6e",customer.get("FName"));//客户名称
  291. formData.put("textField_m67c6m6g",customer.get("FShortName"));//简称
  292. formData.put("textField_m67c6m6h",FDOCUMENTSTATUS.get(customer.get("FDocumentStatus").toString()));//单据状态
  293. formData.put("textField_m67c6m6i",FFORBIDSTATUS.get(customer.get("FForbidStatus").toString()));//禁用状态
  294. formData.put("textField_m67c6m6j",customer.get("FUseOrgId"));//使用组织
  295. formData.put("textField_m67c6m6k",customer.get("FAPPROVERID"));//审核人
  296. formData.put("textField_m67c6m6l",customer.get("FAPPROVEDATE"));//审核日期
  297. formData.put("textField_m67c6m6m",customer.get("FGroup"));//客户分组
  298. ydClient.operateData(YDParam.builder()
  299. .formUuid("FORM-C3E9A165EEAB4232BD2F04F536E195D1WINH")
  300. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m67c6m6f",customer.get("FNumber"),"客户编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
  301. .formDataJson(JSONObject.toJSONString(formData))
  302. .build(), YDConf.FORM_OPERATION.upsert);
  303. }
  304. }catch (Exception e){
  305. fail(e.getMessage());
  306. }
  307. return McR.success();
  308. }
  309. @Override
  310. public McR syncSalesman() {
  311. try {
  312. K3CloudApi client = new K3CloudApi(initIden());
  313. int startRow = 0;
  314. int limit = 2000;
  315. BillQuery billQuery = new BillQuery();
  316. billQuery.setLimit(limit);
  317. billQuery.setFormId("BD_OPERATOR");
  318. billQuery.setFieldKeys("FNumber,FName,FForbiddenStatus,FBizOrgId");
  319. List<Map> filterString = new ArrayList<>();
  320. //修改时间为昨天到今天
  321. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  322. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  323. billQuery.setFilterString(filterString);
  324. List<Map> result = new ArrayList<>();
  325. List<Map> operatorList = new ArrayList<>();
  326. do {
  327. billQuery.setStartRow(startRow);
  328. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  329. result = (List<Map>)JSONObject.parse(s);
  330. operatorList.addAll(result);
  331. startRow += limit;
  332. }while (result.size() == limit);
  333. for (Map operator : operatorList) {
  334. Map formData = new HashMap();
  335. formData.put("textField_m67pb4tl",operator.get("FName"));//业务员名称
  336. formData.put("textField_m67pb4tn",operator.get("FNumber"));//业务员编码
  337. formData.put("textField_m67pb4tm",operator.get("FBizOrgId"));//业务组织
  338. formData.put("textField_m67pb4tk",FFORBIDDENSTATUS.get(operator.get("FForbiddenStatus").toString()));//禁用状态
  339. String FNumber = operator.get("FNumber").toString();
  340. //查找员工任岗信息
  341. View view = new View();
  342. view.setNumber(FNumber);
  343. String resultJson = client.view("BD_NEWSTAFF", JSONObject.toJSONString(view));
  344. Gson gson = new Gson();
  345. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  346. if (isTrue(repoRet)){
  347. Map positionInfo = (Map) repoRet.getResult().getResult();
  348. Map position = (Map) positionInfo.get("Position");
  349. String positionValue = ((List<Map>) position.get("Name")).get(0).get("Value").toString();
  350. Map dept = (Map) position.get("FDept");
  351. String deptValue = ((List<Map>) dept.get("Name")).get(0).get("Value").toString();
  352. formData.put("textField_m67pb4td",positionValue);//岗位
  353. formData.put("textField_m67pb4tb",deptValue);//部门
  354. }
  355. ydClient.operateData(YDParam.builder()
  356. .formUuid("FORM-250CD995257D4CB08F99786E47D8D51BCUDP")
  357. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m67pb4tn",operator.get("FNumber"),"业务员编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
  358. .formDataJson(JSONObject.toJSONString(formData))
  359. .build(), YDConf.FORM_OPERATION.upsert);
  360. }
  361. }catch (Exception e){
  362. fail(e.getMessage());
  363. }
  364. return McR.success();
  365. }
  366. @Override
  367. public McR syncMaterial() {
  368. try {
  369. K3CloudApi client = new K3CloudApi(initIden());
  370. List<Map> result = new ArrayList<>();
  371. List<Map> materialList = new ArrayList<>();
  372. int startRow = 0;
  373. int limit = 2000;
  374. BillQuery billQuery = new BillQuery();
  375. billQuery.setFormId("BD_MATERIAL");
  376. billQuery.setFieldKeys("FUseOrgId,FNumber,FName,FSpecification,FDocumentStatus,FForbidStatus,FErpClsID,FBaseUnitId,FRefStatus");
  377. List<Map> filterString = new ArrayList<>();
  378. //修改时间或审核日期为昨天到今天
  379. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","1"));
  380. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265","1","","","0"));
  381. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-12 00:00:00","","","0"));//修改日期大于等于xx
  382. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","16","2025-03-14 00:00:00","","","0"));//修改日期小于等于xx
  383. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","39","2025-06-28 00:00:00","","","0"));//创建日期大于等于xx
  384. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","16","2025-07-07 00:00:00","","","0"));//创建日期小于等于xx
  385. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","39","2025-03-14 00:00:00","","","0"));//审核日期大于等于xx
  386. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","67","Y0070002","","","0"));//编码等于xx
  387. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","17","0001","","","0"));//编码包含xx
  388. billQuery.setFilterString(filterString);
  389. billQuery.setLimit(limit);
  390. do {
  391. billQuery.setStartRow(startRow);
  392. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  393. result = (List<Map>)JSONObject.parse(s);
  394. materialList.addAll(result);
  395. startRow += limit;
  396. }while (result.size() == limit);
  397. for (Map material : materialList) {
  398. Map formData = new HashMap();
  399. formData.put("textField_m6ak640p",material.get("FUseOrgId"));//使用组织
  400. formData.put("textField_m6ak640v",material.get("FNumber"));//编码
  401. formData.put("selectField_m83u6et1",getString(material.get("FNumber")).substring(0,1).equals("C") ? "成品" : "配件");
  402. formData.put("textField_m6ak640w",material.get("FName"));//名称
  403. formData.put("textField_m6ak640x",material.get("FSpecification"));//规格型号
  404. formData.put("textField_m6ak6413",FDOCUMENTSTATUS.get(material.get("FDocumentStatus").toString()));//单据状态
  405. formData.put("textField_m6ak6414",FFORBIDSTATUS.get(material.get("FForbidStatus").toString()));//禁用状态
  406. formData.put("textField_m6ak6415",FERPCLSID.get(material.get("FErpClsID").toString()));//物料属性
  407. formData.put("textField_m6ak641c",material.get("FRefStatus"));//已使用
  408. //查找计量单位信息
  409. String FBaseUnitId = material.get("FBaseUnitId").toString();
  410. View view = new View();
  411. view.setId(FBaseUnitId);
  412. String resultJson = client.view("BD_UNIT", JSONObject.toJSONString(view));
  413. Gson gson = new Gson();
  414. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  415. if (isTrue(repoRet)){
  416. Map unitInfo = (Map) repoRet.getResult().getResult();
  417. String unitName = ((List<Map>) unitInfo.get("Name")).get(0).get("Value").toString();
  418. String unitCode = unitInfo.get("Number").toString();
  419. formData.put("textField_m6ak6416",unitName);//基本单位
  420. formData.put("textField_m6ak641d",unitCode);//单位编码
  421. }
  422. ydClient.operateData(YDParam.builder()
  423. .formUuid("FORM-2A5CAB7EB91D493AAFC90D8C7479A7F5KPR7")
  424. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m6ak640v",material.get("FNumber"),"编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
  425. .formDataJson(JSONObject.toJSONString(formData))
  426. .build(), YDConf.FORM_OPERATION.upsert);
  427. }
  428. }catch (Exception e){
  429. fail(e.getMessage());
  430. }
  431. return McR.success();
  432. }
  433. @Override
  434. public McR saveForecastOrder(Map map) {
  435. String formInstId = getString(map.get("formInstId"));
  436. Map formData = ydClient.queryData(YDParam.builder()
  437. .formInstId(formInstId)
  438. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  439. //将时间戳转化为字符串 年月日时分秒格式
  440. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  441. Save save = new Save();
  442. Model model = new Model();
  443. model.setFForeOrgId(new FNumber(getString(formData.get("textField_m6yh6qcs"))));//预测组织
  444. model.setFBillTypeID(new BillTypeID(getString(formData.get("textField_m6yh6qcr"))));//单据类型
  445. model.setFDate(sdf.format(new Date((long)formData.get("dateField_m65vi32c"))));//单据日期
  446. model.setFDescription(getString(formData.get("textareaField_m6yh6qck")));//备注
  447. model.setF_WMVJ_Date_qtr(sdf.format(new Date((long)formData.get("dateField_m7lqobzp"))));//要货日期
  448. List<Map> details = (List<Map>) formData.get("tableField_m65vi32k");
  449. List<Object> FEntity = new ArrayList<>();
  450. for (Map detail : details) {
  451. ForecastEntity forecastEntity = new ForecastEntity();
  452. forecastEntity.setFCustID(new FNumber(getString(detail.get("textField_m6yh6qcu"))));//客户
  453. // forecastEntity.setFProductType("0");
  454. forecastEntity.setFMaterialID(new FNumber(getString(detail.get("textField_m65vi32o"))));//物料
  455. forecastEntity.setFUnitID(new FNumber(getString(detail.get("textField_m6yh6qcx"))));//单位
  456. forecastEntity.setFQty(new BigDecimal(getString(detail.get("numberField_m65vi32s"))).doubleValue());//数量
  457. forecastEntity.setFStartDate(sdf.format(new Date((long) detail.get("dateField_m65vi32t"))));//预测开始日期
  458. forecastEntity.setFEndDate(sdf.format(new Date((long) detail.get("dateField_m65vi32u"))));//预测结束日期
  459. //均化类型 W:周,M:月,D:日,N:不均化
  460. String FAVERATYPE = getString(detail.get("selectField_m65vi32v"));
  461. switch (FAVERATYPE){
  462. case "不均化" : forecastEntity.setFAVERATYPE("N");break;
  463. case "日" : forecastEntity.setFAVERATYPE("D");break;
  464. case "周" : forecastEntity.setFAVERATYPE("W");break;
  465. case "月" : forecastEntity.setFAVERATYPE("M");break;
  466. default : break;
  467. }
  468. //均化周期
  469. if (Objects.nonNull(detail.get("numberField_m65vi32w"))){
  470. forecastEntity.setFAveraCycle((int) detail.get("numberField_m65vi32w"));
  471. }
  472. //预留类型 1:弱预留,3:强预留
  473. String FReserveType = getString(detail.get("selectField_m65vi32z"));
  474. switch (FReserveType){
  475. case "强预留" : forecastEntity.setFReserveType("3");
  476. case "弱预留" : forecastEntity.setFReserveType("1");
  477. }
  478. //需求优先级
  479. if (Objects.nonNull(detail.get("numberField_m6yh6qcy"))){
  480. forecastEntity.setFPriority((int) detail.get("numberField_m6yh6qcy"));
  481. }
  482. forecastEntity.setFRemark(getString(detail.get("textField_m65vi330")));//备注
  483. // forecastEntity.setFChangeFlag("0");//变更标志
  484. FEntity.add(forecastEntity);
  485. }
  486. model.setFEntity(FEntity);
  487. save.setModel(model);
  488. try{
  489. K3CloudApi client = new K3CloudApi(initIden());
  490. //业务对象标识
  491. String formId = "PLN_FORECAST";
  492. //调用接口
  493. String resultJson = client.save(formId,JSONObject.toJSONString(save));
  494. //用于记录结果
  495. Gson gson = new Gson();
  496. //对返回结果进行解析和校验
  497. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  498. if (isTrue(repoRet)){
  499. String id = repoRet.getResult().getId();
  500. Submit submit = new Submit();
  501. submit.setIds(id);
  502. //提交
  503. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  504. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  505. isTrue(repoRet2);
  506. String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
  507. ydClient.operateData(YDParam.builder()
  508. .formInstId(formInstId)
  509. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6ydmllb",orderCode)))
  510. .build(), YDConf.FORM_OPERATION.update);
  511. if (isTrue(repoRet2)){
  512. Audit audit = new Audit();
  513. audit.setIds(id);
  514. //审核
  515. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  516. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  517. isTrue(repoRet3);
  518. }
  519. }
  520. } catch (Exception e) {
  521. fail(e.getMessage());
  522. }
  523. return McR.success();
  524. }
  525. @Override
  526. public McR saveDefectiveOrder(Map map) {
  527. String formInstId = getString(map.get("formInstId"));
  528. Map formData = ydClient.queryData(YDParam.builder()
  529. .formInstId(formInstId)
  530. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  531. //将时间戳转化为字符串 年月日时分秒格式
  532. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  533. Save save = new Save();
  534. Model model = new Model();
  535. model.setFBillTypeID(new BillTypeID(getString(formData.get("textField_m6yntxn9"))));//单据类型
  536. //业务类型 1:采购检验 2:委外检验 3:来料不良
  537. String FBusinessType = getString(formData.get("selectField_m64pw0gf"));
  538. switch (FBusinessType){
  539. case "采购检验": model.setFBusinessType("1");break;
  540. case "委外检验": model.setFBusinessType("2");break;
  541. case "来料不良": model.setFBusinessType("3");break;
  542. default:break;
  543. }
  544. model.setFDate(sdf.format(new Date((long) formData.get("dateField_m64pw0gk"))));//日期
  545. model.setFSourceOrgId(new FNumber(getString(formData.get("textField_m6yntxn7"))));//来源组织
  546. model.setFInspectOrgId(new FNumber(getString(formData.get("textField_m6yntxnl"))));//质检组织
  547. model.setFInspectDepId(new FNumber(getString(formData.get("textField_m6yntxnc"))));//质检部门
  548. model.setFDescription(getString(formData.get("textareaField_m6yntxnh")));//备注
  549. List<Object> FEntity = new ArrayList<>();
  550. List<Map> details = (List<Map>) formData.get("tableField_m64pw0gm");
  551. for (Map detail : details) {
  552. DefectEntity defectEntity = new DefectEntity();
  553. defectEntity.setFMateridlId(new FNumber(getString(detail.get("textField_m64pw0go"))));//物料
  554. defectEntity.setFSupplierId(new FNumber(getString(detail.get("textField_m6yumh8w"))));//供应商
  555. defectEntity.setFUnitID(new FNumber(getString(detail.get("textField_m6yntxnj"))));//单位
  556. defectEntity.setFUsePolicy("F");//检验单使用决策 F:判退
  557. defectEntity.setFInspectDefectQty((int) detail.get("numberField_m82qkv1u"));//检验不良数量
  558. //不良处理 A:接收 B:让步接收 F:判退
  559. String FDefProcess = getString(detail.get("selectField_m64pw0gt"));
  560. switch (FDefProcess){
  561. case "接收": defectEntity.setFDefProcess("A");break;
  562. case "让步接收": defectEntity.setFDefProcess("B");break;
  563. case "判退": defectEntity.setFDefProcess("F");break;
  564. default:break;
  565. }
  566. defectEntity.setFDefectiveQty((int) detail.get("numberField_m64pw0gu"));//不良数量
  567. //关联检验单
  568. List<Object> linkEntity = new ArrayList<>();
  569. Map link = new HashMap();
  570. HashMap<String, Object> detailLink = new HashMap<>();
  571. // link.put("FEntity_Link_FFlowId", "");//业务流程图
  572. // link.put("FEntity_Link_FFlowLineId", "");//推进路线
  573. link.put("FEntity_Link_FRuleId","QM_Inspect2DefProecess");//转换规则
  574. // link.put("FEntity_Link_FSTableId", "");//源单表内码
  575. link.put("FEntity_Link_FSTableName","T_QM_INSPECTBILLENTRY");//源单表
  576. link.put("FEntity_Link_FSBillId",formData.get("numberField_m86nq0a5"));//源单内码
  577. link.put("FEntity_Link_FSId", detail.get("numberField_m873a1q2"));//源单分录内码
  578. linkEntity.add(link);
  579. defectEntity.setFEntity_Link(linkEntity);
  580. FEntity.add(defectEntity);
  581. }
  582. model.setFEntity(FEntity);
  583. save.setModel(model);
  584. try{
  585. K3CloudApi client = new K3CloudApi(initIden());
  586. //业务对象标识
  587. String formId = "QM_DefectProcessBill";
  588. //调用接口
  589. String resultJson = client.save(formId,JSONObject.toJSONString(save));
  590. //用于记录结果
  591. Gson gson = new Gson();
  592. //对返回结果进行解析和校验
  593. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  594. if (isTrue(repoRet)){
  595. String id = repoRet.getResult().getId();
  596. Submit submit = new Submit();
  597. submit.setIds(id);
  598. //提交
  599. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  600. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  601. if (isTrue(repoRet2)){
  602. String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
  603. ydClient.operateData(YDParam.builder()
  604. .formInstId(formInstId)
  605. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6yntxmz",orderCode)))
  606. .build(), YDConf.FORM_OPERATION.update);
  607. Audit audit = new Audit();
  608. audit.setIds(id);
  609. //审核
  610. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  611. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  612. if (isTrue(repoRet3)){
  613. //更新检验单使用决策
  614. String formId2 = "QM_InspectBill";
  615. Save save2 = new Save();
  616. Model model2 = new Model();
  617. model2.setFID((int)formData.get("numberField_m86nq0a5"));//检验单id
  618. List<Object> FEntityList = new ArrayList<>();
  619. for (Map detail : details) {
  620. Map FEntity2 = new HashMap();
  621. FEntity2.put("FEntryID",detail.get("numberField_m873a1q2"));//分录明细id
  622. List<Map> FPolicyDetailList = new ArrayList<>();
  623. Map FPolicyDetail = new HashMap();
  624. FPolicyDetail.put("FDetailID",detail.get("numberField_m8fkgsvo"));//使用决策id
  625. //不良处理 A:接收 B:让步接收 F:判退
  626. String FDefProcess = getString(detail.get("selectField_m64pw0gt"));
  627. switch (FDefProcess){
  628. case "接收": FPolicyDetail.put("FUsePolicy","A");break;
  629. case "让步接收": FPolicyDetail.put("FUsePolicy","B");break;
  630. case "判退": FPolicyDetail.put("FUsePolicy","F");break;
  631. default:break;
  632. }
  633. FPolicyDetailList.add(FPolicyDetail);
  634. FEntity2.put("FPolicyDetail",FPolicyDetailList);
  635. FEntityList.add(FEntity2);
  636. }
  637. model2.setFEntity(FEntityList);
  638. save2.setModel(model2);
  639. String resultJson4 = client.save(formId2,JSONObject.toJSONString(save2));
  640. RepoRet repoRet4 = gson.fromJson(resultJson4, RepoRet.class);
  641. isTrue(repoRet4);
  642. }
  643. }
  644. }
  645. } catch (Exception e) {
  646. McR.errorUnknown(e.getMessage());
  647. }
  648. return McR.success();
  649. }
  650. @Override
  651. public McR syncSupplier() {
  652. try {
  653. K3CloudApi client = new K3CloudApi(initIden());
  654. int startRow = 0;
  655. int limit = 2000;
  656. BillQuery billQuery = new BillQuery();
  657. billQuery.setLimit(limit);
  658. billQuery.setFormId("BD_Supplier");
  659. billQuery.setFieldKeys("FNumber,FUseOrgId,FName,FShortName,FGroup,FAuditorId,FAuditDate,FDocumentStatus,FForbidStatus");
  660. List<Map> filterString = new ArrayList<>();
  661. //修改时间为昨天到今天
  662. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  663. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  664. billQuery.setFilterString(filterString);
  665. List<Map> result = new ArrayList<>();
  666. List<Map> operatorList = new ArrayList<>();
  667. do {
  668. billQuery.setStartRow(startRow);
  669. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  670. result = (List<Map>)JSONObject.parse(s);
  671. operatorList.addAll(result);
  672. startRow += limit;
  673. }while (result.size() == limit);
  674. for (Map operator : operatorList) {
  675. Map formData = new HashMap();
  676. formData.put("textField_m6yuw4j2",operator.get("FName"));//名称
  677. formData.put("textField_m6yuw4j3",operator.get("FShortName"));//简称
  678. formData.put("textField_m6yuw4iw",operator.get("FNumber"));//编码
  679. formData.put("textField_m6yuw4j4",operator.get("FUseOrgId"));//组织
  680. if ((int) operator.get("FGroup") == 204305){
  681. formData.put("textField_m6yuw4ja","宁波健辉供应商");//供应商分组
  682. }
  683. formData.put("textField_m6yuw4jb",operator.get("FAuditorId"));//审核人
  684. formData.put("textField_m6yuw4jc",operator.get("FAuditDate"));//审核日期
  685. formData.put("textField_m6yuw4jd",FDOCUMENTSTATUS.get(getString(operator.get("FDocumentStatus"))));//数据状态
  686. formData.put("textField_m67pb4tk",FFORBIDSTATUS.get(getString(operator.get("FForbiddenStatus"))));//禁用状态
  687. ydClient.operateData(YDParam.builder()
  688. .formUuid("FORM-1DAEA1675CAE47F49BE1F86A034D695191W1")
  689. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m6yuw4iw",operator.get("FNumber"),"编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
  690. .formDataJson(JSONObject.toJSONString(formData))
  691. .build(), YDConf.FORM_OPERATION.upsert);
  692. }
  693. }catch (Exception e){
  694. fail(e.getMessage());
  695. }
  696. return McR.success();
  697. }
  698. @Override
  699. public McR syncPurchaseOrder() {
  700. try {
  701. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
  702. //业务对象标识
  703. String formId = "PUR_PurchaseOrder";
  704. K3CloudApi client = new K3CloudApi(initIden());
  705. Gson gson = new Gson();
  706. //查询当天审核中数据
  707. BillQuery billQuery = new BillQuery();
  708. billQuery.setFormId(formId);
  709. billQuery.setFieldKeys("FBillNo");
  710. billQuery.setStartRow(0);
  711. billQuery.setLimit(100);
  712. List<Map> filterString = new ArrayList<>();
  713. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDocumentStatus","105","B","","","0"));
  714. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","13","","","","0"));
  715. billQuery.setFilterString(filterString);
  716. String resultJson = client.billQuery(JSONObject.toJSONString(billQuery));
  717. List<Map> list = (List<Map>) JSONObject.parse(resultJson);
  718. for (Map map : list) {
  719. String fBillNo = getString(map.get("FBillNo"));
  720. //查询宜搭中是否已添加该采购订单
  721. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  722. .formUuid("FORM-050FE2BED20644318C2521F9C7B8D9D1FIFO")
  723. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m703yqyb", fBillNo)))
  724. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  725. //没有则新增
  726. if (data.isEmpty()){
  727. View view = new View();
  728. view.setNumber(fBillNo);
  729. String resultJson2 = client.view(formId,JSONObject.toJSONString(view));
  730. RepoRet repoRet = gson.fromJson(resultJson2, RepoRet.class);
  731. if (isTrue(repoRet)){
  732. Map result = (Map) repoRet.getResult().getResult();
  733. Map formData = new HashMap();
  734. formData.put("selectField_m65wv53k",getMultiLanguageTextName(result.get("BillTypeId")));//单据类型
  735. formData.put("selectField_m65wv53w",getMultiLanguageTextName(result.get("SupplierId")));//供应商
  736. //业务类型
  737. String businessType = getString(result.get("BusinessType"));
  738. switch (businessType){
  739. case "CG":formData.put("selectField_m65wv53r","标准采购");break;
  740. case "WW":formData.put("selectField_m65wv53r","标准委外");break;
  741. case "ZCCG":formData.put("selectField_m65wv53r","资产采购");break;
  742. case "ZYCG":formData.put("selectField_m65wv53r","直运采购");break;
  743. case "FYCG":formData.put("selectField_m65wv53r","费用采购");break;
  744. case "VMICG":formData.put("selectField_m65wv53r","VMI采购");break;
  745. case "cscg":formData.put("selectField_m65wv53r","测试采购");break;
  746. case "DRPCG":formData.put("selectField_m65wv53r","分销购销");break;
  747. default:;break;
  748. }
  749. formData.put("selectField_m65wv542",getMultiLanguageTextName(result.get("PurchaseOrgId")));//采购组织
  750. formData.put("selectField_m65wv543",getMultiLanguageTextName(result.get("PurchaseDeptId")));//采购部门
  751. formData.put("textField_m703yqyb",getString(result.get("BillNo")));//单据编号
  752. // 解析字符串为 LocalDateTime
  753. LocalDateTime localDateTime = LocalDateTime.parse(getString(result.get("Date")), formatter);
  754. // 将 LocalDateTime 转换为 ZonedDateTime
  755. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  756. formData.put("dateField_m65wv548",zonedDateTime.toInstant().toEpochMilli());//采购日期
  757. //验收方式
  758. String facctype = getString(result.get("FACCTYPE"));
  759. switch (facctype){
  760. case "A":formData.put("selectField_m703yqyc","金额验收");break;
  761. case "Q":formData.put("selectField_m703yqyc","数量验收");break;
  762. case "R":formData.put("selectField_m703yqyc","比例验收");break;
  763. default:break;
  764. }
  765. Map SupplierId = (Map) result.get("SupplierId");
  766. Map supplierBusiness = ((List<Map>) SupplierId.get("SupplierBusiness")).get(0);
  767. if (Objects.nonNull(supplierBusiness)){
  768. formData.put("selectField_m65wv54f",getMultiLanguageTextName(supplierBusiness.get("ProviderId")));//供货方
  769. formData.put("textField_m65wv54g",getMultiLanguageTextName(supplierBusiness.get("ProviderContactId")));//供货方联系人
  770. }
  771. formData.put("textField_m65wv54m",getString(result.get("ProviderEMail")));//邮箱
  772. Map supplierFinance = ((List<Map>) SupplierId.get("SupplierFinance")).get(0);
  773. if (Objects.nonNull(supplierFinance)){
  774. formData.put("selectField_m65wv54r",getMultiLanguageTextName(supplierFinance.get("SettleId")));//结算方
  775. formData.put("selectField_m65wv54s",getMultiLanguageTextName(supplierFinance.get("ChargeId")));//收款方
  776. }
  777. List<Map> details = new ArrayList<>();
  778. List<Map> poOrderEntry = (List<Map>) result.get("POOrderEntry");
  779. for (Map po : poOrderEntry) {
  780. Map detail = new HashMap();
  781. // detail.put("textField_m703yqyj",getString(po.get("ProductType")));//委外产品类型
  782. detail.put("textField_m703yqyk",getEntryNumber(po.get("MaterialId")));//物料编码
  783. detail.put("textField_m65wv551",getMultiLanguageTextName(po.get("MaterialId")));//物料名称
  784. detail.put("textField_m65wv552",getMultiLanguageTextSpecification(po.get("MaterialId")));//物料规格
  785. detail.put("textField_m65wv553",getMultiLanguageTextName(po.get("UnitId")));//采购单位
  786. detail.put("numberField_m65wv554",po.get("Qty"));//采购数量
  787. detail.put("textField_m65wv556",getMultiLanguageTextName(po.get("PriceUnitId")));//计价单位
  788. detail.put("textField_m65wv555",po.get("PriceUnitQty"));//计价数量
  789. if (Objects.nonNull(po.get("DeliveryDate"))){
  790. // 解析字符串为 LocalDateTime
  791. localDateTime = LocalDateTime.parse(getString(po.get("DeliveryDate")).substring(0,19), formatter);
  792. // 将 LocalDateTime 转换为 ZonedDateTime
  793. zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  794. detail.put("dateField_m65wv557",zonedDateTime.toInstant().toEpochMilli());//交货日期
  795. }
  796. if (Objects.nonNull(po.get("Price"))){
  797. detail.put("numberField_m65wv558",new BigDecimal(getString(po.get("Price"))).doubleValue());//单价
  798. detail.put("numberField_m65wv559",new BigDecimal(getString(po.get("TaxNetPrice"))).doubleValue());//含税单价
  799. }
  800. if (Objects.nonNull(po.get("DiscountRate"))){
  801. detail.put("numberField_m65wv55a",new BigDecimal(getString(po.get("DiscountRate"))).doubleValue());//折扣率
  802. detail.put("numberField_m65wv55b",new BigDecimal(getString(po.get("Discount"))).doubleValue());//折扣率
  803. }
  804. if (Objects.nonNull(po.get("TaxRate"))){
  805. detail.put("numberField_m65wv55c",new BigDecimal(getString(po.get("TaxRate"))).doubleValue());//税率
  806. detail.put("numberField_m65wv55d",new BigDecimal(getString(po.get("TaxAmount"))).doubleValue());//税额
  807. }
  808. detail.put("numberField_m65wv55e",new BigDecimal(getString(po.get("AllAmount"))).doubleValue());//价税合计
  809. detail.put("numberField_m65wv55f",new BigDecimal(getString(po.get("Amount"))).doubleValue());//金额
  810. details.add(detail);
  811. }
  812. formData.put("tableField_m65wv54z",details);
  813. //新增数据
  814. ydClient.operateData(YDParam.builder()
  815. .formUuid("FORM-050FE2BED20644318C2521F9C7B8D9D1FIFO")
  816. .formDataJson(JSONObject.toJSONString(formData))
  817. .processCode("TPROC--MN866991XW7SZ5CI7GWSFB064DIQ2LEFUW56M1")
  818. .build(), YDConf.FORM_OPERATION.start);
  819. }
  820. }
  821. }
  822. }catch (Exception e){
  823. fail(e.getMessage());
  824. }
  825. return McR.success();
  826. }
  827. @Override
  828. public McR auditPurchaseOrder(Map map) {
  829. String code = getString(map.get("code"));
  830. try {
  831. K3CloudApi client = new K3CloudApi(initIden());
  832. String formId = "PUR_PurchaseOrder";
  833. Gson gson = new Gson();
  834. Audit audit = new Audit();
  835. audit.setNumbers(Collections.singletonList(code));
  836. //审核
  837. String resultJson = client.audit(formId,JSONObject.toJSONString(audit));
  838. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  839. isTrue(repoRet);
  840. }catch (Exception e){
  841. fail(e.getMessage());
  842. }
  843. return McR.success();
  844. }
  845. @Override
  846. public McR syncSalePrice() {
  847. try {
  848. K3CloudApi client = new K3CloudApi(initIden());
  849. Gson gson = new Gson();
  850. String formId = "BD_SAL_PriceList";
  851. int startRow = 0;
  852. int limit = 2000;
  853. BillQuery billQuery = new BillQuery();
  854. billQuery.setLimit(limit);
  855. billQuery.setFormId(formId);
  856. billQuery.setFieldKeys("FNumber");
  857. List<Map> filterString = new ArrayList<>();
  858. //修改时间为昨天到今天
  859. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","265","1","","","0"));
  860. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-06 00:00:00","","","0"));
  861. billQuery.setFilterString(filterString);
  862. List<Map> result = new ArrayList<>();
  863. List<Map> operatorList = new ArrayList<>();
  864. do {
  865. billQuery.setStartRow(startRow);
  866. String s = client.billQuery(JSONObject.toJSONString(billQuery));
  867. result = (List<Map>)JSONObject.parse(s);
  868. operatorList.addAll(result);
  869. startRow += limit;
  870. }while (result.size() == limit);
  871. for (Map operator : operatorList) {
  872. String fNumber = getString(operator.get("FNumber"));
  873. View view = new View();
  874. view.setNumber(fNumber);
  875. String resultJson2 = client.view(formId,JSONObject.toJSONString(view));
  876. RepoRet repoRet = gson.fromJson(resultJson2, RepoRet.class);
  877. if (isTrue(repoRet)) {
  878. Map result2 = (Map) repoRet.getResult().getResult();
  879. Map formData = new HashMap();
  880. formData.put("textField_m7k2tk3u",getString(((List<Map>)result2.get("Name")).get(0).get("Value")));//名称
  881. formData.put("textField_m7k2tk3t",getString(result2.get("Number")));//编号
  882. formData.put("textField_m7k2tk3v",getMultiLanguageTextName(result2.get("CurrencyId")));//币别
  883. formData.put("textField_m7lhqd0y",getEntryNumber(result2.get("CurrencyId")));//币别编码
  884. Map salApplycustomer = ((List<Map>) result2.get("SAL_APPLYCUSTOMER")).get(0);
  885. formData.put("textField_m7k314sr",getMultiLanguageTextName(salApplycustomer.get("CustID")));//客户名称
  886. formData.put("textField_m7k314ss",getEntryNumber(salApplycustomer.get("CustID")));//客户编码
  887. formData.put("textField_m7k2tk3z",(boolean) result2.get("IsIncludedTax") ? "是" : "否");//含税
  888. List<Map> salPricelistentry = (List<Map>) result2.get("SAL_PRICELISTENTRY");
  889. for (Map salPriceEntry : salPricelistentry) {
  890. formData.put("textField_m7k2tk3x",getMultiLanguageTextName(salPriceEntry.get("MaterialId")));//物料名称
  891. formData.put("textField_m7k2tk3w",getEntryNumber(salPriceEntry.get("MaterialId")));//物料编码
  892. formData.put("textField_m7k2tk3y",getMultiLanguageTextName(salPriceEntry.get("PriceUnitId")));//计价单位
  893. formData.put("textField_m7k314st",getEntryNumber(salPriceEntry.get("PriceUnitId")));//单位编码
  894. formData.put("numberField_m7k2tk41",new BigDecimal(getString(salPriceEntry.get("Price"))));//价格
  895. formData.put("textField_m7k2tk42",AUDITSTATUS.get(getString(salPriceEntry.get("RowAuditStatus"))));//审核状态
  896. formData.put("textField_m7u4x3hr",FFORBIDSTATUS.get(getString(salPriceEntry.get("ForbidStatus"))));//失效
  897. //新增数据
  898. ydClient.operateData(YDParam.builder()
  899. .formUuid("FORM-3B1E5298BA4644C1B994B81A4D986886YRA5")
  900. .formDataJson(JSONObject.toJSONString(formData))
  901. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_m7k2tk3t, textField_m7k2tk3w",getString(result2.get("Number")),getEntryNumber(salPriceEntry.get("MaterialId")))))
  902. .useLatestVersion(true)
  903. .build(), YDConf.FORM_OPERATION.upsert);
  904. }
  905. }
  906. }
  907. }catch (Exception e){
  908. fail(e.getMessage());
  909. }
  910. return McR.success();
  911. }
  912. @Override
  913. public McR syncInspectionOrder() {
  914. try {
  915. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
  916. //业务对象标识
  917. String formId = "QM_InspectBill";
  918. K3CloudApi client = new K3CloudApi(initIden());
  919. Gson gson = new Gson();
  920. //查询当天已审核且审核结果为不合格的数据
  921. BillQuery billQuery = new BillQuery();
  922. billQuery.setFormId(formId);
  923. billQuery.setFieldKeys("FBillNo");
  924. billQuery.setStartRow(0);
  925. billQuery.setLimit(2000);
  926. List<Map> filterString = new ArrayList<>();
  927. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FInspectResult","29","2","","","0"));
  928. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FDocumentStatus","105","C","","","0"));
  929. filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","13","","","","0"));//审核日期为今天
  930. // filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","39","2025-03-10 00:00:00","","","0"));//审核日期大于2025-03-10 00:00:00
  931. billQuery.setFilterString(filterString);
  932. String resultJson = client.billQuery(JSONObject.toJSONString(billQuery));
  933. List<Map> list = (List<Map>) JSONObject.parse(resultJson);
  934. Set<String> fBillNoSet = new HashSet<>();
  935. for (Map map : list) {
  936. String fBillNo = getString(map.get("FBillNo"));
  937. if (!fBillNoSet.contains(fBillNo)){
  938. fBillNoSet.add(fBillNo);
  939. }else {
  940. continue;
  941. }
  942. //查询宜搭中是否已添加该检验单
  943. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  944. .formUuid("FORM-959B1CB0AF9F41A091DFDE1203D0C7B2FQBO")
  945. .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m82j5zsd", fBillNo)))
  946. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  947. if (data.isEmpty()){
  948. View view = new View();
  949. view.setNumber(fBillNo);
  950. String resultJson2 = client.view(formId,JSONObject.toJSONString(view));
  951. RepoRet repoRet = gson.fromJson(resultJson2, RepoRet.class);
  952. if (isTrue(repoRet)){
  953. Map result = (Map) repoRet.getResult().getResult();
  954. Map formData = new HashMap();
  955. formData.put("textField_m82j5zsd",fBillNo);//单据编号
  956. formData.put("numberField_m86nmon3",result.get("Id"));//id
  957. formData.put("textField_m82j5zse",getMultiLanguageTextName(result.get("FBillTypeID")));//单据类型
  958. formData.put("textField_m82j5zsf",BUSINESS_TYPE.get(getString(result.get("BusinessType"))));//业务类型
  959. // 解析字符串为 LocalDateTime
  960. LocalDateTime localDateTime = LocalDateTime.parse(getString(result.get("FDate")), formatter);
  961. // 将 LocalDateTime 转换为 ZonedDateTime
  962. ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
  963. formData.put("dateField_m82j5zsk",zonedDateTime.toInstant().toEpochMilli());//单据日期
  964. formData.put("textField_m82j5zsl",FDOCUMENTSTATUS.get(getString(result.get("DocumentStatus"))));//单据状态
  965. if (!((List<Map>)result.get("Description")).isEmpty()){
  966. formData.put("textareaField_m82j5zsm",((List<Map>)result.get("Description")).get(0).get("Value"));//描述
  967. }
  968. List<Map> entityList = (List<Map>) result.get("Entity");
  969. List<Map> detailList = new ArrayList<>();
  970. for (Map entity : entityList) {
  971. Map detail = new HashMap();
  972. detail.put("textField_m82j5zsp",getEntryNumber(entity.get("MaterialId")));//物料编码
  973. detail.put("textField_m82j5zsr",getMultiLanguageTextSpecification(entity.get("MaterialId")));//规格型号
  974. detail.put("textField_m82j5zsq",getMultiLanguageTextName(entity.get("MaterialId")));//物料名称
  975. detail.put("textField_m82og859",getMultiLanguageTextName(entity.get("UnitId")));//单位
  976. detail.put("textField_m82og85a",getEntryNumber(entity.get("UnitId")));//单位编码
  977. detail.put("textField_m82qhpm0",getMultiLanguageTextName(entity.get("SupplierId")));//供应商
  978. detail.put("textField_m82qhpm1",getEntryNumber(entity.get("SupplierId")));//供应商编码
  979. detail.put("numberField_m82j5zst",entity.get("InspectQty"));//检验数量
  980. detail.put("numberField_m82j5zsu",entity.get("QualifiedQty"));//合格数
  981. detail.put("numberField_m82j5zsv",entity.get("UnqualifiedQty"));//不合格数
  982. detail.put("textField_m82j5zsx",INSPECT_RESULT.get(getString(entity.get("InspectResult"))));//检验结果
  983. detail.put("numberField_m873a1q2",entity.get("Id"));//分录明细id
  984. if (!((List<Map>)entity.get("Memo")).isEmpty()){
  985. detail.put("textField_m82j5zsz",((List<Map>)entity.get("Memo")).get(0).get("Value"));//不良原因
  986. }
  987. List<Map> policyDetail = (List<Map>) entity.get("PolicyDetail");
  988. if (!policyDetail.isEmpty()){
  989. detail.put("numberField_m8fkgsvo",policyDetail.get(0).get("Id"));//使用决策id
  990. }
  991. detailList.add(detail);
  992. }
  993. formData.put("tableField_m82j5zso",detailList);
  994. //新增数据
  995. ydClient.operateData(YDParam.builder()
  996. .formUuid("FORM-959B1CB0AF9F41A091DFDE1203D0C7B2FQBO")
  997. .formDataJson(JSONObject.toJSONString(formData))
  998. .build(), YDConf.FORM_OPERATION.create);
  999. }
  1000. /*else {
  1001. //更新数据
  1002. ydClient.operateData(YDParam.builder()
  1003. .formInstId(getString(data.get(0).get("formInstanceId")))
  1004. .updateFormDataJson(JSONObject.toJSONString(formData))
  1005. .useLatestVersion(true).build(), YDConf.FORM_OPERATION.update);
  1006. }*/
  1007. }
  1008. }
  1009. }catch (Exception e){
  1010. return McR.errorUnknown(e.getMessage());
  1011. }
  1012. return McR.success();
  1013. }
  1014. @Override
  1015. public McR syncData() {
  1016. syncCustomers();//同步客户
  1017. syncSalesman();//同步业务员
  1018. syncSupplier();//同步供应商
  1019. syncSalePrice();//同步销售价目表
  1020. syncMaterial();//同步物料
  1021. //新增数据底表更新时间
  1022. ydClient.operateData(YDParam.builder()
  1023. .formUuid("FORM-5BAA6A050AC449438568D5A50FE2D2684RBN")
  1024. .formDataJson(JSONObject.toJSONString(UtilMap.map("dateField_m8sdk1ny", new Date().getTime())))
  1025. .build(), YDConf.FORM_OPERATION.create);
  1026. return McR.success();
  1027. }
  1028. @Async
  1029. @Override
  1030. public void manualSyncData(String userId) {
  1031. //发送工作通知
  1032. if (Strings.isNotBlank(userId)){
  1033. Map param2 = new HashMap();
  1034. param2.put("access_token",ddClient.getAccessToken());
  1035. Map body3 = new HashMap();
  1036. body3.put("agent_id",ddConf.getAgentId());
  1037. body3.put("userid_list",userId);
  1038. Map msg = new HashMap();
  1039. msg.put("msgtype","text");
  1040. //获取当前时间 精确到秒
  1041. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  1042. msg.put("text", UtilMap.map("content","开始同步金蝶业务数据 时间:" + time));
  1043. body3.put("msg",msg);
  1044. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
  1045. }
  1046. syncData();
  1047. //发送工作通知
  1048. if (Strings.isNotBlank(userId)){
  1049. Map param2 = new HashMap();
  1050. param2.put("access_token",ddClient.getAccessToken());
  1051. Map body3 = new HashMap();
  1052. body3.put("agent_id",ddConf.getAgentId());
  1053. body3.put("userid_list",userId);
  1054. Map msg = new HashMap();
  1055. msg.put("msgtype","text");
  1056. //获取当前时间 精确到秒
  1057. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  1058. msg.put("text", UtilMap.map("content","金蝶业务数据已更新 时间:" + time));
  1059. body3.put("msg",msg);
  1060. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
  1061. }
  1062. }
  1063. private String getMultiLanguageTextName(Object object){
  1064. if (Objects.nonNull(object)){
  1065. Map map = (Map) object;
  1066. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  1067. String value = getString(multiLanguageText.get(0).get("Name"));
  1068. return value;
  1069. }
  1070. return null;
  1071. }
  1072. private String getMultiLanguageTextSpecification(Object object){
  1073. if (Objects.nonNull(object)){
  1074. Map map = (Map) object;
  1075. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  1076. String value = getString(multiLanguageText.get(0).get("Specification"));
  1077. return value;
  1078. }
  1079. return null;
  1080. }
  1081. private String getEntryNumber(Object object){
  1082. if (Objects.nonNull(object)){
  1083. Map map = (Map) object;
  1084. String value = getString(map.get("Number"));
  1085. return value;
  1086. }
  1087. return null;
  1088. }
  1089. private boolean isTrue(RepoRet repoRet){
  1090. Gson gson = new Gson();
  1091. if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
  1092. System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
  1093. return true;
  1094. } else {
  1095. fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
  1096. return false;
  1097. }
  1098. }
  1099. private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
  1100. List<Map> list = new ArrayList<>();
  1101. DDR_New ddrNew = new DDR_New();
  1102. int pageNumber = 1;
  1103. int pageSize = 100;
  1104. do {
  1105. ddrNew = ydClient.queryData(YDParam.builder().formUuid(formUuid)
  1106. .searchCondition(searchCondition)
  1107. .pageNumber(pageNumber)
  1108. .pageSize(pageSize).build(), formQuery);
  1109. list.addAll((List<Map>) ddrNew.getData());
  1110. pageNumber++;
  1111. }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
  1112. return list;
  1113. }
  1114. }