xuhao 5 bulan lalu
induk
melakukan
f1e7fd1de5
30 mengubah file dengan 4992 tambahan dan 0 penghapusan
  1. 454 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/api/OASinglepushApi.java
  2. 486 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/api/OApushApi.java
  3. 246 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ApplyBillPlugin.java
  4. 145 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ApplyBillSecondPlugin.java
  5. 669 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ApplyFormPlugin.java
  6. 270 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadFormPLugin.java
  7. 266 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadFormSecondPLugin.java
  8. 54 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadListPlugin.java
  9. 47 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadListSecondPlugin.java
  10. 518 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/CreateTreelistPlugin.java
  11. 110 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/DocF7SelectPlugin.java
  12. 96 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/GetfileNamePlugin.java
  13. 140 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/KnowledgePlugin.java
  14. 25 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ReportFormdlPlugin.java
  15. 22 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ReportFormpreviewPlugin.java
  16. 25 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ReportFormyyPlugin.java
  17. 99 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/CreateInterPlugin.java
  18. 98 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/CreateInterSecondPlugin.java
  19. 55 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/DeleteInterPlugin.java
  20. 103 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/DocumentCreatePlugin.java
  21. 104 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/yaojianformcreatePlugin.java
  22. 41 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/AppLoginService.java
  23. 137 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/AttBatchDownLoadPlugin.java
  24. 107 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/BizOperateService.java
  25. 74 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/DownLoadUtil.java
  26. 76 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/FileUploadService.java
  27. 127 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/HttpClientFactory.java
  28. 106 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/HttpService.java
  29. 255 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/RemoteOperationWithAttachment.java
  30. 37 0
      src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/UserLoginService.java

+ 454 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/api/OASinglepushApi.java

