fix rs 初始化失败

jingwei
youhong.ai 2023-05-30 11:50:41 +08:00
parent a4f9ded450
commit bbcd42e79f
28 changed files with 793 additions and 134 deletions

View File

@ -692,11 +692,13 @@ $(() => {
// 目标字段
targetField: 'htjsrq',
// 日期加月份字段
numberField: 'contractperiod'
numberField: 'contractperiod',
monthBase: 12
}, {
sourceField: 'syqksrq',
targetField: 'syqjsrq',
numberField: 'probationperiod'
numberField: 'probationperiod',
monthBase: 1
}]
runJs();
@ -721,7 +723,8 @@ $(() => {
}, 10)
}
let date = new Date(sourceValue)
date.setMonth(date.getMonth() + +value)
date.setMonth(date.getMonth() + +value * configItem.monthBase)
date.setDate(date.getDate() - 1)
let day = date.getDate();
let month = date.getMonth() + 1;
let year = date.getFullYear();
@ -742,3 +745,45 @@ $(() => {
})
/* ******************* 计算年月日 end ******************* */
/* ******************* 年假计算 start ******************* */
$(() => {
let config = {
// 基础年假
base: 21,
// 入职日期
dateField: 'jrbsjjtsj',
// 年假
targetField: 'nj'
}
runJs()
function runJs() {
WfForm.bindFieldChangeEvent(WfForm.convertFieldNameToId(config.dateField), (obj, id, value) => {
let date = new Date(value)
let nowDate = new Date()
let njValue = calculateBonus(date, nowDate, config)
if (value !== 0) {
WfForm.changeFieldValue(WfForm.convertFieldNameToId(config.targetField), {value: njValue})
}
})
}
function calculateBonus(startDate, endDate, config) {
const diffInMs = endDate.getTime() - startDate.getTime();
const diffInYears = diffInMs / (1000 * 60 * 60 * 24 * 365);
if (diffInYears < 3) {
return 0;
} else if (diffInYears >= 3 && diffInYears < 6) {
return config.base;
} else {
const extraYears = Math.floor((diffInYears - 3) / 3);
return config.base + extraYears * 2;
}
}
})
/* ******************* 年假计算 end ******************* */

View File

