评估考察过期自动打分(80%)提交

This commit is contained in:
李贵强 2025-06-23 14:14:18 +08:00
parent c1f8d27004
commit 49766c770e
1 changed files with 233 additions and 0 deletions

View File

@ -0,0 +1,233 @@
package shkd.repc.resm.task;
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.OperationResult;
import kd.bos.exception.KDException;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.schedule.api.MessageHandler;
import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.OperationServiceHelper;
import kd.sdk.plugin.Plugin;
import oracle.jdbc.driver.DatabaseError;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/**
* 评估考察过期自动打分80%提交
*/
public class AutomaticScoringTaskPlugin extends AbstractTask implements Plugin {
private static final Log logger = LogFactory.getLog(AutomaticScoringTaskPlugin.class);
// 我的评估
private static final String MY_EVAL = "resm_myeval_new";
// 我的考察
private static final String MY_EXAM = "resm_myexam";
// 默认评分比例
private static final BigDecimal DEFAULT_SCORE_RATIO = new BigDecimal("0.8");
@Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
try {
logger.info("开始执行评估考察过期自动打分任务");
// 查询过期的我的评估||我的考察
Date currentDate = new Date();
QFilter qFilter = new QFilter("billstatus", QCP.equals, "A");
qFilter.and(new QFilter("evalenddate", QCP.less_than, currentDate));
logger.debug("构建查询条件: " + qFilter.toString());
// 处理我的评估
processMyEval(qFilter);
// 处理我的考察
processMyExam(qFilter);
logger.info("评估考察过期自动打分任务执行完成");
} catch (Exception e) {
logger.error("执行评估考察过期自动打分任务时发生异常", e);
}
}
/**
* 我的评估处理
* @param qFilter
*/
private void processMyEval(QFilter qFilter) {
logger.info("开始处理我的评估数据");
DynamicObject[] evalRecords = BusinessDataServiceHelper.load(MY_EVAL, "id", qFilter.toArray());
if (evalRecords.length == 0) {
logger.info("没有找到符合条件的我的评估记录");
return;
}
logger.info("找到" + evalRecords.length + "条待处理的我的评估记录");
List<DynamicObject> pendingRecords = new ArrayList<>();
List<Long> recordIds = Arrays.stream(evalRecords)
.map(record -> record.getLong("id"))
.collect(Collectors.toList());
Map<Object, DynamicObject> evalMap = BusinessDataServiceHelper.loadFromCache(recordIds.toArray(), MY_EVAL);
for (DynamicObject evalRecord : evalMap.values()) {
try {
DynamicObjectCollection scoreEntries = evalRecord.getDynamicObjectCollection("entry_stadardscore");
if (scoreEntries != null && !scoreEntries.isEmpty()) {
boolean hasUpdate = false;
for (DynamicObject scoreEntry : scoreEntries) {
BigDecimal inputScore = scoreEntry.getBigDecimal("std_inputscore");
if (inputScore != null && inputScore.compareTo(BigDecimal.ZERO) == 0) {
BigDecimal standardScore = scoreEntry.getBigDecimal("std_standardscore");
if (standardScore != null && standardScore.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal autoScore = calculateAutoScore(standardScore);
scoreEntry.set("std_inputscore", autoScore);
hasUpdate = true;
logger.debug(String.format(
"评估ID[%s]自动打分: 标准分=%s, 自动分=%s",
evalRecord.getLong("id"),
standardScore,
autoScore
));
}
}
}
if (hasUpdate) {
pendingRecords.add(evalRecord);
}
}
} catch (Exception e) {
logger.error("处理评估记录[" + evalRecord.getLong("id") + "]时发生异常", e);
}
}
if (!pendingRecords.isEmpty()) {
logger.info("准备处理" + pendingRecords.size() + "条更新的评估记录");
operationalProcessing(pendingRecords, MY_EVAL);
} else {
logger.info("没有需要更新的评估记录");
}
}
/**
* 我的考察处理
* @param qFilter
*/
private void processMyExam(QFilter qFilter) {
logger.info("开始处理我的考察数据");
DynamicObject[] examRecords = BusinessDataServiceHelper.load(MY_EXAM, "id", qFilter.toArray());
if (examRecords.length == 0) {
logger.info("没有找到符合条件的我的考察记录");
return;
}
logger.info("找到" + examRecords.length + "条待处理的我的考察记录");
List<DynamicObject> pendingRecords = new ArrayList<>();
List<Long> recordIds = Arrays.stream(examRecords)
.map(record -> record.getLong("id"))
.collect(Collectors.toList());
Map<Object, DynamicObject> examMap = BusinessDataServiceHelper.loadFromCache(recordIds.toArray(), MY_EXAM);
for (DynamicObject examRecord : examMap.values()) {
try {
DynamicObjectCollection scoreEntries = examRecord.getDynamicObjectCollection("entry_evalscore");
if (scoreEntries != null && !scoreEntries.isEmpty()) {
boolean hasUpdate = false;
for (DynamicObject scoreEntry : scoreEntries) {
BigDecimal inputScore = scoreEntry.getBigDecimal("inputscore");
if (inputScore != null && inputScore.compareTo(BigDecimal.ZERO) == 0) {
BigDecimal standardScore = scoreEntry.getBigDecimal("standardscore");
if (standardScore != null && standardScore.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal autoScore = calculateAutoScore(standardScore);
scoreEntry.set("inputscore", autoScore);
hasUpdate = true;
logger.debug(String.format(
"考察ID[%s]自动打分: 标准分=%s, 自动分=%s",
examRecord.getLong("id"),
standardScore,
autoScore
));
}
}
}
if (hasUpdate) {
pendingRecords.add(examRecord);
}
}
} catch (Exception e) {
logger.error("处理考察记录[" + examRecord.getLong("id") + "]时发生异常", e);
}
}
if (!pendingRecords.isEmpty()) {
logger.info("准备处理" + pendingRecords.size() + "条更新的考察记录");
operationalProcessing(pendingRecords, MY_EXAM);
} else {
logger.info("没有需要更新的考察记录");
}
}
/**
* 计算公式
* @param standardScore 标准分
* @return 分数
*/
private BigDecimal calculateAutoScore(BigDecimal standardScore) {
return standardScore.multiply(DEFAULT_SCORE_RATIO)
.setScale(0, RoundingMode.HALF_UP);
}
/**
* 操作处理
* @param pendingRecords 待处理数据
* @param entityName 单据标识
*/
private void operationalProcessing(List<DynamicObject> pendingRecords, String entityName) {
try {
logger.info("开始处理" + entityName + "" + pendingRecords.size() + "条记录");
OperateOption option = OperateOption.create();
DynamicObject[] recordsArray = pendingRecords.toArray(new DynamicObject[0]);
// 保存记录
OperationResult saveResult = OperationServiceHelper.executeOperate("save", entityName, recordsArray, option);
if (saveResult.isSuccess()) {
logger.info("保存" + entityName + "记录成功,共" + pendingRecords.size() + "");
// 提交记录
OperationResult submitResult = OperationServiceHelper.executeOperate("submit", entityName, recordsArray, option);
if (submitResult.isSuccess()) {
logger.info("提交" + entityName + "记录成功,共" + pendingRecords.size() + "");
} else {
logger.error("提交" + entityName + "记录失败: " + submitResult.getMessage());
}
} else {
logger.error("保存" + entityName + "记录失败: " + saveResult.getMessage());
}
} catch (Exception e) {
logger.error("处理" + entityName + "记录时发生异常", e);
}
}
}