ChuiZiServiceImpl.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. package com.malk.chuizi.service.impl;
  2. import cn.hutool.core.date.LocalDateTimeUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.google.gson.Gson;
  8. import com.kingdee.bos.webapi.entity.IdentifyInfo;
  9. import com.kingdee.bos.webapi.entity.RepoRet;
  10. import com.kingdee.bos.webapi.sdk.K3CloudApi;
  11. import com.malk.chuizi.config.KDWebApiConf;
  12. import com.malk.chuizi.entity.*;
  13. import com.malk.chuizi.service.ChuiZiService;
  14. import com.malk.server.aliwork.YDConf;
  15. import com.malk.server.aliwork.YDParam;
  16. import com.malk.server.common.McR;
  17. import com.malk.server.dingtalk.DDR_New;
  18. import com.malk.service.aliwork.YDClient;
  19. import com.malk.service.dingtalk.DDClient;
  20. import com.malk.service.dingtalk.DDClient_Personnel;
  21. import com.malk.service.dingtalk.DDClient_Workflow;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.beans.factory.annotation.Value;
  25. import org.springframework.stereotype.Service;
  26. import java.time.LocalDate;
  27. import java.util.*;
  28. import static org.junit.Assert.fail;
  29. @Slf4j
  30. @Service
  31. public class ChuiZiServiceImpl implements ChuiZiService {
  32. @Autowired
  33. private KDWebApiConf kdWebApiConf;
  34. @Autowired
  35. private DDClient ddClient;
  36. @Autowired
  37. private DDClient_Personnel ddClientPersonnel;
  38. @Value("${dingtalk.agentId}")
  39. private Long agentId;
  40. @Autowired
  41. private YDClient ydClient;
  42. //单据状态
  43. private static final Map<String,String> FDOCUMENTSTATUS = new HashMap<>();
  44. static{
  45. FDOCUMENTSTATUS.put("Z","暂存");
  46. FDOCUMENTSTATUS.put("A","创建");
  47. FDOCUMENTSTATUS.put("B","审核中");
  48. FDOCUMENTSTATUS.put("C","已审核");
  49. FDOCUMENTSTATUS.put("D","重新审核");
  50. }
  51. //整单状态
  52. private static final Map<String,String> AUDITSTATUS = new HashMap<>();
  53. static{
  54. AUDITSTATUS.put("U","未审核");
  55. AUDITSTATUS.put("A","已审核");
  56. AUDITSTATUS.put("I","审核中");
  57. AUDITSTATUS.put("P","部分审核");
  58. AUDITSTATUS.put("R","重新审核");
  59. }
  60. //禁用状态
  61. private static final Map<String,String> FFORBIDSTATUS = new HashMap<>();
  62. static{
  63. FFORBIDSTATUS.put("A","否");
  64. FFORBIDSTATUS.put("B","是");
  65. }
  66. private static final Map<String,String> FFORBIDDENSTATUS = new HashMap<>();
  67. static{
  68. FFORBIDDENSTATUS.put("0","否");
  69. FFORBIDDENSTATUS.put("1","是");
  70. }
  71. private static final Map<String,String> FERPCLSID = new HashMap<>();
  72. static {
  73. FERPCLSID.put("10","资产");
  74. FERPCLSID.put("9","配置");
  75. FERPCLSID.put("2","自制");
  76. FERPCLSID.put("11","费用");
  77. FERPCLSID.put("12","模型");
  78. FERPCLSID.put("5","虚拟");
  79. FERPCLSID.put("7","一次性");
  80. FERPCLSID.put("13","产品系列");
  81. FERPCLSID.put("3","委外");
  82. FERPCLSID.put("4","特征");
  83. FERPCLSID.put("6","服务");
  84. FERPCLSID.put("1","外购");
  85. }
  86. private static final Map<String,String> BUSINESS_TYPE = new HashMap<>();
  87. static {
  88. BUSINESS_TYPE.put("8","发货检验");
  89. BUSINESS_TYPE.put("25","生产退料检验");
  90. BUSINESS_TYPE.put("26","委外退料检验");
  91. BUSINESS_TYPE.put("3","产品检验");
  92. BUSINESS_TYPE.put("20","其他检验");
  93. BUSINESS_TYPE.put("6","委外工序");
  94. BUSINESS_TYPE.put("10","受托材料检验");
  95. BUSINESS_TYPE.put("2","委外检验");
  96. BUSINESS_TYPE.put("21","工序巡检");
  97. BUSINESS_TYPE.put("7","退货检验");
  98. BUSINESS_TYPE.put("9","生产线检验");
  99. BUSINESS_TYPE.put("1","采购检验");
  100. BUSINESS_TYPE.put("4","库存检验");
  101. BUSINESS_TYPE.put("5","工序自制");
  102. }
  103. private static final Map<String,String> INSPECT_RESULT = new HashMap<>();
  104. static {
  105. INSPECT_RESULT.put("1","合格");
  106. INSPECT_RESULT.put("2","不合格");
  107. INSPECT_RESULT.put("3","保留");
  108. }
  109. private static final Map<String,String> DEPARTMENT = new HashMap<>();
  110. static {
  111. DEPARTMENT.put("经营管理部","CZ00104");
  112. DEPARTMENT.put("人事行政部","CZ00105");
  113. DEPARTMENT.put("销售部","CZ00106");
  114. DEPARTMENT.put("技术部","CZ00107");
  115. DEPARTMENT.put("IT部门","CZ00107");
  116. DEPARTMENT.put("后勤部","CZ00108");
  117. DEPARTMENT.put("资材部","CZ00109");
  118. DEPARTMENT.put("原料仓库组","CZ0010902");
  119. DEPARTMENT.put("成品仓库组","CZ0010903");
  120. DEPARTMENT.put("生产计划组","CZ0010904");
  121. DEPARTMENT.put("客户服务组","CZ0010905");
  122. DEPARTMENT.put("品质部","CZ00110");
  123. DEPARTMENT.put("一车间检验组","CZ0011001");
  124. DEPARTMENT.put("二车间检验组","CZ0011002");
  125. DEPARTMENT.put("三车间检验组","CZ0011003");
  126. DEPARTMENT.put("生产部","CZ00111");
  127. DEPARTMENT.put("一车间生产组","CZ0011101");
  128. DEPARTMENT.put("二车间生产组","CZ0011103");
  129. DEPARTMENT.put("三车间生产组","CZ0011105");
  130. DEPARTMENT.put("总经办","CZ00101");
  131. DEPARTMENT.put("审计部","CZ00102");
  132. DEPARTMENT.put("财务部","CZ00103");
  133. }
  134. private static final Map<String,String> PAYMENT_METHOD = new HashMap<>();
  135. static {
  136. PAYMENT_METHOD.put("现金","JSFS01_SYS");
  137. PAYMENT_METHOD.put("现金支票","JSFS02_SYS");
  138. PAYMENT_METHOD.put("转账支票","JSFS03_SYS");
  139. PAYMENT_METHOD.put("电汇","JSFS04_SYS");
  140. PAYMENT_METHOD.put("信汇","JSFS05_SYS");
  141. PAYMENT_METHOD.put("商业承兑汇票","JSFS06_SYS");
  142. PAYMENT_METHOD.put("银行承兑汇票","JSFS07_SYS");
  143. PAYMENT_METHOD.put("信用证","JSFS08_SYS");
  144. PAYMENT_METHOD.put("应收票据背书","JSFS09_SYS");
  145. PAYMENT_METHOD.put("票据退票","JSFS12_SYS");
  146. PAYMENT_METHOD.put("保证金转货款","JSFS22_SYS");
  147. PAYMENT_METHOD.put("微信","JSFS31_SYS");
  148. PAYMENT_METHOD.put("支付宝","JSFS32_SYS");
  149. PAYMENT_METHOD.put("供应链票据","JSFS36_SYS");
  150. PAYMENT_METHOD.put("内部转销","JSFS41_SYS");
  151. PAYMENT_METHOD.put("认领结算","JSFS81_SYS");
  152. }
  153. private IdentifyInfo initIden(){
  154. //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
  155. //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
  156. //读取配置,初始化SDK
  157. IdentifyInfo iden = new IdentifyInfo();
  158. iden.setUserName(kdWebApiConf.getXKDApiUserName());
  159. iden.setAppId(kdWebApiConf.getXKDApiAppID());
  160. iden.setdCID(kdWebApiConf.getXKDApiAcctID());
  161. iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
  162. iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
  163. return iden;
  164. }
  165. private String getString(Object object){
  166. return object == null ? "" : object.toString();
  167. }
  168. /// dingtalk
  169. final String APP_EKY = "ding9seotugcsfjlgy8h";
  170. final String APP_SECRET = "4k6hoCDUwwpUG5WXijfWcnzIm97j_zGquJqXJgrkBcyp2vo7ceV6dO-nSDUUDMhE";
  171. @Override
  172. public McR saveOtherMeet(Map processData) {
  173. String userId = String.valueOf(processData.get("originatorUserId"));
  174. String workId = getNumberByUserId(userId);
  175. Save save = new Save();
  176. Model otherMeet = new Model();
  177. otherMeet.setFCONTACTUNITTYPE("BD_Empinfo");
  178. otherMeet.setFBillTypeID(new BillTypeID("QTYFD02_SYS"));
  179. otherMeet.setFCONTACTUNIT(new FNumber(workId));//员工号
  180. otherMeet.setFDATE(LocalDateTimeUtil.format(LocalDate.now(),"yyyy-MM-dd"));
  181. otherMeet.setFENDDATE_H(LocalDateTimeUtil.format(LocalDate.now(),"yyyy-MM-dd"));
  182. otherMeet.setFCURRENCYID(new FNumber("PRE001"));//币别
  183. final double[] sum = {0.0,0.0};
  184. List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
  185. Map<String, Object> mainData = new HashMap<>();
  186. List<Map<String,Object>> sonData = new ArrayList<>();
  187. formComponentValues.forEach(e->{
  188. String name = e.get("name").toString();
  189. if ("金蝶科目".equals(name) || "报销科目".equals(name) || "归属部门".equals(name) || "发票类型".equals(name) || "申请人".equals(name) ) {
  190. mainData.put(name, e.get("value"));
  191. } else if ("TableField".equals(e.get("componentType"))) {
  192. Object parse = JSON.parse(e.get("value").toString());
  193. JSONArray jsonArray = JSON.parseArray(parse.toString());
  194. for (int i = 0; i < jsonArray.size(); i++) {
  195. JSONObject jsonObject = (JSONObject) jsonArray.get(i);
  196. Object rowValue = jsonObject.get("rowValue");
  197. JSONArray array = JSON.parseArray(rowValue.toString());
  198. for (int i1 = 0; i1 < array.size(); i1++) {
  199. jsonObject = (JSONObject) array.get(i1);
  200. if (jsonObject.containsKey("extendValue")){
  201. rowValue = jsonObject.get("extendValue");
  202. jsonObject = JSONObject.parseObject(rowValue.toString());
  203. rowValue = jsonObject.get("list");
  204. JSONArray array1 = JSON.parseArray(rowValue.toString());
  205. for (int i2 = 0; i2 < array1.size(); i2++) {
  206. jsonObject = (JSONObject) array1.get(i2);
  207. if (jsonObject.containsKey("rowValue")){
  208. rowValue = jsonObject.get("rowValue");
  209. JSONArray array2 = JSON.parseArray(rowValue.toString());
  210. for (int l = 0; l < array2.size(); l++) {
  211. Map<String, Object> map = new HashMap<>();
  212. jsonObject = (JSONObject) array2.get(l);
  213. //需要改成金额
  214. if ("金额".equals(jsonObject.get("label"))){
  215. double amount = Double.parseDouble(jsonObject.get("value") == null ? "0.0" : jsonObject.get("value").toString());
  216. sum[0] = sum[0] + amount;
  217. sum[1] = sum[1] + amount;
  218. map.put("amount",amount);
  219. sonData.add(map);
  220. }
  221. }
  222. }
  223. }
  224. }
  225. }
  226. }
  227. }
  228. });
  229. List<Object> objects = new ArrayList<>();
  230. if (ObjectUtil.isNotNull(sonData) && sonData.size()>0){
  231. sonData.forEach(e->{
  232. OtherMeetEntity otherMeetEntity = new OtherMeetEntity();
  233. otherMeetEntity.setFCOSTID(new FNumber(mainData.get("金蝶科目").toString()));
  234. otherMeetEntity.setFINVOICETYPE(mainData.get("发票类型").toString());
  235. otherMeetEntity.setFCOSTDEPARTMENTID(new FNumber(DEPARTMENT.get(mainData.get("归属部门").toString())));
  236. otherMeetEntity.setFEntryTaxRate(0.0);
  237. otherMeetEntity.setFNOTAXAMOUNTFOR(Double.parseDouble(e.get("amount").toString()));
  238. otherMeetEntity.setFTAXAMOUNTFOR(0.0);
  239. otherMeetEntity.setFTOTALAMOUNTFOR(Double.parseDouble(e.get("amount").toString()));
  240. otherMeetEntity.setFPaySubEntity(null);
  241. objects.add(otherMeetEntity);
  242. });
  243. }
  244. otherMeet.setFEntity(objects);
  245. save.setModel(otherMeet);
  246. System.out.println(save);
  247. try{
  248. K3CloudApi client = new K3CloudApi(initIden());
  249. //业务对象标识
  250. String formId = "AP_OtherPayable";
  251. //调用接口
  252. String resultJson = client.save(formId,JSONObject.toJSONString(save));
  253. //用于记录结果
  254. Gson gson = new Gson();
  255. //对返回结果进行解析和校验
  256. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  257. if (isTrue(repoRet)){
  258. String id = repoRet.getResult().getId();
  259. Submit submit = new Submit();
  260. submit.setIds(id);
  261. //提交
  262. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  263. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  264. isTrue(repoRet2);
  265. // String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
  266. // ydClient.operateData(YDParam.builder()
  267. //// .formInstId(formInstId)
  268. // .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6yntxmz",orderCode)))
  269. // .build(), YDConf.FORM_OPERATION.update);
  270. if (isTrue(repoRet2)){
  271. Audit audit = new Audit();
  272. audit.setIds(id);
  273. //审核
  274. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  275. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  276. isTrue(repoRet3);
  277. }
  278. }
  279. } catch (Exception e) {
  280. McR.errorUnknown(e.getMessage());
  281. }
  282. return McR.success();
  283. }
  284. @Override
  285. public McR saveAccountsPayable(Map processData) {
  286. // String userId = String.valueOf(processData.get("originatorUserId"));
  287. Save save = new Save();
  288. Model model = new Model();
  289. model.setFCONTACTUNITTYPE("BD_Supplier");
  290. model.setFBillTypeID(new BillTypeID("FKDLX01_SYS"));
  291. model.setFDATE(LocalDateTimeUtil.format(LocalDate.now(),"yyyy-MM-dd"));
  292. model.setFCURRENCYID(new FNumber("PRE001"));//币别
  293. List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
  294. Map<String, Object> mainData = new HashMap<>();
  295. formComponentValues.forEach(e->{
  296. String name = e.get("name").toString();
  297. mainData.put(name, e.get("value"));
  298. });
  299. List<AccountsPayableEntity> objects = new ArrayList<>();
  300. if (ObjectUtil.isNotNull(mainData)){
  301. //主表
  302. model.setFREMARK(mainData.get("付款事由").toString());
  303. model.setFRECTUNIT(new FNumber(mainData.get("供应商编码").toString()));
  304. model.setFCONTACTUNIT(new FNumber(mainData.get("供应商编码").toString()));
  305. //明细
  306. AccountsPayableEntity accountsPayableEntity = new AccountsPayableEntity();
  307. accountsPayableEntity.setFSETTLETYPEID(new FNumber(PAYMENT_METHOD.get(mainData.get("付款方式"))));//结算方式
  308. accountsPayableEntity.setFPURPOSEID(new FNumber(mainData.get("付款用途编码").toString()));//付款用途
  309. accountsPayableEntity.setFPAYTOTALAMOUNTFOR(Double.parseDouble(mainData.get("付款总额").toString()));
  310. accountsPayableEntity.setFPAYAMOUNTFOR_E(Double.parseDouble(mainData.get("付款总额").toString()));
  311. objects.add(accountsPayableEntity);
  312. }
  313. model.setFPAYBILLENTRY(objects);
  314. save.setModel(model);
  315. System.out.println(save);
  316. try{
  317. K3CloudApi client = new K3CloudApi(initIden());
  318. //业务对象标识
  319. String formId = "AP_PAYBILL";
  320. //调用接口
  321. String resultJson = client.save(formId,JSONObject.toJSONString(save));
  322. //用于记录结果
  323. Gson gson = new Gson();
  324. //对返回结果进行解析和校验
  325. RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
  326. if (isTrue(repoRet)){
  327. String id = repoRet.getResult().getId();
  328. Submit submit = new Submit();
  329. submit.setIds(id);
  330. //提交
  331. String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
  332. RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
  333. isTrue(repoRet2);
  334. if (isTrue(repoRet2)){
  335. Audit audit = new Audit();
  336. audit.setIds(id);
  337. //审核
  338. String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
  339. RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
  340. isTrue(repoRet3);
  341. }
  342. }
  343. } catch (Exception e) {
  344. McR.errorUnknown(e.getMessage());
  345. }
  346. return McR.success();
  347. }
  348. public String getNumberByUserId(String workingEmployeeIds) {
  349. // log.info("根据钉钉人员id获取员工工号:{}",workingEmployeeIds);
  350. List<String> filterList = new ArrayList<>();
  351. filterList.add("sys00-jobNumber");
  352. List<Map> employeeInfos = ddClientPersonnel.getEmployeeInfos(ddClient.getAccessToken(), Arrays.asList(workingEmployeeIds), agentId, filterList);
  353. final String[] value = {""};
  354. employeeInfos.forEach(e -> {
  355. List<Map> mapList = (List<Map>) e.get("field_data_list");
  356. mapList.forEach(m -> {
  357. List<Map> valueList = (List<Map>) m.get("field_value_list");
  358. value[0] = ObjectUtil.isNotNull(valueList.get(0).get("value")) ? valueList.get(0).get("value").toString() : null;
  359. });
  360. });
  361. return value[0];
  362. }
  363. private String getMultiLanguageTextName(Object object){
  364. if (Objects.nonNull(object)){
  365. Map map = (Map) object;
  366. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  367. String value = getString(multiLanguageText.get(0).get("Name"));
  368. return value;
  369. }
  370. return null;
  371. }
  372. private String getMultiLanguageTextSpecification(Object object){
  373. if (Objects.nonNull(object)){
  374. Map map = (Map) object;
  375. List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
  376. String value = getString(multiLanguageText.get(0).get("Specification"));
  377. return value;
  378. }
  379. return null;
  380. }
  381. private String getEntryNumber(Object object){
  382. if (Objects.nonNull(object)){
  383. Map map = (Map) object;
  384. String value = getString(map.get("Number"));
  385. return value;
  386. }
  387. return null;
  388. }
  389. private boolean isTrue(RepoRet repoRet){
  390. Gson gson = new Gson();
  391. if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
  392. System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
  393. return true;
  394. } else {
  395. fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
  396. return false;
  397. }
  398. }
  399. private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
  400. List<Map> list = new ArrayList<>();
  401. DDR_New ddrNew = new DDR_New();
  402. int pageNumber = 1;
  403. int pageSize = 100;
  404. do {
  405. ddrNew = ydClient.queryData(YDParam.builder().formUuid(formUuid)
  406. .searchCondition(searchCondition)
  407. .pageNumber(pageNumber)
  408. .pageSize(pageSize).build(), formQuery);
  409. list.addAll((List<Map>) ddrNew.getData());
  410. pageNumber++;
  411. }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
  412. return list;
  413. }
  414. }