@ -71,6 +71,7 @@ import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Matcher;
@ -98,7 +99,7 @@ public class Util extends weaver.general.Util {
public static final char DBC_SBC_STEP = 65248; // 全角半角转换间隔
public static final ExecutorService threadPool = ThreadPoolConfig.createThreadPoolInstance();
public static final String UF_CUS_DEV_CONFIG = "uf_cus_dev_config";
private static final UtilService utilService = new UtilService();
private static UtilService utilService = null;
private static final RecordsetUtil recordsetUtil = new RecordsetUtil();
private static final RecordsetUtil recordsetTransUtil = new RecordsetUtil();
private static final UtilMapper mapper = recordsetUtil.getMapper(UtilMapper.class);
@ -110,12 +111,20 @@ public class Util extends weaver.general.Util {
static {
try {
rs = new RecordSet();
utilService = new UtilService();
} catch (Exception e) {
e.printStackTrace();
new ToolUtil().writeErrorLog("\n初始化RecordSet失败请检查系统是否正常启动\n");
}
}
public static UtilService getUtilService() {
if (utilService == null) {
return new UtilService();
}
return utilService;
}
/**
*
*
@ -1582,12 +1591,12 @@ public class Util extends weaver.general.Util {
public static ApiConfigMainDTO queryApiConfig(String id) {
// System.out.println(JSON.toJSONString(apiConfigMain));
return utilService.getApiConfigMain(id);
return getUtilService().getApiConfigMain(id);
}
public static ApiConfigMainDTO queryApiConfigTree(String id) {
// System.out.println(JSON.toJSONString(apiConfigMain));
return utilService.getApiConfigMainTree(id);
return getUtilService().getApiConfigMainTree(id);
}
public static <T> AZipOutputStream createZip(List<T> inputList) throws IOException {
@ -1711,13 +1720,13 @@ public class Util extends weaver.general.Util {
}
public static Map<String, String> queryLanguage(int groupId, int languageId) {
return utilService.queryLanguage(groupId, languageId);
return getUtilService().queryLanguage(groupId, languageId);
}
public static Map<String, String> queryLanguage(int groupId, HttpServletRequest request, HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
int languageId = user.getLanguage();
return utilService.queryLanguage(groupId, languageId);
return getUtilService().queryLanguage(groupId, languageId);
}
@ -2920,6 +2929,17 @@ public class Util extends weaver.general.Util {
submitWorkflowThread(requestId, userId, remark, 60);
}
/**
* <h2>action</h2>
*
* @param requestId ID
* @param userId id
* @param remark
*/
public static void submitWorkflowThread(Integer requestId, Integer userId, String remark, Consumer<Boolean> callback) {
submitWorkflowThread(requestId, userId, remark, 60, callback);
}
/**
* <h2>action</h2>
*
@ -2929,6 +2949,10 @@ public class Util extends weaver.general.Util {
* @param seconds
*/
public static void submitWorkflowThread(Integer requestId, Integer userId, String remark, int seconds) {
submitWorkflowThread(requestId, userId, remark, seconds, null);
}
public static void submitWorkflowThread(Integer requestId, Integer userId, String remark, int seconds, Consumer<Boolean> callback) {
if (seconds <= 0) {
seconds = 1;
}
@ -2941,7 +2965,9 @@ public class Util extends weaver.general.Util {
Util.getLogger().error("线程休眠失败", e);
}
int n = 0;
while (!Util.submitWorkflow(requestId, userId, remark)) {
log.info("异步提交流程失败,正在进行重试!!");
n++;
try {
Thread.sleep(1000 * 10);
@ -2949,10 +2975,17 @@ public class Util extends weaver.general.Util {
e.printStackTrace();
}
if (n > 5) {
if (callback != null) {
callback.accept(false);
}
Util.getLogger().error("异步流程自动提交失败!");
break;
}
}
log.info("异步提交流程成功!");
if (callback != null) {
callback.accept(true);
}
}).start();
}
@ -4020,8 +4053,8 @@ public class Util extends weaver.general.Util {
return filePath;
}
public static String createTempFile(InputStream inputStream, String imageFileName) {
String filePath = getTempFilePath("ofd", imageFileName);
public static String createTempFile(InputStream inputStream, String imageFileName, String tempDir) {
String filePath = getTempFilePath(tempDir, imageFileName);
try {
writeToFile(inputStream, filePath);
} catch (IOException e) {

View File

@ -14,4 +14,6 @@ import java.lang.annotation.*;
@Documented
public @interface CollectionMethod {
int value();
String desc() default "";
}

View File

@ -42,15 +42,15 @@ public interface OrgChartMapper {
" job.JOBTITLENAME job_title_name, " +
" uftb.$t{parentField} type_of_employment " +
"from hrmresource hrm " +
" inner join hrmjobtitles job on hrm.JOBTITLE = job.id " +
" inner join cus_fielddata cus on cus.ID = hrm.ID " +
" left join hrmjobtitles job on hrm.JOBTITLE = job.id " +
" left join cus_fielddata cus on cus.ID = hrm.ID " +
" and cus.SCOPE = 'HrmCustomFieldByInfoType' " +
" and cus.SCOPEID = 1 " +
" inner join cus_fielddata cus1 on cus1.id = hrm.id" +
" left join cus_fielddata cus1 on cus1.id = hrm.id" +
" and cus1.scope = 'HrmCustomFieldByInfoType' " +
" and cus1.scopeid = -1" +
" inner join hrmdepartment dept on dept.id = hrm.DEPARTMENTID " +
" inner join $t{typeOfEmploymentTable} uftb on uftb.$t{typeOfEmploymentIdField} = cus1.$t{typeOfEmploymentFiled} " +
" left join hrmdepartment dept on dept.id = hrm.DEPARTMENTID " +
" left join $t{typeOfEmploymentTable} uftb on uftb.$t{typeOfEmploymentIdField} = cus1.$t{typeOfEmploymentFiled} " +
"where hrm.status in (0, 1)")
List<HrmResource> selectAll(@ParamMapper("typeOfEmploymentFiled") String typeOfEmploymentField,
@ParamMapper("lastNameEnField") String lastNameEnField,

View File

@ -39,7 +39,8 @@ public class SsoYunZhaoService {
Method method = User.class.getMethod(userCodeMethod);
String value = Util.null2String(method.invoke(user));
long currentTime = System.currentTimeMillis();
String token = this.rsaEncryptedUserInfo(value + "\"" + String.valueOf(currentTime).substring(0, 10));
String str = value + "\"" + String.valueOf(currentTime).substring(0, 10);
String token = this.rsaEncryptedUserInfo(str);
String yunZhaoSsoPathUrl = Util.getCusConfigValue("YunZhaoSSOPathURL");
Assert.notEmpty(yunZhaoSsoPathUrl, "can not find [YunZhaoSSOPathURL] from table [uf_cus_dev_config]");
return yunZhaoSsoPathUrl + URLEncoder.encode(token, "UTF-8");

View File

@ -495,7 +495,7 @@ public class OpenTheBillService {
// 内部领用
// orderUse + " " + shipTo + " " + costCenter + " " + sku
// condition = "订单用途:" + orderUse + " " + "ShipTo" + shipTo + " CostCenter" + costCenter + " sku" + sku;
condition = orderUse + " " + shipTo + "" + costCenter + "" + sku;
condition = "订单用途:" + orderUse + "、" + "shipTo" + shipTo + "、" + "CostCenter" + costCenter + "、" + "sku" + sku;
}
break;
case "1":
@ -504,7 +504,7 @@ public class OpenTheBillService {
// 第三方 + 柜台订单
// orderUse + ":" + shipTo + ":" + sku
// condition = "订单用途:" + orderUse + " " + "ShipTo" + shipTo + " sku" + sku + " 订单分类:" + orderType;
condition = orderUse + "" + shipTo + "" + sku + "" + orderType;
condition = "订单用途:" + orderUse + "、" + "shipTo" + shipTo + "、" + "sku" + sku + "、" + "订单分类" + orderType;
}
break;
default:

View File

@ -0,0 +1,67 @@
package com.customization.youhong.taibao.trisubreq.impl;
import aiyh.utils.Util;
import aiyh.utils.tool.cn.hutool.core.collection.CollectionUtil;
import com.customization.youhong.taibao.trisubreq.impl.entity.SubRequestEntity;
import com.customization.youhong.taibao.trisubreq.impl.entity.SubRequestToDataConfig;
import com.engine.core.cfg.annotation.ServiceDynamicProxy;
import com.engine.core.impl.aop.AbstractServiceProxy;
import com.engine.workflow.service.SubRequestService;
import com.engine.workflow.service.impl.SubRequestServiceImpl;
import org.apache.log4j.Logger;
import weaver.workflow.request.DiffWfTriggerSetting;
import weaver.workflow.request.SameWfTriggerSetting;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <h1></h1>
*
* <p>create: 2023/5/24 22:52</p>
*
* @author youHong.ai
*/
@ServiceDynamicProxy(target = SubRequestServiceImpl.class, desc = "拦截签字意见信息,是否需要隐私控制")
public class TriSubRequestAfterInterceptImpl extends AbstractServiceProxy implements SubRequestService {
private final TriSubRequestAfterMapper mapper = Util.getMapper(TriSubRequestAfterMapper.class);
private final Logger log = Util.getLogger();
@Override
public void triSameSubRequestBefore(int i, List<SameWfTriggerSetting> list) {
}
@Override
public void triDiffSubRequestBefore(int i, List<DiffWfTriggerSetting> list) {
}
@Override
public void triSubRequestAfter(int i) {
List<SubRequestEntity> subRequestEntities = mapper.selectSubRequestByMainRequest(i);
if (CollectionUtil.isEmpty(subRequestEntities)) {
return;
}
List<SubRequestToDataConfig> subRequestToDataConfigs = mapper.selectConfig();
if (CollectionUtil.isEmpty(subRequestToDataConfigs)) {
return;
}
Map<String, SubRequestToDataConfig> collect = subRequestToDataConfigs
.stream()
.collect(
Collectors.toMap(
SubRequestToDataConfig::getWorkflowType,
value -> value
));
for (SubRequestEntity subRequestEntity : subRequestEntities) {
// 查询流程对应的配置信息
String workflowId = subRequestEntity.getWorkflowId();
SubRequestToDataConfig subRequestToDataConfig = collect.get(workflowId);
}
}
}

View File

@ -0,0 +1,79 @@
package com.customization.youhong.taibao.trisubreq.impl;
import aiyh.utils.annotation.recordset.*;
import com.customization.youhong.taibao.trisubreq.impl.entity.SubRequestEntity;
import com.customization.youhong.taibao.trisubreq.impl.entity.SubRequestToDataConfig;
import com.customization.youhong.taibao.trisubreq.impl.entity.SubRequestToDataMapping;
import java.util.List;
/**
* <h1>sql</h1>
*
* <p>create: 2023/5/24 23:09</p>
*
* @author youHong.ai
*/
@SqlMapper
public interface TriSubRequestAfterMapper {
/**
* <h2></h2>
*
* @param mainRequestId
* @return
*/
@Select("select requestid request_id,workflowid workflow_id from " +
"workflow_requestbase where mainrequestid = #{mainRequestId}")
List<SubRequestEntity> selectSubRequestByMainRequest(@ParamMapper("mainRequestId") Integer mainRequestId);
/**
* <h2></h2>
*
* @return
*/
@Select("select * from uf_sub_wf_to_mode")
@Associations({
@Association(
property = "modelTableName",
column = "model_table",
select = "aiyh.utils.mapper.UtilMapper.selectModelTableInfo",
id = @Id(value = Integer.class)
)
})
@CollectionMappings({
@CollectionMapping(
property = "mappings",
column = "id",
id = @Id(value = String.class, methodId = 1)
)
})
List<SubRequestToDataConfig> selectConfig();
/**
* <h2></h2>
*
* @param mainId id
* @return
*/
@CollectionMethod(value = 1, desc = "查询配置表明细信息")
@Select("select * from uf_sub_wf_to_mode_dt1 where mainid = #{mainId}")
@Associations({
@Association(
property = "modelField",
column = "model_field",
select = "aiyh.utils.mapper.UtilMapper.selectFieldInfo",
id = @Id(value = Integer.class)
),
@Association(
property = "workflowField",
column = "workflow_field",
select = "aiyh.utils.mapper.UtilMapper.selectFieldInfo",
id = @Id(value = Integer.class)
)
})
List<SubRequestToDataMapping> selectConfigDt(String mainId);
}

View File

@ -0,0 +1,23 @@
package com.customization.youhong.taibao.trisubreq.impl.entity;
import aiyh.utils.annotation.recordset.SqlOracleDbFieldAnn;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* <h1></h1>
*
* <p>create: 2023/5/24 23:13</p>
*
* @author youHong.ai
*/
@Getter
@Setter
@ToString
public class SubRequestEntity {
@SqlOracleDbFieldAnn("REQUEST_ID")
private String requestId;
@SqlOracleDbFieldAnn("WORKFLOW_ID")
private String workflowId;
}

View File

@ -0,0 +1,36 @@
package com.customization.youhong.taibao.trisubreq.impl.entity;
import aiyh.utils.entity.ModelTableInfo;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.List;
/**
* <h1></h1>
*
* <p>create: 2023/5/29 10:31</p>
*
* @author youHong.ai
*/
@Getter
@Setter
@ToString
public class SubRequestToDataConfig {
private Integer id;
/** 流程 */
private String workflowType;
/** 建模 */
private String modelTable;
/** 更新条件 */
private String conditionUpdate;
/** 建模表 */
private ModelTableInfo modelTableName;
private List<SubRequestToDataMapping> mappings;
}

View File

@ -0,0 +1,29 @@
package com.customization.youhong.taibao.trisubreq.impl.entity;
import aiyh.utils.annotation.recordset.SqlDbFieldAnn;
import aiyh.utils.entity.FieldViewInfo;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* <h1></h1>
*
* <p>create: 2023/5/29 10:37</p>
*
* @author youHong.ai
*/
@Getter
@Setter
@ToString
public class SubRequestToDataMapping {
private Integer id;
@SqlDbFieldAnn("mainid")
private Integer mainId;
/** 建模字段 */
private FieldViewInfo modelField;
/** 流程字段 */
private FieldViewInfo workflowField;
}

View File

@ -687,7 +687,9 @@ public class DealWithMapping extends ToolUtil {
// 数据id
case MAIN_DATA_ID: {
if ("1".equals(childSource)) {
if (Objects.nonNull(detailMap)) {
value = Util.null2String(detailMap.get("id"));
}
} else {
value = Util.null2String(mainMap.get("id"));
}
@ -1006,7 +1008,7 @@ public class DealWithMapping extends ToolUtil {
} else if ("0".equals(childSource)) {
tempValue = Util.null2String(mainMap.get(fieldName));
if ("".equals(tempValue)) {
tempValue = Util.null2String(detailMap.get(fieldNameLower));
tempValue = Util.null2String(mainMap.get(fieldNameLower));
}
} else {
tempValue = Util.null2String(relationRs.getString(fieldName));
@ -1067,7 +1069,7 @@ public class DealWithMapping extends ToolUtil {
} else {
value = Util.null2String(mainMap.get(fieldName));
if ("".equals(value)) {
value = Util.null2String(detailMap.get(fieldNameLower));
value = Util.null2String(mainMap.get(fieldNameLower));
}
}
String fileIds = Util.null2String(value);
@ -1107,7 +1109,7 @@ public class DealWithMapping extends ToolUtil {
} else {
value = Util.null2String(mainMap.get(fieldName));
if ("".equals(value)) {
value = Util.null2String(detailMap.get(fieldNameLower));
value = Util.null2String(mainMap.get(fieldNameLower));
}
}
}

View File

@ -2,10 +2,7 @@ package weaver.youhong.ai.geerde.action.submitfirst;
import aiyh.utils.Util;
import aiyh.utils.action.SafeCusBaseAction;
import aiyh.utils.annotation.ActionDesc;
import aiyh.utils.annotation.ActionOptionalParam;
import aiyh.utils.annotation.PrintParamMark;
import aiyh.utils.annotation.RequiredMark;
import aiyh.utils.annotation.*;
import aiyh.utils.tool.cn.hutool.core.util.StrUtil;
import lombok.Getter;
import lombok.Setter;
@ -14,7 +11,10 @@ import weaver.hrm.User;
import weaver.soa.workflow.request.RequestInfo;
import weaver.youhong.ai.geerde.action.submitfirst.mapper.AutoSubmitFirstMapper;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* <h1></h1>
@ -33,29 +33,92 @@ public class AutoSubmitFirstAction extends SafeCusBaseAction {
@RequiredMark(value = "account", desc = "主表流程经过标识字段,整数或单行文本字段名都可以")
@PrintParamMark
@ActionDefaultTestValue("account")
private String accountField;
@ActionOptionalParam(value = "1", desc = "流程操作人id默认为1-系统管理员")
@PrintParamMark
private String operator = "1";
@Override
private static final Map<String, Integer> oneRequestLock = new ConcurrentHashMap<>();
@Override
@SuppressWarnings("all")
public void doSubmit(String requestId, String billTable,
int workflowId, User user,
RequestInfo requestInfo) {
Map<String, String> mainTableValue = getMainTableValue(requestInfo);
log.info("do submit action!");
if (mainTableValue.containsKey(accountField)) {
if (StrUtil.isNotBlank(mainTableValue.get(accountField))) {
// 如果存在当前流程id的值表示当前action属于锁住状态需要进入线程睡眠等待
if (oneRequestLock.containsKey(requestId)) {
log.info("流程正在异步提交中,使用线程排队");
new Thread(() -> {
log.info("开始异步等待上一个节点提交");
while (oneRequestLock.containsKey(requestId)) {
try {
Thread.sleep(1000L * 60 * oneRequestLock.get(requestId));
} catch (InterruptedException e) {
log.error("线程休眠失败!");
throw new RuntimeException(e);
}
}
log.info("开始提交流程!");
oneRequestLock.put(requestId, 2);
Map<String, Object> mainMap = mapper.selectMainMap(billTable, requestId);
String currentNode = mapper.selectCurrentNodeId(requestId);
if (mainMap.containsKey(accountField)) {
String mark = Util.null2String(mainMap.get(accountField));
String nodesStr = currentNode;
if (StrUtil.isNotBlank(mark)) {
String[] split = mark.split(",");
List<String> nodes = Arrays.asList(split);
if (nodes.contains(currentNode)) {
return;
}
String creatorId = requestInfo.getCreatorid();
mapper.updateMark(billTable, accountField, "1",
nodesStr += "," + Util.join(nodes, ",");
}
int creatorId = requestInfo.getRequestManager().getCreater();
String finalNodesStr = nodesStr;
Util.submitWorkflowThread(Integer.parseInt(requestId), creatorId,
"", 60, flag -> {
oneRequestLock.remove(requestId);
if (flag) {
mapper.updateMark(billTable, accountField, finalNodesStr,
Util.null2String(mainMap.get("id")));
}
});
}
}).start();
return;
}
// 如果没有锁住,异步延时提交,延时3分钟
log.info("没有锁住流程,开始异步提交流程");
oneRequestLock.put(requestId, 2);
Map<String, String> mainTableValue = getMainTableValue(requestInfo);
String currentNode = mapper.selectCurrentNodeId(requestId);
int creatorId = requestInfo.getRequestManager().getCreater();
// 判断是否存在统计字段
if (mainTableValue.containsKey(accountField)) {
// 获取统计字段的值
String mark = mainTableValue.get(accountField);
String nodesStr = currentNode;
if (StrUtil.isNotBlank(mark)) {
String[] split = mark.split(",");
List<String> nodes = Arrays.asList(split);
if (nodes.contains(currentNode)) {
return;
}
nodesStr += "," + Util.join(nodes, ",");
}
String finalNodesStr = nodesStr;
Util.submitWorkflowThread(Integer.parseInt(requestId), creatorId,
"", 60, flag -> {
oneRequestLock.remove(requestId);
if (flag) {
log.info("异步提交流程完成!");
// 提交成功,更新标识
mapper.updateMark(billTable, accountField, finalNodesStr,
mainTableValue.get("id"));
Util.submitWorkflowThread(Integer.parseInt(requestId), Integer.parseInt(creatorId),
"");
}
});
}
}
}

View File

@ -1,9 +1,12 @@
package weaver.youhong.ai.geerde.action.submitfirst.mapper;
import aiyh.utils.annotation.recordset.ParamMapper;
import aiyh.utils.annotation.recordset.Select;
import aiyh.utils.annotation.recordset.SqlMapper;
import aiyh.utils.annotation.recordset.Update;
import java.util.Map;
/**
* <h1></h1>
*
@ -19,4 +22,12 @@ public interface AutoSubmitFirstMapper {
@ParamMapper("fieldName") String fieldName,
@ParamMapper("value") String value,
@ParamMapper("id") String id);
@Select("select * from $t{tableName} where requestid = #{requestId}")
Map<String, Object> selectMainMap(@ParamMapper("tableName") String tableName, @ParamMapper("requestId") String requestId);
@Select("select currentnodeid from workflow_requestbase where requestid = #{requestId}")
String selectCurrentNodeId(@ParamMapper("requestId") String requestId);
}

View File

@ -20,8 +20,10 @@ import javax.ws.rs.core.MediaType;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URLDecoder;
import java.util.Base64;
import java.util.Map;
import java.util.Objects;
/**
* <h1>ca</h1>
@ -88,6 +90,10 @@ public class CaElectronicSignatureAction extends SafeCusBaseAction {
}
Map<String, Object> responseMap = responeVo.getResponseMap();
Map<String, Object> data = (Map<String, Object>) responseMap.get("data");
if (Objects.isNull(data)) {
Util.actionFail(requestInfo.getRequestManager(), URLDecoder.decode(Util.null2String(responseMap.get("ret_msg")), "UTF-8"));
return;
}
String documentNo = Util.null2String(data.get("document_no"));
String pdf = Util.null2String(data.get("ofd"));
InputStream inputStream = base64ContentToFile(pdf);

View File

@ -10,6 +10,8 @@ import weaver.xiao.commons.config.interfacies.CusInterfaceGetValue;
import weaver.youhong.ai.intellectualproperty.util.OFDReader;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
@ -26,26 +28,29 @@ public class GetOfdKeywordPageValue implements CusInterfaceGetValue {
@Override
public Object execute(Map<String, Object> mainMap, Map<String, Object> detailMap, String currentValue, Map<String, String> pathParam) {
try {
DocImageInfo docImageInfo = Util.selectImageInfoByDocId(currentValue);
InputStream inputStream = ImageFileManager.getInputStreamById(docImageInfo.getImageFileId());
String filePath = Util.createTempFile(inputStream, docImageInfo.getImageFileName());
String filePath = Util.createTempFile(inputStream, docImageInfo.getImageFileName(), "ofd");
String keywordType = pathParam.get("keywordType");
String keywordValue = "";
String keyword = pathParam.get("keyword");
if (StrUtil.isNotBlank(keywordType)) {
if ("1".equals(keywordType)) {
keywordValue = Util.null2String(mainMap.get(keyword));
} else {
keywordValue = keyword;
}
} else {
keywordValue = keyword;
}
OFDReader reader = new OFDReader(filePath, keywordValue);
List<OFDReader.KeywordInfo> keywordInfos = reader.findKeywords();
List<OFDReader.KeywordInfoRange> keywordInfos = reader.findKeywords();
Files.delete(Paths.get(filePath));
if (keywordInfos.isEmpty()) {
throw new CustomerException("关键字定位异常!未找到关键字");
} else {
return keywordInfos.get(0).getPageNumber();
String pageNumber = keywordInfos.get(keywordInfos.size() - 1).getStart().getPageNumber();
return Integer.parseInt(pageNumber) + 1;
}
} catch (Exception e) {
log.error("关键字定位异常: " + Util.getErrString(e));

View File

@ -24,7 +24,7 @@ public class OFDReader {
this.keyword = keyword;
}
public List<KeywordInfo> findKeywords() throws Exception {
public List<KeywordInfoRange> findKeywords() throws Exception {
// 解析OFD.xml文件获取OFD的根目录路径
String rootDirPath = parseOFDXmlAndGetRootDirPath();
if (rootDirPath == null) {
@ -41,9 +41,9 @@ public class OFDReader {
}
// 查找所有关键字的位置信息
List<KeywordInfo> result = new ArrayList<>();
List<KeywordInfoRange> result = new ArrayList<>();
for (String pageFolder : pageFolders) {
KeywordInfo keywordInfo = findKeywordInPage(zipFile, pageFolder);
KeywordInfoRange keywordInfo = findKeywordInPage(zipFile, pageFolder);
if (keywordInfo != null) {
result.add(keywordInfo);
}
@ -78,10 +78,11 @@ public class OFDReader {
private List<String> getPageFolders(ZipFile zipFile, String rootDirPath) {
List<String> pageFolders = new ArrayList<>();
String pagesDirPath = rootDirPath + "/Pages/";
String pagesPrefix = pagesDirPath + "Page_";
String pagesSuffix = "Content.xml";
// 遍历OFD文件中所有的ZipEntry对象查找所有页面文件夹
zipFile.stream().forEach(entry -> {
if (entry.getName().startsWith(pagesDirPath) && entry.isDirectory() && !entry.getName().equals(pagesDirPath)) {
if (entry.getName().startsWith(pagesDirPath) && entry.getName().startsWith(pagesPrefix) && entry.getName().endsWith(pagesSuffix) && !entry.getName().equals(pagesDirPath)) {
pageFolders.add(entry.getName());
}
});
@ -90,34 +91,71 @@ public class OFDReader {
}
// 在指定页面中查找关键字
private KeywordInfo findKeywordInPage(ZipFile zipFile, String pageFolder) throws Exception {
ZipEntry contentXmlEntry = zipFile.getEntry(pageFolder + "Content.xml");
private KeywordInfoRange findKeywordInPage(ZipFile zipFile, String pageFolder) throws Exception {
ZipEntry contentXmlEntry = zipFile.getEntry(pageFolder);
InputStream inputStream = zipFile.getInputStream(contentXmlEntry);
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream);
NodeList textNodes = doc.getElementsByTagName("ofd:TextObject");
int startK = 0;
List<KeywordInfo> keywordInfos = new ArrayList<>();
for (int i = 0; i < textNodes.getLength(); i++) {
Node textNode = textNodes.item(i);
String textContent = textNode.getTextContent();
if (textContent.contains(keyword)) {
char[] chars = textContent.toCharArray();
char[] keywordChars = keyword.toCharArray();
for (int j = 0; j < chars.length; j++) {
for (int k = startK; k < keywordChars.length; k++) {
char contentChar = chars[j];
char keywordChar = keywordChars[k];
if (contentChar == keywordChar) {
j++;
if (j == chars.length) {
startK = j;
Node boundaryNode = textNode.getAttributes().getNamedItem("Boundary");
String boundary = boundaryNode.getNodeValue();
String[] boundarySegments = boundary.split(" ");
double x = Double.parseDouble(boundarySegments[0]);
double y = Double.parseDouble(boundarySegments[1]);
double width = Double.parseDouble(boundarySegments[2]);
double height = Double.parseDouble(boundarySegments[3]);
KeywordInfo keywordInfo = new KeywordInfo(pageFolder, x, y, width, height);
return keywordInfo;
keywordInfos.add(keywordInfo);
break;
}
} else {
startK = 0;
keywordInfos.clear();
break;
}
}
}
}
if (keywordInfos.isEmpty()) {
return null;
}
return new KeywordInfoRange(keywordInfos.get(0), keywordInfos.get(keywordInfos.size() - 1));
}
public static class KeywordInfoRange {
private final KeywordInfo start;
private final KeywordInfo end;
public KeywordInfoRange(KeywordInfo start, KeywordInfo end) {
this.start = start;
this.end = end;
}
public KeywordInfo getStart() {
return start;
}
public KeywordInfo getEnd() {
return end;
}
}
public static class KeywordInfo {
private final String pageFolder;
@ -126,6 +164,7 @@ public class OFDReader {
private final double width;
private final double height;
public KeywordInfo(String pageFolder, double x, double y, double width, double height) {
this.pageFolder = pageFolder;
this.x = x;
@ -135,7 +174,7 @@ public class OFDReader {
}
public String getPageNumber() {
int pageNumber = Integer.parseInt(pageFolder.substring(pageFolder.lastIndexOf('_') + 1, pageFolder.length() - 1));
int pageNumber = Integer.parseInt(pageFolder.substring(pageFolder.lastIndexOf('_') + 1, pageFolder.length() - "/Content.xml".length()));
return String.valueOf(pageNumber);
}

View File

@ -0,0 +1,119 @@
package weaver.youhong.ai.pcn.actioin.doctoavatar;
import aiyh.utils.Util;
import aiyh.utils.action.SafeCusBaseAction;
import aiyh.utils.annotation.ActionDesc;
import aiyh.utils.annotation.PrintParamMark;
import aiyh.utils.annotation.RequiredMark;
import aiyh.utils.entity.DocImageInfo;
import aiyh.utils.excention.CustomerException;
import aiyh.utils.tool.cn.hutool.core.util.IdUtil;
import com.weaver.esb.server.cache.ResourceComInfo;
import lombok.Getter;
import lombok.Setter;
import weaver.file.ImageFileManager;
import weaver.general.GCONST;
import weaver.hrm.User;
import weaver.soa.workflow.request.RequestInfo;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.Map;
import java.util.Objects;
/**
* <h1></h1>
*
* <p>create: 2023/5/29 17:40</p>
*
* @author youHong.ai
*/
@ActionDesc(value = "生成头像", author = "youhong.ai")
@Getter
@Setter
public class DocToAvatarAction extends SafeCusBaseAction {
@PrintParamMark
@RequiredMark(value = "sctxzp", desc = "上传头像的字段名称")
private String iconDocField;
@RequiredMark(value = "dqyh", desc = "上传头像的字段名称")
@PrintParamMark
private String userField;
private final DocToAvatarActionMapper mapper = Util.getMapper(DocToAvatarActionMapper.class);
@Override
public void doSubmit(String requestId, String billTable, int workflowId, User user, RequestInfo requestInfo) {
Map<String, String> mainTable = getMainTableValue(requestInfo);
String docIds = "";
if (mainTable.containsKey(iconDocField)) {
docIds = mainTable.get(iconDocField);
}
String[] docArr = docIds.split(",");
if (docArr.length == 0) {
return;
}
String avatarDoc = docArr[0];
DocImageInfo docImageInfo = Util.selectImageInfoByDocId(avatarDoc);
if (Objects.isNull(docImageInfo)) {
return;
}
InputStream inputStreamById = ImageFileManager.getInputStreamById(docImageInfo.getImageFileId());
String avatarPath = GCONST.getRootPath();
if (avatarPath.endsWith(File.separator)) {
avatarPath += File.separator;
}
String uuid = IdUtil.randomUUID();
String imgName = docImageInfo.getImageFileName();
int dotIndex = imgName.lastIndexOf(".");
if (dotIndex > 0) {
String extension = imgName.substring(dotIndex + 1);
long time = System.currentTimeMillis();
String imageFileName = "/messager/usericon/" + uuid + "-" + time + "." + extension;
avatarPath += "messager" + File.separator + "usericon" + File.separator;
File imageFile = new File(avatarPath + uuid + "-" + time + "." + extension);
if (!imageFile.getParentFile().exists()) {
imageFile.getParentFile().mkdirs();
}
OutputStream os = null;
try {
os = Files.newOutputStream(imageFile.toPath());
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStreamById.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
log.info("写入头像文件失败!" + Util.getErrString(e));
throw new CustomerException("头像生成失败!");
} finally {
try {
if (inputStreamById != null) {
inputStreamById.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
log.info("关闭文件流失败!!" + Util.getErrString(e));
}
}
if (mainTable.containsKey(userField)) {
String currentUser = mainTable.get(userField);
if (!mapper.updateAvatar(currentUser, imageFileName, docImageInfo.getImageFileId())) {
log.info("头像更新失败sql出错");
} else {
ResourceComInfo rsc = new ResourceComInfo();
rsc.removeCache();
}
}
}
}
}

View File

@ -0,0 +1,29 @@
package weaver.youhong.ai.pcn.actioin.doctoavatar;
import aiyh.utils.annotation.recordset.ParamMapper;
import aiyh.utils.annotation.recordset.SqlMapper;
import aiyh.utils.annotation.recordset.Update;
/**
* <h1></h1>
*
* <p>create: 2023/5/29 18:02</p>
*
* @author youHong.ai
*/
@SqlMapper
public interface DocToAvatarActionMapper {
/**
* <h2></h2>
*
* @param currentUser
* @param avatarImg
* @return
*/
@Update("update hrmresource set messagerurl = #{avatarImg},resourceimageid = #{imageId} where id = #{currentUser}")
boolean updateAvatar(@ParamMapper("currentUser") String currentUser,
@ParamMapper("avatarImg") String avatarImg,
@ParamMapper("imageId") Integer imgId);
}

View File

@ -1 +1 @@
yunzhao.environment=test
yunzhao.environment=pro

View File

@ -15,7 +15,6 @@ import org.h2.util.StringUtils;
import weaver.aiyh_pcn.common_fadada.entity.CreateFileEntity;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@ -36,6 +35,10 @@ public class FaRequestUtils {
private final static Logger log = Util.getLogger();
static {
init();
}
public static void init() {
try {
String appId = TOOL_UTIL.getSystemParamValue("FDD_appId");
if (StringUtils.isNullOrEmpty(appId)) {
@ -256,6 +259,7 @@ public class FaRequestUtils {
* @return
*/
private static String builderSign(Object data) {
init();
HEADER.put("timestamp", Util.getTime("yyyy-MM-dd HH:mm:ss"));
HEADER.put("bizContent", builderBizContent(data));
String signStr = "appId=" + HEADER.get("appId") +
@ -319,12 +323,12 @@ public class FaRequestUtils {
log.info("排序后json编码" + bizContent);
// 将 JSON 字符串内特殊字符进行编码
bizContent = cn.hutool.core.util.URLUtil.encodeAll(bizContent,
Charset.forName("UTF-8"));
StandardCharsets.UTF_8);
log.info("bizContent进行JSON编码后URLEncoder编码" + bizContent);
// 将编码后的 JSON 字符串进行 base64 加密
bizContent =
cn.hutool.core.codec.Base64.encode(cn.hutool.core.util.StrUtil.bytes(bizContent,
Charset.forName("UTF-8")));
StandardCharsets.UTF_8));
log.info("bizContent进行JSON编码后URLEncoder编码后进行base64编码" + bizContent);
return bizContent;

View File

@ -0,0 +1,30 @@
package youhong.ai.geerde;
import aiyh.utils.Util;
import basetest.BaseTest;
import org.junit.Test;
import weaver.youhong.ai.geerde.action.submitfirst.AutoSubmitFirstAction;
/**
* <h1></h1>
*
* <p>create: 2023/5/25 11:21</p>
*
* @author youHong.ai
*/
public class GeerdeTest extends BaseTest {
@Test
public void testAvtion() {
Util.actionTest(AutoSubmitFirstAction.class, 522529);
Util.actionTest(AutoSubmitFirstAction.class, 522529);
while (true) {
}
}
@Test
public void test() {
Util.submitWorkflow(522524, 1, "");
}
}

View File

@ -0,0 +1,26 @@
package youhong.ai.pcn;
import basetest.BaseTest;
import com.api.youhong.ai.pcn.ssoyunzhao.service.SsoYunZhaoService;
import org.junit.Test;
import weaver.hrm.User;
/**
* <h1>test</h1>
*
* <p>create: 2023/5/24 15:22</p>
*
* @author youHong.ai
*/
public class Test01 extends BaseTest {
@Test
public void testst() throws Exception {
SsoYunZhaoService service = new SsoYunZhaoService();
String redirectPath = service.getRedirectPath(new User(23));
System.out.println(redirectPath);
System.out.println(service.rsaDecryptUserInfo("EpPlcAYvNOFfJWHBuvLkWzkTOoEk3NoO95FoRlEJTGlblyBEYV0CQWnCDd4yXDCgcR1yhaig/5NrIZ5dGTTgwZ6f0fOfVDdnFPr5/GUUzxxsW8qpdHLIswFT1O4E57ny1Df6uxPaE5Hqp3QHvGkfUo4ak2mI0D11V7XzxGmVsSqoofdrCVXJIRrTkUHJ3OSxtQtkuxHcc0ivSAtJkWtdgnxRbmCvMMuPKELAq/cxqPfRSAf/sL/SI374DqlYnZDn/BCVA9Ab9TC/9g08QHSlGP+XV/CySecV5Z8bILCTV8bzcgMUznQSTuyIastzMHWLtcJ2zr4gE8jR393vRtAI9A=="));
}
}

View File

@ -12,7 +12,7 @@ import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Test;
import weaver.youhong.ai.geerde.action.submitfirst.AutoSubmitFirstAction;
import weaver.youhong.ai.pcn.actioin.doctoavatar.DocToAvatarAction;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
@ -95,7 +95,7 @@ public class GenericTest extends BaseTest {
@Test
public void testGre() {
GenerateFileUtil.createActionDocument(AutoSubmitFirstAction.class);
GenerateFileUtil.createActionDocument(DocToAvatarAction.class);
}

View File

@ -75,10 +75,12 @@ public class OFDReader {
private List<String> getPageFolders(ZipFile zipFile, String rootDirPath) {
List<String> pageFolders = new ArrayList<>();
String pagesDirPath = rootDirPath + "/Pages/";
String pagesPrefix = pagesDirPath + "Page_";
String pagesSuffix = "Content.xml";
// 遍历OFD文件中所有的ZipEntry对象查找所有页面文件夹
zipFile.stream().forEach(entry -> {
if (entry.getName().startsWith(pagesDirPath) && entry.isDirectory() && !entry.getName().equals(pagesDirPath)) {
if (entry.getName().startsWith(pagesDirPath) && entry.getName().startsWith(pagesPrefix) && entry.getName().endsWith(pagesSuffix) && !entry.getName().equals(pagesDirPath)) {
pageFolders.add(entry.getName());
}
});
@ -88,7 +90,7 @@ public class OFDReader {
// 在指定页面中查找关键字
private KeywordInfo findKeywordInPage(ZipFile zipFile, String pageFolder) throws Exception {
ZipEntry contentXmlEntry = zipFile.getEntry(pageFolder + "Content.xml");
ZipEntry contentXmlEntry = zipFile.getEntry(pageFolder);
InputStream inputStream = zipFile.getInputStream(contentXmlEntry);
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream);
@ -117,8 +119,8 @@ public class OFDReader {
}
public static void main(String[] args) {
String filePath = "/Users/aoey.oct.22/Downloads/测试.ofd";
String keyword = "签章位置";
String filePath = "/Users/aoey.oct.22/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/44e92f459afe6c0b31d119efb268a257/Message/MessageTemp/65ac172b9cb23c7967462468b4b5be81/File/测试文档01 (1).ofd";
String keyword = "签章位置001";
OFDReader reader = new OFDReader(filePath, keyword);
@ -154,7 +156,7 @@ public class OFDReader {
}
public String getPageNumber() {
int pageNumber = Integer.parseInt(pageFolder.substring(pageFolder.lastIndexOf('_') + 1, pageFolder.length() - 1));
int pageNumber = Integer.parseInt(pageFolder.substring(pageFolder.lastIndexOf('_') + 1, pageFolder.length() - "/Content.xml".length()));
return String.valueOf(pageNumber);
}

View File

@ -9,6 +9,7 @@ import com.api.youhong.ai.zhishichanquan.ssocaiwu.util.AES;
import org.junit.Test;
import weaver.xiao.commons.config.interfacies.CusInterfaceGetValue;
import weaver.xiao.commons.config.service.DealWithMapping;
import weaver.youhong.ai.intellectualproperty.util.OFDReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@ -32,10 +33,17 @@ public class PDFODFTest extends BaseTest {
@Test
public void testOfdKeyword() throws IOException {
List<PdfPointItem> pointItemList = PdfUtil.findKeywordPoints(Files.newInputStream(Paths.get("/Users/aoey.oct.22/Downloads/测试.ofd")), "签章位置");
List<PdfPointItem> pointItemList = PdfUtil.findKeywordPoints(Files.newInputStream(Paths.get("/Users/aoey.oct.22/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/44e92f459afe6c0b31d119efb268a257/Message/MessageTemp/65ac172b9cb23c7967462468b4b5be81/File/测试文档01 (1).ofd")), "签章位置");
System.out.println(JSON.toJSONString(pointItemList));
}
@Test
public void tesetOfdKeyWorkdasdf() throws Exception {
weaver.youhong.ai.intellectualproperty.util.OFDReader reader = new OFDReader("/Users/aoey.oct.22/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/44e92f459afe6c0b31d119efb268a257/Message/MessageTemp/65ac172b9cb23c7967462468b4b5be81/File/1684915381834-ofd-4e579378-0925-43b3-9f89-89b661772521测试文档01.ofd", "签章位置001");
System.out.println(JSON.toJSONString(reader.findKeywords()));
}
@Test
public void teest() throws ClassNotFoundException {
Map<String, String> stringStringMap = Util.parseCusInterfacePathParam("weaver.youhong.ai.intellectualproperty.cusgetvalue.GetOfdKeywordPageValue?keywordType=0&keyword=电子签章001");