@@ -0,0 +1,454 @@
+package nckd.yjk.yj.plugin.docLibrary.api;
+
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.TempFileCache;
+import kd.bos.coderule.api.CodeRuleInfo;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.fileservice.FileItem;
+import kd.bos.fileservice.FileService;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.bos.url.UrlService;
+import kd.bos.util.FileNameUtils;
+import nckd.yjk.yj.plugin.docLibrary.utils.FileUploadService;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.*;
+import java.util.*;
+
+import static kd.bos.entity.earlywarn.kit.StringUtil.newString;
+
+@ApiController(value = "open",desc = "oa要件推送接口")
+@ApiMapping(value = "/example")
+public class OASinglepushApi implements Serializable{
+    private final static String  URL_COSMICHOST=UrlService.getDomainContextUrl();
+
+//    private final static String  URL_COSMICHOST="http://111.75.220.136:8022/ierp";
+
+//    private static final String REMOTEHOST = "http://127.0.0.1:8080/ierp";
+//
+//    // 苍穹系统中,对应单据的标识,需修改
+//    private static final String FORMID = "nckd_jiekoutest";
+//
+//    // 苍穹系统中,对应单据所属应用的标识,需修改
+//    private static final String APPID = "nckd_requirements";
+
+    
+    private String postFileToCosmic(File file, String accessToken) throws Exception {
+
+        //上传附件,返回缓存中的临时储存路径
+        StringBuffer url = new StringBuffer();
+//        String domainContextUrl = UrlService.getDomainContextUrl();
+        url.append(URL_COSMICHOST).append("/attachment/uploadFile.do");
+
+        //上传可能需要传的参数
+        Map<String, Object> param = new HashMap<String, Object>();
+//        // 上传附件,返回该附件在苍穹缓存中的临时存储路径
+        try {
+            return FileUploadService.getService().postFile(url.toString(), param, file, accessToken);
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+
+
+    @ApiPostMapping(value = "/singleyaojian",desc = "oa要件推送方法")
+    public CustomApiResult<Map<String, Object>>  doCustomService(@ApiParam(value = "parameters") String parameters) throws Exception {
+
+
+
+
+        String accessToken = RequestContext.get().getGlobalSessionId();
+//        String paramsString = JSON.toJSONString(parameters);
+//        JSONObject paramsJo = JSONObject.parseObject(paramsString);
+        JSONObject object = JSONObject.parseObject(parameters);
+
+
+        //参数校验
+
+        if(StringUtils.isBlank(object.getString("base64")))
+        {
+            return CustomApiResult.fail("523","缺少参数base64");
+        }
+         if(StringUtils.isBlank(object.getString("orgremote")))
+        {
+            return CustomApiResult.fail("523","缺少参数orgremote");
+        }
+
+
+        QFilter qFilter98=new QFilter("nckd_otherorg", QCP.equals,object.getString("orgremote"));
+        DynamicObject dynamicObject98 = BusinessDataServiceHelper.loadSingle("nckd_mapping", new QFilter[]{qFilter98});
+        if(null==dynamicObject98){
+            return CustomApiResult.fail("524","组织编码在映射表中不存在");
+        }
+
+        if(StringUtils.isBlank(object.getString("name")))
+        {
+            return CustomApiResult.fail("523","缺少参数name");
+        }
+        if(StringUtils.isBlank(object.getString("nckd_atttype")))
+        {
+            return CustomApiResult.fail("523","缺少参数nckd_atttype");
+        }
+
+
+
+
+
+
+
+        String base64 = object.getString("base64");
+
+
+        File file = base64ToFile("/OA推送的要件",base64 , object.getString("name")+"."+object.getString("nckd_atttype"));
+
+        Long nckd_attsize = file.length();
+
+        Map<String, List<File>> allFiles = new HashMap<>();
+        List<File> fileList=new ArrayList<>();
+        fileList.add(file);
+        allFiles.put("filename",fileList);
+        //........................................................................................................................................................................................................................
+        //这个result  用来装成功失败信息的
+        Map<String, Object> resultInfo = new HashMap<String, Object>();
+        //
+        Map<String, Object> allBizBillData  = this.generateBizData(allFiles, accessToken,object,nckd_attsize);
+        Map<String, Object> params=(Map<String, Object>)allBizBillData.get("params");
+        Map<String, Object> billData=(Map<String, Object>)allBizBillData.get("billData");
+        Map<String, Object> allAttachmentsData=(Map<String, Object>)allBizBillData.get("allAttachmentsData");
+
+
+
+
+        DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject("nckd_requisitionlist");
+//        dynamicObject.set("billno",billData.get("billno"));
+
+        CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(dynamicObject.getDataEntityType().getName(), dynamicObject, null);
+        String number = CodeRuleServiceHelper.getNumber(codeRule, dynamicObject);
+        dynamicObject.set("number",number);
+
+        dynamicObject.set("status", "C");
+        dynamicObject.set("enable", 1);
+        dynamicObject.set("createorg",billData.get("createorg"));
+        dynamicObject.set("useorg",billData.get("useorg"));
+        dynamicObject.set("name",billData.get("name"));
+        dynamicObject.set("nckd_atttype",billData.get("nckd_atttype"));
+        dynamicObject.set("nckd_attsize",billData.get("nckd_attsize"));
+//        dynamicObject.set("nckd_isrepeatcite",true);
+//        dynamicObject.set("nckd_iscitebynotupload",true);
+//        dynamicObject.set("nckd_iscross",false);
+        dynamicObject.set("nckd_isdownloadable",true);
+        dynamicObject.set("nckd_isshared",false);
+        dynamicObject.set("nckd_applydate",new Date());
+        dynamicObject.set("nckd_yjclass",billData.get("nckd_yjclass"));
+        //获取当前登录人
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        //获取主组织
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        List<Long> allDepartmentByUserId = UserServiceHelper.getAllDepartmentByUserId(currentUserId);
+        //获取当前登录切换的组织
+        long orgId = RequestContext.get().getOrgId();
+        dynamicObject.set("creator",currentUserId);
+        dynamicObject.set("nckd_userfield",currentUserId);
+        dynamicObject.set("nckd_orgbase",billData.get("createorg"));
+
+
+
+
+
+        List<HashMap<String, Object>> attmentInfors = (List<HashMap<String, Object>>) allAttachmentsData
+                .get("filename");
+        DynamicObjectCollection attCol = dynamicObject.getDynamicObjectCollection("nckd_attachmentfield");
+
+        for (HashMap<String, Object> attmentInfor : attmentInfors) {
+            String name = (String) attmentInfor.get("name");
+            String url = (String) attmentInfor.get("url");
+            String[] split = url.split("id=");
+            if(split.length>1){
+                // 参考标准源码 AttachmentFieldServiceHelper.saveTempToFileService(tempUrl, AttPk,fileName)
+                TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+                RequestContext requestContext = RequestContext.get();
+
+                String uuid = UUID.randomUUID().toString();
+                // 指定上传到文件服务器的目标地址
+                String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(),
+                        requestContext.getAccountId(), uuid, name);
+                FileItem item = new FileItem(name, pathParam, cache.getInputStream(url));
+
+                // 上传附件
+                FileService fileService = FileServiceFactory.getAttachmentFileService();
+                String path = fileService.upload(item);
+                String attachmentFullUrl = UrlService.getAttachmentFullUrl(path);
+                // String
+                // url="http://172.20.63.42:8080/ierp/attachment/download.do?path=/ierp/1218732684788893696/202203/attachmentupload/one_1646273203365.txt";
+                String downurl = UrlService.getDomainContextUrl() + "/attachment/download.do?path=" + path;
+                attmentInfor.put("url", path);
+                DynamicObject att = createAttDynamic(attmentInfor);
+                DynamicObject addNew = attCol.addNew();
+                addNew.set("fbasedataid", att);
+                cache.remove(url);
+
+            }
+        }
+
+
+        OperationResult result = SaveServiceHelper.saveOperate("nckd_requisitionlist", new DynamicObject[] { dynamicObject },
+                OperateOption.create());
+
+
+
+        if (!result.isSuccess()) {
+            List<IOperateInfo> operateInfo = result.getAllErrorOrValidateInfo();
+            String message="";
+            for (IOperateInfo tempOperateInfo : operateInfo) {
+                message=message+tempOperateInfo.getMessage();
+            }
+
+            return CustomApiResult.fail("654","单据保存失败"+message);
+        }
+        // 上传附件
+        String appId ="nckd_jxyy";
+        Object pkId = result.getSuccessPkIds().get(0);
+        resultInfo.put("生成的要件单id", pkId);
+        resultInfo.put("mes","生成要件单成功");
+
+        return CustomApiResult.success(resultInfo);
+    }
+
+
+
+    //封装要上传的信息到苍穹平台
+    public Map<String, Object> generateBizData(Map<String, List<File>> allFiles, String accessToken,JSONObject object,Long nckd_attsize) throws Exception {
+        //上传文件到苍穹
+        Map<String, Object> allBizBillData = new HashMap<String, Object>();
+        // 生成单据数据
+        Map<String, Object> billData = new HashMap<String, Object>();
+        String orgremote = object.getString("orgremote");
+        String name=object.getString("name");
+        String nckd_atttype=object.getString("nckd_atttype");
+
+
+
+
+
+//      billData.put("billno", "QWER123"+rand(100));
+        billData.put("name", name);
+        billData.put("nckd_atttype",nckd_atttype );
+        billData.put("nckd_attsize",nckd_attsize );
+
+
+
+        QFilter qFilter99=new QFilter("name", QCP.equals,"OA公文");
+        DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_classification", new QFilter[]{qFilter99});
+        Long nckd_yjclass=(Long)dynamicObject.getPkValue();
+        QFilter qFilter98=new QFilter("nckd_otherorg", QCP.equals,orgremote);
+        DynamicObject dynamicObject98 = BusinessDataServiceHelper.loadSingle("nckd_mapping", new QFilter[]{qFilter98});
+        Long createorg=(Long)dynamicObject98.getDynamicObject("nckd_xinghanorg").getLong("id");
+        Long useorg=createorg;
+
+
+
+
+
+        billData.put("nckd_yjclass",nckd_yjclass);
+        billData.put("useorg",useorg);
+        billData.put("createorg",createorg);
+        allBizBillData.put("billData", billData);
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("appId", "NCKD");
+        params.put("entityName", "nckd_requisitionlist");
+        allBizBillData.put("params",params);
+        // 生成单据上所有的附件数据
+        Map<String, Object> allAttachmentsData = new HashMap<String, Object>();
+        // 单个附件面板中所有附件的信息
+        List<Map<String, Object>> attachments = null;
+        // 单个附件的信息
+        Map<String, Object> attachmentInfo = null;
+        StringBuffer uid = new StringBuffer();
+        uid.append("rc-upload-").append(new Date().getTime()).append("-");
+        int index = (int) (1 + Math.random()*10);
+        for (String tempAttaKey : allFiles.keySet()) {
+            List<File> files = allFiles.get(tempAttaKey);
+            attachments = new ArrayList<Map<String, Object>>();
+            for (File tempFile : files) {
+                String tempAttaUrl = null;
+                try {
+                    tempAttaUrl = this.postFileToCosmic(tempFile, accessToken);
+                } catch (Exception ex) {
+                    throw new RuntimeException(ex);
+                }
+                attachmentInfo = new HashMap<String, Object>();
+                attachmentInfo.put("entityNum", "nckd_requisitionlist");
+                attachmentInfo.put("name", tempFile.getName());
+                attachmentInfo.put("url", tempAttaUrl);
+                attachmentInfo.put("size", tempFile.length());
+                attachmentInfo.put("status", "success");
+                attachmentInfo.put("uid", uid.toString() + index++);
+                attachments.add(attachmentInfo);
+            }
+            allAttachmentsData.put(tempAttaKey, attachments);
+        }
+        allBizBillData.put("allAttachmentsData", allAttachmentsData);
+
+        return allBizBillData;
+    }
+
+
+
+
+//    //调用自定义OpenApi上传单据&附件信息到苍穹单据上
+//    public String bizSaveApi( String accessToken, Map<String, Object> allAttachmentsData) throws URISyntaxException {
+//        // 自定义开放平台接口路径
+//        StringBuffer url = new StringBuffer();
+//        url.append(URL_COSMICHOST).append(UPLOADATTAPATH);
+//        System.out.println(">>> " + url.toString());
+//        // 封装数据
+//        JSONObject body = new JSONObject();
+//        body.put("billData", allAttachmentsData.get("billData"));
+//        body.put("allAttachmentsData", allAttachmentsData.get("allAttachmentsData"));
+//        body.put("params", allAttachmentsData.get("params"));
+//        String responseStr = null;
+//        try {
+//            responseStr = HttpService.getService().doGetByHttpClient(url.toString(), accessToken, body);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//        return responseStr;
+//    }
+
+
+
+
+
+
+
+
+    //构建附件字段对象
+    private DynamicObject createAttDynamic(Map<String, Object> attmentInfor) {
+        DynamicObject attObj = BusinessDataServiceHelper.newDynamicObject("bd_attachment");
+        String name = (String) attmentInfor.get("name");
+        attObj.set("name", name);
+        attObj.set("size", attmentInfor.get("size"));
+        attObj.set("uid", attmentInfor.get("uid"));
+        attObj.set("url", attmentInfor.get("url"));
+        String type = name.substring(name.lastIndexOf(".") + 1);
+        attObj.set("type", type);
+        // tempfile=1表示持久化附件对象
+        attObj.set("tempfile", 1);
+        ORM orm = ORM.create();
+        long id = orm.genLongId("bd_attachment");
+        attObj.set("id", id);
+        attObj.set("pageid", "");
+        attObj.set("number", UUID.randomUUID().toString());
+        attObj.set("status", "B");
+        Date now = new Date();
+        attObj.set("modifytime", now.getTime());
+        attObj.set("creator", UserServiceHelper.getCurrentUserId());
+        SaveServiceHelper.save(new DynamicObject[] { attObj });
+        return attObj;
+    }
+
+
+
+
+
+    public static String fileToBase64(String path) {
+        String base64 = null;
+        InputStream in = null;
+        try {
+            File file = new File(path);
+            in = new FileInputStream(file);
+            byte[] bytes = new byte[(int) file.length()];
+            in.read(bytes);
+            base64 =newString(Base64.getEncoder().encode(bytes),"UTF-8");
+//            base64 = new String(Base64.encodeBase64(bytes),"UTF-8");
+            System.out.println("将文件["+path+"]转base64字符串:"+base64);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return base64;
+    }
+
+
+
+
+    public static File base64ToFile(String outFilePath,String base64, String outFileName) {
+        File file = null;
+        //创建文件目录
+        String filePath=outFilePath;
+        File  dir=new File(filePath);
+        if (!dir.exists() && !dir.isDirectory()) {
+            dir.mkdirs();
+        }
+        BufferedOutputStream bos = null;
+        FileOutputStream fos = null;
+        try {
+            byte[] bytes = Base64.getDecoder().decode(base64);
+//            file=new File(filePath+"/"+outFileName+UUID.randomUUID().toString());
+            file=new File(outFileName);
+            fos = new FileOutputStream(file);
+            bos = new BufferedOutputStream(fos);
+            bos.write(bytes);
+            return file;
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (bos != null) {
+                try {
+                    bos.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (fos != null) {
+                try {
+                    fos.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return file;
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 486 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/api/OApushApi.java

@@ -0,0 +1,486 @@
+package nckd.yjk.yj.plugin.docLibrary.api;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.bill.IBillWebApiPlugin;
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.TempFileCache;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.api.ApiResult;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.fileservice.FileItem;
+import kd.bos.fileservice.FileService;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.bos.url.UrlService;
+import kd.bos.util.FileNameUtils;
+
+import nckd.yjk.yj.plugin.docLibrary.utils.FileUploadService;
+import nckd.yjk.yj.plugin.docLibrary.utils.HttpService;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.*;
+import java.util.*;
+import java.util.Base64;
+
+import static kd.bos.entity.earlywarn.kit.StringUtil.newString;
+import static kd.bos.orm.datasync.Constant.Keys.entityNumber;
+import static org.apache.flink.table.api.Expressions.rand;
+
+//传多个文件的
+@ApiController(value = "open",desc = "oa要件推送接口")
+@ApiMapping(value = "/example")
+public class OApushApi implements Serializable{
+    private final static String  URL_COSMICHOST=UrlService.getDomainContextUrl();
+
+//    private final static String  URL_COSMICHOST="http://111.75.220.136:8022/ierp";
+
+//    private static final String REMOTEHOST = "http://127.0.0.1:8080/ierp";
+//
+//    // 苍穹系统中,对应单据的标识,需修改
+//    private static final String FORMID = "nckd_jiekoutest";
+//
+//    // 苍穹系统中,对应单据所属应用的标识,需修改
+//    private static final String APPID = "nckd_requirements";
+
+    
+    private String postFileToCosmic(File file, String accessToken) throws Exception {
+
+        //上传附件,返回缓存中的临时储存路径
+        StringBuffer url = new StringBuffer();
+//        String domainContextUrl = UrlService.getDomainContextUrl();
+        url.append(URL_COSMICHOST).append("/attachment/uploadFile.do");
+
+        //上传可能需要传的参数
+        Map<String, Object> param = new HashMap<String, Object>();
+//        // 上传附件,返回该附件在苍穹缓存中的临时存储路径
+        try {
+            return FileUploadService.getService().postFile(url.toString(), param, file, accessToken);
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+
+
+    @ApiPostMapping(value = "/yaojian",desc = "oa要件推送方法")
+    public  CustomApiResult<String> doCustomService(@ApiParam(value = "parameters") List<String> parameters) throws Exception {
+//        CustomApiResult<Map<String, Object>>
+        String accessToken = RequestContext.get().getGlobalSessionId();
+        Map<String, Object> resultInfo = new HashMap<String, Object>();
+
+        for (String parameter : parameters) {
+            JSONObject object = JSONObject.parseObject(parameter);
+
+
+
+
+//        String paramsString = JSON.toJSONString(parameters);
+//        JSONObject paramsJo = JSONObject.parseObject(paramsString);
+
+
+        //参数校验
+
+        if(StringUtils.isBlank(object.getString("base64")))
+        {
+            return CustomApiResult.fail("523","缺少参数base64");
+        }
+         if(StringUtils.isBlank(object.getString("orgremote")))
+        {
+
+
+
+            return CustomApiResult.fail("523","缺少参数orgremote");
+        }
+
+
+        QFilter qFilter98=new QFilter("nckd_otherorg", QCP.equals,object.getString("orgremote"));
+        DynamicObject dynamicObject98 = BusinessDataServiceHelper.loadSingle("nckd_mapping", new QFilter[]{qFilter98});
+        if(null==dynamicObject98){
+            return CustomApiResult.fail("524","组织编码在映射表中不存在");
+        }
+
+        if(StringUtils.isBlank(object.getString("name")))
+        {
+            return CustomApiResult.fail("523","缺少参数name");
+        }
+        if(StringUtils.isBlank(object.getString("nckd_atttype")))
+        {
+            return CustomApiResult.fail("523","缺少参数nckd_atttype");
+        }
+        if(StringUtils.isBlank(object.getString("nckd_attsize")))
+        {
+            return CustomApiResult.fail("523","缺少参数nckd_attsize");
+        }
+        if(object.getBoolean("nckd_isrepeatcite")==null){
+            return CustomApiResult.fail("523","缺少参数nckd_isrepeatcite");
+        }
+        if(object.getBoolean("nckd_iscitebynotupload")==null){
+            return CustomApiResult.fail("523","缺少参数nckd_iscitebynotupload");
+        }
+        if(object.getBoolean("nckd_iscross")==null){
+            return CustomApiResult.fail("523","缺少参数nckd_iscross");
+        }
+        if(object.getBoolean("nckd_isdownloadable")==null){
+            return CustomApiResult.fail("523","缺少参数nckd_isdownloadable");
+        }
+        if(object.getBoolean("nckd_isreferenceable")==null){
+            return CustomApiResult.fail("523","缺少参数nckd_isreferenceable");
+        }
+
+
+
+
+
+        String base64 = object.getString("base64");
+
+
+        File file = base64ToFile("/OA推送的要件",base64 , UUID.randomUUID().toString()+"."+object.getString("nckd_atttype"));
+
+
+        Map<String, List<File>> allFiles = new HashMap<>();
+        List<File> fileList=new ArrayList<>();
+        fileList.add(file);
+        allFiles.put("filename",fileList);
+        //........................................................................................................................................................................................................................
+        //这个result  用来装成功失败信息的
+
+        //
+        Map<String, Object> allBizBillData  = this.generateBizData(allFiles, accessToken,object);
+        Map<String, Object> params=(Map<String, Object>)allBizBillData.get("params");
+        Map<String, Object> billData=(Map<String, Object>)allBizBillData.get("billData");
+        Map<String, Object> allAttachmentsData=(Map<String, Object>)allBizBillData.get("allAttachmentsData");
+
+
+
+
+        DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject("nckd_requisitionlist");
+//        dynamicObject.set("billno",billData.get("billno"));
+        dynamicObject.set("status", "C");
+        dynamicObject.set("enable", 1);
+        dynamicObject.set("createorg",billData.get("createorg"));
+        dynamicObject.set("useorg",billData.get("useorg"));
+        dynamicObject.set("name",billData.get("name"));
+        dynamicObject.set("nckd_atttype",billData.get("nckd_atttype"));
+        dynamicObject.set("nckd_attsize",billData.get("nckd_attsize"));
+        dynamicObject.set("nckd_isrepeatcite",billData.get("nckd_isrepeatcite"));
+        dynamicObject.set("nckd_iscitebynotupload",billData.get("nckd_iscitebynotupload"));
+        dynamicObject.set("nckd_iscross",billData.get("nckd_iscross"));
+        dynamicObject.set("nckd_isdownloadable",billData.get("nckd_isdownloadable"));
+        dynamicObject.set("nckd_isreferenceable",billData.get("nckd_isreferenceable"));
+        dynamicObject.set("nckd_applydate",new Date());
+        dynamicObject.set("nckd_yjclass",billData.get("nckd_yjclass"));
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        dynamicObject.set("creator",currentUserId);
+        dynamicObject.set("nckd_userfield",currentUserId);
+
+
+
+
+
+        List<HashMap<String, Object>> attmentInfors = (List<HashMap<String, Object>>) allAttachmentsData
+                .get("filename");
+        DynamicObjectCollection attCol = dynamicObject.getDynamicObjectCollection("nckd_attachmentfield");
+
+        for (HashMap<String, Object> attmentInfor : attmentInfors) {
+            String name = (String) attmentInfor.get("name");
+            String url = (String) attmentInfor.get("url");
+            String[] split = url.split("id=");
+            if(split.length>1){
+                // 参考标准源码 AttachmentFieldServiceHelper.saveTempToFileService(tempUrl, AttPk,fileName)
+                TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+                RequestContext requestContext = RequestContext.get();
+
+                // 指定上传到文件服务器的目标地址
+                String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(),
+                        requestContext.getAccountId(), "attachmentupload", name);
+                FileItem item = new FileItem(name, pathParam, cache.getInputStream(url));
+
+                // 上传附件
+                FileService fileService = FileServiceFactory.getAttachmentFileService();
+                String path = fileService.upload(item);
+                String attachmentFullUrl = UrlService.getAttachmentFullUrl(path);
+                // String
+                // url="http://172.20.63.42:8080/ierp/attachment/download.do?path=/ierp/1218732684788893696/202203/attachmentupload/one_1646273203365.txt";
+                String downurl = UrlService.getDomainContextUrl() + "/attachment/download.do?path=" + path;
+                attmentInfor.put("url", path);
+                DynamicObject att = createAttDynamic(attmentInfor);
+                DynamicObject addNew = attCol.addNew();
+                addNew.set("fbasedataid", att);
+                cache.remove(url);
+
+            }
+        }
+
+
+        OperationResult result = SaveServiceHelper.saveOperate("nckd_requisitionlist", new DynamicObject[] { dynamicObject },
+                OperateOption.create());
+        if (!result.isSuccess()) {
+            List<IOperateInfo> operateInfo = result.getAllErrorOrValidateInfo();
+            for (IOperateInfo tempOperateInfo : operateInfo) {
+//                logger.error(tempOperateInfo.getMessage());
+            }
+            return CustomApiResult.fail("654","单据保存失败");
+        }
+
+
+        // 上传附件
+        String appId ="nckd_jxyy";
+        Object pkId = result.getSuccessPkIds().get(0);
+        resultInfo.put("生成的要件单id", pkId);
+
+
+        }
+        resultInfo.put("mes","生成要件单成功");
+        return CustomApiResult.success("resultInfo");
+    }
+
+
+
+
+
+
+
+
+
+
+    //封装要上传的信息到苍穹平台
+    public Map<String, Object> generateBizData(Map<String, List<File>> allFiles, String accessToken,JSONObject object) throws Exception {
+        //上传文件到苍穹
+        Map<String, Object> allBizBillData = new HashMap<String, Object>();
+        // 生成单据数据
+        Map<String, Object> billData = new HashMap<String, Object>();
+        String orgremote = object.getString("orgremote");
+        String name=object.getString("name");
+        String nckd_atttype=object.getString("nckd_atttype");
+        String nckd_attsize=object.getString("nckd_attsize");
+        Boolean nckd_isrepeatcite=object.getBoolean("nckd_isrepeatcite");
+        Boolean nckd_iscitebynotupload=object.getBoolean("nckd_iscitebynotupload");
+        Boolean nckd_iscross=object.getBoolean("nckd_iscross");
+        Boolean nckd_isdownloadable=object.getBoolean("nckd_isdownloadable");
+        Boolean nckd_isreferenceable=object.getBoolean("nckd_isreferenceable");
+
+
+
+//      billData.put("billno", "QWER123"+rand(100));
+        billData.put("name", name);
+        billData.put("nckd_atttype",nckd_atttype );
+        billData.put("nckd_attsize",nckd_attsize );
+        billData.put("nckd_isrepeatcite",nckd_isrepeatcite );
+        billData.put("nckd_iscitebynotupload", nckd_iscitebynotupload);
+        billData.put("nckd_iscross", nckd_iscross);
+        billData.put("nckd_isdownloadable", nckd_isdownloadable);
+        billData.put("nckd_isreferenceable", nckd_isreferenceable);
+
+
+        QFilter qFilter99=new QFilter("name", QCP.equals,"OA公文");
+        DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_classification", new QFilter[]{qFilter99});
+        Long nckd_yjclass=(Long)dynamicObject.getPkValue();
+        QFilter qFilter98=new QFilter("nckd_otherorg", QCP.equals,orgremote);
+        DynamicObject dynamicObject98 = BusinessDataServiceHelper.loadSingle("nckd_mapping", new QFilter[]{qFilter98});
+        Long createorg=(Long)dynamicObject98.getDynamicObject("nckd_xinghanorg").getLong("id");
+        Long useorg=createorg;
+
+
+
+
+
+        billData.put("nckd_yjclass",nckd_yjclass);
+        billData.put("useorg",useorg);
+        billData.put("createorg",createorg);
+        allBizBillData.put("billData", billData);
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("appId", "NCKD");
+        params.put("entityName", "nckd_requisitionlist");
+        allBizBillData.put("params",params);
+        // 生成单据上所有的附件数据
+        Map<String, Object> allAttachmentsData = new HashMap<String, Object>();
+        // 单个附件面板中所有附件的信息
+        List<Map<String, Object>> attachments = null;
+        // 单个附件的信息
+        Map<String, Object> attachmentInfo = null;
+        StringBuffer uid = new StringBuffer();
+        uid.append("rc-upload-").append(new Date().getTime()).append("-");
+        int index = (int) (1 + Math.random()*10);
+        for (String tempAttaKey : allFiles.keySet()) {
+            List<File> files = allFiles.get(tempAttaKey);
+            attachments = new ArrayList<Map<String, Object>>();
+            for (File tempFile : files) {
+                String tempAttaUrl = null;
+                try {
+                    tempAttaUrl = this.postFileToCosmic(tempFile, accessToken);
+                } catch (Exception ex) {
+                    throw new RuntimeException(ex);
+                }
+                attachmentInfo = new HashMap<String, Object>();
+                attachmentInfo.put("entityNum", "nckd_requisitionlist");
+                attachmentInfo.put("name", tempFile.getName());
+                attachmentInfo.put("url", tempAttaUrl);
+                attachmentInfo.put("size", tempFile.length());
+                attachmentInfo.put("status", "success");
+                attachmentInfo.put("uid", uid.toString() + index++);
+                attachments.add(attachmentInfo);
+            }
+            allAttachmentsData.put(tempAttaKey, attachments);
+        }
+        allBizBillData.put("allAttachmentsData", allAttachmentsData);
+
+        return allBizBillData;
+    }
+
+
+
+
+//    //调用自定义OpenApi上传单据&附件信息到苍穹单据上
+//    public String bizSaveApi( String accessToken, Map<String, Object> allAttachmentsData) throws URISyntaxException {
+//        // 自定义开放平台接口路径
+//        StringBuffer url = new StringBuffer();
+//        url.append(URL_COSMICHOST).append(UPLOADATTAPATH);
+//        System.out.println(">>> " + url.toString());
+//        // 封装数据
+//        JSONObject body = new JSONObject();
+//        body.put("billData", allAttachmentsData.get("billData"));
+//        body.put("allAttachmentsData", allAttachmentsData.get("allAttachmentsData"));
+//        body.put("params", allAttachmentsData.get("params"));
+//        String responseStr = null;
+//        try {
+//            responseStr = HttpService.getService().doGetByHttpClient(url.toString(), accessToken, body);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//        return responseStr;
+//    }
+
+
+
+
+
+
+
+
+    //构建附件字段对象
+    private DynamicObject createAttDynamic(Map<String, Object> attmentInfor) {
+        DynamicObject attObj = BusinessDataServiceHelper.newDynamicObject("bd_attachment");
+        String name = (String) attmentInfor.get("name");
+        attObj.set("name", name);
+        attObj.set("size", attmentInfor.get("size"));
+        attObj.set("uid", attmentInfor.get("uid"));
+        attObj.set("url", attmentInfor.get("url"));
+        String type = name.substring(name.lastIndexOf(".") + 1);
+        attObj.set("type", type);
+        // tempfile=1表示持久化附件对象
+        attObj.set("tempfile", 1);
+        ORM orm = ORM.create();
+        long id = orm.genLongId("bd_attachment");
+        attObj.set("id", id);
+        attObj.set("pageid", "");
+        attObj.set("number", UUID.randomUUID().toString());
+        attObj.set("status", "B");
+        Date now = new Date();
+        attObj.set("modifytime", now.getTime());
+        attObj.set("creator", UserServiceHelper.getCurrentUserId());
+        SaveServiceHelper.save(new DynamicObject[] { attObj });
+        return attObj;
+    }
+
+
+
+
+
+    public static String fileToBase64(String path) {
+        String base64 = null;
+        InputStream in = null;
+        try {
+            File file = new File(path);
+            in = new FileInputStream(file);
+            byte[] bytes = new byte[(int) file.length()];
+            in.read(bytes);
+            base64 =newString(Base64.getEncoder().encode(bytes),"UTF-8");
+//            base64 = new String(Base64.encodeBase64(bytes),"UTF-8");
+            System.out.println("将文件["+path+"]转base64字符串:"+base64);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return base64;
+    }
+
+
+
+
+    public static File base64ToFile(String outFilePath,String base64, String outFileName) {
+        System.out.println("BASE64:["+base64+"]解码成File文件["+outFilePath+"\\"+outFileName+"]");
+        File file = null;
+        //创建文件目录
+        String filePath=outFilePath;
+        File  dir=new File(filePath);
+        if (!dir.exists() && !dir.isDirectory()) {
+            dir.mkdirs();
+        }
+        BufferedOutputStream bos = null;
+        FileOutputStream fos = null;
+        try {
+            byte[] bytes = Base64.getDecoder().decode(base64);
+//            file=new File(filePath+"/"+outFileName+UUID.randomUUID().toString());
+            file=new File(outFileName);
+            fos = new FileOutputStream(file);
+            bos = new BufferedOutputStream(fos);
+            bos.write(bytes);
+            return file;
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (bos != null) {
+                try {
+                    bos.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (fos != null) {
+                try {
+                    fos.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return file;
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 246 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ApplyBillPlugin.java

@@ -0,0 +1,246 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.algo.DataSet;
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.bill.BillShowParameter;
+import kd.bos.cache.CacheFactory;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.operate.Attachment;
+import kd.bos.entity.operate.Donothing;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.IClientViewProxy;
+import kd.bos.form.ShowType;
+import kd.bos.form.control.AttachmentPanel;
+import kd.bos.form.control.Button;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.events.ClickListener;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.id.ID;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.url.UrlService;
+import kd.sdk.plugin.Plugin;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.util.*;
+
+import static kd.bos.cache.ehcache.syncstatus.MemoryCacheSyncStatusMange.getUid;
+
+/**
+ * 父界面
+ */
+public class ApplyBillPlugin extends AbstractBillPlugIn implements Plugin, ClickListener {
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+        Integer b=1;
+        if(args.getOperateKey().equals("yinyong")){
+
+            Integer a=1;
+            DynamicObject[] nckd_requisitionlists = BusinessDataServiceHelper.load("nckd_requisitionlist", "id,billno", null);
+            FormShowParameter showParameter=new FormShowParameter();
+            showParameter.setFormId("nckd_reference");
+            showParameter.setCaption("要件列表");
+            showParameter.setCloseCallBack(new CloseCallBack(this,"officecount"));
+            showParameter.getOpenStyle().setShowType(ShowType.Modal);
+            this.getView().showForm(showParameter);
+
+        }
+
+
+//        if(args.getOperateKey().equals("check")){
+//            AttachmentPanel attachmentpanel = this.getView().getControl("attachmentpanel");
+//            List<Map<String, Object>> attachmentData = attachmentpanel.getAttachmentData();
+////            List<Map<String,Object>> attachmentpanel = (List<Map<String,Object>>)this.getModel().getValue("attachmentpanel");
+//            for (Map<String, Object> map : attachmentData) {
+//                String uid = (String) map.get("uid");
+//                String url = (String) map.get("url");
+//                String name = (String) map.get("name");
+//                String size = (String) map.get("size");
+////                String fattachmentpanel = (String) map.get("fattachmentpanel");
+//                Integer entityNum =  (Integer) map.get("entityNum");
+//                String lastModified = (String) map.get("lastModified");
+//                String status = (String) map.get("status");
+//                String client = (String) map.get("client");
+//
+//            }
+//            Integer a=1;
+//
+//
+//        }
+
+
+    }
+
+    @Override
+    public void closedCallBack(ClosedCallBackEvent e) {
+        super.closedCallBack(e);
+
+        String callBackpage = e.getActionId();
+            if("officecount".equals(callBackpage)){
+           DynamicObjectCollection dynamicObjectCollection= (DynamicObjectCollection)e.getReturnData();
+           if(dynamicObjectCollection!=null){
+               for (DynamicObject dynamicObject : dynamicObjectCollection) {
+                   String number = dynamicObject.getString("nckd_number");
+
+                   try {
+
+                       DynamicObjectCollection dynamicObjects=(DynamicObjectCollection)dynamicObject.get("nckd_attachmentfield");
+
+                       AttachmentPanel attachmentPanel =this.getControl("nckd_attachmentpanel");
+                       List<Map<String,Object>> attachments=new ArrayList<>();
+                       HashMap<String,Object> map;
+
+                       if(dynamicObjects!=null&&dynamicObjects.size()>0){
+                           for (DynamicObject attachmentField : dynamicObjects) {
+                               
+                               
+//                              获取附件编码
+//                               DynamicObject sourceAttachment = BusinessDataServiceHelper.loadSingle(attachmentField.getDynamicObject("fbasedataId").getPkValue(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+//                               String number = sourceAttachment.getString("number");
+
+
+                               map=new HashMap<>();
+                               //获取附件字段中的单个附件
+                               DynamicObject fbasedataid = attachmentField.getDynamicObject("fbasedataid");
+                               map.put("type", fbasedataid.getString("type"));
+                               //获取附件inputstream上传到缓存服务(附件面板数据需要上传到缓存服务中,返回非持久化的url)
+                               InputStream inputStream = FileServiceFactory.getAttachmentFileService().getInputStream(fbasedataid.getString("url"));
+                               String tempUrl =
+                                       CacheFactory.getCommonCacheFactory().getTempFileCache().saveAsFullUrl(fbasedataid.getString("name"), new BufferedInputStream(inputStream), 2 * 3600);
+                               //临时url
+                               map.put("url", tempUrl);
+                               //uid
+                               map.put("uid", number);
+                               //name
+                               map.put("name", fbasedataid.getString("name"));
+                               //size
+                               map.put("size", fbasedataid.get("size"));
+//                    map.put("fattachmentpanel", "attachmentpanel");
+                               //entityNum
+//                               map.put("entityNum", getView().getEntityId());
+                               //lastModified
+                               map.put("lastModified", new Date().getTime());
+                               map.put("status", "success");
+                               //client
+                               map.put("client", "web");
+//                               map.put("entityNum",number);
+
+
+                               attachments.add(map);
+//                    AttachmentServiceHelper.upload(getView().getEntityId(),this.getModel().getValue("id"),"attachmentpanel",attachments);
+                               attachmentPanel.upload(attachments);
+                               // 刷新附件面板,才会重新加载数据
+                               this.getView().updateView("nckd_attachmentpanel");
+
+                           }
+                       }
+
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//                       List<Map<String, Object>> attachmentData = attachmentPanel.getAttachmentData();
+//
+//
+//                       for (Map<String, Object> attachmentMap : attachmentData) {
+//                           String visiablePreview = "1";//是否显示预览按钮
+//                           String visiableDownload = "0";//是否显示下载按钮
+//                           String visiableDelete = "1";//是否显示删除按钮
+//                           String visiableRename = "1";//是否显示重命名按钮
+//                           attachmentMap.put("visible",visiablePreview + visiableDownload + visiableDelete + visiableRename);
+//                       }
+//
+//                       IClientViewProxy clientViewProxy = getView().getService(IClientViewProxy.class);
+//                       clientViewProxy.setEntryProperty("attachmentpanel","data",attachmentData);
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+//                    break;
+                   } catch (Exception ex) {
+                       throw new RuntimeException(ex);
+                   }
+
+
+
+
+
+//            //根据附件字段数据构造附件面板数据
+//            Map<String, Object> attachemnts = new HashMap<>();
+//            List<Map<String, Object>> attachmentData3 = buildAttachmentDataFromEdit(dynamicObjects);
+//            //key:目标附件面板标识,value:目标附件面板附件数据
+//            attachemnts.put("attachmentpanel", attachmentData3);
+//
+//            /**
+//             * 根据附件字段数据构造附件面板数据
+//             * @param sourceAttachCol
+//             * @return
+//             */
+//            private List<Map<String, Object>> buildAttachmentDataFromEdit(DynamicObjectCollection sourceAttachCol) {
+//                List<Map<String, Object>> attachDataList = new ArrayList<>();
+//                sourceAttachCol.forEach(attach -> {
+//                    DynamicObject attachObj = attach.getDynamicObject("fbasedataid");
+//                    Map<String, Object> attachMap = new HashMap<>();
+//                    //description
+//                    attachMap.put("description", attachObj.getString("description"));
+//                    attachMap.put("type", attachObj.getString("type"));
+//                    //获取附件inputstream上传到缓存服务
+//                    InputStream inputStream = FileServiceFactory.getAttachmentFileService().getInputStream(attachObj.getString("url"));
+//                    String saveUrl = CacheFactory.getCommonCacheFactory().getTempFileCache().saveAsFullUrl(attachObj.getString("name"), new BufferedInputStream(inputStream), 2*3600);
+//                    //url
+//                    attachMap.put("url", saveUrl);
+//                    //uid
+//                    attachMap.put("uid", getUid());
+//                    //name
+//                    attachMap.put("name", attachObj.getString("name"));
+//                    //size
+//                    attachMap.put("size", attachObj.get("size"));
+//                    attachMap.put("fattachmentpanel", "attachmentpanel");
+//                    //entityNum
+//                    attachMap.put("entityNum", getView().getEntityId());
+//                    attachMap.put("billPkId", String.valueOf(getModel().getValue("id")));
+//                    //lastModified
+//                    attachMap.put("lastModified", new Date().getTime());
+//                    attachMap.put("status", "success");
+//                    //client
+//                    attachMap.put("client", null);
+//                    attachDataList.add(attachMap);
+//                });
+//                return attachDataList;
+//             }
+
+               }
+           }
+
+
+
+        }
+
+
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        AttachmentPanel panel = this.getView().getControl("nckd_attachmentpanel");
+        List<Map<String, Object>> attachmentData = panel.getAttachmentData();
+
+
+        for (Map<String, Object> attachmentMap : attachmentData) {
+            String visiablePreview = "1";//是否显示预览按钮
+            String visiableDownload = "0";//是否显示下载按钮
+            String visiableDelete = "1";//是否显示删除按钮
+            String visiableRename = "1";//是否显示重命名按钮
+            attachmentMap.put("visible",visiablePreview + visiableDownload + visiableDelete + visiableRename);
+        }
+
+        IClientViewProxy clientViewProxy = getView().getService(IClientViewProxy.class);
+        clientViewProxy.setEntryProperty("nckd_attachmentpanel","data",attachmentData);
+
+
+
+    }
+}

+ 145 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ApplyBillSecondPlugin.java

@@ -0,0 +1,145 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.cache.CacheFactory;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.IClientViewProxy;
+import kd.bos.form.ShowType;
+import kd.bos.form.control.AttachmentPanel;
+import kd.bos.form.control.events.ClickListener;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.util.*;
+
+/**
+ * 父界面
+ */
+public class ApplyBillSecondPlugin extends AbstractBillPlugIn implements Plugin, ClickListener {
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+        Integer b=1;
+        if(args.getOperateKey().equals("yinyong")){
+
+            Integer a=1;
+            DynamicObject[] nckd_requisitionlists = BusinessDataServiceHelper.load("nckd_requisitionlist", "id,billno", null);
+            FormShowParameter showParameter=new FormShowParameter();
+            showParameter.setFormId("nckd_reference");
+            showParameter.setCaption("要件列表");
+            showParameter.setCloseCallBack(new CloseCallBack(this,"officecount"));
+            showParameter.getOpenStyle().setShowType(ShowType.Modal);
+            this.getView().showForm(showParameter);
+
+        }
+
+
+
+
+    }
+
+    @Override
+    public void closedCallBack(ClosedCallBackEvent e) {
+        super.closedCallBack(e);
+
+        String callBackpage = e.getActionId();
+            if("officecount".equals(callBackpage)){
+           DynamicObjectCollection dynamicObjectCollection= (DynamicObjectCollection)e.getReturnData();
+           if(dynamicObjectCollection!=null){
+               for (DynamicObject dynamicObject : dynamicObjectCollection) {
+                   String number = dynamicObject.getString("nckd_number");
+
+                   try {
+
+                       DynamicObjectCollection dynamicObjects=(DynamicObjectCollection)dynamicObject.get("nckd_attachmentfield");
+
+                       AttachmentPanel attachmentPanel =this.getControl("nckd_attachmentpanel");
+                       List<Map<String,Object>> attachments=new ArrayList<>();
+                       HashMap<String,Object> map;
+
+                       if(dynamicObjects!=null&&dynamicObjects.size()>0){
+                           for (DynamicObject attachmentField : dynamicObjects) {
+
+                               map=new HashMap<>();
+                               //获取附件字段中的单个附件
+                               DynamicObject fbasedataid = attachmentField.getDynamicObject("fbasedataid");
+                               map.put("type", fbasedataid.getString("type"));
+                               //获取附件inputstream上传到缓存服务(附件面板数据需要上传到缓存服务中,返回非持久化的url)
+                               InputStream inputStream = FileServiceFactory.getAttachmentFileService().getInputStream(fbasedataid.getString("url"));
+                               String tempUrl =
+                                       CacheFactory.getCommonCacheFactory().getTempFileCache().saveAsFullUrl(fbasedataid.getString("name"), new BufferedInputStream(inputStream), 2 * 3600);
+                               //临时url
+                               map.put("url", tempUrl);
+                               //uid
+                               map.put("uid", number);
+                               //name
+                               map.put("name", fbasedataid.getString("name"));
+                               //size
+                               map.put("size", fbasedataid.get("size"));
+
+                               map.put("lastModified", new Date().getTime());
+                               map.put("status", "success");
+                               //client
+                               map.put("client", "web");
+//                               map.put("entityNum",number);
+
+
+                               attachments.add(map);
+                               attachmentPanel.upload(attachments);
+                               // 刷新附件面板,才会重新加载数据
+                               this.getView().updateView("nckd_attachmentpanel");
+
+                           }
+                       }
+
+
+                   } catch (Exception ex) {
+                       throw new RuntimeException(ex);
+                   }
+
+
+
+
+
+
+
+               }
+           }
+
+
+
+        }
+
+
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        AttachmentPanel panel = this.getView().getControl("nckd_attachmentpanel");
+        List<Map<String, Object>> attachmentData = panel.getAttachmentData();
+
+
+        for (Map<String, Object> attachmentMap : attachmentData) {
+            String visiablePreview = "1";//是否显示预览按钮
+            String visiableDownload = "0";//是否显示下载按钮
+            String visiableDelete = "1";//是否显示删除按钮
+            String visiableRename = "1";//是否显示重命名按钮
+            attachmentMap.put("visible",visiablePreview + visiableDownload + visiableDelete + visiableRename);
+        }
+
+        IClientViewProxy clientViewProxy = getView().getService(IClientViewProxy.class);
+        clientViewProxy.setEntryProperty("nckd_attachmentpanel","data",attachmentData);
+
+
+
+    }
+}

+ 669 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ApplyFormPlugin.java

@@ -0,0 +1,669 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.grapecity.documents.excel.Q;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.serialization.SerializationUtils;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.datamodel.events.BizDataEventArgs;
+import kd.bos.entity.operate.Donothing;
+import kd.bos.entity.tree.TreeNode;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.TreeView;
+import kd.bos.form.control.events.*;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeClosedEvent;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.list.BillList;
+import kd.bos.list.plugin.StandardTreeListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.bos.url.UrlService;
+import kd.sdk.plugin.Plugin;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+
+/**
+ * 子界面
+ */
+public class ApplyFormPlugin extends StandardTreeListPlugin implements Plugin, ClickListener, ItemClickListener {
+
+    private final static String KEY_OK = "btnok";
+    //页面取消按钮标识
+    private final static String KEY_CANCEL = "btncancel";
+    //页面取消按钮标识
+
+    @Override
+    public void click(EventObject evt) {
+        Control source = (Control) evt.getSource();
+        String sourceKey=source.getKey();
+
+
+        if (KEY_OK.equals(sourceKey)) {
+//            int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity1");
+
+            EntryGrid entryGrid= this.getControl("nckd_entryentity1");
+            int selectRows[]=entryGrid.getSelectRows();
+            if (selectRows.length<=0){
+                this.getView().showMessage("请先选择一条数据!");
+                return;
+            }
+            DynamicObjectCollection dynamicObjectCollection=new DynamicObjectCollection();
+
+            DynamicObjectCollection entity=this.getModel().getEntryEntity("nckd_entryentity1");
+            if(selectRows!=null && selectRows.length>0){
+                for(int selectRow :selectRows){
+                    DynamicObject dynamicObject=entity.get(selectRow);  //获取选中行的单据体数据
+                    dynamicObjectCollection.add(dynamicObject);
+                }
+                this.getView().returnDataToParent(dynamicObjectCollection);
+            }
+            this.getView().close();
+        }
+        else if (KEY_CANCEL.equals(sourceKey)) {
+            //被点击控件为取消则设置返回值为空并关闭页面(在页面关闭回调方法中必须验证返回值不为空,否则会报空指针)
+            this.getView().returnDataToParent(null);
+            this.getView().close();
+        }
+        else {
+            this.getView().returnDataToParent(null);
+            this.getView().close();
+        }
+
+
+        super.click(evt);
+        //获取被点击的控件对象
+     Integer a=1;
+    }
+
+    @Override
+    public void beforeItemClick(BeforeItemClickEvent evt) {
+        super.beforeItemClick(evt);
+        Integer a=1;
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        //页面确认按钮和取消按钮添加监听
+        this.addClickListeners("btnok","btncancel","nckd_baritemap");
+        this.addItemClickListeners("nckd_baritemap", "nckd_toolbarap");
+    }
+    @Override
+
+    public void itemClick(ItemClickEvent evt) {
+
+        String itemKey = evt.getItemKey();
+
+// 此处必须是工具栏项的标识! 工具栏项! 工具栏项! 工具栏项!
+
+        if (StringUtils.equalsIgnoreCase(itemKey, "nckd_baritemap")) {
+
+           Integer b=1;
+
+        }
+
+        super.itemClick(evt);
+
+    }
+
+
+
+
+//    @Override
+//    public void beforeClosed(BeforeClosedEvent e) {
+//        super.beforeClosed(e);
+//        int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity1");
+//
+//        EntryGrid entryGrid= this.getControl("nckd_entryentity1");
+//        int selectRows[]=entryGrid.getSelectRows();
+//        if (selectRows.length<=0){
+//            this.getView().showMessage("请先选择一条数据!");
+//            return;
+//        }
+//        DynamicObjectCollection dynamicObjectCollection=new DynamicObjectCollection();
+//
+//        DynamicObjectCollection entity=this.getModel().getEntryEntity("nckd_entryentity1");
+//        if(selectRows!=null && selectRows.length>0){
+//            for(int selectRow :selectRows){
+//                DynamicObject dynamicObject=entity.get(selectRow);  //获取选中行的单据体数据
+//                dynamicObjectCollection.add(dynamicObject);
+//            }
+//        }
+//
+//        this.getView().returnDataToParent(dynamicObjectCollection);
+//    }
+
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        //获取当前登录人
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        //获取主组织
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        //获取当前登录切换的组织
+        long orgId = RequestContext.get().getOrgId();
+        super.afterCreateNewData(e);
+        this.getModel().deleteEntryData("nckd_entryentity1");
+        QFilter qFilter8=new QFilter("enable", QCP.equals,"1");
+        QFilter qFilter9=new QFilter("status", QCP.equals,"C");
+        QFilter qFiltercommonuser=new QFilter("nckd_userfield.id",QCP.equals,currentUserId);
+        DynamicObject dynamicObjectcommonuser = BusinessDataServiceHelper.loadSingle("nckd_commonuser", new QFilter[]{qFiltercommonuser});
+        QFilter yjFilter=null;
+        if(dynamicObjectcommonuser!=null){
+            DynamicObject nckd_orgbase = dynamicObjectcommonuser.getDynamicObject("nckd_orgbase");
+            long orgbaseid=nckd_orgbase.getLong("id");
+             yjFilter=new QFilter("nckd_orgbase.id",QCP.equals,orgbaseid);
+        }
+        else{
+            QFilter qFilteruser=new QFilter("creator.id",QCP.equals,currentUserId);
+            QFilter qFiltershare1=new QFilter("nckd_isshared",QCP.equals,true);
+            QFilter qFiltershare2=new QFilter("nckd_orgbase.id",QCP.equals,userMainOrgId);
+            QFilter qFiltershare=qFiltershare1.and(qFiltershare2);
+             yjFilter=qFilteruser.or(qFiltershare);
+        }
+        DynamicObject[] nckd_requisitionlists = BusinessDataServiceHelper.load("nckd_requisitionlist", "id,billno", new QFilter[]{qFilter8,qFilter9,yjFilter});
+        for (int i = 0; i < nckd_requisitionlists.length; i++) {
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_requisitionlists[i].getPkValue(), nckd_requisitionlists[i].getDataEntityType().getName());
+            String number = dynamicObject.getString("number");
+            String name = dynamicObject.getString("name");
+            String type=dynamicObject.getString("nckd_atttype");
+            String size=dynamicObject.getString("nckd_attsize");
+//            boolean nckd_isrepeatcite = dynamicObject.getBoolean("nckd_isrepeatcite");
+//            boolean nckd_iscitebynotupload = dynamicObject.getBoolean("nckd_iscitebynotupload");
+//            boolean nckd_iscross = dynamicObject.getBoolean("nckd_iscross");
+            boolean nckd_isdownloadable = dynamicObject.getBoolean("nckd_isdownloadable");
+//            boolean nckd_isreferenceable = dynamicObject.getBoolean("nckd_isreferenceable");
+            boolean nckd_isshared=dynamicObject.getBoolean("nckd_isshared");
+            String status=dynamicObject.getString("status");
+            String enable=dynamicObject.getString("enable");
+            DynamicObject nckdOrgbase = dynamicObject.getDynamicObject("nckd_orgbase");
+            if(nckdOrgbase==null){
+                continue;
+            }
+            long nckd_orgbase = dynamicObject.getDynamicObject("nckd_orgbase").getLong("id");
+            Long creator = dynamicObject.getDynamicObject("creator").getLong("id");
+            //要件分类
+            Long nckd_yjclass= Long.valueOf("11111111111111");
+            if(dynamicObject.getDynamicObject("nckd_yjclass")!=null) {
+                nckd_yjclass = dynamicObject.getDynamicObject("nckd_yjclass").getLong("id");
+            }
+//            if(dynamicObject.getDynamicObject("nckd_yjclass")!=null){
+//                nckd_yjclass= dynamicObject.getDynamicObject("nckd_yjclass").getLong("id");
+//            }
+            Date applydate=dynamicObject.getDate("nckd_applydate");
+
+//            DynamicObjectCollection collection=getModel().getEntryEntity("nckd_entryentity1");
+//            DynamicObject dynamicObject1 = collection.addNew();
+//            dynamicObject1.set("nckd_number",number);
+//            dynamicObject1.set("nckd_name",name);
+            int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity1");
+            this.getModel().setValue("nckd_number", number, rowIndex);
+            this.getModel().setValue("nckd_name", name, rowIndex);
+            this.getModel().setValue("nckd_atttype", type, rowIndex);
+            this.getModel().setValue("nckd_attsize", size, rowIndex);
+            this.getModel().setValue("nckd_yjclass", nckd_yjclass, rowIndex);
+//            this.getModel().setValue("nckd_isrepeatcite", nckd_isrepeatcite, rowIndex);
+//            this.getModel().setValue("nckd_iscitebynotupload", nckd_iscitebynotupload, rowIndex);
+//            this.getModel().setValue("nckd_iscross", nckd_iscross, rowIndex);
+            this.getModel().setValue("nckd_isdownloadable", nckd_isdownloadable, rowIndex);
+            this.getModel().setValue("nckd_isshared", nckd_isshared, rowIndex);
+//            this.getModel().setValue("nckd_isreferenceable", nckd_isreferenceable, rowIndex);
+            this.getModel().setValue("nckd_status", status, rowIndex);
+            this.getModel().setValue("nckd_yjclass", nckd_yjclass, rowIndex );
+            this.getModel().setValue("nckd_applydate", applydate, rowIndex);
+            this.getModel().setValue("nckd_orgbase", nckd_orgbase, rowIndex);
+            this.getModel().setValue("nckd_enable", enable, rowIndex );
+            this.getModel().setValue("nckd_creator",creator,rowIndex);
+
+
+            List<Object> attchIdSet = new ArrayList<>();
+            DynamicObjectCollection picCo = dynamicObject.getDynamicObjectCollection("nckd_attachmentfield");
+            if (picCo != null && !picCo.isEmpty()) {
+                picCo.forEach(attach -> {
+                    attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                });
+
+            }
+            this.getModel().setValue("nckd_attachmentfield", attchIdSet.toArray(),rowIndex);
+        }
+    }
+
+
+
+
+
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        super.afterDoOperation(e);
+        //获取当前登录人
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        //获取主组织
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        List<Long> allDepartmentByUserId = UserServiceHelper.getAllDepartmentByUserId(currentUserId);
+        //获取当前登录切换的组织
+        long orgId = RequestContext.get().getOrgId();
+
+
+
+
+        Integer b=1;
+        if ("search".equals(e.getOperateKey())) {
+
+            String nckd_namesearch = (String) this.getModel().getValue("nckd_namesearch");
+            String nckd_numbersearch = (String) this.getModel().getValue("nckd_numbersearch");
+            //创建人
+            Long nckd_createusersearch=null;
+            DynamicObject nckd_createusersearch1 = (DynamicObject) this.getModel().getValue("nckd_createusersearch");
+            if(nckd_createusersearch1!=null) {
+                 nckd_createusersearch = nckd_createusersearch1.getLong("id");
+            }
+            //创建组织
+            Long nckd_createorgsearch=null;
+            DynamicObject nckd_createorgsearch1 = (DynamicObject) this.getModel().getValue("nckd_createorgsearch");
+            if(nckd_createorgsearch1!=null) {
+                nckd_createorgsearch = nckd_createorgsearch1.getLong("id");
+            }
+
+            //起始日期
+            Date nckd_begindate = (Date) this.getModel().getValue("nckd_begindate");
+            //结束日期
+            Date nckd_enddate = (Date) this.getModel().getValue("nckd_enddate");
+            //要件分类名称
+            String nckd_yaojianclass=(String)this.getModel().getValue("nckd_yaojianclass");
+            //清空单据体数据
+            this.getModel().deleteEntryData("nckd_entryentity1");
+
+            QFilter qFilter1=null;
+            QFilter qFilter2=null;
+            QFilter qFilter3=null;
+            QFilter qFilter4=null;
+            QFilter qFilter5=null;
+            QFilter qFilter6=null;
+            QFilter qFilter7=null;
+            QFilter qFilter8=new QFilter("enable", QCP.equals,"1");
+            QFilter qFilter9=new QFilter("status", QCP.equals,"C");
+//            QFilter qFilter10=new QFilter("nckd_isreferenceable", QCP.equals,true);
+//            QFilter qFilter111   =new QFilter("nckd_isrepeatcite", QCP.equals,true);
+//            QFilter qFilter112   =new QFilter("nckd_isrepeatcite", QCP.equals,false);
+//            DynamicObject[] load = BusinessDataServiceHelper.load("nckd_yinyongbiao", "nckd_elecoding", null);
+//            List<String> arrayList = new ArrayList<>();
+//            for (int i = 0; i < load.length; i++) {
+//                arrayList.add( load[i].get("nckd_elecoding").toString());
+//            }
+//            QFilter qFilter10   =new QFilter("number", QCP.not_in,arrayList);
+
+//            QFilter qFilter11=qFilter111.or(qFilter112.and(qFilter113));
+
+
+            //***********************
+//            QFilter qFilter121   =new QFilter("nckd_iscitebynotupload", QCP.equals,true);
+////            QFilter qFilter122   =new QFilter("nckd_iscitebynotupload", QCP.equals,false);
+////
+////            QFilter qFilter123   =new QFilter("creator", QCP.equals,currentUserId);
+////            QFilter qFilter12=qFilter121.or(qFilter122.and(qFilter123));
+
+
+
+            //***********************能否跨组织引用
+//            QFilter qFilter131   =new QFilter("nckd_iscross", QCP.equals,true);
+//            QFilter qFilter132   =new QFilter("nckd_iscross", QCP.equals,false);
+//
+//            QFilter qFilter133   =new QFilter("createorg", QCP.in,allDepartmentByUserId);
+//
+//
+//            QFilter qFilter13=qFilter131.or(qFilter132.and(qFilter133));
+
+
+
+
+
+
+
+            if (StringUtils.isNotBlank(nckd_namesearch)) {
+                 qFilter1=new QFilter("name",QCP.like,"%"+nckd_namesearch+"%");
+            }
+            if (StringUtils.isNotBlank(nckd_numbersearch)) {
+                qFilter2=new QFilter("number",QCP.like,"%"+nckd_numbersearch+"%");
+            }
+            if (nckd_createusersearch!=null) {
+                qFilter3=new QFilter("creator",QCP.equals,nckd_createusersearch);
+            }
+            if (nckd_createorgsearch!=null) {
+                qFilter4=new QFilter("createorg",QCP.equals,nckd_createorgsearch);
+            }
+
+            if (nckd_begindate!=null&&nckd_enddate!=null) {
+                qFilter5=new QFilter("nckd_applydate",QCP.large_equals,nckd_begindate);
+                qFilter6=new QFilter("nckd_applydate",QCP.less_equals,nckd_enddate);
+            }
+
+            if (StringUtils.isNotBlank(nckd_yaojianclass)) {
+                qFilter7=new QFilter("nckd_yjclass.name",QCP.equals,nckd_yaojianclass);
+            }
+//
+//            QFilter qFilter666=new QFilter("enable", QCP.equals,"1");
+//            QFilter qFilter777=new QFilter("status", QCP.equals,"C");
+
+            QFilter qFiltercommonuser=new QFilter("nckd_userfield.id",QCP.equals,currentUserId);
+            DynamicObject dynamicObjectcommonuser = BusinessDataServiceHelper.loadSingle("nckd_commonuser", new QFilter[]{qFiltercommonuser});
+            QFilter yjFilter=null;
+            if(dynamicObjectcommonuser!=null){
+                DynamicObject nckd_orgbase = dynamicObjectcommonuser.getDynamicObject("nckd_orgbase");
+                long orgbaseid=nckd_orgbase.getLong("id");
+                yjFilter=new QFilter("nckd_orgbase.id",QCP.equals,orgbaseid);
+            }
+            else{
+                QFilter qFilteruser=new QFilter("creator.id",QCP.equals,currentUserId);
+                QFilter qFiltershare1=new QFilter("nckd_isshared",QCP.equals,true);
+                QFilter qFiltershare2=new QFilter("nckd_orgbase.id",QCP.equals,userMainOrgId);
+                QFilter qFiltershare=qFiltershare1.and(qFiltershare2);
+                yjFilter=qFilteruser.or(qFiltershare);
+            }
+
+
+
+            DynamicObject[] nckd_requisitionlists = BusinessDataServiceHelper.load("nckd_requisitionlist", "id,billno", new QFilter[]{qFilter1,qFilter2,qFilter3,qFilter4,qFilter5,qFilter6,qFilter7,
+           qFilter8,qFilter9,yjFilter});
+//            for (int i = 0; i < nckd_requisitionlists.length; i++) {
+//                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_requisitionlists[i].getPkValue(), nckd_requisitionlists[i].getDataEntityType().getName());
+//                String number = dynamicObject.getString("number");
+//                String name = dynamicObject.getString("name");
+//                Long nckd_yjclass = dynamicObject.getDynamicObject("nckd_yjclass").getLong("id");
+//
+////            DynamicObjectCollection collection=getModel().getEntryEntity("nckd_entryentity1");
+////            DynamicObject dynamicObject1 = collection.addNew();
+////            dynamicObject1.set("nckd_number",number);
+////            dynamicObject1.set("nckd_name",name);
+//                int rowIndex = 0;
+//                try {
+//                    rowIndex = this.getModel().createNewEntryRow("nckd_entryentity1");
+//                    this.getModel().setValue("nckd_number", number, rowIndex);
+//                    this.getModel().setValue("nckd_name", name, rowIndex);
+//                    this.getModel().setValue("nckd_yjclass",nckd_yjclass,rowIndex);
+//                    List<Object> attchIdSet = new ArrayList<>();
+//                    DynamicObjectCollection picCo = dynamicObject.getDynamicObjectCollection("nckd_attachmentfield");
+//                    if (picCo != null && !picCo.isEmpty()) {
+//                        picCo.forEach(attach -> {
+//                            attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+//                        });
+//
+//                    }
+//                    this.getModel().setValue("nckd_attachmentfield", attchIdSet.toArray(),rowIndex);
+//
+//                } catch (Exception ex) {
+//                    throw new RuntimeException(ex);
+//                }
+//
+//
+//
+//            }
+
+            for (int i = 0; i < nckd_requisitionlists.length; i++) {
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_requisitionlists[i].getPkValue(), nckd_requisitionlists[i].getDataEntityType().getName());
+                String number = dynamicObject.getString("number");
+                String name = dynamicObject.getString("name");
+                String type=dynamicObject.getString("nckd_atttype");
+                String size=dynamicObject.getString("nckd_attsize");
+                Long nckd_orgbase=dynamicObject.getDynamicObject("nckd_orgbase").getLong("id");
+//                boolean nckd_isrepeatcite = dynamicObject.getBoolean("nckd_isrepeatcite");
+//                boolean nckd_iscitebynotupload = dynamicObject.getBoolean("nckd_iscitebynotupload");
+//                boolean nckd_iscross = dynamicObject.getBoolean("nckd_iscross");
+                boolean nckd_isdownloadable = dynamicObject.getBoolean("nckd_isdownloadable");
+                boolean nckd_isshared = dynamicObject.getBoolean("nckd_isshared");
+
+//                boolean nckd_isreferenceable = dynamicObject.getBoolean("nckd_isreferenceable");
+                String status=dynamicObject.getString("status");
+                String enable=dynamicObject.getString("enable");
+//                Long createorg=dynamicObject.getDynamicObject("createorg").getLong("id");
+                Long creator = dynamicObject.getDynamicObject("creator").getLong("id");
+                //要件分类
+                Long nckd_yjclass= Long.valueOf("11111111111111");
+                if(dynamicObject.getDynamicObject("nckd_yjclass")!=null) {
+                    nckd_yjclass = dynamicObject.getDynamicObject("nckd_yjclass").getLong("id");
+                }
+                Date applydate=dynamicObject.getDate("nckd_applydate");
+
+//            DynamicObjectCollection collection=getModel().getEntryEntity("nckd_entryentity1");
+//            DynamicObject dynamicObject1 = collection.addNew();
+//            dynamicObject1.set("nckd_number",number);
+//            dynamicObject1.set("nckd_name",name);
+                int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity1");
+                this.getModel().setValue("nckd_number", number, rowIndex );
+                this.getModel().setValue("nckd_name", name, rowIndex );
+                this.getModel().setValue("nckd_atttype", type, rowIndex);
+                this.getModel().setValue("nckd_attsize", size, rowIndex);
+                this.getModel().setValue("nckd_yjclass", nckd_yjclass, rowIndex );
+//                this.getModel().setValue("nckd_isrepeatcite", nckd_isrepeatcite, rowIndex );
+//                this.getModel().setValue("nckd_iscitebynotupload", nckd_iscitebynotupload, rowIndex );
+//                this.getModel().setValue("nckd_iscross", nckd_iscross, rowIndex );
+                this.getModel().setValue("nckd_isdownloadable", nckd_isdownloadable, rowIndex);
+                this.getModel().setValue("nckd_orgbase", nckd_orgbase, rowIndex);
+                this.getModel().setValue("nckd_isshared", nckd_isshared, rowIndex );
+//                this.getModel().setValue("nckd_isreferenceable", nckd_isreferenceable, rowIndex );
+                this.getModel().setValue("nckd_status", status, rowIndex );
+                this.getModel().setValue("nckd_yjclass", nckd_yjclass, rowIndex );
+                this.getModel().setValue("nckd_applydate", applydate, rowIndex );
+//                this.getModel().setValue("nckd_createorg", createorg, rowIndex );
+                this.getModel().setValue("nckd_creator",creator,rowIndex);
+                this.getModel().setValue("nckd_enable", enable, rowIndex );
+
+
+
+                List<Object> attchIdSet = new ArrayList<>();
+                DynamicObjectCollection picCo = dynamicObject.getDynamicObjectCollection("nckd_attachmentfield");
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach(attach -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+
+                }
+                this.getModel().setValue("nckd_attachmentfield", attchIdSet.toArray(),rowIndex);
+            }
+
+
+
+
+
+//            Date startDate = (Date) this.getModel().getValue("ztjg_startdate");
+//            Date endDate = (Date) this.getModel().getValue("ztjg_enddate");
+//            Boolean isForce = (Boolean) this.getModel().getValue("ztjg_isforce");
+//            Boolean isInform = (Boolean) this.getModel().getValue("ztjg_isinform");
+//            String likeName = (String) this.getModel().getValue("ztjg_likename");
+//            if (isForce == null){
+//                isForce = false;
+//            }
+//            if (isInform == null){
+//                isInform = false;
+//            }
+//
+//            if (startDate == null){
+//                this.getView().showMessage("请选择开始日期!");
+//                return;
+//            }else if (endDate == null){
+//                this.getView().showMessage("请选择结束日期!");
+//                return;
+//            }
+//            initTable(isInform,isForce,startDate,endDate,likeName);
+        }
+        if ("refresh".equals(e.getOperateKey())){
+            this.getView().updateView();
+        }
+        if("individuation".equals(e.getOperateKey())) {
+            Donothing donothing = (Donothing) e.getSource();
+//            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            EntryGrid entryGrid = this.getControl("nckd_entryentity1");
+            int selectRows[] = entryGrid.getSelectRows();
+            String formID = donothing.getEntityId();
+
+            DynamicObjectCollection dynamicObjectCollection = new DynamicObjectCollection();
+
+            DynamicObjectCollection entity = this.getModel().getEntryEntity("nckd_entryentity1");
+            DynamicObject obj = null;
+
+            if (selectRows != null && selectRows.length > 0) {
+
+                obj = entity.get(selectRows[0]);  //获取选中行的单据体数据
+
+
+            }
+            boolean nckd_isdownloadable = obj.getBoolean("nckd_isdownloadable");
+
+            if (nckd_isdownloadable == true){
+                String number = obj.getString("nckd_number");
+                String name = obj.getString("nckd_name");
+                //下载附件
+                List<Object> attchIdSet = new ArrayList<>();
+            DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+            if (picCo != null && !picCo.isEmpty()) {
+                picCo.forEach(attach -> {
+                    attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                });
+                DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                Object url = sourceAttachments[0].get("url");
+                String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+                this.getView().openUrl(attachmentFullUrl);
+
+                //往下载记录表跟引用下载次数那个报表里面赋值
+                DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_download");
+                //获取要往下载记录里赋的值
+                newDangerRepository.set("billstatus","A");
+
+                newDangerRepository.set("creator",currentUserId);
+                newDangerRepository.set("nckd_downloadperson",currentUserId);
+
+                // 获取当前日期
+                Date date = new Date();
+                // 定义日期格式
+//                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//                    String date1 = dateFormat.format(date);
+                newDangerRepository.set("nckd_downloadtime",date);
+                newDangerRepository.set("nckd_yjname",name);
+                newDangerRepository.set("nckd_yjnumber",number);
+                SaveServiceHelper.saveOperate("nckd_download",new DynamicObject[]{newDangerRepository}, OperateOption.create());
+
+
+                //更新下载次数
+
+
+
+                QFilter qFilter=new QFilter("number",QCP.equals,number);
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist",new QFilter[]{qFilter});
+                int nckd_dlnum = dynamicObject.getInt("nckd_dlnum");
+                dynamicObject.set("nckd_dlnum",nckd_dlnum+1);
+                SaveServiceHelper.saveOperate("nckd_requisitionlist",new DynamicObject[]{dynamicObject}, OperateOption.create());
+            }
+        }
+        }
+
+        if("preview".equals(e.getOperateKey())){
+
+            Donothing donothing=(Donothing)e.getSource();
+//            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            EntryGrid entryGrid= this.getControl("nckd_entryentity1");
+            int selectRows[]=entryGrid.getSelectRows();
+            String formID = donothing.getEntityId();
+
+            //*****************
+
+
+
+            //********************
+
+            DynamicObjectCollection dynamicObjectCollection=new DynamicObjectCollection();
+
+            DynamicObjectCollection entity=this.getModel().getEntryEntity("nckd_entryentity1");
+            DynamicObject obj=null;
+
+            if(selectRows!=null && selectRows.length>0){
+
+                     obj=entity.get(selectRows[0]);  //获取选中行的单据体数据
+
+
+            }
+
+            String number = obj.getString("nckd_number");
+            String name = obj.getString("nckd_name");
+//            DynamicObject obj = BusinessDataServiceHelper.loadSingle(selectRows[0],formID);
+
+                //预览附件
+                List<Object> attchIdSet = new ArrayList<>();
+                DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach(attach -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+                    DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                    String url = sourceAttachments[0].getString("url");
+                    String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+                    String previewUrl = UrlService.getAttachmentPreviewUrl(url.toString());
+//                    String domainContextUrl = UrlService.getDomainContextUrl() + "/attachment/preview.do?path=";
+//                    String previewUrl=domainContextUrl + url;
+
+//                    List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments(formID, id, "nckd_attachmentfield", true);
+//                    this.getView().previewAttachment(attachments.get(0));
+
+
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("url",attachmentFullUrl );
+                    map.put("uid", sourceAttachments[0].getString("uid"));
+                    map.put("name", sourceAttachments[0].getString("name"));
+                    map.put("previewurl",previewUrl);
+                    map.put("size", sourceAttachments[0].getString("size"));
+                    map.put("status", "success");
+                    map.put("type", sourceAttachments[0].getString("type"));
+                    this.getView().previewAttachment(map);
+
+
+
+                    //往预览记录表里面赋值
+                    DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_preview");
+                    //获取要往预览记录里赋的值
+                    newDangerRepository.set("billstatus","A");
+
+                    newDangerRepository.set("creator",currentUserId);
+                    newDangerRepository.set("nckd_previewperson",currentUserId);
+
+                    // 获取当前日期
+                    Date date = new Date();
+                    // 定义日期格式
+//                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//                    String date1 = dateFormat.format(date);
+                    newDangerRepository.set("nckd_previewtime",date);
+                    newDangerRepository.set("nckd_yjname",name);
+                    newDangerRepository.set("nckd_yjnumber",number);
+                    newDangerRepository.set("nckd_previewperson",currentUserId);
+                    SaveServiceHelper.saveOperate("nckd_preview",new DynamicObject[]{newDangerRepository}, OperateOption.create());
+
+
+                    //更新预览次数
+                    QFilter qFilter=new QFilter("number",QCP.equals,number);
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist",new QFilter[]{qFilter});
+                    int nckd_previewnum = dynamicObject.getInt("nckd_previewnum");
+                    dynamicObject.set("nckd_previewnum",nckd_previewnum+1);
+                    SaveServiceHelper.saveOperate("nckd_requisitionlist",new DynamicObject[]{dynamicObject}, OperateOption.create());
+
+                }
+
+
+        }
+
+
+
+
+    }
+}

+ 270 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadFormPLugin.java

@@ -0,0 +1,270 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import com.bes.appserv.lic.e;
+import com.tongtech.jms.ra.util.Str;
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.TempFileCache;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.fileservice.BatchDownloadRequest;
+import kd.bos.fileservice.FileService;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.fileservice.extension.FileServiceExt;
+import kd.bos.fileservice.extension.FileServiceExtFactory;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.events.ClickListener;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.yjk.yj.plugin.docLibrary.utils.DownLoadUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * 单据界面插件
+ */
+public class BatchdownloadFormPLugin extends AbstractBillPlugIn implements Plugin, ClickListener {
+
+    private final static String KEY_OK = "btnok";
+    //页面取消按钮标识
+    private final static String KEY_CANCEL = "btncancel";
+    //页面取消按钮标识
+
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+        Map<String, Object> hashmap = this.getView().getFormShowParameter().getCustomParams();
+        List<Map<String, Object>> atts = AttachmentServiceHelper.getAttachments((String) hashmap.get("formId"), hashmap.get("id"), "nckd_attachmentpanel");
+
+
+        FileServiceExt fileServiceExt = FileServiceExtFactory.getAttachFileServiceExt();
+        fileServiceExt.getRealPath("encryptPath");
+
+
+        for (Map<String, Object> att : atts) {
+            String number = (String) att.get("uid");
+            QFilter qFilter = new QFilter("number", QCP.equals, number);
+            Boolean nckd_isdownloadable = null;
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", "id,nckd_isdownloadable", new QFilter[]{qFilter});
+
+            if (dynamicObject == null) {
+                nckd_isdownloadable = true;
+            }
+            if (dynamicObject != null) {
+                nckd_isdownloadable = dynamicObject.getBoolean("nckd_isdownloadable");
+            }
+
+
+
+            if (nckd_isdownloadable == true) {
+                int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity");
+                Integer a = 1;
+                this.getModel().setValue("nckd_name", att.get("name"), rowIndex);
+                this.getModel().setValue("nckd_url", fileServiceExt.getRealPath((String)att.get("relativeUrl")), rowIndex);
+                this.getModel().setValue("nckd_number", att.get("uid"), rowIndex);
+                this.getModel().setValue("nckd_isdownloadable", nckd_isdownloadable, rowIndex);
+                Integer b = 1;
+            }
+
+        }
+
+
+//        this.getView().openUrl((String)att.get("url"));
+
+
+    }
+
+
+    @Override
+    public void click(EventObject evt) {
+        super.click(evt);
+        //获取当前登录人
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        //获取主组织
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        //获取当前登录切换的组织
+        long orgId = RequestContext.get().getOrgId();
+
+
+        Control source = (Control) evt.getSource();
+        String sourceKey = source.getKey();
+
+
+        if (KEY_OK.equals(sourceKey)) {
+//            int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity1");
+            List<String> urls = new ArrayList<>();
+            EntryGrid treeEntryEntity = this.getControl("nckd_entryentity");
+            int[] rows = treeEntryEntity.getSelectRows();
+            List<DynamicObject> fujianobjects = new ArrayList<>();
+
+            for (int row : rows) {
+                DynamicObject selectedData = this.getModel().getEntryRowEntity("nckd_entryentity", row);
+                fujianobjects.add(selectedData);
+            }
+
+
+            this.getPageCache().put("ifContainTempfile", "false");
+            FileService fs = FileServiceFactory.getAttachmentFileService();
+            // 浏览器用户代理字符串,模拟浏览器userAgent访问
+            String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36";
+            // 获取附件面板的附件放在一个文件夹下
+            BatchDownloadRequest.Dir attpanelDir = this.createDirAndFileByAttPanel(fujianobjects);
+            // 构造BatchDownloadRequest对象
+            BatchDownloadRequest bdr = new BatchDownloadRequest("alldownload");
+            bdr.setDirs(new BatchDownloadRequest.Dir[] { attpanelDir});
+            /**
+             *BatchDownloadRequest对象的输出流
+             */
+            OutputStream out = null;
+            String url = "";
+            try {
+                // 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
+                File file = File.createTempFile("test", ".zip");
+                out = new FileOutputStream(file);
+                // 批量下载接口BatchDownloadRequest请求下载的地址必须是服务器中存在的地址
+                fs.batchDownload(bdr, out, userAgent);
+                // 临时文件地址
+                // String path = file.getPath();
+                // 上传为临时文件,主要作为this.getView().download提供下载地址
+                TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+                url = cache.saveAsUrl(file.getName(), new FileInputStream(file), 2 * 60);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            String ifContainTempfile = this.getPageCache().get("ifContainTempfile");
+            if (ifContainTempfile.equals("true")) {
+                this.getView().showMessage("有附件未保存,请先保存单据");
+            } else {
+                // 下载后文件的地址为浏览器的下载地址
+                this.getView().download(url);
+            }
+
+
+//            for (int row : rows) {
+//                DynamicObject selectedData = this.getModel().getEntryRowEntity("nckd_entryentity", row);
+//                Boolean nckd_isdownloadable = selectedData.getBoolean("nckd_isdownloadable");
+//                if (nckd_isdownloadable != null) {
+//
+//                    String url = (String) selectedData.get("nckd_url");
+//                    this.getView().openUrl(url);
+// //---------------------------------------------------------------------------------
+//                    try {
+//                        if (!StringUtils.isBlank(DownLoadUtil.getPathfromDownloadUrl(url))) {
+//                            urls.add(url);
+//                        }
+//                    } catch (IOException e) {
+//                        throw new RuntimeException(e);
+//                    }
+// //---------------------------------------------------------------------------------
+//
+//                    //先判断是引用按钮上传的还是手动上传的,去要件单里查id
+//                    String nckd_number = (String) selectedData.get("nckd_number");
+//                    QFilter qFilter1 = new QFilter("number", QCP.equals, nckd_number);
+//                    DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", new QFilter[]{qFilter1});
+//                    if (dynamicObject1 != null) {
+//                        //这里添加下载记录
+//                        //往下载记录表跟引用下载次数那个报表里面赋值
+//                        DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_download");
+//                        //获取要往下载记录里赋的值
+//                        newDangerRepository.set("billstatus", "A");
+//
+//                        newDangerRepository.set("creator", currentUserId);
+//                        newDangerRepository.set("nckd_downloadperson", currentUserId);
+//
+//                        // 获取当前日期
+//                        Date date = new Date();
+//                        // 定义日期格式
+////                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+////                    String date1 = dateFormat.format(date);
+//                        newDangerRepository.set("nckd_downloadtime", date);
+//                        newDangerRepository.set("nckd_yjname", dynamicObject1.getString("name"));
+//                        newDangerRepository.set("nckd_yjnumber", nckd_number);
+//                        SaveServiceHelper.saveOperate("nckd_download", new DynamicObject[]{newDangerRepository}, OperateOption.create());
+//
+//
+//                        //更新下载次数
+//                        QFilter qFilter = new QFilter("number", QCP.equals, nckd_number);
+////                        DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(dynamicObject1.getPkValue(),dynamicObject1.getDynamicObjectType().getName());
+//                        int nckd_dlnum = dynamicObject1.getInt("nckd_dlnum");
+//                        dynamicObject1.set("nckd_dlnum", nckd_dlnum + 1);
+//                        SaveServiceHelper.saveOperate("nckd_requisitionlist", new DynamicObject[]{dynamicObject1}, OperateOption.create());
+//                    }
+//
+//
+//                }
+//            }
+
+//---------------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------------
+
+                this.getView().close();
+            } else if (KEY_CANCEL.equals(sourceKey)) {
+                //被点击控件为取消则设置返回值为空并关闭页面(在页面关闭回调方法中必须验证返回值不为空,否则会报空指针)
+                this.getView().returnDataToParent(null);
+                this.getView().close();
+            } else {
+                this.getView().returnDataToParent(null);
+                this.getView().close();
+            }
+        }
+
+
+
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        this.addClickListeners(KEY_OK, KEY_CANCEL);
+    }
+
+
+
+    public BatchDownloadRequest.Dir createDirAndFileByAttPanel(List<DynamicObject> list) {
+        // 以附件面板标识命名文件夹
+        BatchDownloadRequest.Dir attpanelDir = new BatchDownloadRequest.Dir("文件夹");
+
+        ArrayList<BatchDownloadRequest.File> attpanelFile = new ArrayList<>();
+
+
+
+        for (DynamicObject dynamicObject : list) {
+
+            String path = dynamicObject.getString("nckd_url");
+            String name = dynamicObject.getString("nckd_name");
+            BatchDownloadRequest.File aFile = new BatchDownloadRequest.File(name, path);
+            attpanelFile.add(aFile);
+
+
+//            if (atturl.indexOf("path=") != -1) {
+//                String[] urlsplit = atturl.split("path=");
+//                String path = urlsplit[1];
+//                String name = dynamicObject.getString("nckd_name");
+//                BatchDownloadRequest.File aFile = new BatchDownloadRequest.File(name, path);
+//                attpanelFile.add(aFile);
+//            } else if (atturl.contains("/tempfile/download.do?configKey")) {
+//                this.getPageCache().put("ifContainTempfile", "true");
+//                break;
+//            }
+        }
+
+        BatchDownloadRequest.File[] files = attpanelFile.toArray(new BatchDownloadRequest.File[attpanelFile.size()]);
+        attpanelDir.setFiles(files);
+
+
+        return attpanelDir;
+    }
+}

+ 266 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadFormSecondPLugin.java

@@ -0,0 +1,266 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.TempFileCache;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.fileservice.BatchDownloadRequest;
+import kd.bos.fileservice.FileService;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.fileservice.extension.FileServiceExt;
+import kd.bos.fileservice.extension.FileServiceExtFactory;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.events.ClickListener;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.EventObject;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 单据界面插件
+ */
+public class BatchdownloadFormSecondPLugin extends AbstractBillPlugIn implements Plugin, ClickListener {
+
+    private final static String KEY_OK = "btnok";
+    //页面取消按钮标识
+    private final static String KEY_CANCEL = "btncancel";
+    //页面取消按钮标识
+
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+        Map<String, Object> hashmap = this.getView().getFormShowParameter().getCustomParams();
+        List<Map<String, Object>> atts = AttachmentServiceHelper.getAttachments((String) hashmap.get("formId"), hashmap.get("id"), "nckd_attachmentpanel");
+
+
+        FileServiceExt fileServiceExt = FileServiceExtFactory.getAttachFileServiceExt();
+        fileServiceExt.getRealPath("encryptPath");
+
+
+        for (Map<String, Object> att : atts) {
+            String number = (String) att.get("uid");
+            QFilter qFilter = new QFilter("number", QCP.equals, number);
+            Boolean nckd_isdownloadable = null;
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", "id,nckd_isdownloadable", new QFilter[]{qFilter});
+
+            if (dynamicObject == null) {
+                nckd_isdownloadable = true;
+            }
+            if (dynamicObject != null) {
+                nckd_isdownloadable = dynamicObject.getBoolean("nckd_isdownloadable");
+            }
+
+
+
+            if (nckd_isdownloadable == true) {
+                int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity");
+                Integer a = 1;
+                this.getModel().setValue("nckd_name", att.get("name"), rowIndex);
+                this.getModel().setValue("nckd_url", fileServiceExt.getRealPath((String)att.get("relativeUrl")), rowIndex);
+                this.getModel().setValue("nckd_number", att.get("uid"), rowIndex);
+                this.getModel().setValue("nckd_isdownloadable", nckd_isdownloadable, rowIndex);
+                Integer b = 1;
+            }
+
+        }
+
+
+//        this.getView().openUrl((String)att.get("url"));
+
+
+    }
+
+
+    @Override
+    public void click(EventObject evt) {
+        super.click(evt);
+        //获取当前登录人
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        //获取主组织
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        //获取当前登录切换的组织
+        long orgId = RequestContext.get().getOrgId();
+
+
+        Control source = (Control) evt.getSource();
+        String sourceKey = source.getKey();
+
+
+        if (KEY_OK.equals(sourceKey)) {
+//            int rowIndex = this.getModel().createNewEntryRow("nckd_entryentity1");
+            List<String> urls = new ArrayList<>();
+            EntryGrid treeEntryEntity = this.getControl("nckd_entryentity");
+            int[] rows = treeEntryEntity.getSelectRows();
+            List<DynamicObject> fujianobjects = new ArrayList<>();
+
+            for (int row : rows) {
+                DynamicObject selectedData = this.getModel().getEntryRowEntity("nckd_entryentity", row);
+                fujianobjects.add(selectedData);
+            }
+
+
+            this.getPageCache().put("ifContainTempfile", "false");
+            FileService fs = FileServiceFactory.getAttachmentFileService();
+            // 浏览器用户代理字符串,模拟浏览器userAgent访问
+            String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36";
+            // 获取附件面板的附件放在一个文件夹下
+            BatchDownloadRequest.Dir attpanelDir = this.createDirAndFileByAttPanel(fujianobjects);
+            // 构造BatchDownloadRequest对象
+            BatchDownloadRequest bdr = new BatchDownloadRequest("alldownload");
+            bdr.setDirs(new BatchDownloadRequest.Dir[] { attpanelDir});
+            /**
+             *BatchDownloadRequest对象的输出流
+             */
+            OutputStream out = null;
+            String url = "";
+            try {
+                // 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
+                File file = File.createTempFile("test", ".zip");
+                out = new FileOutputStream(file);
+                // 批量下载接口BatchDownloadRequest请求下载的地址必须是服务器中存在的地址
+                fs.batchDownload(bdr, out, userAgent);
+                // 临时文件地址
+                // String path = file.getPath();
+                // 上传为临时文件,主要作为this.getView().download提供下载地址
+                TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+                url = cache.saveAsUrl(file.getName(), new FileInputStream(file), 2 * 60);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            String ifContainTempfile = this.getPageCache().get("ifContainTempfile");
+            if (ifContainTempfile.equals("true")) {
+                this.getView().showMessage("有附件未保存,请先保存单据");
+            } else {
+                // 下载后文件的地址为浏览器的下载地址
+                this.getView().download(url);
+            }
+
+
+//            for (int row : rows) {
+//                DynamicObject selectedData = this.getModel().getEntryRowEntity("nckd_entryentity", row);
+//                Boolean nckd_isdownloadable = selectedData.getBoolean("nckd_isdownloadable");
+//                if (nckd_isdownloadable != null) {
+//
+//                    String url = (String) selectedData.get("nckd_url");
+//                    this.getView().openUrl(url);
+// //---------------------------------------------------------------------------------
+//                    try {
+//                        if (!StringUtils.isBlank(DownLoadUtil.getPathfromDownloadUrl(url))) {
+//                            urls.add(url);
+//                        }
+//                    } catch (IOException e) {
+//                        throw new RuntimeException(e);
+//                    }
+// //---------------------------------------------------------------------------------
+//
+//                    //先判断是引用按钮上传的还是手动上传的,去要件单里查id
+//                    String nckd_number = (String) selectedData.get("nckd_number");
+//                    QFilter qFilter1 = new QFilter("number", QCP.equals, nckd_number);
+//                    DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", new QFilter[]{qFilter1});
+//                    if (dynamicObject1 != null) {
+//                        //这里添加下载记录
+//                        //往下载记录表跟引用下载次数那个报表里面赋值
+//                        DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_download");
+//                        //获取要往下载记录里赋的值
+//                        newDangerRepository.set("billstatus", "A");
+//
+//                        newDangerRepository.set("creator", currentUserId);
+//                        newDangerRepository.set("nckd_downloadperson", currentUserId);
+//
+//                        // 获取当前日期
+//                        Date date = new Date();
+//                        // 定义日期格式
+////                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+////                    String date1 = dateFormat.format(date);
+//                        newDangerRepository.set("nckd_downloadtime", date);
+//                        newDangerRepository.set("nckd_yjname", dynamicObject1.getString("name"));
+//                        newDangerRepository.set("nckd_yjnumber", nckd_number);
+//                        SaveServiceHelper.saveOperate("nckd_download", new DynamicObject[]{newDangerRepository}, OperateOption.create());
+//
+//
+//                        //更新下载次数
+//                        QFilter qFilter = new QFilter("number", QCP.equals, nckd_number);
+////                        DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(dynamicObject1.getPkValue(),dynamicObject1.getDynamicObjectType().getName());
+//                        int nckd_dlnum = dynamicObject1.getInt("nckd_dlnum");
+//                        dynamicObject1.set("nckd_dlnum", nckd_dlnum + 1);
+//                        SaveServiceHelper.saveOperate("nckd_requisitionlist", new DynamicObject[]{dynamicObject1}, OperateOption.create());
+//                    }
+//
+//
+//                }
+//            }
+
+//---------------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------------
+
+                this.getView().close();
+            } else if (KEY_CANCEL.equals(sourceKey)) {
+                //被点击控件为取消则设置返回值为空并关闭页面(在页面关闭回调方法中必须验证返回值不为空,否则会报空指针)
+                this.getView().returnDataToParent(null);
+                this.getView().close();
+            } else {
+                this.getView().returnDataToParent(null);
+                this.getView().close();
+            }
+        }
+
+
+
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        this.addClickListeners(KEY_OK, KEY_CANCEL);
+    }
+
+
+
+    public BatchDownloadRequest.Dir createDirAndFileByAttPanel(List<DynamicObject> list) {
+        // 以附件面板标识命名文件夹
+        BatchDownloadRequest.Dir attpanelDir = new BatchDownloadRequest.Dir("文件夹");
+
+        ArrayList<BatchDownloadRequest.File> attpanelFile = new ArrayList<>();
+
+
+
+        for (DynamicObject dynamicObject : list) {
+
+            String path = dynamicObject.getString("nckd_url");
+            String name = dynamicObject.getString("nckd_name");
+            BatchDownloadRequest.File aFile = new BatchDownloadRequest.File(name, path);
+            attpanelFile.add(aFile);
+
+
+//            if (atturl.indexOf("path=") != -1) {
+//                String[] urlsplit = atturl.split("path=");
+//                String path = urlsplit[1];
+//                String name = dynamicObject.getString("nckd_name");
+//                BatchDownloadRequest.File aFile = new BatchDownloadRequest.File(name, path);
+//                attpanelFile.add(aFile);
+//            } else if (atturl.contains("/tempfile/download.do?configKey")) {
+//                this.getPageCache().put("ifContainTempfile", "true");
+//                break;
+//            }
+        }
+
+        BatchDownloadRequest.File[] files = attpanelFile.toArray(new BatchDownloadRequest.File[attpanelFile.size()]);
+        attpanelDir.setFiles(files);
+
+
+        return attpanelDir;
+    }
+}

+ 54 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadListPlugin.java

@@ -0,0 +1,54 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.operate.Donothing;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.ShowType;
+import kd.bos.form.control.events.ItemClickListener;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.list.AbstractList;
+import kd.bos.list.IListView;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 标准单据列表插件
+ */
+public class BatchdownloadListPlugin extends AbstractListPlugin implements Plugin, ItemClickListener {
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+        Integer b = 1;
+        if (args.getOperateKey().equals("batchdl")) {
+            Donothing donothing = (Donothing) args.getSource();
+            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            String formID = donothing.getEntityId();
+            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id, formID);
+
+
+
+            FormShowParameter showParameter = new FormShowParameter();
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("formId",obj.getDataEntityType().getName());
+            hashMap.put("id",obj.getPkValue());
+            showParameter.setCustomParams(hashMap);
+            showParameter.setFormId("nckd_batchdl");
+            showParameter.setCaption("文件下载");
+            showParameter.setCloseCallBack(new CloseCallBack(this, "officecount"));
+            showParameter.getOpenStyle().setShowType(ShowType.Modal);
+
+            this.getView().showForm(showParameter);
+
+        }
+    }
+}

+ 47 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/BatchdownloadListSecondPlugin.java

@@ -0,0 +1,47 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.operate.Donothing;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.ShowType;
+import kd.bos.form.control.events.ItemClickListener;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 标准单据列表插件
+ */
+public class BatchdownloadListSecondPlugin extends AbstractListPlugin implements Plugin, ItemClickListener {
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+        Integer b = 1;
+        if (args.getOperateKey().equals("batchdl")) {
+            Donothing donothing = (Donothing) args.getSource();
+            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            String formID = donothing.getEntityId();
+            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id, formID);
+
+
+
+            FormShowParameter showParameter = new FormShowParameter();
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("formId",obj.getDataEntityType().getName());
+            hashMap.put("id",obj.getPkValue());
+            showParameter.setCustomParams(hashMap);
+            showParameter.setFormId("nckd_batchdl2");
+            showParameter.setCaption("文件下载");
+            showParameter.setCloseCallBack(new CloseCallBack(this, "officecount"));
+            showParameter.getOpenStyle().setShowType(ShowType.Modal);
+
+            this.getView().showForm(showParameter);
+
+        }
+    }
+}

+ 518 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/CreateTreelistPlugin.java

@@ -0,0 +1,518 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.bill.BillShowParameter;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.operate.Donothing;
+import kd.bos.entity.tree.TreeNode;
+import kd.bos.form.ShowType;
+import kd.bos.form.control.TreeView;
+import kd.bos.form.control.events.RefreshNodeEvent;
+import kd.bos.form.control.events.TreeNodeClickListener;
+import kd.bos.form.control.events.TreeNodeEvent;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.BillList;
+import kd.bos.list.plugin.StandardTreeListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.bos.url.UrlService;
+import kd.sdk.plugin.Plugin;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 左树右表插件,附件下载预览
+ */
+public class CreateTreelistPlugin extends StandardTreeListPlugin implements Plugin, TreeNodeClickListener {
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+        TreeView tv1 = this.getView().getControl("treeview");
+        this.constructorData(tv1);
+    }
+    /**
+     * 构造数据
+     */
+    private void   constructorData(TreeView tv1) {
+        // final String   rootId = "0"; // 根节点id
+        // TreeNode   rootNode = new TreeNode(null, rootId, "根节点", true);
+        //   rootNode.setIsOpened(true); // 设置默认展开
+        TreeNode rootNode = this.getTreeModel().getRoot();
+        String   rootId = rootNode.getId();
+        // 查出分组数据
+        QFilter qFilter = new QFilter("name", QCP.not_equals, "知识库");
+
+        DynamicObjectCollection types =   QueryServiceHelper.query("nckd_classification", "id,name", new QFilter[]{qFilter});
+        // 查出渠道数据
+//        DynamicObjectCollection   channels =   QueryServiceHelper.query("kdec_channel", "Id,name,group.Id", null);
+        //按照分类分组
+//        Map<String, List<DynamicObject>> datatypeMap = channels.stream()
+//                .collect(Collectors.groupingBy(it -> it.getString("group.Id")));
+        for (DynamicObject type : types) {//构建树节点
+            // 构造一级子节点
+            String   typeId = type.getString("id");
+            TreeNode   tn1 = new TreeNode(rootId, typeId, type.getString("name"), true);
+            tn1.setIsOpened(true);
+            tn1.setColor("blue"); // 设置节点文字颜色
+            tn1.setIcon("kdfont kdfont-cangku3");
+//            List<DynamicObject> channelsByType = datatypeMap.get(type.getString("Id"));
+//            for (DynamicObject channel : channelsByType) {
+//                // 构造二级子节点
+//                String   channelId = channel.getString("Id");
+//                TreeNode   tn2 = new TreeNode(typeId, channelId, channel.getString("name"), false);
+//                tn1.addChild(tn2);
+//            }
+            rootNode.addChild(tn1);
+        }
+//         tv1.addNode(rootNode);
+        this.getTreeModel().setRoot(rootNode);//将树节点加到树模型
+        //   this.getTreeModel().getRoot().addChild(rootNode);
+    }
+
+
+    @Override
+    public void refreshNode(RefreshNodeEvent e) {
+        super.refreshNode(e);
+        // 取缓存的根节点
+        TreeNode root = this.getTreeModel().getRoot();
+        // 当前节点
+        String currNodeId = e.getNodeId().toString();
+        TreeNode currNode = root.getTreeNode(currNodeId, 10);
+        // 判断当前节点下,是否已经缓存了子节点:如果有,无需重复加载
+        if (currNode.getChildren() != null && !currNode.getChildren().isEmpty()) {
+            // 直接返回缓存的子节点
+            e.setChildNodes(currNode.getChildren());
+        } else {
+            // 没有缓存子节点
+            if (StringUtils.equals(currNodeId, root.getId())) {
+                // 当前要刷新的是根节点:读取全部 知识体系主数据, 生成节点返回
+                e.setChildNodes(null);
+            } else {
+                // 当前要刷新非根节点
+                // 如果采用了懒加载子节点方案,则需要在这里尝试加载子节点
+                e.setChildNodes(null);
+            }
+        }
+
+
+    }
+
+
+
+    @Override
+    public void   registerListener(EventObject e) {
+        super.registerListener(e);
+        TreeView   tv1 = this.getView().getControl("treeview");
+        tv1.addTreeNodeClickListener(this);
+
+
+
+    }
+
+    @Override
+    public void   treeNodeClick(TreeNodeEvent e) {
+        super.treeNodeClick(e);
+        BillList billList = this.getControl("billlistap");
+        billList.refresh();
+    }
+    @Override
+    public void   setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+        String   nodeId = this.getTreeModel().getCurrentNodeId().toString();
+
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        long orgId = RequestContext.get().getOrgId();
+
+
+
+
+
+
+//*******************************************************************************************************************
+        QFilter qFiltercommonuser=new QFilter("nckd_userfield.id",QCP.equals,currentUserId);
+        DynamicObject dynamicObjectcommonuser = BusinessDataServiceHelper.loadSingle("nckd_commonuser", new QFilter[]{qFiltercommonuser});
+        if(dynamicObjectcommonuser!=null){
+            DynamicObject nckd_orgbase = dynamicObjectcommonuser.getDynamicObject("nckd_orgbase");
+            long orgbaseid=nckd_orgbase.getLong("id");
+            e.getQFilters().add(new QFilter("nckd_orgbase.id",QCP.equals,orgbaseid));
+        }
+        else{
+            QFilter qFilteruser=new QFilter("creator.id",QCP.equals,currentUserId);
+            QFilter qFiltershare1=new QFilter("nckd_isshared",QCP.equals,true);
+            QFilter qFiltershare2=new QFilter("nckd_orgbase.id",QCP.equals,userMainOrgId);
+            QFilter qFiltershare=qFiltershare1.and(qFiltershare2);
+            e.getQFilters().add(qFilteruser.or(qFiltershare));
+//            e.getQFilters().add(new QFilter("creator.id",QCP.equals,currentUserId));
+        }
+
+
+
+//*******************************************************************************************************************
+
+
+
+        if (this.getTreeModel().getRoot().getId().equals(nodeId)) {
+            e.getQFilters().add(new QFilter("nckd_yjclass.name", QCP.not_equals, "知识库"));
+            return;
+        }
+        Long nodeId1=Long.parseLong(nodeId);
+        e.getQFilters().add(new QFilter("nckd_yjclass.id", QCP.equals, nodeId1));
+        e.getQFilters().add(new QFilter("nckd_yjclass.name", QCP.not_equals, "知识库"));
+
+
+
+//        e.addCustomQFilter();
+
+    }
+
+
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+
+        Integer b=1;
+
+        if(args.getOperateKey().equals("newyj")){
+            BillShowParameter billShowParameter = new BillShowParameter();
+            billShowParameter.setFormId("nckd_application_form");
+            billShowParameter.setCaption("要件列表");
+            billShowParameter.getOpenStyle().setShowType(ShowType.Modal);
+            this.getView().showForm(billShowParameter);
+        }
+
+
+        if(args.getOperateKey().equals("batchdownload")){
+
+            if(true){
+
+            }
+
+
+            Donothing donothing=(Donothing)args.getSource();
+            ListSelectedRowCollection selectedRows = this.getSelectedRows();
+//            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            String formID = donothing.getEntityId();
+
+
+            for (ListSelectedRow selectedRow : selectedRows) {
+
+            Long id = (Long)selectedRow.getPrimaryKeyValue();
+
+            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id,formID);
+
+            boolean nckd_isdownloadable = obj.getBoolean("nckd_isdownloadable");
+                String number = obj.getString("number");
+                String name = obj.getString("name");
+
+
+
+                if(nckd_isdownloadable==true) {
+
+
+//                    Object nckd_yjclass = obj.getDynamicObject("nckd_yjclass").getLong("id");
+//
+//                    QFilter qFilter99=new QFilter("id", QCP.equals,nckd_yjclass);
+//                    DynamicObject dynamicObject98 = BusinessDataServiceHelper.loadSingle("nckd_classification", new QFilter[]{qFilter99});
+//                    String name1=dynamicObject98.getLocaleString("name").getLocaleValue();
+//
+//
+//
+//
+
+
+                //下载附件
+                List<Object> attchIdSet = new ArrayList<>();
+                DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+
+
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach(attach -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+                    DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                    Object url = sourceAttachments[0].get("url");
+                    String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+                    this.getView().openUrl(attachmentFullUrl);
+//                FileServiceFactory.getAttachmentFileService().preview();
+
+                    DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_download");
+                    //获取要往下载记录里赋的值
+                    newDangerRepository.set("billstatus","A");
+
+                    long currentUserId = UserServiceHelper.getCurrentUserId();
+                    newDangerRepository.set("creator",currentUserId);
+                    newDangerRepository.set("nckd_downloadperson",currentUserId);
+
+                    // 获取当前日期
+                    Date date = new Date();
+                    // 定义日期格式
+//                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//                    String date1 = dateFormat.format(date);
+                    newDangerRepository.set("nckd_downloadtime",date);
+                    newDangerRepository.set("nckd_yjname",name);
+                    newDangerRepository.set("nckd_yjnumber",number);
+                    SaveServiceHelper.saveOperate("nckd_download",new DynamicObject[]{newDangerRepository},OperateOption.create());
+
+
+                    //更新下载次数
+                    QFilter qFilter=new QFilter("number",QCP.equals,number);
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(obj.getPkValue(),obj.getDynamicObjectType().getName());
+                    int nckd_dlnum = dynamicObject.getInt("nckd_dlnum");
+                    dynamicObject.set("nckd_dlnum",nckd_dlnum+1);
+                    SaveServiceHelper.saveOperate("nckd_requisitionlist",new DynamicObject[]{dynamicObject}, OperateOption.create());
+
+
+                }
+            }
+        }
+
+        }
+
+
+
+
+
+
+
+        //预览==============================================
+        if(args.getOperateKey().equals("preview")){
+            Donothing donothing=(Donothing)args.getSource();
+            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            String formID = donothing.getEntityId();
+            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id,formID);
+            String number = obj.getString("number");
+            String name = obj.getString("name");
+
+                //下载附件
+                List<Object> attchIdSet = new ArrayList<>();
+                DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach(attach -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+                    DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                    String url = sourceAttachments[0].getString("url");
+                    String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+                    String previewUrl = UrlService.getAttachmentPreviewUrl(url.toString());
+//                    String domainContextUrl = UrlService.getDomainContextUrl() + "/attachment/preview.do?path=";
+//                    String previewUrl=domainContextUrl + url;
+
+//                    List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments(formID, id, "nckd_attachmentfield", true);
+//                    this.getView().previewAttachment(attachments.get(0));
+
+
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("url",attachmentFullUrl );
+                    map.put("uid", sourceAttachments[0].getString("uid"));
+                    map.put("name", sourceAttachments[0].getString("name"));
+                    map.put("previewurl",previewUrl);
+                    map.put("size", sourceAttachments[0].getString("size"));
+                    map.put("status", "success");
+                    map.put("type", sourceAttachments[0].getString("type"));
+                    this.getView().previewAttachment(map);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//                    String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+//                    String domainContextUrl = UrlService.getDomainContextUrl() + "/attachment/preview.do?path=";
+//                    this.getView().openUrl(domainContextUrl + url);
+ //                    String previewUrl=UrlService.getAttachmentPreviewUrl(url);
+//                    this.getView().openUrl(previewUrl);
+//                    UrlService.getAttachmentDownloadUrl("url");
+
+                    //往预览记录表里面赋值
+                    DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_preview");
+                    //获取要往预览记录里赋的值
+                    newDangerRepository.set("billstatus","A");
+
+                    long currentUserId = UserServiceHelper.getCurrentUserId();
+                    newDangerRepository.set("creator",currentUserId);
+                    newDangerRepository.set("nckd_previewperson",currentUserId);
+
+                    // 获取当前日期
+                    Date date = new Date();
+                    // 定义日期格式
+//                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//                    String date1 = dateFormat.format(date);
+                    newDangerRepository.set("nckd_previewtime",date);
+                    newDangerRepository.set("nckd_yjname",name);
+                    newDangerRepository.set("nckd_yjnumber",number);
+                    SaveServiceHelper.saveOperate("nckd_preview",new DynamicObject[]{newDangerRepository}, OperateOption.create());
+
+
+                    //更新预览次数
+                    QFilter qFilter=new QFilter("number",QCP.equals,number);
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(obj.getPkValue(),obj.getDynamicObjectType().getName());
+                    int nckd_previewnum = dynamicObject.getInt("nckd_previewnum");
+                    dynamicObject.set("nckd_previewnum",nckd_previewnum+1);
+                    SaveServiceHelper.saveOperate("nckd_requisitionlist",new DynamicObject[]{dynamicObject}, OperateOption.create());
+
+
+
+                }
+
+
+
+                }
+
+
+        if (args.getOperateKey().equals("download")) {
+            Donothing donothing = (Donothing)args.getSource();
+            Long id = (Long)donothing.getListFocusRow().getPrimaryKeyValue();
+            String formID = donothing.getEntityId();
+            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id, formID);
+
+            //获取一下创建人
+            long userid=UserServiceHelper.getCurrentUserId();
+            long creator = obj.getDynamicObject("creator").getLong("id");
+
+
+//            if(userid==creator||){
+//
+//            }
+
+            boolean nckd_isdownloadable = obj.getBoolean("nckd_isdownloadable");
+
+            if (nckd_isdownloadable) {
+                String number = obj.getString("number");
+                String name = obj.getString("name");
+
+                List<Object> attchIdSet = new ArrayList();
+                DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach((attach) -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+                    DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+                    Object url = sourceAttachments[0].get("url");
+                    String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+                    this.getView().openUrl(attachmentFullUrl);
+
+
+                    //往下载记录表跟引用下载次数那个报表里面赋值
+                    DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_download");
+                    //获取要往下载记录里赋的值
+                    newDangerRepository.set("billstatus","A");
+
+                    long currentUserId = UserServiceHelper.getCurrentUserId();
+                    newDangerRepository.set("creator",currentUserId);
+                    newDangerRepository.set("nckd_downloadperson",currentUserId);
+
+                    // 获取当前日期
+                    Date date = new Date();
+                    // 定义日期格式
+//                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//                    String date1 = dateFormat.format(date);
+                    newDangerRepository.set("nckd_downloadtime",date);
+                    newDangerRepository.set("nckd_yjname",name);
+                    newDangerRepository.set("nckd_yjnumber",number);
+                    SaveServiceHelper.saveOperate("nckd_download",new DynamicObject[]{newDangerRepository},OperateOption.create());
+
+
+                    //更新下载次数
+                    QFilter qFilter=new QFilter("number",QCP.equals,number);
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(obj.getPkValue(),obj.getDynamicObjectType().getName());
+                    int nckd_dlnum = dynamicObject.getInt("nckd_dlnum");
+                    dynamicObject.set("nckd_dlnum",nckd_dlnum+1);
+                    SaveServiceHelper.saveOperate("nckd_requisitionlist",new DynamicObject[]{dynamicObject}, OperateOption.create());
+
+                }
+            }
+        }
+
+
+
+//        if(args.getOperateKey().equals("preview")){
+//
+//
+//            Donothing donothing=(Donothing)args.getSource();
+//            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+//            String formID = donothing.getEntityId();
+//            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id,formID);
+//
+//            //下载附件
+//            List<Object> attchIdSet = new ArrayList<>();
+//            DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+//            if (picCo != null && !picCo.isEmpty()) {
+//                picCo.forEach(attach -> {
+//                    attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+//                });
+//                DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+//
+//                String url = sourceAttachments[0].getString("url");
+//
+////                String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+//
+//                String domainContextUrl = UrlService.getDomainContextUrl() + "/attachment/preview.do?path=";
+//                this.getView().openUrl(domainContextUrl + url);
+//
+////                Map<String, Object> map=new HashMap<>();
+////                map.put("previewurl",sourceAttachments[0].get("previewurl"));
+//
+//
+////                this.getView().openUrl(attachmentFullUrl);
+////                FileServiceFactory.getAttachmentFileService().preview();
+//
+//                //论坛提供的方法
+////            List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments(formID,id, "individuation");
+////            Map<String, Object> stringObjectMap = attachments.get(0);
+////            Object url = stringObjectMap.get("url");
+////            String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+////            this.getView().openUrl(attachmentFullUrl);
+//
+//
+////            //附件预览参数构建
+////            Map<String, Object> map = new HashMap<>();
+////
+////            this.getView().previewAttachment(stringObjectMap);
+//
+//
+////            FileServiceFactory.getAttachmentFileService().preview();
+//            }
+//
+//
+//        }
+
+
+        };
+
+
+}
+
+
+

