package com.malk.server.dingtalk; import com.alibaba.fastjson.JSON; import com.malk.utils.UtilMap; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** * 钉钉组件要求 * - * 1. 数字组件不能传null或空, 计算字段会自动计算, 不用传值有可. 但打印不支持会不显示 * 2. 撤回和提交字段必填设置, 接口调用也会受控. 但若发起页面只读, 审批节点必填则不影响 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class DDFormComponentDto { /** * 组件名称 */ private String name; /** * 组件的值 */ private String value; /** * todo: 钉钉回调, 数字组件不能传null或空, 文本组件null过滤为空; 计算字段胡自动计算, 不用传值, 日期仅支持为年月日或年月日时分两种格式, 人员组件JSON.toJSONString(Arrays.asList(userId)))) * 快速格式化, 若value非直接取值需预处理好 * * @param formData 表单数据源, 若Value类型为list, 则触发ruleDetail * @param formRule 表单数据格式: { 字段名: 组件名 } * @param detailRule 表单明细数据格式: 单子表 { 字段名: 组件名 }; 多明细 { 明细字段: { 字段名: 组件名 } }, 明细字段保持和数据字段一致 */ public static List formatComponentValues(Map formData, Map formRule, Map detailRule) { // 审批流表单参数,设置各表单项值 Map ruleDetail = detailRule; List formComponentValues = new ArrayList<>(); for (String key : formRule.keySet()) { if (formData.get(key) instanceof List) { // 明细组件: 每一个组件都是集合, table为集合嵌套集合 List> formComponentDetailsValues = new ArrayList<>(); List details = (List) formData.get(key); if (detailRule.get(key) instanceof Map) { ruleDetail = (Map) detailRule.get(key); } for (Map detail : details) { List detailComponentValues = new ArrayList<>(); for (String sub : ruleDetail.keySet()) { detailComponentValues.add(DDFormComponentDto.builder().name(ruleDetail.get(sub)).value(String.valueOf(detail.get(sub))).build()); } formComponentDetailsValues.add(detailComponentValues); } formComponentValues.add(DDFormComponentDto.builder().name(formRule.get(key)).value(JSON.toJSONString(formComponentDetailsValues)).build()); } else { formComponentValues.add(DDFormComponentDto.builder().name(formRule.get(key)).value(String.valueOf(formData.get(key))).build()); } } return formComponentValues; } /** * 快速格式化, 上传釘盘的文件转为OA审批对象 */ public static String formatAttachment(Map dentry) { Map data = UtilMap.map("spaceId, fileName, fileSize, fileType, fileId", "spaceId, name, size, extension, id", dentry); return JSON.toJSONString(Arrays.asList(data)); } }