From 49766c770e4708d6c11f288cbc640e5a901b22a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=B4=B5=E5=BC=BA?= Date: Mon, 23 Jun 2025 14:14:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=84=E4=BC=B0=E8=80=83=E5=AF=9F=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E8=87=AA=E5=8A=A8=E6=89=93=E5=88=86=EF=BC=8880%?= =?UTF-8?q?=EF=BC=89=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resm/task/AutomaticScoringTaskPlugin.java | 233 ++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 main/java/shkd/repc/resm/task/AutomaticScoringTaskPlugin.java diff --git a/main/java/shkd/repc/resm/task/AutomaticScoringTaskPlugin.java b/main/java/shkd/repc/resm/task/AutomaticScoringTaskPlugin.java new file mode 100644 index 0000000..4702532 --- /dev/null +++ b/main/java/shkd/repc/resm/task/AutomaticScoringTaskPlugin.java @@ -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 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 pendingRecords = new ArrayList<>(); + List recordIds = Arrays.stream(evalRecords) + .map(record -> record.getLong("id")) + .collect(Collectors.toList()); + + Map 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 pendingRecords = new ArrayList<>(); + List recordIds = Arrays.stream(examRecords) + .map(record -> record.getLong("id")) + .collect(Collectors.toList()); + + Map 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 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); + } + } +} \ No newline at end of file