+ 110 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/DocF7SelectPlugin.java

@@ -0,0 +1,110 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.ArrayList;
+import java.util.EventObject;
+import java.util.List;
+
+public class DocF7SelectPlugin extends AbstractFormPlugin implements Plugin,BeforeF7SelectListener {
+
+    /**
+     * 要件单F7列表过滤
+     */
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent arg0) {
+        //获取当前登录人
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        //获取主组织
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        //获取当前登录切换的组织
+        long orgId = RequestContext.get().getOrgId();
+
+//        DynamicObject[] yaojiandanlist = BusinessDataServiceHelper.load("nckd_requirements","id,billno",null);
+//
+//
+//        for (int i = 0; i < yaojiandanlist.length; i++) {
+//            DynamicObject info = BusinessDataServiceHelper.loadSingle(yaojiandanlist[i].getPkValue(),yaojiandanlist[i].getDynamicObjectType().getName());
+//            info.getBoolean("nckd_isrepeatcite");
+//            info.getBoolean("nckd_iscitebynotupload");
+//            info.getBoolean("nckd_iscross");
+//            info.getBoolean("nckd_isdownloadable");
+//            info.getBoolean("nckd_isreferenceable");
+//        }
+
+        //获取属性值
+        String fieldKey = arg0.getProperty().getName();
+
+        if (StringUtils.equals(fieldKey, "nckd_requirements")){
+            List<QFilter> qFilters=new ArrayList<>();
+            Integer a=1;
+//            *********************************
+            QFilter qFilter=new QFilter("enable", QCP.equals,"1");
+            QFilter qFilter1=new QFilter("nckd_isreferenceable", QCP.equals,true);
+            qFilters.add(qFilter1);
+
+//             //*********************************
+            QFilter qFilter21   =new QFilter("nckd_isrepeatcite", QCP.equals,true);
+
+            QFilter qFilter22   =new QFilter("nckd_isrepeatcite", QCP.equals,false);
+            List<String> arrayList = new ArrayList<>();
+            DynamicObject[] load = BusinessDataServiceHelper.load("nckd_yinyongbiao", "nckd_elecoding", null);
+            for (int i = 0; i < load.length; i++) {
+                arrayList.add( load[i].get("nckd_elecoding").toString());
+            }
+
+            QFilter qFilter23   =new QFilter("number", QCP.not_in,arrayList);
+
+            QFilter qFilter2=qFilter21.or(qFilter22.and(qFilter23));
+            qFilters.add(qFilter21);
+
+            //***********************
+            QFilter qFilter31   =new QFilter("nckd_iscitebynotupload", QCP.equals,true);
+            QFilter qFilter32   =new QFilter("nckd_iscitebynotupload", QCP.equals,false);
+
+            QFilter qFilter33   =new QFilter("creator", QCP.equals,currentUserId);
+            QFilter qFilter3=qFilter31.or(qFilter32.and(qFilter33));
+            qFilters.add(qFilter3);
+
+
+            //***********************
+            QFilter qFilter41   =new QFilter("nckd_iscross", QCP.equals,true);
+            QFilter qFilter42   =new QFilter("nckd_iscross", QCP.equals,false);
+
+            QFilter qFilter43   =new QFilter("createorg", QCP.equals,orgId);
+//            DynamicObject[] load = BusinessDataServiceHelper.load("nckd_requirements", "nckd_elecoding", null);
+
+            QFilter qFilter4=qFilter41.or(qFilter42.and(qFilter43));
+            qFilters.add(qFilter4);
+
+            DynamicObject[] load1 = BusinessDataServiceHelper.load("nckd_requisitionlist", "name", new QFilter[]{qFilter4});
+            for (int i = 0; i < load1.length; i++) {
+                String name = load1[i].getString("name");
+            }
+
+            arg0.setCustomQFilters(qFilters);
+
+
+        }
+    }
+
+
+    @Override
+    public void   registerListener(EventObject e) {
+        super.registerListener(e);
+        BasedataEdit fieldEdit = this.getView().getControl("nckd_requirements");
+        fieldEdit.addBeforeF7SelectListener(this);
+    }
+}

