package com.kingdee.eas.custom.esign.osf; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Maps; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.bos.bsf.service.app.IHRMsfService; import com.kingdee.bos.dao.IObjectPK; import com.kingdee.bos.dao.ormapping.ObjectUuidPK; import com.kingdee.bos.rabbitmq.guava.Lists; import com.kingdee.bos.util.BOSUuid; import com.kingdee.eas.basedata.person.PersonInfo; import com.kingdee.eas.common.EASBizException; import com.kingdee.eas.custom.esign.ESignGlobalStatusOverviewCollection; import com.kingdee.eas.custom.esign.ESignGlobalStatusOverviewFactory; import com.kingdee.eas.custom.esign.ESignGlobalStatusOverviewInfo; import com.kingdee.eas.custom.esign.IESignGlobalStatusOverview; import com.kingdee.eas.custom.esign.bizEnum.EsignConfigEnum; import com.kingdee.eas.custom.esign.bizEnum.EsignStatusEnum; import com.kingdee.eas.custom.esign.bizEnum.SendStatusEnum; import com.kingdee.eas.custom.esign.tsign.hz.comm.EsignHttpResponse; import com.kingdee.eas.custom.esign.tsign.hz.exception.EsignException; import com.kingdee.eas.custom.esign.util.EsignHttpUtil; import com.kingdee.eas.custom.esign.util.SyncSignedFilesUtil; import com.kingdee.eas.util.app.DbUtil; import com.kingdee.jdbc.rowset.IRowSet; import org.apache.commons.lang3.StringUtils; import java.sql.SQLException; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * description: EsignFlowListOSFService
* date: 4/1/2026 下午 4:23
* author: lhbj
* version: 1.0
*/ public class EsignFlowListOSFService implements IHRMsfService { public static LocalDateTime formatter(String time) { LocalDateTime dateTime = null; if (time.length() == 10) { LocalDate localD = LocalDate.parse(time); LocalTime localT = LocalTime.of(0, 0, 0); dateTime = LocalDateTime.of(localD, localT); } else if (time.length() == 16) { dateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); } else if (time.length() == 19) { dateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } return dateTime; } public static LocalDateTime startDateTimeNow() { LocalDate localD1 = LocalDate.now(); LocalTime time1 = LocalTime.now(); LocalTime localT1 = LocalTime.of(time1.getHour(), 0, 0); LocalDateTime dateTime = LocalDateTime.of(localD1, localT1); dateTime = dateTime.minusHours(1); return dateTime; } public static LocalDateTime endDateTimeNow() { LocalDate localD2 = LocalDate.now(); LocalTime localT2 = LocalTime.of(23, 59, 59); LocalDateTime dateTime = LocalDateTime.of(localD2, localT2); return dateTime; } @Override public Object process(Context context, Map map) throws EASBizException, BOSException { String param = (String) map.get("data"); LocalDateTime startDateTime = null; LocalDateTime endDateTime = null; StringBuilder msg = new StringBuilder(); if (StringUtils.isNotBlank(param)) { JSONObject object = JSON.parseObject(param); String startTime = object.getString("startTime"); String endTime = object.getString("endTime"); String status = object.getString("status"); String advanceHours = object.getString("advanceHours"); if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime) ) { startDateTime = this.formatter(startTime); endDateTime = this.formatter(endTime); } if (null == startDateTime || null == endDateTime) { startDateTime = startDateTimeNow(); endDateTime = endDateTimeNow(); } startDateTime = startDateTime.minusHours(Integer.parseInt(advanceHours)); } if (null == startDateTime || null == endDateTime) { startDateTime = startDateTimeNow(); endDateTime = endDateTimeNow(); } int pageNum = 0; int pageSize = 100; long totalNum = 1; IESignGlobalStatusOverview overview = ESignGlobalStatusOverviewFactory.getLocalInstance(context); Map jsonMap = Maps.newHashMap(); long signFlowStartTimeFrom = startDateTime.atZone(ZoneId.systemDefault()) .toInstant() .toEpochMilli(); long signFlowStartTimeTo = endDateTime.atZone(ZoneId.systemDefault()) .toInstant() .toEpochMilli(); jsonMap.put("signFlowStartTimeFrom", signFlowStartTimeFrom); jsonMap.put("signFlowStartTimeTo", signFlowStartTimeTo); // List list = Lists.newArrayList(); // list.add("2"); // jsonMap.put("signFlowStatus", list); do { pageNum++; jsonMap.put("pageNum", pageNum); jsonMap.put("pageSize", pageSize); try { EsignHttpResponse response = EsignHttpUtil.sign_flow_list(context, jsonMap, "查询签署流程列表"); if (response.getStatus() >= 200 && response.getStatus() < 300) { if (StringUtils.isBlank(response.getBody())) { continue; } //System.out.println(response.getBody()); JSONObject jsonObject = JSON.parseObject(response.getBody()); int code = jsonObject.getInteger("code"); if (0 != code) { continue; } JSONObject data = jsonObject.getJSONObject("data"); if (null == data) { continue; } long total = data.getLong("total"); if (total % pageSize == 0) { totalNum = total / pageSize; } else { totalNum = total / pageSize + 1; } JSONArray signFlowInfos = data.getJSONArray("signFlowInfos"); for (int i = 0; i < signFlowInfos.size(); i++) { JSONObject signFlowInfo = signFlowInfos.getJSONObject(i); String signFlowId = signFlowInfo.getString("signFlowId"); String signFlowTitle = signFlowInfo.getString("signFlowTitle"); String sel = "select fid from CT_ESI_ESGSO where CFSignFlowId ='" + signFlowId + "'"; IRowSet rowSet = DbUtil.executeQuery(context, sel); if (rowSet.next()) { String id = rowSet.getString("fid"); updateSignFlow(context, overview, signFlowId, id); } else { if (signFlowTitle.indexOf("人资") < 0 && signFlowTitle.indexOf("人力资源") < 0) { continue; } addNewSignFlow(context, overview, signFlowInfo, signFlowId, signFlowTitle); } } } } catch (EsignException | SQLException e) { e.printStackTrace(); } } while (pageNum < totalNum); return "ok"; } private boolean updateSignFlow(Context context, IESignGlobalStatusOverview overview, String signFlowId, String id) throws BOSException, EASBizException, EsignException, SQLException { ESignGlobalStatusOverviewInfo oldInfo = overview.getESignGlobalStatusOverviewInfo(new ObjectUuidPK(id)); EsignHttpResponse respsf = EsignHttpUtil.getSign_fields(context, signFlowId, "查询签署流程详情"); if (respsf.getStatus() < 200 || respsf.getStatus() >= 300) { return true; } if (StringUtils.isBlank(respsf.getBody())) { return true; } JSONObject jsonObjsf = JSON.parseObject(respsf.getBody()); int codesf = jsonObjsf.getInteger("code"); if (0 != codesf) { return true; } JSONObject datasf = jsonObjsf.getJSONObject("data"); if (null == datasf) { return true; } Integer signFlowStatus = datasf.getInteger("signFlowStatus"); String statusDescription = datasf.getString("statusDescription"); //签署中 if (null != signFlowStatus && 1 == signFlowStatus) { JSONArray signers = datasf.getJSONArray("signers"); StringBuilder signNames = new StringBuilder(); for (int j = 0; j < signers.size(); j++) { JSONObject signer = signers.getJSONObject(j); JSONObject psnSigner = signer.getJSONObject("psnSigner"); JSONObject orgSigner = signer.getJSONObject("orgSigner"); JSONArray signFields = signer.getJSONArray("signFields"); boolean signFieldBool=false; for (int x = 0; x < signFields.size(); x++) { JSONObject sign = signFields.getJSONObject(x); Integer signFieldStatus = Integer.parseInt(sign.getString("signFieldStatus")); //这三种情况的话说明是当前这个签署区所属的签署人在签署:1 - 执行中、2 - 执行失败、3 - 审批中 if (signFieldStatus > 0 && signFieldStatus < 4) { signFieldBool=true; } } oldInfo.setEsignStatus(EsignStatusEnum.getEnum(signFlowStatus)); oldInfo.setDescription(statusDescription); oldInfo.setNowOperator(""); if (signFieldBool) { signNames = getPsnName(context, signNames, psnSigner); signNames = getOrgName(context, signNames, orgSigner); } } if(signNames.indexOf(",") == 0) { signNames.delete(0,1); } if (signNames.length() > 500) { oldInfo.setNowOperator(signNames.substring(0, 500)); } else { oldInfo.setNowOperator(signNames.toString()); } } else { String signFlowDescription = datasf.getString("signFlowDescription"); String revokeReason = datasf.getString("revokeReason"); oldInfo.setNowOperator(""); oldInfo.setDescription(signFlowDescription); oldInfo.setDescription(revokeReason); } overview.save(oldInfo); return false; } private StringBuilder getOrgName(Context context, StringBuilder signNames, JSONObject orgSigner) throws BOSException, SQLException { if (null == orgSigner) { return signNames; } String orgName = orgSigner.getString("orgName"); JSONObject transactor = orgSigner.getJSONObject("transactor"); if (null == transactor) { return signNames; } String psnName = transactor.getString("psnName"); if (StringUtils.isNotBlank(psnName)) { signNames.append("," + orgName + "(" + psnName + ")"); return signNames; } JSONObject psnAccount = transactor.getJSONObject("psnAccount"); if (null == psnAccount) { return signNames; } String accountMobile = psnAccount.getString("accountMobile"); String accountEmail = psnAccount.getString("accountEmail"); if (StringUtils.isNotBlank(accountMobile)) { String selp = "select fid,fname_l2,fnumber from t_bd_person where FNCELL='" + accountMobile + "'"; IRowSet rs = DbUtil.executeQuery(context, selp); if (rs.next()) { String fid = rs.getString("fid"); String fname_l2 = rs.getString("fname_l2"); String fnumber = rs.getString("fnumber"); signNames.append("," + orgName + "(" + fname_l2 + ")"); return signNames; } } if (StringUtils.isNotBlank(accountEmail)) { String selp = "select fid,fname_l2,fnumber from t_bd_person where FEMail='" + accountEmail + "'"; IRowSet rs = DbUtil.executeQuery(context, selp); if (rs.next()) { String fid = rs.getString("fid"); String fname_l2 = rs.getString("fname_l2"); String fnumber = rs.getString("fnumber"); signNames.append("," + orgName + "(" + fname_l2 + ")"); return signNames; } } return signNames; } private StringBuilder getPsnName(Context context, StringBuilder signNames, JSONObject psnSigner) throws BOSException, SQLException { if (null == psnSigner) { return signNames; } String psnName = psnSigner.getString("psnName"); if (StringUtils.isNotBlank(psnName)) { signNames.append("," + psnName); return signNames; } JSONObject psnAccount = psnSigner.getJSONObject("psnAccount"); if (null == psnAccount) { return signNames; } String accountMobile = psnAccount.getString("accountMobile"); String accountEmail = psnAccount.getString("accountEmail"); if (StringUtils.isNotBlank(accountMobile)) { String selp = "select fid,fname_l2,fnumber from t_bd_person where FNCELL='" + accountMobile + "'"; IRowSet rs = DbUtil.executeQuery(context, selp); if (rs.next()) { String fid = rs.getString("fid"); String fname_l2 = rs.getString("fname_l2"); String fnumber = rs.getString("fnumber"); signNames.append("," + fname_l2); return signNames; } } if (StringUtils.isNotBlank(accountEmail)) { String selp = "select fid,fname_l2,fnumber from t_bd_person where FEMail='" + accountEmail + "'"; IRowSet rs = DbUtil.executeQuery(context, selp); if (rs.next()) { String fid = rs.getString("fid"); String fname_l2 = rs.getString("fname_l2"); String fnumber = rs.getString("fnumber"); signNames.append("," + fname_l2); return signNames; } } return signNames; } private void addNewSignFlow(Context context, IESignGlobalStatusOverview overview, JSONObject signFlowInfo, String signFlowId, String signFlowTitle) throws BOSException, SQLException, EASBizException { ESignGlobalStatusOverviewInfo nowInfo = new ESignGlobalStatusOverviewInfo(); nowInfo.setSignFlowId(signFlowId); nowInfo.setFileName(signFlowTitle); nowInfo.setEsignStatus(EsignStatusEnum.COMPLETED); nowInfo.setEsignName(EsignConfigEnum.sign_flow_list); nowInfo.setRequestParams(signFlowInfo.toJSONString()); nowInfo.setFiesign(true); nowInfo.setSendStatus(SendStatusEnum.SUCCESS); JSONArray signers = signFlowInfo.getJSONArray("signers"); for (int x = 0; x < signers.size(); x++) { JSONObject signer = signers.getJSONObject(x); JSONObject psnSigner = signer.getJSONObject("psnSigner"); if (null == psnSigner) { continue; } JSONObject psnAccount = psnSigner.getJSONObject("psnAccount"); String accountMobile = psnAccount.getString("accountMobile"); String accountEmail = psnAccount.getString("accountEmail"); if (StringUtils.isNotBlank(accountMobile)) { String selp = "select fid from t_bd_person where FNCELL='" + accountMobile + "'"; IRowSet rs = DbUtil.executeQuery(context, selp); if (rs.next()) { String fid = rs.getString("fid"); PersonInfo personInfo = new PersonInfo(); personInfo.setId(BOSUuid.read(fid)); nowInfo.setPerson(personInfo); } } else { String selp = "select fid from t_bd_person where FEMail='" + accountEmail + "'"; IRowSet rs = DbUtil.executeQuery(context, selp); if (rs.next()) { String fid = rs.getString("fid"); PersonInfo personInfo = new PersonInfo(); personInfo.setId(BOSUuid.read(fid)); nowInfo.setPerson(personInfo); } } } if (null != nowInfo.getPerson()) { IObjectPK pk = overview.addnew(nowInfo); ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1); scheduledThreadPoolExecutor.schedule(() -> { try { this.updateSignFlow(context, overview, signFlowId, nowInfo.getId().toString()); SyncSignedFilesUtil.syncAttachmentsForEmpPage(context, nowInfo.getId().toString()); } catch (BOSException e) { e.printStackTrace(); } catch (EASBizException e) { e.printStackTrace(); } catch (EsignException e) { e.printStackTrace(); } catch (SQLException throwables) { throwables.printStackTrace(); } }, 1, TimeUnit.MINUTES); } } public static void main(String[] args) throws EsignException { System.setProperty("EAS_HOME","D:\\project\\kingdeeV90\\Project_hty\\tengda"); // LocalDateTime startDateTime = null; // LocalDateTime endDateTime = null; // if (null == startDateTime || null == endDateTime) { // startDateTime = formatter("2025-02-01");; // endDateTime = formatter("2026-02-01");; // } // int pageNum=0; // int pageSize=100; // long totalNum=1; // do { // pageNum++; // Map jsonMap = Maps.newHashMap(); // long signFlowStartTimeFrom = startDateTime.atZone(ZoneId.systemDefault()) // .toInstant() // .toEpochMilli(); // long signFlowStartTimeTo = endDateTime.atZone(ZoneId.systemDefault()) // .toInstant() // .toEpochMilli(); // jsonMap.put("signFlowStartTimeFrom", signFlowStartTimeFrom); // jsonMap.put("signFlowStartTimeTo", signFlowStartTimeTo); // jsonMap.put("pageNum", pageNum); // jsonMap.put("pageSize", pageSize); // List list = Lists.newArrayList(); // list.add("1"); // list.add("2"); // list.add("3"); // jsonMap.put("signFlowStatus", list); // try { // EsignHttpResponse response = EsignHttpUtil.sign_flow_list(null, jsonMap, "查询签署流程列表"); // System.out.println(response.getBody()); // JSONObject jsonObject = JSON.parseObject(response.getBody()); // int code =jsonObject.getInteger("code"); // if (0==code){ // JSONObject data = jsonObject.getJSONObject("data"); // if (null!=data){ // JSONArray signFlowInfos = data.getJSONArray("signFlowInfos"); // System.out.println(signFlowInfos.size()); // long total = data.getLong("total"); // if(total%pageSize==0){ // totalNum=total/pageSize; // }else { // totalNum=total/pageSize+1; // } // } // } // } catch (EsignException e) { // e.printStackTrace(); // } // } while (pageNum