package com.malk.kabeiyi.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.malk.core.McProject; import com.malk.kabeiyi.service.KabeiyiService; import com.malk.kabeiyi.util.RecognizeAllText; import com.malk.kabeiyi.util.U8Util; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.common.McR; import com.malk.server.dingtalk.DDConf; import com.malk.server.dingtalk.DDR; import com.malk.server.dingtalk.DDR_New; import com.malk.service.aliwork.YDClient; import com.malk.service.aliwork.YDService; import com.malk.service.dingtalk.DDClient; import com.malk.service.dingtalk.DDClient_Workflow; import com.malk.utils.PublicUtil; import com.malk.utils.UtilHttp; import com.malk.utils.UtilToken; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.apache.logging.log4j.util.Strings; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.*; @Slf4j @Service public class KabeiyiServiceImpl implements KabeiyiService { @Autowired private DDClient_Workflow ddClient_workflow; @Autowired private DDClient ddClient; @Autowired private YDService ydService; @Autowired private YDClient ydClient; @Autowired private DDConf ddConf; @Value("${tcdingtalk.appKey}") private String appKey; @Value("${tcdingtalk.appSecret}") private String appSecret; @Value("${aliwork.accessKeyId}") private String accessKeyId; @Value("${aliwork.accessKeySecret}") private String accessKeySecret; //审批实例url前缀(卡倍亿) private static final String PROC_INST_PREFIX_URL = "https://aflow.dingtalk.com/dingtalk/web/query/pchomepage.htm?from=oflow&op=true&corpid=dingc3a744cb591a7346f2c783f7214b6d69#/plainapproval?procInstId="; //宜搭-关联数据(卡倍亿) private static final String RELATION = "FORM-230C40137ED94524B4D4C94F8B23A8D2F8PF"; //审批实例url前缀(特充) private static final String PROC_INST_PREFIX_URL2 = "https://aflow.dingtalk.com/dingtalk/web/query/pchomepage.htm?from=oflow&op=true&corpid=ding3ea249a3b5b466d0f2c783f7214b6d69#/plainapproval?procInstId="; //宜搭-关联数据(特充) private static final String RELATION2 = "FORM-51E17EFB52C14C9CB9E00168FED2BC18LQ6H"; //问题整改表 private static final String QUESTION = "FORM-89F515967FF94C62A9031F28EF6000B1YV5Q"; //问题整改表流程code private static final String QUESTION_PROC_CODE = "TPROC--DP5660A1LEXNP1S37P7KU9GCHD5U3HB6C360M5"; //审核表 private static final String CHECK = "FORM-F4ED246EADD8427381BC13C4F0FEF7FDYMKJ"; //审核表流程code private static final String CHECK_PROC_CODE = "TPROC--4XC66Y61XWWNZNJKBZD4VAB5BQAJ2YANX160M5"; //关联表单(卡倍亿) private static final Map SCHEMA_MAP = new HashMap<>(); static{ SCHEMA_MAP.put("工厂用章流程","1.1、工厂用章流程(除采购营销人事)"); SCHEMA_MAP.put("中心用章流程","1.2、中心用章流程(除采购营销人事)"); SCHEMA_MAP.put("人事专用用章审批流程","1.3、人事专用用章审批流程"); SCHEMA_MAP.put("商务部用章申请流程","1.4、商务部用章申请流程"); SCHEMA_MAP.put("办公用品采购申请流程","4.3、办公用品采购申请流程"); //需传其他值 //对方单位名称 收入或支出 金额 备注 SCHEMA_MAP.put("信息化建设用章流程","1.7、信息化建设用章流程"); //合同说明 采购物品类型 SCHEMA_MAP.put("技术中心请购审批流程","4.10、技术中心请购审批流程"); //合同总金额 合同说明 SCHEMA_MAP.put("设备备品备件采购合同审批流程","4.1b、设备备品备件采购合同审批流程"); SCHEMA_MAP.put("其他物品采购合同流程","4.2b、其他物品采购合同流程"); SCHEMA_MAP.put("设备采购合同审批流程","4.5c、设备采购合同审批流程"); SCHEMA_MAP.put("原材料采购合同审批流程","4.9b、原材料采购合同审批流程"); SCHEMA_MAP.put("墨西哥采购合同审批流程","4.13b、墨西哥采购合同审批流程"); } //关联表单(特充) private static final Map SCHEMA_MAP2 = new HashMap<>(); static{ //需传其他值 //对方单位名称 收入或支出 金额 备注 SCHEMA_MAP2.put("特充用章流程","1.2、特充用章流程(除采购营销人事)"); //合同总金额 合同说明 SCHEMA_MAP2.put("设备备品备件采购合同审批流程","4.1b、设备备品备件采购合同审批流程"); SCHEMA_MAP2.put("其他物品采购合同流程","4.2b、其他物品采购合同流程"); SCHEMA_MAP2.put("母排设备采购合同审批流程","4.5c、母排设备采购合同审批流程"); SCHEMA_MAP2.put("双铝设备采购合同审批流程","4.6c、双铝设备采购合同审批流程"); //合同总金额 SCHEMA_MAP2.put("原材料采购合同审批流程","4.9b、原材料采购合同审批流程"); //文件类别 对方单位名称 收入或支出 金额 用印文件名称 文件份数 加盖何种印章 备注 SCHEMA_MAP2.put("信息化建设用章流程","1.7、信息化建设用章流程"); } @Override public McR addPayment(Map map) { try { String tradeid = U8Util.getTradeid(); map.put("tradeid",tradeid); U8Util.sendPost(map,"https://api.yonyouup.com/api/voucher/add","voucher"); }catch (Exception e) { return McR.errorUnknown(e.getMessage()); } return McR.success(); } @Override public McR pushProcInstToYD(Map map) { MDC.put("MDC_KEY_PID","1002"); //审批实例 String procInstId = String.valueOf(map.get("procInstId")); //获取审批实例信息 Map processInstance = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), procInstId); if (Objects.nonNull(processInstance)){ Map formData = new HashMap<>(); String title = String.valueOf(processInstance.get("title")); String type = ""; List formComponentValues = (List) processInstance.get("formComponentValues"); for (String key : SCHEMA_MAP.keySet()) { if (title.contains(key)){ type = SCHEMA_MAP.get(key); switch (type){ case "1.7、信息化建设用章流程" : for (Map formComponentValue : formComponentValues) { String name = String.valueOf(formComponentValue.get("name")); String value = String.valueOf(formComponentValue.get("value")).equals("null") ? "" : String.valueOf(formComponentValue.get("value")); switch (name){ case "对方单位名称" : formData.put("textField_lygzlf3j",value);break; case "收入或支出" : formData.put("textField_lygzlf3k",value);break; case "金额" : formData.put("textField_lygzlf3l",value);break; case "备注" : formData.put("textField_lygzlf3m",value);break; } } break; case "4.1b、设备备品备件采购合同审批流程" : case "4.2b、其他物品采购合同流程" : case "4.5c、设备采购合同审批流程" : case "4.9b、原材料采购合同审批流程" : case "4.13b、墨西哥采购合同审批流程" : for (Map formComponentValue : formComponentValues) { String name = String.valueOf(formComponentValue.get("name")); switch (name){ case "合同总金额" : formData.put("numberField_lyf81587",formComponentValue.get("value"));break; case "合同说明" : if (Objects.nonNull(formComponentValue.get("value"))){ formData.put("textField_lyf81588",formComponentValue.get("value")); } break; } } break; case "4.10、技术中心请购审批流程" : for (Map formComponentValue : formComponentValues) { String name = String.valueOf(formComponentValue.get("name")); switch (name){ case "采购物品类型" : formData.put("textField_lyibvb98",formComponentValue.get("value"));break; case "合同说明" : if (Objects.nonNull(formComponentValue.get("value"))){ formData.put("textField_lyf81588",formComponentValue.get("value")); } break; } } break; default: break; } formData.put("textField_lyf8157x",title); formData.put("selectField_lyf81580",type); Map condition = new HashMap<>(); condition.put("textField_lyf81581",PROC_INST_PREFIX_URL + procInstId); //同步到宜搭 ydService.upsertFormData(RELATION,condition,formData,null); break; } } return McR.success(); } return McR.errorParam("审批实例不存在!"); } @Override public McR pushProcInstToYD2(Map map) { MDC.put("MDC_KEY_PID","1003"); //审批实例 String procInstId = String.valueOf(map.get("procInstId")); //获取审批实例信息 Map processInstance = ddClient_workflow.getProcessInstanceId(getTcAccessToken(), procInstId); if (Objects.nonNull(processInstance)){ Map formData = new HashMap<>(); String title = String.valueOf(processInstance.get("title")); String type = ""; List formComponentValues = (List) processInstance.get("formComponentValues"); for (String key : SCHEMA_MAP2.keySet()) { if (title.contains(key)){ type = SCHEMA_MAP2.get(key); switch (type){ case "1.7、信息化建设用章流程" : for (Map formComponentValue : formComponentValues) { String name = String.valueOf(formComponentValue.get("name")); Object value = formComponentValue.get("value"); switch (name){ case "文件类别" : formData.put("textField_lymfq9oa",value);break; case "对方单位名称" : formData.put("textField_lygzlf3j",value);break; case "收入或支出" : formData.put("textField_lygzlf3k",value);break; case "金额(元)" : formData.put("textField_lygzlf3l",value);break; case "用印文件名称" : formData.put("textField_lymfq9oc",value);break; case "文件份数" : formData.put("numberField_lymfq9od",value);break; case "加盖何种印章" : formData.put("textField_lymfq9oe",value);break; case "备注" : formData.put("textField_lygzlf3m",value);break; } } break; case "4.1b、设备备品备件采购合同审批流程" : case "4.2b、其他物品采购合同流程" : case "4.5c、母排设备采购合同审批流程" : case "4.6c、双铝设备采购合同审批流程" : case "4.9b、原材料采购合同审批流程" : for (Map formComponentValue : formComponentValues) { String name = String.valueOf(formComponentValue.get("name")); switch (name){ case "合同总金额(元)": case "合同总金额" : formData.put("numberField_lyf81587",formComponentValue.get("value"));break; case "合同说明" : if (Objects.nonNull(formComponentValue.get("value"))){ formData.put("textField_lyf81588",formComponentValue.get("value")); } break; } } break; case "1.2、特充用章流程(除采购营销人事)" : for (Map formComponentValue : formComponentValues) { String name = String.valueOf(formComponentValue.get("name")); String value = String.valueOf(formComponentValue.get("value")).equals("null") ? "" : String.valueOf(formComponentValue.get("value")); switch (name){ case "对方单位名称" : formData.put("textField_lygzlf3j",value);break; case "收入或支出" : formData.put("textField_lygzlf3k",value);break; case "金额(元)" : formData.put("textField_lygzlf3l",value);break; case "备注" : formData.put("textField_lygzlf3m",value);break; } } break; default: break; } formData.put("textField_lyf8157x",title); formData.put("selectField_lyf81580",type); Map condition = new HashMap<>(); condition.put("textField_lyf81581",PROC_INST_PREFIX_URL2 + procInstId); //同步到宜搭 ydService.upsertFormData(RELATION2,condition,formData,null); break; } } return McR.success(); } return McR.errorParam("审批实例不存在!"); } @Override public McR addQuestionApproval(Map map) { MDC.put("MDC_KEY_PID","1009"); if (Objects.isNull(map.get("formInstId"))){ return McR.errorParam("formInstId不能为空!"); } String formInstId = map.get("formInstId").toString(); DDR_New ddrNew = ydClient.queryData(YDParam.builder() .formInstId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id); Map formData = ddrNew.getFormData(); //审核人 List reviewerUserIds = (List) formData.get("employeeField_m061zye5_id"); List details = (List) formData.get("tableField_m0kqtqoy"); String[] yida = McProject.getYida("1009"); for (Map detail : details) { String result = detail.get("radioField_m0nm3des").toString(); if ("NG".equals(result)){ //发起问题整改审批 Map question = new HashMap(); question.put("textField_m061zye8",detail.get("textField_m0on13ob"));//审核项目 question.put("textareaField_m061zye9",detail.get("textField_m0kqtqoz"));//审核方法和标准 question.put("attachmentField_m061zyep",detail.get("attachmentField_m061zyep"));//问题证据 question.put("textareaField_m063drgz",detail.get("textareaField_m063drgz"));//问题描述 question.put("dateField_m061zyev",detail.get("dateField_m061zyev"));//整改截止时间 //根据userId获取部门id List rectificationUserIds = (List) detail.get("employeeField_m061zyeq_id"); question.put("employeeField_m061zyeq",rectificationUserIds);//责任整改人 Map body2 = new HashMap<>(); body2.put("userid", rectificationUserIds.get(0)); DDR_New ddrNew1 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/department/listparentbyuser", null, ddClient.initTokenParams(), body2, DDR_New.class); Map result2 = (Map) ddrNew1.getResult(); List parentList = (List) result2.get("parent_list"); List parentDeptIdList = (List) parentList.get(0).get("parent_dept_id_list"); String deptId = parentDeptIdList.get(0) + ""; question.put("departmentSelectField_m0p0tbyo",new String[]{deptId});//部门 Map body = new HashMap<>(); body.put("appType",yida[0]); body.put("systemToken",yida[1]); body.put("userId",reviewerUserIds.get(0)); body.put("formUuid",QUESTION); body.put("processCode",QUESTION_PROC_CODE); body.put("formDataJson", JSONObject.toJSONString(question)); UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/processes/instances/start", ddClient.initTokenHeader(), null, body, DDR_New.class); } } return McR.success(); } @Override public McR ocr() { try { String content = RecognizeAllText.recognizeText("C:\\Users\\EDY\\Desktop\\3.jpg","Table",accessKeyId,accessKeySecret); return McR.success(content); }catch (Exception e){ System.out.println(e.getMessage()); } return McR.errorUnknown("识别失败!"); } @Override public McR addPlanApproval(Map map) { MDC.put("MDC_KEY_PID","1009"); if (Objects.isNull(map.get("formInstId"))){ return McR.errorParam("formInstId不能为空!"); } String formInstId = map.get("formInstId").toString(); DDR_New ddrNew = ydClient.queryData(YDParam.builder() .formInstId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id); //计划制定人 Map originator = ddrNew.getOriginator(); String planUserId = originator.get("userId").toString(); Map formData = ddrNew.getFormData(); //审核人 List reviewerUserIds = (List) formData.get("employeeField_m061zye5_id"); //频次 String frequency = formData.get("selectField_m0koxj7g").toString(); //下次自动发起审核日期 long nextTime = (long) formData.get("dateField_m0nbpasq"); Date nextDate = new Date(nextTime); //上次自动发起审核日期 Date lastTime = nextDate; //审核截至日期 Date endDate = new Date(); switch (frequency){ case "每周": endDate = DateUtils.addDays(nextDate, 6); nextDate = DateUtils.addDays(nextDate, 7); break; case "每两周": endDate = DateUtils.addDays(nextDate, 13); nextDate = DateUtils.addDays(nextDate, 14); break; case "每月": endDate = DateUtils.addDays(DateUtils.addMonths(nextDate, 1), -1); nextDate = DateUtils.addMonths(nextDate, 1); break; case "每季度": endDate = DateUtils.addDays(DateUtils.addMonths(nextDate, 3),-1); nextDate = DateUtils.addMonths(nextDate, 3); break; case "一次": endDate = new Date((long)formData.get("dateField_m0oqbh48")); nextDate = null; break; default:break; } //每个审批人发起审批 for (String reviewerUserId : reviewerUserIds) { //根据userId获取部门id Map body = new HashMap<>(); body.put("userid", reviewerUserId); DDR_New ddrNew1 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/department/listparentbyuser", null, ddClient.initTokenParams(), body, DDR_New.class); Map result = (Map) ddrNew1.getResult(); List parentList = (List) result.get("parent_list"); List parentDeptIdList = (List) parentList.get(0).get("parent_dept_id_list"); String deptId = parentDeptIdList.get(0) + ""; formData.put("departmentSelectField_m0c3qbjn", new String[]{deptId}); formData.put("dateField_m061zye7", endDate.getTime()); formData.put("employeeField_m061zye5",new String[]{reviewerUserId}); //发起审批 String[] yida = McProject.getYida("1009"); Map body2 = new HashMap<>(); body2.put("appType",yida[0]); body2.put("systemToken",yida[1]); body2.put("userId",planUserId); body2.put("formUuid",CHECK); body2.put("processCode",CHECK_PROC_CODE); body2.put("formDataJson", JSONObject.toJSONString(formData)); UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/processes/instances/start", ddClient.initTokenHeader(), null, body2, DDR_New.class); } //更新审核计划下次发起审批时间及上次发起审批时间 formData.put("dateField_m0nbpasw", lastTime); formData.put("dateField_m0nbpasq", nextDate); ydClient.operateData(YDParam.builder() .formInstId(formInstId) .updateFormDataJson(JSON.toJSONString(formData)) .build(), YDConf.FORM_OPERATION.update); return McR.success(); } private String getString(Object obj){ return obj == null ? "" : obj.toString(); } public String getTcAccessToken() { String accessToken = UtilToken.get("tc-invalid-token-dingtalk"); if (StringUtils.isNotBlank(accessToken)) { return accessToken; } else { Map param = new HashMap(); param.put("appkey", appKey); param.put("appsecret", appSecret); DDR r = (DDR)UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", param, DDR.class); log.info("特充响应token, {}", r.getAccessToken()); accessToken = r.getAccessToken(); UtilToken.put("tc-invalid-token-dingtalk", accessToken, (long)r.getExpiresIn() * 1000L); return accessToken; } } }