+ 96 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/GetfileNamePlugin.java

@@ -0,0 +1,96 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.*;
+/**
+ * 获取附件信息
+ */
+public class GetfileNamePlugin extends AbstractBillPlugIn implements Plugin, BeforeF7SelectListener {
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        Integer b=1;
+        super.propertyChanged(e);
+        if (e.getProperty().getName().equals("nckd_attachmentfield")) {
+            List<Object> attchIdSet = new ArrayList<>();
+            DynamicObjectCollection picco = (DynamicObjectCollection) this.getModel().getValue("nckd_attachmentfield");
+            if (picco != null && !picco.isEmpty()) {
+                picco.forEach(attach -> {
+                    attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                });
+                DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+                for (int i = 0; i < sourceAttachments.length; i++) {
+                    String name = sourceAttachments[0].getString("name");
+                    String type = sourceAttachments[0].getString("type");
+                    String size= sourceAttachments[0].getString("size");
+                    int num = this.getModel().getEntryCurrentRowIndex("entryentity");
+
+                    name=name.substring(0,name.indexOf("."));
+                    this.getModel().setValue("nckd_attname",name,num);
+                    this.getModel().setValue("nckd_atttype",type,num);
+                    this.getModel().setValue("nckd_attsize",size,num);
+                    Integer d=1;
+
+                }
+            }
+        }
+    }
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+        //获取当前登录人
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        //获取主组织
+        long userMainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId);
+        //获取当前登录切换的组织
+        long orgId = RequestContext.get().getOrgId();
+        this.getModel().setValue("nckd_orgbase",userMainOrgId);
+        this.getModel().setValue("nckd_orgfield1",orgId);
+        Integer a=1;
+    }
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
+        //获取属性值
+        String fieldKey = beforeF7SelectEvent.getProperty().getName();
+        if (StringUtils.equals(fieldKey, "nckd_yjclass")) {
+
+            QFilter qFilter = new QFilter("name", QCP.not_equals, "OA公文");
+            List<QFilter> qFilters = new ArrayList<>();
+            qFilters.add(qFilter);
+            beforeF7SelectEvent.setCustomQFilters(qFilters);
+        }
+    }
+
+
+
+    @Override
+    public void   registerListener(EventObject e) {
+        super.registerListener(e);
+        BasedataEdit fieldEdit = this.getView().getControl("nckd_yjclass");
+        fieldEdit.addBeforeF7SelectListener(this);
+    }
+//    @Override
+//    public void afterBindData(EventObject e) {
+//        super.beforeBindData(e);
+//        Map<String,Object> map = new HashMap();
+//        map.put("maxatmcount",1);
+//        this.getView().updateControlMetadata("dmp_attachmentpanelap",map);
+//    }
+}
+

