|
|
@@ -0,0 +1,778 @@
|
|
|
+package com.malk.aosikang.service.Impl;
|
|
|
+
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.malk.aosikang.service.DingTalkService;
|
|
|
+import com.malk.aosikang.service.PayService;
|
|
|
+import com.malk.server.crm.DDR;
|
|
|
+import com.malk.service.dingtalk.DDClient;
|
|
|
+import com.malk.service.dingtalk.DDClient_Personnel;
|
|
|
+import com.malk.service.dingtalk.DDClient_Workflow;
|
|
|
+import com.malk.service.dingtalk.DDService;
|
|
|
+import com.malk.utils.UtilDateTime;
|
|
|
+import com.malk.utils.UtilFile;
|
|
|
+import com.malk.utils.UtilMap;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections4.map.HashedMap;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class PayServiceImpl implements PayService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DDClient ddClient;
|
|
|
+ @Autowired
|
|
|
+ private DDClient_Workflow ddClient_workflow;
|
|
|
+ @Autowired
|
|
|
+ private DDClient_Personnel ddClientPersonnel;
|
|
|
+ @Value("${dingtalk.appKey}")
|
|
|
+ private String APP_EKY;
|
|
|
+ @Value("${dingtalk.appSecret}")
|
|
|
+ private String APP_SECRET;
|
|
|
+ @Value("${dingtalk.agentId}")
|
|
|
+ private Long agentId;
|
|
|
+ @Value("${crm.appId}")
|
|
|
+ private String appId;
|
|
|
+ @Value("${crm.appSecret}")
|
|
|
+ private String appSecret;
|
|
|
+ @Value("${crm.permanentCode}")
|
|
|
+ private String permanentCode;
|
|
|
+ @Value("${crm.url}")
|
|
|
+ private String crmHost;
|
|
|
+ @Autowired
|
|
|
+ DingTalkService dingTalkService;
|
|
|
+ @Autowired
|
|
|
+ DDService ddService;
|
|
|
+
|
|
|
+ private static final String API_TOKEN = "/corpAccessToken/get/V2";
|
|
|
+ private static final String POST_GET_USER = "/user/getByMobile";
|
|
|
+ // private static final String FIND_BY_CODES = "/common/users/v2/findByCodes";
|
|
|
+ private static final String POST_DATA_UPDATE = "/crm/custom/v2/data/update";
|
|
|
+ private static final String TABLE_PRODUCT_FIELID = "TableField_BEUZFS0B8R40";
|
|
|
+ private static final String TABLE_CELLLINES_FIELID = "TableField_M04O3XGALA80";
|
|
|
+ private ConcurrentHashMap<String, LocalDateTime> tokenStore = new ConcurrentHashMap<>();
|
|
|
+ private static String CROPID = "";
|
|
|
+
|
|
|
+ //所有的枚举
|
|
|
+ private static final Map<String, String> ALLENUM = new HashMap<>();
|
|
|
+
|
|
|
+ static {
|
|
|
+ //签署法人实体
|
|
|
+ ALLENUM.put("option_aoscience_bio_nantong_co_l__c", "澳斯康生物(南通)股份有限公司");
|
|
|
+ ALLENUM.put("option_gansu_jianshun_biotech_co__c", "甘肃健顺生物科技有限公司");
|
|
|
+ ALLENUM.put("option_jianshun_bio_tech_nantong__c", "健顺生物科技(南通)有限公司");
|
|
|
+ ALLENUM.put("option_shanghai_aoskang_bio_pharm__c", "上海澳斯康生物制药有限公司");
|
|
|
+ ALLENUM.put("option_shanghai_jianshiba_biotech__c", "上海健士拜生物科技有限公司");
|
|
|
+ ALLENUM.put("option_group_research_center__c", "集团研发中心");
|
|
|
+ ALLENUM.put("i5r85d5r8", "集团部门");
|
|
|
+ //区域
|
|
|
+ ALLENUM.put("option_international__c", "国际");
|
|
|
+ ALLENUM.put("cD2b3f", "国内");
|
|
|
+ //合同事宜
|
|
|
+ ALLENUM.put("x8luwTHo7", "合同签订");
|
|
|
+ ALLENUM.put("kptFZ7XFr", "合同变更");
|
|
|
+ ALLENUM.put("8D36ieItP", "合同解除");
|
|
|
+ //是否设计法人章、是否涉密
|
|
|
+ ALLENUM.put("option_yes__c", "是");
|
|
|
+ ALLENUM.put("option_no__c", "否");
|
|
|
+ //合同总价是否为固定金额、客户是否需求赔偿
|
|
|
+ ALLENUM.put("true", "是");
|
|
|
+ ALLENUM.put("false", "否");
|
|
|
+ //原币类型
|
|
|
+ ALLENUM.put("option_example_options__c", "欧元EUR");
|
|
|
+ ALLENUM.put("option_usd_currency__c", "美元USD");
|
|
|
+ ALLENUM.put("option_cny__c", "人民币CNY");
|
|
|
+ //是否加盖公章
|
|
|
+ ALLENUM.put("wSZ3tbp4m", "否");
|
|
|
+ ALLENUM.put("option1", "是");
|
|
|
+ //投诉等级
|
|
|
+ ALLENUM.put("option_B__c", "一般质量投诉");
|
|
|
+ ALLENUM.put("option_A__c", "重大质量投诉");
|
|
|
+ //申请类型
|
|
|
+ ALLENUM.put("1kRYAt2So", "细胞株");
|
|
|
+ ALLENUM.put("9V9fvk5j1", "原材料");
|
|
|
+ ALLENUM.put("5U6yt12hf", "耗材");
|
|
|
+ ALLENUM.put("evF26O4He", "产品");
|
|
|
+ ALLENUM.put("other", "其他");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //所有的枚举
|
|
|
+ private static final Map<String, String> AFTER_SALE = new HashMap<>();
|
|
|
+
|
|
|
+ static {
|
|
|
+ //售后管理
|
|
|
+ AFTER_SALE.put("option_example_options__c", "投诉处理(非质量投诉)");
|
|
|
+ AFTER_SALE.put("option_quality_complaint_handling__c", "投诉处理(质量投诉)");
|
|
|
+ }
|
|
|
+
|
|
|
+ //各表单审批结果映射
|
|
|
+ private static final Map<String, String> APPROVAL_RESULT = new HashMap<>();
|
|
|
+ static {
|
|
|
+ APPROVAL_RESULT.put("DXCPXS", "approval_result__c");
|
|
|
+ APPROVAL_RESULT.put("NDKJXS", "field_V4t4n__c");
|
|
|
+ APPROVAL_RESULT.put("YPSQ", "field_0Xan7__c");
|
|
|
+ APPROVAL_RESULT.put("KS", "field_AkJi0__c");
|
|
|
+ }
|
|
|
+ //各表单审批结果映射
|
|
|
+ private static final Map<String, String> APPROVAL_TYPE = new HashMap<>();
|
|
|
+ static {
|
|
|
+ APPROVAL_TYPE.put("DXCPXS", "framework_agreement__c");
|
|
|
+ APPROVAL_TYPE.put("NDKJXS", "frameork_agreement__c");
|
|
|
+ APPROVAL_TYPE.put("YPSQ", "sample_application__c");
|
|
|
+ APPROVAL_TYPE.put("KS", "customer_complaint__c");
|
|
|
+ }
|
|
|
+
|
|
|
+ //产品信息子表id
|
|
|
+ private static final Map<String, String> PRODUCTS_IDS = new HashMap<>();
|
|
|
+ static {
|
|
|
+ PRODUCTS_IDS.put("产品名称", "TextField_EKDJALVY7400");
|
|
|
+ PRODUCTS_IDS.put("产品规格", "TextField_EZ369AR1K540");
|
|
|
+ PRODUCTS_IDS.put("有效期", "TextField_15ALDAZR96KG0");
|
|
|
+ PRODUCTS_IDS.put("产品批号", "TextField_OLDI5UFGBO00");
|
|
|
+ PRODUCTS_IDS.put("包装数量", "NumberField_PC0XRBAYFW00");
|
|
|
+ }
|
|
|
+
|
|
|
+ //细胞株信息子表id
|
|
|
+ private static final Map<String, String> CELLLINES_IDS = new HashMap<>();
|
|
|
+ static {
|
|
|
+ CELLLINES_IDS.put("细胞株名称", "TextField_NSL9P2RPBE80");
|
|
|
+ CELLLINES_IDS.put("细胞株类型", "TextField_1HTGO286W6DC0");
|
|
|
+ CELLLINES_IDS.put("数量", "NumberField_1CV9FYA729UO0");
|
|
|
+ CELLLINES_IDS.put("温度", "TextField_23O8J0UZ7PVK0");
|
|
|
+ CELLLINES_IDS.put("储存和运输条件", "TextField_1Y6PNKV1MRC00");
|
|
|
+ }
|
|
|
+
|
|
|
+ //审批拒绝置空CRM
|
|
|
+ private static final Map<String, String> CRM_NULL = new HashMap<>();
|
|
|
+ static {
|
|
|
+ CRM_NULL.put("DXCPXS", "dingtalk_bill_number__c");
|
|
|
+ CRM_NULL.put("NDKJXS", "dd_approval_id__c");
|
|
|
+ CRM_NULL.put("YPSQ", "dd_approval_id__c");
|
|
|
+ CRM_NULL.put("KS", "dd_approval_id__c");
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map MATE;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载json
|
|
|
+ */
|
|
|
+ private Map _getMeta() {
|
|
|
+ if (ObjectUtil.isNull(MATE)) {
|
|
|
+ MATE = (Map) UtilFile.readJsonObjectFromResource("static/json/form.json"); // 本地匹配宜搭组件ID
|
|
|
+ }
|
|
|
+ return MATE;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void synchronousAndPush(String processInstanceId) {
|
|
|
+ Map formData = queryOAById(processInstanceId);
|
|
|
+ final String[] token = {""};
|
|
|
+ final boolean[] isHave = {false};
|
|
|
+ tokenStore.forEach((k, v) -> {
|
|
|
+ if (validateToken(k)) {
|
|
|
+ token[0] = k;
|
|
|
+ isHave[0] = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+// if (!isHave[0]) {
|
|
|
+// token[0] = getToken();
|
|
|
+// }
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ param.put("access_token", token[0]);
|
|
|
+ //获取申请人数据
|
|
|
+ List<Map> userName = new ArrayList<>();
|
|
|
+ try {
|
|
|
+ List<String> userIds = Arrays.asList(formData.get("userId").toString());
|
|
|
+ List<String> workNumbers = getNumberByUserId(userIds);
|
|
|
+ log.info("获取申请人工号:{}",workNumbers.toString());
|
|
|
+// userName = getUserFormByNumber(workNumbers, token[0]);
|
|
|
+ log.info("获取申请人云简平台信息:{}",workNumbers);
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ log.info("云简平台查无此人,请检查钉钉和云简员工号是否对应");
|
|
|
+ }
|
|
|
+ //获取同行人数据
|
|
|
+ List<Object> names = new ArrayList<>();
|
|
|
+ if (ObjectUtil.isNotNull(formData.get("出行人(同行人)"))){
|
|
|
+ List<String> companionsUserIds = (List<String>)formData.get("出行人(同行人)");
|
|
|
+ List<String> companionsWorkNumbers = getNumberByUserId(companionsUserIds);
|
|
|
+// List<Map> companionsUserName = getUserFormByNumber(companionsWorkNumbers, token[0]);
|
|
|
+// userName.addAll(companionsUserName);
|
|
|
+// names = companionsUserName.stream().map(item -> item.get("name")).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ // 去重
|
|
|
+ List<Map> uniqueUsers= new ArrayList<>(userName.stream()
|
|
|
+ .filter(m -> m != null) // 过滤掉空值
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ m -> m.toString(), // 使用 map 的 toString() 作为唯一标识符
|
|
|
+ m -> m, // 保留原 map
|
|
|
+ (existing, replacement) -> existing // 遇到重复时保留已有元素
|
|
|
+ )).values());
|
|
|
+// extracted(formData, param, uniqueUsers, names);
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getUserId(String phoneNum){
|
|
|
+
|
|
|
+ Number nextCursor = 0; // 初始的offset值设置为"0"
|
|
|
+ List<String> allUserIds = new ArrayList<>();
|
|
|
+ while (nextCursor != null ) {
|
|
|
+ Map userIds = dingTalkService.getAllUserIdInfo(ddClient.getAccessToken(),"2,3,5",nextCursor,50);
|
|
|
+ //获取在职人员信息
|
|
|
+ List<String> userIdList = (List<String>) userIds.get("data_list");
|
|
|
+ Number newNextCursor = (Number) userIds.getOrDefault("next_cursor", null);
|
|
|
+ if (!userIdList.isEmpty()) {
|
|
|
+ allUserIds.addAll(userIdList);
|
|
|
+ }
|
|
|
+ // 更新nextCursor为下一次请求的offset
|
|
|
+ nextCursor = newNextCursor;
|
|
|
+ }
|
|
|
+
|
|
|
+ return phoneNum;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 整合传参及OA数据格式
|
|
|
+ * @param code 单据类型
|
|
|
+ * @param data 传参
|
|
|
+ * @return 流程实例id
|
|
|
+ */
|
|
|
+ private String dataProcessing(String code, Map data){
|
|
|
+ //加载json映射
|
|
|
+ Map meta = _getMeta();
|
|
|
+ //表单字段映射
|
|
|
+ List<Map> formValue = new ArrayList<>();
|
|
|
+ log.info("code:{} ",code);
|
|
|
+ IntegrationData(code, data, meta, formValue);
|
|
|
+ List<String> workingEmployeeIds = new ArrayList<>();
|
|
|
+ workingEmployeeIds.add(data.get(((Map) meta.get(code)).get("creator")).toString());
|
|
|
+ List<String> deptIdByUserId = getDeptIdByUserId(workingEmployeeIds);
|
|
|
+ return ddClient_workflow.doProcessInstancesNew(ddClient.getAccessToken(), data.get(((Map) meta.get(code)).get("creator")).toString(), ((Map) meta.get(code)).get("processCode").toString(), formValue, deptIdByUserId.get(0));
|
|
|
+// return code;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 整合传参数据为OA审批 name - value 数据格式
|
|
|
+ * @param code 单据类型
|
|
|
+ * @param data 传参
|
|
|
+ * @param meta json
|
|
|
+ * @param formValue OA审批数据格式
|
|
|
+ */
|
|
|
+ private void IntegrationData(String code, Map data, Map meta, List<Map> formValue) {
|
|
|
+ log.info("开始处理接口参数数据转为OA审批接口数据格式");
|
|
|
+ //json数据列
|
|
|
+ Map<String, ?> component = (Map) ((Map) meta.get(code)).get("compIds");
|
|
|
+ for (String key : component.keySet()) {
|
|
|
+ Map formData = UtilMap.empty();
|
|
|
+ if (key.startsWith("tableField_")) {
|
|
|
+ String[] split = key.split("_");
|
|
|
+ List<Map> rows = UtilMap.getList(data,split[1]);
|
|
|
+ List<List<Map>> lastList = new ArrayList<>();
|
|
|
+ Map<String, String> compIds = (Map) component.get(key);
|
|
|
+ if (rows.size() > 0 ){
|
|
|
+ for (Map row : rows) {
|
|
|
+ List<Map> details = new ArrayList<>();
|
|
|
+ for (String prop : compIds.keySet()) {
|
|
|
+ Map detail = UtilMap.empty();
|
|
|
+ detail.put("value", row.get(compIds.get(prop)));
|
|
|
+ detail.put("name", prop);
|
|
|
+ details.add(detail);
|
|
|
+ }
|
|
|
+ lastList.add(details);
|
|
|
+ }
|
|
|
+ formData.put( "value", JSON.toJSONString(lastList));
|
|
|
+ formData.put( "name",((Map) meta.get(code)).get(split[1]).toString());
|
|
|
+ }else {
|
|
|
+ List<Map> details = new ArrayList<>();
|
|
|
+ for (String prop : compIds.keySet()) {
|
|
|
+ Map detail = UtilMap.empty();
|
|
|
+ if ("quantity".equals(compIds.get(prop))){
|
|
|
+ detail.put("value", "0");
|
|
|
+ detail.put("name", prop);
|
|
|
+ }else {
|
|
|
+ detail.put("value", "无");
|
|
|
+ detail.put("name", prop);
|
|
|
+ }
|
|
|
+ details.add(detail);
|
|
|
+ }
|
|
|
+ lastList.add(details);
|
|
|
+ formData.put( "value", JSON.toJSONString(lastList));
|
|
|
+ formData.put( "name",((Map) meta.get(code)).get(split[1]).toString());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (data.containsKey(component.get(key))){
|
|
|
+ if (ObjectUtil.isNotNull(data.get(component.get(key)))){
|
|
|
+ Object value = data.get(component.get(key));
|
|
|
+ formData.put("name", key);
|
|
|
+ formData.put("value",value.toString());
|
|
|
+ if (ALLENUM.containsKey(value.toString())){
|
|
|
+ formData.put("value",ALLENUM.get(value.toString()));
|
|
|
+ }
|
|
|
+ if (AFTER_SALE.containsKey(value.toString()) && "KS".equals(code) && "售后管理".equals(key)) {
|
|
|
+ formData.put("value",AFTER_SALE.get(value.toString()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (formData.size()>0){
|
|
|
+ formValue.add(formData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (data.containsKey("attachmentUrl") && ObjectUtil.isNotNull(data.get("attachmentUrl"))){
|
|
|
+ log.info("开始处理附件上传");
|
|
|
+ List<Map> attachment = (List<Map>) data.get("attachmentUrl");
|
|
|
+ List<Map<String, Object>> resultList = new ArrayList<>();
|
|
|
+ attachment.forEach(e->{
|
|
|
+ String[] split = UtilMap.getString(e, "name").split("\\.");
|
|
|
+ String fileName = split[0];
|
|
|
+ Map map = ddService.uploadFileFormUrlForOverflow(ddClient.getAccessToken(), data.get(((Map) meta.get(code)).get("creator")).toString(), e.get("downloadUrl").toString(), fileName, UtilMap.getString(e,"type"));
|
|
|
+ Map<String, Object> result = UtilMap.map("spaceId, fileName, fileSize, fileType, fileId", UtilMap.getString(map, "spaceId"), fileName,
|
|
|
+ UtilMap.getString(map, "size"), UtilMap.getString(map, "extension"), UtilMap.getString(map, "id"));
|
|
|
+ resultList.add(result);
|
|
|
+ });
|
|
|
+ formValue.add(UtilMap.map("name, value","附件",JSON.toJSONString(resultList)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发起流程审批
|
|
|
+ * @param code
|
|
|
+ * @param data
|
|
|
+ * @return 流程实例id和地址
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> startProcess(String code, Map data) {
|
|
|
+ String instanceId = dataProcessing(code, data);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(instanceId);
|
|
|
+ if (!ObjectUtil.isNotNull(jsonObject.get("instanceId"))){
|
|
|
+ return UtilMap.map("ddProcessId, dtUrl, reqMsg", jsonObject.get("instanceId"), "error", instanceId);
|
|
|
+ }
|
|
|
+ String url = "https://applink.dingtalk.com/approval/detail?corpId=ding226da4276814d290a1320dcb25e91351&instanceId=" + jsonObject.get("instanceId");
|
|
|
+ return UtilMap.map("ddProcessId, dtUrl, reqMsg", jsonObject.get("instanceId"), url, instanceId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 终止流程
|
|
|
+ * @param data 传参
|
|
|
+ * @return 是否成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map terminateProcess(Map data) {
|
|
|
+ boolean isSystem = false;
|
|
|
+ if (data.containsKey("isSystem") && ObjectUtil.isNotNull(data.get("isSystem"))){
|
|
|
+ isSystem = UtilMap.getBoolean(data,"isSystem");
|
|
|
+ }
|
|
|
+ String operatingUserId = "";
|
|
|
+ if (data.containsKey("operatingUserId")){
|
|
|
+ operatingUserId = UtilMap.getString(data,"operatingUserId");
|
|
|
+ }
|
|
|
+ boolean isOk = ddClient_workflow.terminateRunningApproveNew(ddClient.getAccessToken(), UtilMap.getString(data, "processInstanceId"), isSystem, UtilMap.getString(data, "remark"), operatingUserId);
|
|
|
+ return UtilMap.map("result",isOk);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新表单实例
|
|
|
+ * @param code 单据类型
|
|
|
+ * @param data 传参
|
|
|
+ * @return 是否成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean updateProcess(String code, Map data) {
|
|
|
+ Map formData = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), UtilMap.getString(data, "instanceId"));
|
|
|
+ boolean isOk = false;
|
|
|
+ if (ObjectUtil.isNotNull(formData)){
|
|
|
+ List<Map> mapList = (List<Map>) formData.get("formComponentValues");
|
|
|
+ //加载json映射
|
|
|
+ Map meta = _getMeta();
|
|
|
+ //表单字段映射
|
|
|
+ List<Map> formValue = new ArrayList<>();
|
|
|
+ log.info("code:{} ",code);
|
|
|
+ IntegrationData(code, data, meta, formValue);
|
|
|
+ //更新值
|
|
|
+ List<Map> variables = new ArrayList<>();
|
|
|
+ formValue.forEach(f->{
|
|
|
+ List<Map> lastValues = new ArrayList<>();
|
|
|
+ String fielId ="";
|
|
|
+ if ("样品信息".equals(f.get("name")) || "细胞株信息".equals(f.get("name"))){
|
|
|
+ switch (f.get("name").toString()){
|
|
|
+ case "样品信息": fielId = TABLE_PRODUCT_FIELID;break;
|
|
|
+ case "细胞株信息": fielId = TABLE_CELLLINES_FIELID;break;
|
|
|
+
|
|
|
+ }
|
|
|
+ JSONArray jsonArray2 = JSONArray.parseArray(f.get("value").toString());
|
|
|
+ String finalFielId = fielId;
|
|
|
+ jsonArray2.forEach(a2->{
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(a2.toString());
|
|
|
+ List<Map> values = new ArrayList<>();
|
|
|
+ jsonArray.forEach(a3->{
|
|
|
+ if ("样品信息".equals(f.get("name"))){
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(a3.toString());
|
|
|
+ Map<String, Object> value = UtilMap.map("key, value",PRODUCTS_IDS.get(jsonObject.get("name").toString()), jsonObject.get("value"));
|
|
|
+ values.add(value);
|
|
|
+ }else if ("细胞株信息".equals(f.get("name"))){
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(a3.toString());
|
|
|
+ Map<String, Object> value = UtilMap.map("key, value",CELLLINES_IDS.get(jsonObject.get("name").toString()), jsonObject.get("value"));
|
|
|
+ values.add(value);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ lastValues.add( UtilMap.map("rowValue, rowNumber", values, finalFielId+ "_" +UUID.randomUUID().toString().substring(0,7)));
|
|
|
+ });
|
|
|
+ Map<String, Object> variable = UtilMap.map("id, value", fielId, JSON.toJSONString(lastValues));
|
|
|
+ variables.add(variable);
|
|
|
+ }
|
|
|
+ mapList.forEach(map -> {
|
|
|
+ if (f.get("name").equals(map.get("name"))){
|
|
|
+ if ("附件".equals(f.get("name")) || "TableField".equals(map.get("componentType"))){
|
|
|
+
|
|
|
+ }else {
|
|
|
+ Map<String, Object> variable = UtilMap.map("id, value",map.get("id"), UtilMap.getString(f,"value"));
|
|
|
+ variables.add(variable);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ String remark = "";
|
|
|
+ if (data.containsKey("remark")){
|
|
|
+ remark = UtilMap.getString(data,"remark");
|
|
|
+ }
|
|
|
+ isOk = ddClient_workflow.updateApprove(ddClient.getAccessToken(), UtilMap.getString(data, "opUserId"), UtilMap.getString(data, "instanceId"), "", variables, remark);
|
|
|
+ }
|
|
|
+ return isOk;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void approveUpdateCRM(String processInstanceId, String code, String result, boolean isAgree) {
|
|
|
+ log.info("开始执行审批回调:{} 审批结果:{}",processInstanceId,result);
|
|
|
+ Map processData = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(APP_EKY, APP_SECRET), processInstanceId);
|
|
|
+ String userId = String.valueOf(processData.get("originatorUserId"));
|
|
|
+ List<String> mapList = new ArrayList<>();
|
|
|
+ mapList.add(userId);
|
|
|
+ List<String> numberByUserId = getNumberByUserId(mapList);
|
|
|
+ String trim = numberByUserId.get(0);
|
|
|
+ if (trim.contains("-")){
|
|
|
+ String[] split = trim.split("-");
|
|
|
+ trim = split[1].trim();
|
|
|
+ }
|
|
|
+ List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
|
|
|
+ List<Map> operationRecords = (List<Map>) processData.get("operationRecords");
|
|
|
+ final String[] remark = {""};
|
|
|
+ operationRecords.forEach(o->{
|
|
|
+ if(!"NONE".equals(o.get("result"))){
|
|
|
+ remark[0] = UtilMap.getString(o,"remark");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ Map formComp = formComponentValues.stream().filter(item -> "crmId".equals(item.get("name"))).findAny().get();
|
|
|
+ String value = formComp.get("value").toString();
|
|
|
+
|
|
|
+ Map<String, String> objectData = new HashMap<>();
|
|
|
+ objectData.put(APPROVAL_RESULT.get(code),"审批结果:"+result+",审批意见:"+ remark[0]);
|
|
|
+ objectData.put("dataObjectApiName",APPROVAL_TYPE.get(code));
|
|
|
+ objectData.put("_id",value);
|
|
|
+ if (!isAgree){
|
|
|
+ objectData.put(CRM_NULL.get(code),"");
|
|
|
+ }
|
|
|
+ final String[] crmValue = {"",""};
|
|
|
+ final boolean[] isHave = {false};
|
|
|
+ tokenStore.forEach((k, v) -> {
|
|
|
+ if (validateToken(k)) {
|
|
|
+ crmValue[0] = k;
|
|
|
+ crmValue[1] = CROPID;
|
|
|
+ isHave[0] = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (!isHave[0]) {
|
|
|
+ Map crmToken = getToken();
|
|
|
+ crmValue[0] = UtilMap.getString(crmToken,"token");
|
|
|
+ crmValue[1] = UtilMap.getString(crmToken,"corpId");
|
|
|
+ }
|
|
|
+
|
|
|
+ String userFormByNumber = getUserFormByNumber(trim, crmValue[1], crmValue[0]);
|
|
|
+
|
|
|
+ updateCRMForm(userFormByNumber,crmValue[1],crmValue[0],objectData);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Map getToken() {
|
|
|
+ Map<String, String> body = new HashMap<>();
|
|
|
+ body.put("appId", appId);
|
|
|
+ body.put("appSecret", appSecret);
|
|
|
+ body.put("permanentCode", permanentCode);
|
|
|
+ Map<String, String> header = UtilMap.map("Content-Type", "application/json");
|
|
|
+ DDR ddr = DDR.doPost(getRequestUrl(API_TOKEN), header, null, body);
|
|
|
+ addToken(ddr.getCorpAccessToken(), 110);
|
|
|
+ CROPID = ddr.getCorpId();
|
|
|
+ return UtilMap.map("token, corpId",ddr.getCorpAccessToken(),ddr.getCorpId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * token存储
|
|
|
+ * @param token
|
|
|
+ * @param expireMinutes
|
|
|
+ */
|
|
|
+ public void addToken(String token, int expireMinutes) {
|
|
|
+ LocalDateTime expirationTime = LocalDateTime.now().plusMinutes(expireMinutes);
|
|
|
+ tokenStore.put(token, expirationTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清理过期token
|
|
|
+ * @param token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean validateToken(String token) {
|
|
|
+ LocalDateTime expirationTime = tokenStore.get(token);
|
|
|
+ if (expirationTime == null || expirationTime.isBefore(LocalDateTime.now())) {
|
|
|
+ tokenStore.remove(token); // 清理过期 Token
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void testToken() {
|
|
|
+ Map processData = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(APP_EKY, APP_SECRET), "9aUyg-MhQOaWMIu6KIMt3A03891762254188");
|
|
|
+ List<Map> operationRecords = (List<Map>) processData.get("operationRecords");
|
|
|
+ final String[] remark = {""};
|
|
|
+ operationRecords.forEach(o->{
|
|
|
+ if(!"NONE".equals(o.get("result"))){
|
|
|
+ remark[0] = UtilMap.getString(o,"remark");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ approveUpdateCRM("QHtdZ0DyTQq-elLLjmic9g03891762329654","DXCPXS","审批拒绝", false);
|
|
|
+ System.out.println(remark[0]);
|
|
|
+// Map token = getToken();
|
|
|
+// List<String> mapList = new ArrayList<>();
|
|
|
+// mapList.add("manager3269");
|
|
|
+// List<String> numberByUserId = getNumberByUserId(mapList);
|
|
|
+// numberByUserId.forEach(e->{
|
|
|
+// String trim = e;
|
|
|
+// if (e.contains("-")){
|
|
|
+// String[] split = e.split("-");
|
|
|
+// trim = split[1].trim();
|
|
|
+// }
|
|
|
+// String userFormByNumber = getUserFormByNumber(trim, token.get("corpId").toString(), token.get("token").toString());
|
|
|
+//
|
|
|
+// });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void testGet(String id) {
|
|
|
+ approveUpdateCRM("K977PURCR0SATrmOoPfTAg03891761641697","KS","审批拒绝",false);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取钉钉OA单据数据
|
|
|
+ * @param processInstanceId 钉钉OA流程单号(URL上)
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Map queryOAById(String processInstanceId) {
|
|
|
+ String[] compsId_main = {"发票抬头", "备注", "出差天数", "出差事由", "出差备注", "出行人(同行人)", "外部人员", "出差流水号", "日程", "出差类型"};
|
|
|
+ String[] compsId_itinerary = {"交通工具", "单程往返", "出发城市", "目的城市", "开始时间", "结束时间", "时长"};
|
|
|
+// syncYD(processInstanceId, "FORM-210DA087671044F8A5CD72F0E9E89060SZ8Q", compsId_main, compsId_itinerary, "itinerary");
|
|
|
+ String token = ddClient.getAccessToken(APP_EKY, APP_SECRET);
|
|
|
+
|
|
|
+ Map processData = ddClient_workflow.getProcessInstanceId(token, processInstanceId);
|
|
|
+ List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
|
|
|
+ log.info("开始获取OA数据:{}",formComponentValues);
|
|
|
+
|
|
|
+ String userId = String.valueOf(processData.get("originatorUserId"));
|
|
|
+ long cDate = UtilDateTime.parse(UtilMap.getString(processData, "createTime"), "yyyy-MM-dd'T'HH:mm").getTime();
|
|
|
+ Map formData = UtilMap.map("userId, depId, createTime, textField_lygnetw9", userId, processData.get("originatorDeptId"), cDate, UtilMap.getString(processData, "businessId"));
|
|
|
+
|
|
|
+ for (String name : compsId_main) {
|
|
|
+ String compId = name;
|
|
|
+ // 判定是否子表 [宜搭]
|
|
|
+ if (compId.endsWith("日程")) {
|
|
|
+ List<Map> details = new ArrayList<>();
|
|
|
+ // 兼容明细组件, 存在多条情况 [加班跨天才有有明细]
|
|
|
+ Optional optional = formComponentValues.stream().filter(item -> "itinerary".equals(item.get("bizAlias"))).findAny();
|
|
|
+ if (!optional.isPresent()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String schedule = UtilMap.getString((Map) optional.get(), "value");
|
|
|
+ List<Map> itineraryList = ((List<Map>) JSON.parse(schedule));
|
|
|
+ // 循环明细数据
|
|
|
+ for (Map itinerary : itineraryList) {
|
|
|
+ List<Map> rowValue = (List<Map>) itinerary.get("rowValue");
|
|
|
+ Map rowData = new HashedMap();
|
|
|
+ // 循环子表组件
|
|
|
+ for (String subName : compsId_itinerary) {
|
|
|
+ log.info("子表字段, {}", subName);
|
|
|
+ // 加班单跨天 [子表label为空]
|
|
|
+ rowData.put(subName, rowValue.stream().filter(item -> subName.equals(item.get("bizAlias")) || subName.equals(item.get("label"))).findAny().get().get("value"));
|
|
|
+ }
|
|
|
+ details.add(rowData);
|
|
|
+ }
|
|
|
+ formData.put(compId, details);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ log.info("主表字段, {}", name);
|
|
|
+ // 请假套件: 开始时间 / 结束时间 / 时长 / 单位 / 请假类型
|
|
|
+ if ("DDHolidayField".equals(name)) {
|
|
|
+ Optional optional = formComponentValues.stream().filter(item -> "DDHolidayField".equals(item.get("componentType"))).findAny();
|
|
|
+ if (optional.isPresent()) {
|
|
|
+ String[] ids = compId.split(" / ");
|
|
|
+ List vas = (List) JSON.parse(UtilMap.getString((Map) optional.get(), "value"));
|
|
|
+ for (int i = 0; i < ids.length; i++) {
|
|
|
+ formData.put(ids[i], vas.get(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Map formComp = formComponentValues.stream().filter(item -> name.equals(item.get("name"))).findAny().get();
|
|
|
+ Object value = formComp.get("value");
|
|
|
+ // 成员组件, 数据处理
|
|
|
+ if ("InnerContactField".equals(formComp.get("componentType")) && formComp.containsKey("value")) {
|
|
|
+ List<Map> empInfos = (List<Map>) JSON.parse(String.valueOf(formComp.get("extValue")));
|
|
|
+ List<String> emplsId = new ArrayList<>();
|
|
|
+ for (Map empInfo : empInfos) {
|
|
|
+ emplsId.add(String.valueOf(empInfo.get("emplId")));
|
|
|
+ }
|
|
|
+ value = emplsId; // 成员多选
|
|
|
+ }
|
|
|
+ formData.put(compId, value);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("缺失字段:{}", name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return formData;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取钉钉员工手机号
|
|
|
+ * @param workingEmployeeIds 钉钉人员id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<String> getNumberByUserId(List<String> workingEmployeeIds) {
|
|
|
+ log.info("根据钉钉人员id获取员工工号:{}",workingEmployeeIds.toString());
|
|
|
+ List<String> filterList = new ArrayList<>();
|
|
|
+ filterList.add("sys00-mobile");
|
|
|
+ List<Map> employeeInfos = ddClientPersonnel.getEmployeeInfos(ddClient.getAccessToken(), workingEmployeeIds, agentId, filterList);
|
|
|
+ List<String> personList = new ArrayList<>();
|
|
|
+ employeeInfos.forEach(e -> {
|
|
|
+ List<Map> mapList = (List<Map>) e.get("field_data_list");
|
|
|
+ mapList.forEach(m -> {
|
|
|
+ List<Map> valueList = (List<Map>) m.get("field_value_list");
|
|
|
+ String value = valueList.get(0).get("value").toString();
|
|
|
+ personList.add(value);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return personList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取钉钉员工手机号
|
|
|
+ * @param workingEmployeeIds 钉钉人员id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<String> getDeptIdByUserId(List<String> workingEmployeeIds) {
|
|
|
+ log.info("根据钉钉人员id获取员工部门id:{}",workingEmployeeIds.toString());
|
|
|
+ List<String> filterList = new ArrayList<>();
|
|
|
+ filterList.add("sys00-mainDeptId");
|
|
|
+ List<Map> employeeInfos = ddClientPersonnel.getEmployeeInfos(ddClient.getAccessToken(), workingEmployeeIds, agentId, filterList);
|
|
|
+ List<String> personList = new ArrayList<>();
|
|
|
+ employeeInfos.forEach(e -> {
|
|
|
+ List<Map> mapList = (List<Map>) e.get("field_data_list");
|
|
|
+ mapList.forEach(m -> {
|
|
|
+ List<Map> valueList = (List<Map>) m.get("field_value_list");
|
|
|
+ String value = valueList.get(0).get("value").toString();
|
|
|
+ personList.add(value);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return personList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取crm平台员工信息
|
|
|
+ * @param mobile 钉钉手机号
|
|
|
+ * @param corpId crm企业id
|
|
|
+ * @param token token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getUserFormByNumber(String mobile, String corpId, String token) {
|
|
|
+ log.info("获取crm平台员工信息:{}",mobile);
|
|
|
+ final String[] openUserId = {""};
|
|
|
+ Map<String, Object> body = UtilMap.map("corpAccessToken, corpId, mobile", token, corpId, mobile);
|
|
|
+ DDR ddr = DDR.doPost(getRequestUrl(POST_GET_USER), null, null, body);
|
|
|
+ log.info("员工信息返回:{}",ddr.toString());
|
|
|
+ if (ObjectUtil.isNotNull(ddr.getEmpList())) {
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(ddr.getEmpList().toString());
|
|
|
+ jsonArray.forEach(e->{
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(e.toString());
|
|
|
+ openUserId[0] = jsonObject.get("openUserId").toString();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return openUserId[0];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改crm自定义对象
|
|
|
+ * @param currentOpenUserId crm员工号
|
|
|
+ * @param corpId crm企业id
|
|
|
+ * @param token token
|
|
|
+ * @param object_data 修改参数
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String updateCRMForm(String currentOpenUserId, String corpId, String token, Map object_data) {
|
|
|
+ log.info("修改crm自定义对象:{}",object_data);
|
|
|
+ Map<String, Object> objectData = UtilMap.map("object_data", object_data);
|
|
|
+ Map<String, Object> body = UtilMap.map("corpAccessToken, corpId, currentOpenUserId, data, triggerWorkFlow, triggerApprovalFlow",
|
|
|
+ token, corpId, currentOpenUserId, objectData, false, false);
|
|
|
+ JSON.toJSONString(body);
|
|
|
+ DDR ddr = DDR.doPost(getRequestUrl(POST_DATA_UPDATE), null, null, body);
|
|
|
+ log.info("修改crm自定义对象返回:{}",ddr.toString());
|
|
|
+ if ("0".equals(ddr.getErrorCode())){
|
|
|
+ return "success";
|
|
|
+ }else {
|
|
|
+ return "error";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 递归查询人员一级部门(B0001除外)
|
|
|
+ * @param depId 人员所属部门id
|
|
|
+ * @param token token
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getCompany(String depId, String token) {
|
|
|
+ String uuid = UUID.randomUUID().toString();
|
|
|
+ Map<String, Object> param = UtilMap.map("bizId, timestamp, code, access_token", uuid, new Date().getTime(), depId, token);
|
|
|
+ DDR ddr = DDR.doGet(getRequestUrl(API_TOKEN), null, param);
|
|
|
+ String company = depId;
|
|
|
+ if (ObjectUtil.isNotNull(ddr.getData())) {
|
|
|
+ List<Map> data = (List<Map>) ddr.getData();
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(data.get(0).get("parent_vo").toString());
|
|
|
+ if (!"B0001".equals(depId) && !"B0001".equals(jsonObject.getString("code"))){
|
|
|
+ company = jsonObject.getString("code");
|
|
|
+ company = getCompany(company, token);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return company;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取拼接后接口地址
|
|
|
+ * @param url
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getRequestUrl(String url){
|
|
|
+ log.info("请求CRM地址接口:{}",crmHost+url);
|
|
|
+ return crmHost + url;
|
|
|
+ }
|
|
|
+}
|