Explorar o código

1.年度复制额度任务:次年复制前一年全部额度,生成新年额度数据。

lisheng hai 4 días
pai
achega
5a544807ae

+ 144 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/task/PersonReimYearQuotaCopyTask.java

@@ -0,0 +1,144 @@
+package nckd.jimin.jyyy.fi.task;
+
+import com.google.common.collect.Lists;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.exception.KDBizException;
+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.StopTask;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.bos.util.StringUtils;
+import nckd.jimin.jyyy.fi.common.constant.BillTypeConstants;
+import nckd.jimin.jyyy.fi.common.util.CommonUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 年度个人额度复制功能
+ */
+public class PersonReimYearQuotaCopyTask extends AbstractTask implements StopTask {
+    private static final Log logger = LogFactory.getLog(PersonReimYearQuotaCopyTask.class);
+    private static final String YEAR = "year";
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        copyYearData(map);
+    }
+
+    /**
+     * 年度个人额度复制功能
+     * @param map
+     */
+    protected void copyYearData(Map<String, Object> map){
+        logger.info("PersonReimYearCopyTask_begin");
+        int year = getYear(map);
+
+        // 复制的到第二年
+        int copyYear = year + 1;
+
+        // 查询去年的个人额度信息
+
+        List<Object> copyDataId = QueryServiceHelper.query(BillTypeConstants.ER_REIMBURSEAMOUNT, "id", new QFilter[]{
+                new QFilter("dateyear", QCP.equals, String.valueOf(year)),
+                new QFilter("auditstatus", QCP.equals, "1")
+        }).stream().map(r -> r.get("id")).collect(Collectors.toList());
+        logger.info("PersonReimYearCopyTask copyDataId size : " + copyDataId.size());
+        // 分批
+        List<List<Object>> partition = Lists.partition(copyDataId, 100);
+        List<String> failBillSet = new ArrayList<>();
+        for(List<Object> patchIdList : partition){
+
+            // 查询已经生成的数据
+            Set<Object> hasCreateIdSet = QueryServiceHelper.query(BillTypeConstants.ER_REIMBURSEAMOUNT, "nckd_sourcebillid", new QFilter[]{
+                    new QFilter("dateyear", QCP.equals, String.valueOf(copyYear)),
+                    new QFilter("nckd_sourcetype", QCP.equals, "yearcopy"),
+                    new QFilter("nckd_sourcebillid", QCP.in, patchIdList),
+            }).stream().map(r -> r.get("nckd_sourcebillid")).collect(Collectors.toSet());
+
+            // 移除
+            patchIdList.removeIf(r -> hasCreateIdSet.contains(r));
+
+            DynamicObject[] copyDataList = BusinessDataServiceHelper.load(patchIdList.toArray(), EntityMetadataCache.getDataEntityType(BillTypeConstants.ER_REIMBURSEAMOUNT));
+            for(DynamicObject reimburseQuota : copyDataList){
+                String reimPerson = "";
+                try{
+                    reimPerson = reimburseQuota.getDynamicObject("employee").getString("number");
+                    saveQuotaData(reimburseQuota,copyYear);
+                }catch (Exception e){
+                    failBillSet.add(reimPerson);
+                    logger.error(String.format("【%s】的个人额度同步失败", reimPerson ), e);
+                }
+            }
+        }
+        logger.info(String.format("失败的单据条数为:%s,请monitor检查失败原因后,在任务中重试。",failBillSet.size()));
+    }
+
+    private void saveQuotaData(DynamicObject reimburseQuota , int dateYear) {
+
+        Date now = new Date();
+        long currentUserId = UserServiceHelper.getCurrentUserId();
+        DynamicObject remiQuota = BusinessDataServiceHelper.newDynamicObject(BillTypeConstants.ER_REIMBURSEAMOUNT);
+        remiQuota.set("company", reimburseQuota.get("company"));
+        remiQuota.set("expenseitem", reimburseQuota.get("expenseitem"));
+        remiQuota.set("currency", reimburseQuota.get("currency"));
+        remiQuota.set("dateyear", dateYear);
+        remiQuota.set("totalamount", reimburseQuota.get("totalamount"));
+        remiQuota.set("costcompany", reimburseQuota.get("costcompany"));
+
+        for(int i = 1; i <= 12; i++) {
+            remiQuota.set("month" + i, reimburseQuota.get("month" + i));
+            if (i <= 4) {
+                remiQuota.set("quarter" + i, reimburseQuota.get("quarter" + i));
+            }
+        }
+
+        remiQuota.set("amounttype", "1");
+        remiQuota.set("employee", reimburseQuota.get("employee"));
+        remiQuota.set("dept", reimburseQuota.get("dept"));
+        remiQuota.set("auditstatus", "0");
+        remiQuota.set("createtime", now);
+        remiQuota.set("modifytime", now);
+        remiQuota.set("creator", currentUserId);
+        remiQuota.set("modifier", currentUserId);
+        remiQuota.set("wbsrcbilltype", "er_reimctl_new");
+
+        remiQuota.set("nckd_sourcetype", "yearcopy");
+        remiQuota.set("nckd_sourcebillid", reimburseQuota.getPkValue());
+
+        // 调用保存
+        OperationResult saveOp = OperationServiceHelper.executeOperate("save", BillTypeConstants.ER_REIMBURSEAMOUNT, new DynamicObject[]{remiQuota}, OperateOption.create());
+        if(!saveOp.isSuccess() || saveOp.getSuccessPkIds().size() == 0){
+            throw new KDBizException(CommonUtils.getOperationResultErrorInfos(saveOp));
+        }
+        OperationResult approveOp = OperationServiceHelper.executeOperate("approve", BillTypeConstants.ER_REIMBURSEAMOUNT, new Object[]{saveOp.getSuccessPkIds().get(0)}, OperateOption.create());
+        if(!approveOp.isSuccess() || approveOp.getSuccessPkIds().size() == 0){
+            throw new KDBizException(CommonUtils.getOperationResultErrorInfos(approveOp));
+        }
+    }
+
+    /**
+     * 获取额度复制年
+     * @param map
+     * @return
+     */
+    protected int getYear(Map<String, Object> map){
+
+        if(map.containsKey(YEAR) && StringUtils.isNotEmpty((String)map.get(YEAR))){
+            return Integer.parseInt(map.get(YEAR).toString());
+        }
+        // 第二年执行前一年的数据
+        return Calendar.getInstance().get(Calendar.YEAR)-1;
+    }
+
+}