+ 140 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/KnowledgePlugin.java

@@ -0,0 +1,140 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.operate.Donothing;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.url.UrlService;
+import kd.sdk.plugin.Plugin;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 知识库列表过滤
+ */
+public class KnowledgePlugin extends AbstractListPlugin implements Plugin {
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+        String name="知识库";
+        try {
+            e.getQFilters().add(new QFilter("nckd_yjclass.name", QCP.equals,name));
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+
+        Integer b=1;
+
+        if(args.getOperateKey().equals("individuation")){
+            Donothing donothing=(Donothing)args.getSource();
+            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            String formID = donothing.getEntityId();
+            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id,formID);
+            boolean nckd_isdownloadable = obj.getBoolean("nckd_isdownloadable");
+            if(nckd_isdownloadable==true) {
+                //下载附件
+                List<Object> attchIdSet = new ArrayList<>();
+                DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach(attach -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+                    DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                    Object url = sourceAttachments[0].get("url");
+                    String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+                    this.getView().openUrl(attachmentFullUrl);
+//                FileServiceFactory.getAttachmentFileService().preview();
+                }
+            }
+
+            //论坛提供的方法
+//            List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments(formID,id, "individuation");
+//            Map<String, Object> stringObjectMap = attachments.get(0);
+//            Object url = stringObjectMap.get("url");
+//            String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+//            this.getView().openUrl(attachmentFullUrl);
+
+
+//            //附件预览参数构建
+//            Map<String, Object> map = new HashMap<>();
+//
+//            this.getView().previewAttachment(stringObjectMap);
+
+
+
+//            FileServiceFactory.getAttachmentFileService().preview();
+        }
+
+
+
+
+
+        if(args.getOperateKey().equals("preview")){
+
+
+            Donothing donothing=(Donothing)args.getSource();
+            Long id = (Long) donothing.getListFocusRow().getPrimaryKeyValue();
+            String formID = donothing.getEntityId();
+            DynamicObject obj = BusinessDataServiceHelper.loadSingle(id,formID);
+
+
+
+                //下载附件
+                List<Object> attchIdSet = new ArrayList<>();
+                DynamicObjectCollection picCo = obj.getDynamicObjectCollection("nckd_attachmentfield");
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach(attach -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+                    DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                    String url = sourceAttachments[0].getString("url");
+
+//                String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+
+                    String domainContextUrl = UrlService.getDomainContextUrl() + "/attachment/preview.do?path=";
+                    this.getView().openUrl(domainContextUrl + url);
+
+//                Map<String, Object> map=new HashMap<>();
+//                map.put("previewurl",sourceAttachments[0].get("previewurl"));
+
+
+//                this.getView().openUrl(attachmentFullUrl);
+//                FileServiceFactory.getAttachmentFileService().preview();
+
+                    //论坛提供的方法
+//            List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments(formID,id, "individuation");
+//            Map<String, Object> stringObjectMap = attachments.get(0);
+//            Object url = stringObjectMap.get("url");
+//            String attachmentFullUrl = UrlService.getAttachmentFullUrl(url.toString());
+//            this.getView().openUrl(attachmentFullUrl);
+
+
+//            //附件预览参数构建
+//            Map<String, Object> map = new HashMap<>();
+//
+//            this.getView().previewAttachment(stringObjectMap);
+
+
+//            FileServiceFactory.getAttachmentFileService().preview();
+                }
+
+
+        }
+
+
+    };
+}

+ 25 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ReportFormdlPlugin.java

@@ -0,0 +1,25 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.report.plugin.AbstractReportFormPlugin;
+import kd.sdk.plugin.Plugin;
+
+import java.util.List;
+
+/**
+ * 报表界面插件
+ */
+public class ReportFormdlPlugin extends AbstractReportFormPlugin implements Plugin {
+    @Override
+    public void setMergeColums(List<String> columns) {
+        super.setMergeColums(columns);
+        columns.add("nckd_yjname");
+        columns.add("nckd_yjnumber");
+//        columns.add("nckd_yynum");
+        columns.add("nckd_dlnum");
+//        columns.add("nckd_appname");
+//        columns.add("nckd_appcoding");
+        columns.add("nckd_downloadtime");
+        columns.add("nckd_downloadperson");
+
+    }
+}

+ 22 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ReportFormpreviewPlugin.java

@@ -0,0 +1,22 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.report.plugin.AbstractReportFormPlugin;
+import kd.sdk.plugin.Plugin;
+
+import java.util.List;
+
+/**
+ * 报表界面插件
+ */
+public class ReportFormpreviewPlugin extends AbstractReportFormPlugin implements Plugin {
+    @Override
+    public void setMergeColums(List<String> columns) {
+        super.setMergeColums(columns);
+        columns.add("nckd_yjname");
+        columns.add("nckd_yjnumber");
+        columns.add("nckd_previewnum");
+        columns.add("nckd_previewperson");
+
+
+    }
+}

+ 25 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/form/ReportFormyyPlugin.java

@@ -0,0 +1,25 @@
+package nckd.yjk.yj.plugin.docLibrary.form;
+
+import kd.bos.report.plugin.AbstractReportFormPlugin;
+import kd.sdk.plugin.Plugin;
+
+import java.util.List;
+
+/**
+ * 报表界面插件
+ */
+public class ReportFormyyPlugin extends AbstractReportFormPlugin implements Plugin {
+    @Override
+    public void setMergeColums(List<String> columns) {
+        super.setMergeColums(columns);
+        columns.add("nckd_yjname");
+        columns.add("nckd_yjnumber");
+        columns.add("nckd_yynum");
+//        columns.add("nckd_dlnum");
+        columns.add("nckd_appname");
+        columns.add("nckd_appcoding");
+//        columns.add("nckd_downloadtime");
+//        columns.add("nckd_downloadperson");
+
+    }
+}

+ 99 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/CreateInterPlugin.java

@@ -0,0 +1,99 @@
+package nckd.yjk.yj.plugin.docLibrary.operate;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.operate.Donothing;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.DeleteServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 生成中间单
+ */
+public class CreateInterPlugin extends AbstractOperationServicePlugIn implements Plugin {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        // 获取当前日期
+        Date date = new Date();
+
+
+
+
+        super.beginOperationTransaction(e);
+        DynamicObject[] dynamicObjects=e.getDataEntities();
+        String FormId=dynamicObjects[0].getDataEntityType().getName();
+        Integer a=1;
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            String nckd_appcoding = dynamicObjects[i].getString("billno");
+            QFilter qFilter=new QFilter("nckd_appcoding", QCP.equals,nckd_appcoding);
+            DeleteServiceHelper.delete("nckd_yinyongbiao", new QFilter[]{qFilter});
+            //获取单据中附件面板信息
+            List<Map<String, Object>> atts = AttachmentServiceHelper.getAttachments(dynamicObjects[i].getDataEntityType().getName(),dynamicObjects[i].getPkValue(), "attachmentpanel");
+            //遍历文件
+            for (Map<String, Object>  att: atts) {
+                String uid = (String) att.get("uid");
+                String url = (String) att.get("url");
+                String number = (String) att.get("uid");
+
+                QFilter qFilter1 = new QFilter("number", QCP.equals, number);
+                DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", "id", new QFilter[]{qFilter1});
+                if (dynamicObject1!=null) {
+
+
+                    String name = (String) att.get("name");
+//            String name = dynamicObjects[i].getDynamicObject("nckd_requirements").getString("name");
+                    LocaleString localeString = new LocaleString();
+                    localeString.setLocaleValue_zh_CN(name);
+
+//            Long nckd_elecoding=(Long)att.get("attPkId");
+//            String nckd_elecoding = dynamicObjects[i].getDynamicObject("nckd_requirements").getString("number");
+
+
+                    DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_yinyongbiao");
+                    long currentUserId = UserServiceHelper.getCurrentUserId();
+
+                    newDangerRepository.set("billstatus", "A");
+                    newDangerRepository.set("creator", currentUserId);
+                    newDangerRepository.set("nckd_elecoding", number);
+                    newDangerRepository.set("nckd_appcoding", nckd_appcoding);
+                    newDangerRepository.set("nckd_textname", name);
+                    newDangerRepository.set("nckd_appname", FormId);
+                    newDangerRepository.set("nckd_appname", FormId);
+                    newDangerRepository.set("nckd_yinyongperson", currentUserId);
+                    newDangerRepository.set("nckd_yinyongdate", date);
+
+                    QFilter qFilter369 = new QFilter("number", QCP.equals, number);
+                    //更新引用次数
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", new QFilter[]{qFilter369});
+                    int nckd_yynum = dynamicObject.getInt("nckd_yynum");
+                    dynamicObject.set("nckd_yynum", nckd_yynum + 1);
+                    SaveServiceHelper.saveOperate("nckd_requisitionlist", new DynamicObject[]{dynamicObject}, OperateOption.create());
+
+
+                    try {
+                        OperationResult repositoryResult = OperationServiceHelper.executeOperate("save", "nckd_yinyongbiao",
+                                new DynamicObject[]{newDangerRepository}, OperateOption.create());
+                    } catch (Exception ex) {
+                        throw new RuntimeException(ex);
+                    }
+
+                }
+            }
+
+        }
+    }
+}

+ 98 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/CreateInterSecondPlugin.java

@@ -0,0 +1,98 @@
+package nckd.yjk.yj.plugin.docLibrary.operate;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.DeleteServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 生成中间单
+ */
+public class CreateInterSecondPlugin extends AbstractOperationServicePlugIn implements Plugin {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        // 获取当前日期
+        Date date = new Date();
+
+
+
+
+        super.beginOperationTransaction(e);
+        DynamicObject[] dynamicObjects=e.getDataEntities();
+        String FormId=dynamicObjects[0].getDataEntityType().getName();
+        Integer a=1;
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            String nckd_appcoding = dynamicObjects[i].getString("billno");
+            QFilter qFilter=new QFilter("nckd_appcoding", QCP.equals,nckd_appcoding);
+            DeleteServiceHelper.delete("nckd_yinyongbiao", new QFilter[]{qFilter});
+            //获取单据中附件面板信息
+            List<Map<String, Object>> atts = AttachmentServiceHelper.getAttachments(dynamicObjects[i].getDataEntityType().getName(),dynamicObjects[i].getPkValue(), "nckd_attachmentpanel");
+            //遍历文件
+            for (Map<String, Object>  att: atts) {
+                String uid = (String) att.get("uid");
+                String url = (String) att.get("url");
+                String number = (String) att.get("uid");
+
+                QFilter qFilter1 = new QFilter("number", QCP.equals, number);
+                DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", "id", new QFilter[]{qFilter1});
+                if (dynamicObject1!=null) {
+
+
+                    String name = (String) att.get("name");
+//            String name = dynamicObjects[i].getDynamicObject("nckd_requirements").getString("name");
+                    LocaleString localeString = new LocaleString();
+                    localeString.setLocaleValue_zh_CN(name);
+
+//            Long nckd_elecoding=(Long)att.get("attPkId");
+//            String nckd_elecoding = dynamicObjects[i].getDynamicObject("nckd_requirements").getString("number");
+
+
+                    DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_yinyongbiao");
+                    long currentUserId = UserServiceHelper.getCurrentUserId();
+
+                    newDangerRepository.set("billstatus", "A");
+                    newDangerRepository.set("creator", currentUserId);
+                    newDangerRepository.set("nckd_elecoding", number);
+                    newDangerRepository.set("nckd_appcoding", nckd_appcoding);
+                    newDangerRepository.set("nckd_textname", name);
+                    newDangerRepository.set("nckd_appname", FormId);
+                    newDangerRepository.set("nckd_appname", FormId);
+                    newDangerRepository.set("nckd_yinyongperson", currentUserId);
+                    newDangerRepository.set("nckd_yinyongdate", date);
+
+                    QFilter qFilter369 = new QFilter("number", QCP.equals, number);
+                    //更新引用次数
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", new QFilter[]{qFilter369});
+                    int nckd_yynum = dynamicObject.getInt("nckd_yynum");
+                    dynamicObject.set("nckd_yynum", nckd_yynum + 1);
+                    SaveServiceHelper.saveOperate("nckd_requisitionlist", new DynamicObject[]{dynamicObject}, OperateOption.create());
+
+
+                    try {
+                        OperationResult repositoryResult = OperationServiceHelper.executeOperate("save", "nckd_yinyongbiao",
+                                new DynamicObject[]{newDangerRepository}, OperateOption.create());
+                    } catch (Exception ex) {
+                        throw new RuntimeException(ex);
+                    }
+
+                }
+            }
+
+        }
+    }
+}

+ 55 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/DeleteInterPlugin.java

@@ -0,0 +1,55 @@
+package nckd.yjk.yj.plugin.docLibrary.operate;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.DeleteServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 删除中间单
+ */
+public class DeleteInterPlugin extends AbstractOperationServicePlugIn implements Plugin {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+        DynamicObject[] dynamicObjects=e.getDataEntities();
+        Integer a=1;
+        for (int i = 0; i < dynamicObjects.length; i++) {
+
+           //nckd_appcoding 是引用要件单的单据编号
+            String nckd_appcoding = dynamicObjects[i].getString("billno");
+            QFilter qFilter1 = new QFilter("nckd_appcoding", QCP.equals, nckd_appcoding);
+
+
+            DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_yinyongbiao", new QFilter[]{qFilter1});
+
+            if(dynamicObject1!=null) {
+
+                String nckd_elecoding = dynamicObject1.getString("nckd_elecoding");
+
+
+                QFilter qFilter369 = new QFilter("number", QCP.equals, nckd_elecoding);
+                //更新引用次数
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("nckd_requisitionlist", new QFilter[]{qFilter369});
+
+                int nckd_yynum = dynamicObject.getInt("nckd_yynum");
+                dynamicObject.set("nckd_yynum", nckd_yynum - 1);
+                SaveServiceHelper.saveOperate("nckd_requisitionlist", new DynamicObject[]{dynamicObject}, OperateOption.create());
+
+                QFilter qFilter = new QFilter("nckd_appcoding", QCP.equals, nckd_appcoding);
+                DeleteServiceHelper.delete("nckd_yinyongbiao", new QFilter[]{qFilter});
+            }
+        }
+    }
+}

+ 103 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/DocumentCreatePlugin.java

@@ -0,0 +1,103 @@
+package nckd.yjk.yj.plugin.docLibrary.operate;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.*;
+
+/**
+ * 要件单生成
+ */
+public class DocumentCreatePlugin extends AbstractOperationServicePlugIn implements Plugin {
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+        DynamicObject[] dynamicObjects=e.getDataEntities();
+        Integer a=1;
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(),dynamicObjects[i].getDynamicObjectType().getName());
+            Long orgbaseid=info.getDynamicObject("nckd_orgbase").getLong("id");
+            Long creator=info.getDynamicObject("creator").getLong("id");
+            Long auditor= UserServiceHelper.getCurrentUserId();
+            Long org=info.getDynamicObject("nckd_orgfield1").getLong("id");
+            Date applydate = info.getDate("nckd_applydate");
+            DynamicObjectCollection objectCollection = info.getDynamicObjectCollection("entryentity");
+            for (DynamicObject dynamicObject : objectCollection) {
+
+                Long nckd_yjclass = dynamicObject.getDynamicObject("nckd_yjclass").getLong("id");
+                String classname=dynamicObject.getDynamicObject("nckd_yjclass").getString("name");
+//                boolean nckd_isrepeatcite = dynamicObject.getBoolean("nckd_isrepeatcite");
+//                boolean nckd_iscitebynotupload = dynamicObject.getBoolean("nckd_iscitebynotupload");
+//                boolean nckd_iscross = dynamicObject.getBoolean("nckd_iscross");
+                boolean nckd_isdownloadable = dynamicObject.getBoolean("nckd_isdownloadable");
+                boolean nckd_isshared = dynamicObject.getBoolean("nckd_isshared");
+                String nckd_attname = dynamicObject.getString("nckd_attname");
+                String nckd_atttype = dynamicObject.getString("nckd_atttype");
+                String nckd_attsize = dynamicObject.getString("nckd_attsize");
+                LocaleString localeString=new LocaleString();
+                localeString.setLocaleValue_zh_CN(nckd_attname);
+
+                    DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_requisitionlist");
+                    newDangerRepository.set("status","C");
+                    newDangerRepository.set("name",localeString);
+                    newDangerRepository.set("enable",1);
+                    newDangerRepository.set("createorg",org);
+                    newDangerRepository.set("useorg",org);
+                    newDangerRepository.set("creator",creator);
+                    newDangerRepository.set("nckd_userfield",auditor);
+                    newDangerRepository.set("nckd_applydate",applydate);
+                    newDangerRepository.set("nckd_yjclass",nckd_yjclass);
+//                    newDangerRepository.set("nckd_isrepeatcite",nckd_isrepeatcite);
+//                    newDangerRepository.set("nckd_iscitebynotupload",nckd_iscitebynotupload);
+//                    newDangerRepository.set("nckd_iscross",nckd_iscross);
+                    newDangerRepository.set("nckd_isdownloadable",nckd_isdownloadable);
+                    newDangerRepository.set("nckd_isshared",nckd_isshared);
+                    newDangerRepository.set("nckd_atttype",nckd_atttype);
+                    newDangerRepository.set("nckd_attsize",nckd_attsize);
+                    newDangerRepository.set("nckd_orgbase",orgbaseid);
+
+                    if(classname.equals("知识库")){
+                        newDangerRepository.set("nckd_iscross",true);
+                    }
+
+                    List<Object> attchIdSet = new ArrayList<>();
+                    DynamicObjectCollection picCo = dynamicObject.getDynamicObjectCollection("nckd_attachmentfield");
+                    if (picCo != null && !picCo.isEmpty()) {
+                        picCo.forEach(attach -> {
+                            attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                        });
+                        DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                        DynamicObjectCollection targetAttachCol = newDangerRepository.getDynamicObjectCollection("nckd_attachmentfield");
+                        Arrays.asList(sourceAttachments).forEach(attachObj ->
+                                targetAttachCol.addNew().set("fbasedataid", attachObj)
+                        );
+                    }
+
+                    //保存
+
+                    OperationResult repositoryResult = OperationServiceHelper.executeOperate("save", "nckd_requisitionlist",
+                            new DynamicObject[]{newDangerRepository}, OperateOption.create());
+
+                Integer o=0;
+
+
+
+
+
+            }
+        }
+
+
+
+    }
+}

+ 104 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/operate/yaojianformcreatePlugin.java

@@ -0,0 +1,104 @@
+package nckd.yjk.yj.plugin.docLibrary.operate;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+public class yaojianformcreatePlugin extends AbstractOperationServicePlugIn implements Plugin {
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+        DynamicObject[] dynamicObjects=e.getDataEntities();
+        Integer a=1;
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            DynamicObject info=dynamicObjects[i];
+//            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(),dynamicObjects[i].getDynamicObjectType().getName());
+            Long orgbaseid=info.getDynamicObject("nckd_orgbase").getLong("id");
+            Long creator=info.getDynamicObject("creator").getLong("id");
+            Long auditor= UserServiceHelper.getCurrentUserId();
+            Long org=info.getDynamicObject("nckd_orgfield1").getLong("id");
+            Date applydate = info.getDate("nckd_applydate");
+            DynamicObjectCollection objectCollection = info.getDynamicObjectCollection("entryentity");
+            for (DynamicObject dynamicObject : objectCollection) {
+
+                Long nckd_yjclass = dynamicObject.getDynamicObject("nckd_yjclass").getLong("id");
+                String classname=dynamicObject.getDynamicObject("nckd_yjclass").getString("name");
+//                boolean nckd_isrepeatcite = dynamicObject.getBoolean("nckd_isrepeatcite");
+//                boolean nckd_iscitebynotupload = dynamicObject.getBoolean("nckd_iscitebynotupload");
+//                boolean nckd_iscross = dynamicObject.getBoolean("nckd_iscross");
+                boolean nckd_isdownloadable = dynamicObject.getBoolean("nckd_isdownloadable");
+                boolean nckd_isshared = dynamicObject.getBoolean("nckd_isshared");
+                String nckd_attname = dynamicObject.getString("nckd_attname");
+                String nckd_atttype = dynamicObject.getString("nckd_atttype");
+                String nckd_attsize = dynamicObject.getString("nckd_attsize");
+                LocaleString localeString=new LocaleString();
+                localeString.setLocaleValue_zh_CN(nckd_attname);
+
+                DynamicObject newDangerRepository = BusinessDataServiceHelper.newDynamicObject("nckd_requisitionlist");
+                newDangerRepository.set("status","C");
+                newDangerRepository.set("name",localeString);
+                newDangerRepository.set("enable",1);
+                newDangerRepository.set("createorg",org);
+                newDangerRepository.set("useorg",org);
+                newDangerRepository.set("creator",creator);
+                newDangerRepository.set("nckd_userfield",auditor);
+                newDangerRepository.set("nckd_applydate",applydate);
+                newDangerRepository.set("nckd_yjclass",nckd_yjclass);
+//                newDangerRepository.set("nckd_isrepeatcite",nckd_isrepeatcite);
+//                newDangerRepository.set("nckd_iscitebynotupload",nckd_iscitebynotupload);
+//                newDangerRepository.set("nckd_iscross",nckd_iscross);
+                newDangerRepository.set("nckd_isdownloadable",nckd_isdownloadable);
+                newDangerRepository.set("nckd_isshared",nckd_isshared);
+                newDangerRepository.set("nckd_atttype",nckd_atttype);
+                newDangerRepository.set("nckd_attsize",nckd_attsize);
+                newDangerRepository.set("nckd_orgbase",orgbaseid);
+
+                if(classname.equals("知识库")){
+                    newDangerRepository.set("nckd_isshared",true);
+                }
+
+                List<Object> attchIdSet = new ArrayList<>();
+                DynamicObjectCollection picCo = dynamicObject.getDynamicObjectCollection("nckd_attachmentfield");
+                if (picCo != null && !picCo.isEmpty()) {
+                    picCo.forEach(attach -> {
+                        attchIdSet.add(attach.getDynamicObject("fbasedataId").getPkValue());
+                    });
+                    DynamicObject[] sourceAttachments = BusinessDataServiceHelper.load(attchIdSet.toArray(), EntityMetadataCache.getDataEntityType("bd_attachment"));
+
+                    DynamicObjectCollection targetAttachCol = newDangerRepository.getDynamicObjectCollection("nckd_attachmentfield");
+                    Arrays.asList(sourceAttachments).forEach(attachObj ->
+                            targetAttachCol.addNew().set("fbasedataid", attachObj)
+                    );
+                }
+
+                //保存
+
+                OperationResult repositoryResult = OperationServiceHelper.executeOperate("save", "nckd_requisitionlist",
+                        new DynamicObject[]{newDangerRepository}, OperateOption.create());
+
+                Integer o=0;
+
+
+
+
+
+            }
+        }
+
+
+
+    }
+}

+ 41 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/AppLoginService.java

@@ -0,0 +1,41 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import com.alibaba.fastjson.JSONObject;
+
+/*
+ * 获取APPTOKEN
+ */
+public class AppLoginService {
+	
+	private static final String path  = "/api/getAppToken.do";
+	
+	private static final AppLoginService service = new AppLoginService();
+	
+	private AppLoginService() {}
+	
+	//静态工厂方法   
+    public static AppLoginService getService() {  
+        return service;
+    }
+    
+    public String getAppToken(String REMOTEHOST) {
+    	//获取APPTOKEN
+		String url = REMOTEHOST + path;
+		// appId & appSecuret & tenantid & accountId 需修改
+		String data = "{\"appId\": \"EAS\""
+				+ ",\"appSecuret\": \"123456\""
+				+ ",\"tenantid\": \"ierp\""
+				+ ",\"accountId\": \"1557233840063393244\""
+				+ ",\"language\": \"zh_CN\"}";
+		String responseStr = null;
+		try {
+			responseStr = HttpService.getService().doPostByHttpClient(url, data);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		JSONObject json  = JSONObject.parseObject(responseStr);
+		String appToken  = json.getJSONObject("data").getString("app_token");
+		return appToken;
+    }
+    
+}

+ 137 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/AttBatchDownLoadPlugin.java

@@ -0,0 +1,137 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;//package nckd.yjk.yj.plugin.docLibrary.utils;
+//
+//import java.io.FileInputStream;
+//import java.io.FileNotFoundException;
+//import java.io.FileOutputStream;
+//import java.io.IOException;
+//import java.io.OutputStream;
+//import java.util.ArrayList;
+//import java.util.EventObject;
+//import java.util.List;
+//import java.util.Map;
+//
+//import kd.bos.bill.AbstractBillPlugIn;
+//import kd.bos.cache.CacheFactory;
+//import kd.bos.cache.TempFileCache;
+//import kd.bos.dataentity.entity.DynamicObject;
+//import kd.bos.dataentity.entity.DynamicObjectCollection;
+//import kd.bos.fileservice.BatchDownloadRequest;
+//import kd.bos.fileservice.BatchDownloadRequest.Dir;
+//import kd.bos.fileservice.BatchDownloadRequest.File;
+//import kd.bos.fileservice.FileService;
+//import kd.bos.fileservice.FileServiceFactory;
+//import kd.bos.form.control.AttachmentPanel;
+//import kd.bos.form.control.events.BeforeItemClickEvent;
+//import kd.bos.form.control.events.ItemClickEvent;
+//import kd.bos.servicehelper.attachment.AttachmentFieldServiceHelper;
+//
+//public class AttBatchDownLoadPlugin extends AbstractBillPlugIn {
+//	@Override
+//	public void registerListener(EventObject e) {
+//		// TODO Auto-generated method stub
+//		super.registerListener(e);
+//	}
+//
+//	@Override
+//	public void beforeItemClick(BeforeItemClickEvent evt) {
+//		// TODO Auto-generated method stub
+//		super.beforeItemClick(evt);
+//	}
+//
+//	@Override
+//	public void itemClick(ItemClickEvent evt) {
+//		if (evt.getItemKey().equals("kded_alldown")) {
+//			this.getPageCache().put("ifContainTempfile", "false");
+//			FileService fs = FileServiceFactory.getAttachmentFileService();
+//			// 浏览器用户代理字符串,模拟浏览器userAgent访问
+//			String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36";
+//			// 获取附件面板的附件放在一个文件夹下
+//			Dir attpanelDir = createDirAndFileByAttPanel("attachmentpanel");
+//			// 获取单据体附件字段字段的附件放在一个文件夹下
+//			Dir attFileDir = createDirAndFileByAttFile("attentryentity", "kded_attachmentfield");
+//			// 构造BatchDownloadRequest对象
+//			BatchDownloadRequest bdr = new BatchDownloadRequest("alldownload");
+//			bdr.setDirs(new Dir[] { attpanelDir, attFileDir });
+//			/**
+//			 *BatchDownloadRequest对象的输出流
+//			 */
+//			OutputStream out = null;
+//			String url = "";
+//			try {
+//				// 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
+//				java.io.File file = java.io.File.createTempFile("test", ".zip");
+//				out = new FileOutputStream(file);
+//				// 批量下载接口BatchDownloadRequest请求下载的地址必须是服务器中存在的地址
+//				fs.batchDownload(bdr, out, userAgent);
+//				// 临时文件地址
+//				// String path = file.getPath();
+//				// 上传为临时文件,主要作为this.getView().download提供下载地址
+//				TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+//				url = cache.saveAsUrl(file.getName(), new FileInputStream(file), 2 * 60);
+//			} catch (FileNotFoundException e) {
+//				e.printStackTrace();
+//			} catch (IOException e) {
+//				e.printStackTrace();
+//			}
+//			String ifContainTempfile = this.getPageCache().get("ifContainTempfile");
+//			if (ifContainTempfile.equals("true")) {
+//				this.getView().showMessage("有附件未保存,请先保存单据");
+//			} else {
+//				// 下载后文件的地址为浏览器的下载地址
+//				this.getView().download(url);
+//			}
+//		}
+//		super.itemClick(evt);
+//	}
+//
+//	// 获取单据体中的附件字段中的附件,用来创建附件
+//	public Dir createDirAndFileByAttFile(String entityName, String attachmentfield) {
+//		// 以附件字段标识命名文件夹
+//		Dir attFileDir = new Dir(attachmentfield);
+//		DynamicObjectCollection col = this.getModel().getDataEntity(true).getDynamicObjectCollection(entityName);
+//		ArrayList<File> attFileFile = new ArrayList<>();
+//		for (DynamicObject dynamicObject : col) {
+//			DynamicObjectCollection attCol = dynamicObject.getDynamicObjectCollection(attachmentfield);
+//			for (DynamicObject attObj : attCol) {
+//				DynamicObject btdata = attObj.getDynamicObject("fbasedataid");
+//				String atturl = btdata.getString("url");
+//				if (atturl.indexOf("path=") != -1) {
+//					String[] urlsplit = atturl.split("path=");
+//					String path = urlsplit[1];
+//					String name = btdata.getString("name");
+//					File aFile = new File(name, path);
+//					attFileFile.add(aFile);
+//				} else if (atturl.contains("/tempfile/download.do?configKey")) {
+//					this.getPageCache().put("ifContainTempfile", "true");
+//					break;
+//				}
+//			}
+//		}
+//		File[] files = attFileFile.toArray(new File[attFileFile.size()]);
+//		attFileDir.setFiles(files);
+//		return attFileDir;
+//	}
+//
+//	public Dir createDirAndFileByAttPanel(List<DynamicObject> list) {
+//		// 以附件面板标识命名文件夹
+//		Dir attpanelDir = new Dir("sdf");
+//		List<Map<String, Object>> attachmentData = att.getAttachmentData();
+//		ArrayList<File> attpanelFile = new ArrayList<>();
+//		for (Map<String, Object> map : attachmentData) {
+//			String atturl = (String) map.get("url");
+//			if (atturl.indexOf("path=") != -1) {
+//				String[] urlsplit = atturl.split("path=");
+//				String path = urlsplit[1];
+//				String name = (String) map.get("name");
+//				File aFile = new File(name, path);
+//				attpanelFile.add(aFile);
+//			} else if (atturl.contains("/tempfile/download.do?configKey")) {
+//				this.getPageCache().put("ifContainTempfile", "true");
+//				break;
+//			}
+//		}
+//		File[] files = attpanelFile.toArray(new File[attpanelFile.size()]);
+//		attpanelDir.setFiles(files);
+//		return attpanelDir;
+//	}
+//}

+ 107 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/BizOperateService.java

@@ -0,0 +1,107 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class BizOperateService {
+	
+	private static final BizOperateService service = new BizOperateService();
+	
+	private static final String relativePath = "/kapi/app/sys/BizCustomSave";
+	
+	private BizOperateService() {}
+	
+    //静态工厂方法   
+    public static BizOperateService getService() {  
+        return service;  
+    } 
+    
+    /**
+     * 远程上传单据数据 & 附件文件到苍穹系统
+     * @param remotehost	苍穹系统访问地址
+     * @param accessToken	
+     * @param formData		单据数据
+     * @param attchmentsUrl	附件在苍穹系统中的保存地址
+     * @param attchmentpanles	第三方系统中附件面板的标识,如无可传null
+     * @return
+     * @throws URISyntaxException
+     */
+    public String BizSave(String remotehost, String accessToken, Map<String, Object> formData, String attchmentsUrl, List<String> attchmentpanles) 
+    		throws URISyntaxException {
+		List<String> attchmentsUrlList = new ArrayList<String>();
+		attchmentsUrlList.add(attchmentsUrl);
+		// 默认一个附件面板
+    	attchmentpanles = (attchmentpanles == null) ? new ArrayList<String>() : attchmentpanles;
+    	if (attchmentpanles.size() == 0) {
+    		attchmentpanles.add("attachmentpanel");
+    	}
+    	// 自定义开放平台接口路径
+    	String url = remotehost + relativePath;
+    	// 附件信息
+    	Map<String, Object> attachmentInfo = new HashMap<String, Object>();
+    	List<Map<String, Object>> attachments = null;
+    	Map<String, Object> attachment = null;
+    	StringBuffer uid = new StringBuffer("rc-upload-");
+    	uid.append(new Date().getTime());
+		uid.append("-");
+		int index = (int) (1 + Math.random()*10);
+    	// 多个附件面板
+    	for (String tempattchmentpanle : attchmentpanles) {
+    		attachments = new ArrayList<Map<String, Object>>();
+    		// 多个附件
+    		for (String attchmentUrl : attchmentsUrlList) {
+    			attachment = new HashMap<String, Object>();
+    			attachment.put("name", formData.get("fileName"));
+    			attachment.put("url", attchmentUrl);
+    			uid.append(index);
+    			attachment.put("uid", uid);
+    			index++;
+    			attachment.put("size", formData.get("fileSize"));
+    			attachment.put("description", formData.get("description"));
+    			attachments.add(attachment);
+    		}
+    		attachmentInfo.put(tempattchmentpanle, attachments);
+    	}
+    	// 封装数据
+    	JSONObject body = new JSONObject();
+    	body.put("accessToken", accessToken);
+    	body.put("bizObject", formData);
+    	body.put("attachmentInfo", attachmentInfo);
+		String responseStr = null;
+		try {
+			responseStr = HttpService.getService().doGetByHttpClient(url, body);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return responseStr;
+    }
+    
+    /**
+     * 远程查询附件信息
+     * @param remotehost	苍穹系统访问地址
+     * @param accessToken	
+     * @param params		参数
+     * @return
+     */
+    public String bizGetAttachmentsInfo(String remotehost, String accessToken, Map<String, Object> params) {
+    	// 自定义开放平台接口路径
+    	String url = remotehost + relativePath;
+    	// 封装参数
+    	JSONObject body = new JSONObject();
+    	body.put("accessToken", accessToken);
+    	body.put("bizObject", params);
+		String responseStr = null;
+		try {
+			responseStr = HttpService.getService().doGetByHttpClient(url, body);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return responseStr;
+    }
+}

+ 74 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/DownLoadUtil.java

@@ -0,0 +1,74 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.TempFileCache;
+import kd.bos.fileservice.BatchDownloadRequest;
+import kd.bos.fileservice.FileService;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.fileservice.path.FilePathFactory;
+import org.apache.commons.lang3.StringUtils;
+
+
+import java.io.*;
+import java.net.URLDecoder;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+public class DownLoadUtil {
+    public static String getPathfromDownloadUrl(String url) throws IOException {
+        String path = kd.bos.dataentity.utils.StringUtils.substringAfter(url, "path=");
+        path = URLDecoder.decode(path, "UTF-8");
+        if (path.contains("kdedcba")) {
+            path = kd.bos.dataentity.utils.StringUtils.substringBefore(path, "&kdedcba");
+        }
+
+        if (path.contains("?v=1")) {
+            path = path.replace("?v=1", "");
+
+        }
+        path = FilePathFactory.getFilePath().getRealPath(path);
+        if(StringUtils.isBlank(path)) {
+            path = url;
+        }
+        return path;
+    }
+
+    public static String getBatchDownLoadUrl(List<String> urls) {
+        FileService fileService = FileServiceFactory.getAttachmentFileService();
+
+        String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String date = dateFormat.format(new Date());
+        String fileName = "全部附件_" + date + ".zip";
+
+        BatchDownloadRequest.File[] files = new BatchDownloadRequest.File[urls.size()];
+        for (int i = 0; i < urls.size(); ++i) {
+            String path = (String) urls.get(i);
+            BatchDownloadRequest.File file = new BatchDownloadRequest.File(path.substring(path.lastIndexOf("/") + 1), path);
+            files[i] = file;
+        }
+
+        BatchDownloadRequest bdRequest = new BatchDownloadRequest(fileName);
+        bdRequest.setFiles(files);
+        ;
+
+        OutputStream out = null;
+        try {
+            File file = File.createTempFile("test", ".zip");
+            out = new FileOutputStream(file);
+            fileService.batchDownload(bdRequest, out, userAgent);
+            TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+            return cache.saveAsUrl(file.getName(), new FileInputStream(file), 2 * 60);
+
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            return null;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}

+ 76 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/FileUploadService.java

@@ -0,0 +1,76 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.FormBodyPart;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntity;
+import org.apache.http.entity.mime.content.InputStreamBody;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.util.EntityUtils;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class FileUploadService {
+	
+	private static final FileUploadService service = new FileUploadService();
+	
+	private static final String BOUNDARY = "----WebKitFormBoundaryBHp47SjGMxpHX0X6--";
+	
+	private FileUploadService() {}
+	
+	//静态工厂方法
+	public static FileUploadService getService() {
+		return service;
+	}
+	
+	public String postFile(String url, Map<String, Object> param, File file, String accessToken) throws Exception {
+		HttpPost httppost = new HttpPost(url);
+		httppost.addHeader("api", "true");
+		httppost.addHeader("accessToken", accessToken);
+		//设置boundary,文件解析用
+		httppost.addHeader("Content-Type",  "multipart/form-data; boundary="+BOUNDARY);
+		MultipartEntity entry = this.getMutipartEntry(param, file);
+		httppost.setEntity(entry);
+		return HttpService.getService().doExecuteByHttpClient(httppost, new ResponseHandler<String>() {
+			@Override
+			public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
+				HttpEntity entity = response.getEntity();
+				String  rtn =  EntityUtils.toString(entity, "UTF-8");
+				JSONObject json  = JSONObject.parseObject(rtn);
+				String url  = json.getString("url");
+				return url;
+			}
+		});
+	}
+    
+    private MultipartEntity getMutipartEntry(Map<String, Object> param, File file) 
+			throws UnsupportedEncodingException, FileNotFoundException {
+    	if (file == null) {
+    		throw new IllegalArgumentException("文件不能为空");
+        }
+        MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, BOUNDARY, Charset.forName("UTF-8"));
+        multipartEntity.addPart("file", new InputStreamBody(new FileInputStream(file), file.getName()));
+        if (param != null) {
+        	Iterator<String> iterator = param.keySet().iterator();
+        	while (iterator.hasNext()) {
+        		String key = iterator.next();
+        		FormBodyPart field = new FormBodyPart(key, new StringBody((String) param.get(key)));
+        		multipartEntity.addPart(field);
+        	}
+        }
+        return multipartEntity;
+    }
+}

+ 127 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/HttpClientFactory.java

@@ -0,0 +1,127 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.http.HeaderElement;
+import org.apache.http.HeaderElementIterator;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.params.ClientPNames;
+import org.apache.http.conn.ConnectionKeepAliveStrategy;
+import org.apache.http.conn.HttpClientConnectionManager;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicHeaderElementIterator;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.protocol.HttpContext;
+
+/*
+ * 高并发HttpClient
+ */
+public class HttpClientFactory {
+
+	private static CloseableHttpClient httpClient ;
+	
+	public static CloseableHttpClient getHttpClient() throws InstantiationException, IllegalAccessException 
+	{
+		if(httpClient == null ) {
+			synchronized (HttpClientFactory.class) 
+			{
+				if(httpClient == null) {
+					httpClient = create();
+				}
+			}
+		}
+		return httpClient;	
+	}
+	
+	private static CloseableHttpClient create() {
+		ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
+		    @Override
+		    public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
+		        HeaderElementIterator it = new BasicHeaderElementIterator
+		            (response.headerIterator(HTTP.CONN_KEEP_ALIVE));
+		        while (it.hasNext()) {
+		            HeaderElement he = it.nextElement();
+		            String param = he.getName();
+		            String value = he.getValue();
+		            if (value != null && param.equalsIgnoreCase
+		               ("timeout")) {
+		                return Long.parseLong(value) * 1000;
+		            }
+		        }
+		        return 60 * 1000;//如果没有约定,则默认定义时长为60s
+		    }			
+		};
+		// 配置一个PoolingHttpClientConnectionManager
+		PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+		connectionManager.setMaxTotal(500);
+		connectionManager.setDefaultMaxPerRoute(50);//例如默认每路由最高50并发,具体依据业务来定
+		
+		//设置一个线程隔一段时间关闭超时连接
+		IdleConnectionMonitorThread thread  = new IdleConnectionMonitorThread(connectionManager);
+		thread.start();
+		CloseableHttpClient	httpClient = HttpClients.custom()
+                .setConnectionManager(connectionManager)
+                .setKeepAliveStrategy(myStrategy)
+                .setDefaultRequestConfig(RequestConfig.custom().setStaleConnectionCheckEnabled(true).build())
+                .build();
+		HttpParams params = new BasicHttpParams();
+		//设置连接超时时间
+		Integer CONNECTION_TIMEOUT = 2 * 1000; //设置请求超时2秒钟 根据业务调整
+		Integer SO_TIMEOUT = 2 * 1000; //设置等待数据超时时间2秒钟 根据业务调整
+
+		//定义了当从ClientConnectionManager中检索ManagedClientConnection实例时使用的毫秒级的超时时间
+		//这个参数期望得到一个java.lang.Long类型的值。如果这个参数没有被设置,默认等于CONNECTION_TIMEOUT,因此一定要设置。
+		Long CONN_MANAGER_TIMEOUT = 500L; //在httpclient4.2.3中我记得它被改成了一个对象导致直接用long会报错,后来又改回来了
+		 
+		params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
+		params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SO_TIMEOUT);
+		params.setLongParameter(ClientPNames.CONN_MANAGER_TIMEOUT, CONN_MANAGER_TIMEOUT);
+		//在提交请求之前 测试连接是否可用
+		params.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, true);
+		 
+		//另外设置http client的重试次数,默认是3次;当前是禁用掉(如果项目量不到,这个默认即可)
+//		 httpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
+		return httpClient;
+	}
+	
+	public static class IdleConnectionMonitorThread extends Thread {	    
+	    private final HttpClientConnectionManager connMgr;
+	    private volatile boolean shutdown;
+	    
+	    public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr) {
+	        super();
+	        this.connMgr = connMgr;
+	    }
+	    @Override
+	    public void run() {
+	        try {
+	            while (!shutdown) {
+	                synchronized (this) {
+	                    wait(5000);
+	                    // Close expired connections
+	                    connMgr.closeExpiredConnections();
+	                    // Optionally, close connections
+	                    // that have been idle longer than 30 sec
+	                    connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
+	                }
+	            }
+	        } catch (InterruptedException ex) {
+	            // terminate
+	        }
+	    }
+	    
+	    public void shutdown() {
+	        shutdown = true;
+	        synchronized (this) {
+	            notifyAll();
+	        }
+	    }
+	    
+	}
+}

+ 106 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/HttpService.java

@@ -0,0 +1,106 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class HttpService {
+	
+	private static final HttpService service = new HttpService();
+	
+	private HttpService() {}
+
+	// 静态工厂方法
+	public static HttpService getService() {
+		return service;
+	}
+
+	/**
+	 * POST方式发送请求
+	 * @param url
+	 * @param data
+	 * @return
+	 * @throws Exception
+	 */
+	public String doPostByHttpClient(String url, String data) throws Exception {
+		StringEntity se = new StringEntity(data, "UTF-8");
+		se.setContentType("text/json");
+		se.setContentEncoding(new BasicHeader("Content-Type", "application/json; charset=UTF-8"));
+		HttpPost httpPost = new HttpPost(url);
+		httpPost.addHeader("Content-Type", "application/json; charset=UTF-8");
+		httpPost.setEntity(se);
+		return doExecuteByHttpClient(httpPost,new ResponseHandler<String>() {
+			@Override
+			public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) {
+					try {
+						throw new Exception("连接服务器发生错误!");
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+				return EntityUtils.toString(response.getEntity());
+			}
+		});
+	}
+
+	public <T> T doExecuteByHttpClient(HttpUriRequest httpPost, ResponseHandler<? extends T> responseHandler) throws Exception {
+		try {
+			CloseableHttpClient httpClient = HttpClientFactory.getHttpClient();
+			T rtn = httpClient.execute(httpPost, responseHandler);
+			return rtn;
+		} catch (Exception e) {
+			e.printStackTrace();
+			System.out.println(" ===== doPostByHttpClient() ERROR ===== ");
+			throw new Exception(e.getMessage());
+		} finally {
+			System.clearProperty("javax.net.debug");
+		}
+	}
+
+	/**
+	 * GET方式发送请求
+	 * @param url
+	 * @param param
+	 * @return
+	 * @throws Exception
+	 */
+	public String doGetByHttpClient(String url, JSONObject param) throws Exception {
+		URIBuilder builder = new URIBuilder(url);
+		if (param != null) {
+			builder.addParameter("body", param.toJSONString());
+		}
+		URI uri = builder.build();
+		HttpGet httpGet = new HttpGet(uri);
+		return doExecuteByHttpClient(httpGet, new ResponseHandler<String>() {
+			@Override
+			public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) {
+					try {
+						throw new Exception("连接服务器发生错误!");
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+				return EntityUtils.toString(response.getEntity());
+			}
+		});
+	}
+	
+}

+ 255 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/RemoteOperationWithAttachment.java

@@ -0,0 +1,255 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import kd.bos.url.UrlService;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+
+import com.alibaba.fastjson.JSONObject;
+
+import kd.bos.dataentity.utils.StringUtils;
+
+/**
+ * 第三方系统远程上传单据&附件到苍穹系统
+ * 
+ * @author Administrator
+ *
+ */
+public class RemoteOperationWithAttachment {
+	
+	// 苍穹系统访问地址,需修改
+	private static final String REMOTEHOST = UrlService.getDomainContextUrl();
+
+//    private final static String  URL_COSMICHOST="http://111.75.220.136:8022/ierp";
+
+	
+	// 苍穹系统中,对应单据的标识,需修改
+	private static final String FORMID = "nckd_requisitionlist";
+	
+	// 苍穹系统中,对应单据所属应用的标识,需修改
+	private static final String APPID = "nckd_requirements";
+	
+	/***************************************** 临时变量 *****************************************/
+	// 苍穹系统中, 该单据的所有附件面板上的附件信息(key:附件面板标识符;value:附件信息集合)
+	private Map<String, List<Map<String, Object>>> collection = null;
+	// 苍穹系统中, 该单据的所有附件面板标识
+	private List<String> attachKeys = null;
+	
+	/**
+	 * 测试入口(上传、下载请分开测试)
+	 * 
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		RemoteOperationWithAttachment remoteOperation = new RemoteOperationWithAttachment();
+		// 获取连接信息,需修改(在方法体内)
+		String appToken = AppLoginService.getService().getAppToken(REMOTEHOST);
+		String accessToken = UserLoginService.getService().getAccessToken(REMOTEHOST, appToken);
+		// 远程上传单据&附件
+//		try {
+//			remoteOperation.remoteSaveWithAttachments (accessToken);
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//		}
+		
+		// 查询苍穹系统中指定单据上的所有附件信息
+		try {
+			remoteOperation.remoteGetAttachmentsInfo(accessToken);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		// 远程下载附件
+		try {
+			remoteOperation.remoteDownloadAttachment(accessToken);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * 远程上传单据&附件到苍穹系统
+	 * 参考资料:https://www.cnblogs.com/zwqh/p/9635176.html
+	 *        https://blog.csdn.net/zzq900503/article/details/72920914/
+	 * 
+	 * @throws Exception
+	 */
+	private void remoteSaveWithAttachments(String accessToken) throws Exception {
+		// 第三方系统中待上传到苍穹系统的文件,需修改
+		File file = new File("E:\\test.txt");
+		// 上传可能需要传的参数
+        Map<String, Object> param = new HashMap<String, Object>();	     
+        String responseStr = null;
+        JSONObject responseJson = null;
+		String url = REMOTEHOST + "/attachment/uploadFile.do";
+		// 上传文件		
+		responseStr = FileUploadService.getService().postFile(url, param, file, accessToken);
+		// 封装第三方系统中待上传到苍穹系统的单据数据
+		Map<String, Object> formData = new HashMap<String, Object>();
+		// 单据标识符,需修改(苍穹系统中需要该参数,如第三方系统没有该参数,可自行新建,格式:开发商标识符+单据名称,英文或者数字,附:开发商标识符可在苍穹系统中查询到)
+		formData.put("formId", FORMID);
+		formData.put("appId", APPID);
+		formData.put("fileName", file.getName());
+		formData.put("fileSize", file.length());
+		formData.put("description", "");
+		formData.put("bizType", "upload");
+		// 单据数据,按实际业务自行修改
+		formData.put("billno", "test20190819");
+		formData.put("billstatus", "B");
+		formData.put("desc", "测试");
+		formData.put("qtyfield1", "12");
+		responseStr = BizOperateService.getService().BizSave(REMOTEHOST, accessToken, formData, responseStr, null);
+		responseJson = JSONObject.parseObject(responseStr);
+		Boolean success = Boolean.valueOf(responseJson.getString("success"));
+		if (success) {
+			System.out.println("上传成功!");
+		} else {
+			String message = responseJson.getJSONObject("data").getString("message");
+			throw new Exception(message);
+		}
+	}
+	
+	/**
+	 * 远程查询附件信息
+	 * @param accessToken
+	 * @throws Exception
+	 */
+	private void remoteGetAttachmentsInfo(String accessToken) throws Exception {
+		String responseStr = null;
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("bizType", "getAttachments");
+		params.put("formId", FORMID);
+		// 待查询单据的主键ID,需修改
+		params.put("pkId", "697030778130792448");
+		// 可不传,查询默认附件面板的所有附件信息
+		// 如存在多个附件面板,或附件面板标识与默认附件面板标识("attachmentpanel")不一致,或查询指定附件面板的所有附件信息,需修改
+		params.put("attachKeys", attachKeys);
+		responseStr = BizOperateService.getService().bizGetAttachmentsInfo(REMOTEHOST, accessToken, params);
+		JSONObject responseJson = StringUtils.isEmpty(responseStr) ? new JSONObject() : JSONObject.parseObject(responseStr);
+		Boolean success = responseJson == null ? false : Boolean.valueOf(responseJson.getString("success"));
+		if (success) {
+			attachKeys = (List<String>) responseJson.getJSONObject("data").get("attachKeys");
+			collection = (Map<String, List<Map<String, Object>>>) responseJson.getJSONObject("data").get("collection");
+		} else {
+			String message = responseJson.getJSONObject("data").getString("message");
+			message = StringUtils.isEmpty(message) ? "远程查询附件信息失败!" : message;
+			throw new Exception(message);
+		}
+		System.out.println(collection);
+	}
+	
+	/**
+	 * 远程下载附件
+	 * 参考资料:https://blog.csdn.net/u014267900/article/details/80712357
+	 *        https://www.cnblogs.com/lucas1024/p/9533220.html
+	 *        https://www.cnblogs.com/Donnnnnn/p/7902718.html
+	 * 
+	 * @param accessToken
+	 * @throws Exception
+	 */
+	private void remoteDownloadAttachment(String accessToken) throws Exception {
+		// 下载指定附件,需修改
+		String attachKey = attachKeys.get(0);
+		List<Map<String, Object>> attachments = collection.get(attachKey);
+		Map<String, Object> attachment = attachments.get(0);
+		String url = attachment.get("url").toString();
+		InputStream is = null;
+		// 创建默认http客户端
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		// 采用默认请求配置
+		RequestConfig requestConfig= RequestConfig.DEFAULT;
+		// 通过get方法下载文件流
+		HttpGet request = new HttpGet(url);
+		// 设置请头求配置
+		request.setConfig(requestConfig);
+		try {
+			// 执行请求,接收返回信息
+			CloseableHttpResponse httpResponse = httpClient.execute(request);
+			// 获取执行状态
+			int statusCode = httpResponse.getStatusLine().getStatusCode();
+			if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) {
+				request.abort();
+			} else {
+				HttpEntity entity = httpResponse.getEntity();
+				if (null != entity) {
+					// 获取返回内容
+					is = entity.getContent();
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			request.abort();
+		}
+		// 本地存放位置
+		String path = "E:\\测试下载远程文件\\demo.txt";
+		File file = new File(path);
+		if (!file.getParentFile().exists()) {
+			file.getParentFile().mkdirs();
+		}
+		if (!file.exists()) {
+			try {
+				file.createNewFile();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		FileOutputStream fos = null;
+		try {
+			fos = new FileOutputStream(file);
+			int bytes = 0;
+			byte[] buffer = new byte[1024];
+			while ((bytes = is.read(buffer)) != -1) {
+			    fos.write(buffer, 0, bytes);
+			}
+			System.out.println("文件下载成功!");
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			close(is);
+			close(fos);
+		}
+	}
+	
+	/**
+	 * 关闭输入流
+	 * @param is
+	 */
+	public static void close(InputStream is) {
+		if (is != null) {
+			try {
+				is.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	/**
+	 * 关闭输出流
+	 * @param fos
+	 */
+	public static void close(FileOutputStream fos) {
+		if (fos != null) {
+			try {
+				fos.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+}

+ 37 - 0
src/main/java/nckd/yjk/yj/plugin/docLibrary/utils/UserLoginService.java

@@ -0,0 +1,37 @@
+package nckd.yjk.yj.plugin.docLibrary.utils;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class UserLoginService {
+
+	private static final String path = "/api/login.do";
+	
+	private UserLoginService() {}
+	
+    private static final UserLoginService service = new UserLoginService();
+    
+    //静态工厂方法   
+    public static UserLoginService getService()  {  
+        return service;  
+    }
+    
+	public String getAccessToken(String REMOTEHOST, String appToken) {
+		//获取用户token
+		String url = REMOTEHOST + path;
+		// user & tenantid & accountId 需修改
+		String data = "{\"user\": \"17299999999\""
+				+ ",\"apptoken\": \""+appToken+"\""
+				+ ",\"tenantid\": \"ierp\""
+				+ ",\"accountId\": \"1557233840063393244\""
+				+ ",\"usertype\": \"Mobile\"}";
+		String responseStr = null;
+		try {
+			responseStr = HttpService.getService().doPostByHttpClient(url, data);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}	
+		JSONObject json  = JSONObject.parseObject(responseStr);
+		String accessToken  = json.getJSONObject("data").getString("access_token");
+		return accessToken;
+	}
+}