From 3ba1ea6cc7dcd90e727e8741c1a73c0f2e95223a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 28 Nov 2024 09:41:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E9=80=81=E8=AE=B0=E5=BD=95=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/entity/push/po/PushRecordPO.java | 20 ++ .../enums/push/PushRecordStatusEnum.java | 2 +- .../salary/enums/push/PushRecordTypeEnum.java | 68 +++++ .../mapper/push/PushRecordDetailMapper.java | 3 +- .../mapper/push/PushRecordDetailMapper.xml | 6 + .../salary/mapper/push/PushRecordMapper.java | 2 + .../salary/mapper/push/PushRecordMapper.xml | 52 ++++ .../engine/salary/service/PushService.java | 2 + .../salary/service/impl/PushServiceImpl.java | 244 +++++++++++++++--- .../engine/salary/wrapper/PushWrapper.java | 3 +- 10 files changed, 360 insertions(+), 42 deletions(-) create mode 100644 src/com/engine/salary/enums/push/PushRecordTypeEnum.java diff --git a/src/com/engine/salary/entity/push/po/PushRecordPO.java b/src/com/engine/salary/entity/push/po/PushRecordPO.java index ee6249123..a994a14f6 100644 --- a/src/com/engine/salary/entity/push/po/PushRecordPO.java +++ b/src/com/engine/salary/entity/push/po/PushRecordPO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.push.po; import com.engine.hrmelog.annotation.ElogTransform; +import com.engine.salary.enums.push.PushRecordStatusEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -21,12 +22,19 @@ public class PushRecordPO { @ElogTransform(name = "") private Long id; + /** + * 批次号 + */ + private Long batchId; + + /** * 记录名 */ @ElogTransform(name = "记录名") private String name; + /** * 核算记录id */ @@ -40,8 +48,20 @@ public class PushRecordPO { @ElogTransform(name = "推送配置id") private Long settingId; + /** + * 建模id + */ + private Integer modeId; + + /** + * 数据库表名 + */ + private String tableName; + + /** * 推送状态 + * @see PushRecordStatusEnum */ @ElogTransform(name = "推送状态") private Integer status; diff --git a/src/com/engine/salary/enums/push/PushRecordStatusEnum.java b/src/com/engine/salary/enums/push/PushRecordStatusEnum.java index d05d40f1c..0a25b2b0a 100644 --- a/src/com/engine/salary/enums/push/PushRecordStatusEnum.java +++ b/src/com/engine/salary/enums/push/PushRecordStatusEnum.java @@ -17,7 +17,7 @@ public enum PushRecordStatusEnum implements BaseEnum { PREPARE(0, "准备中", 87625), WAITING(1, "等待中", 87625), PROGRESS(2, "执行中", 85393), - success(3, "执行成功", 85393), + SUCCESS(3, "执行成功", 85393), FAIL(4, "执行失败", 85393); private int value; diff --git a/src/com/engine/salary/enums/push/PushRecordTypeEnum.java b/src/com/engine/salary/enums/push/PushRecordTypeEnum.java new file mode 100644 index 000000000..9fc79f308 --- /dev/null +++ b/src/com/engine/salary/enums/push/PushRecordTypeEnum.java @@ -0,0 +1,68 @@ +package com.engine.salary.enums.push; + +import com.engine.salary.enums.BaseEnum; + +import java.util.Arrays; +import java.util.Objects; + +/** + * 推送记录状态 + *

Copyright: Copyright (c) 2024

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public enum PushRecordTypeEnum implements BaseEnum { + PUSH(0, "推送", 85393), + WITHDRAW(1, "撤回", 85393); + + private int value; + + private String defaultLabel; + + private int labelId; + + PushRecordTypeEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + public static PushRecordTypeEnum parseByValue(int value) { + for (PushRecordTypeEnum salaryDataSourceEnum : PushRecordTypeEnum.values()) { + if (Objects.equals(salaryDataSourceEnum.getValue(), value)) { + return salaryDataSourceEnum; + } + } + return null; + } + + public static String getDefaultLabelByValue(Integer value) { + if (value == null) { + return ""; + } + PushRecordTypeEnum[] enumAry = PushRecordTypeEnum.values(); + for (int i = 0; i < Arrays.asList(enumAry).size(); i++) { + if (enumAry[i].getValue().equals(value)) { + return enumAry[i].getDefaultLabel(); + } + } + return ""; + } +} diff --git a/src/com/engine/salary/mapper/push/PushRecordDetailMapper.java b/src/com/engine/salary/mapper/push/PushRecordDetailMapper.java index 469d40eea..5ad4a105f 100644 --- a/src/com/engine/salary/mapper/push/PushRecordDetailMapper.java +++ b/src/com/engine/salary/mapper/push/PushRecordDetailMapper.java @@ -68,5 +68,6 @@ public interface PushRecordDetailMapper { * @param ids 主键id集合 */ void deleteByIds(@Param("ids") Collection ids); - + + void deleteByRecordId(Long acctRecordId); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/push/PushRecordDetailMapper.xml b/src/com/engine/salary/mapper/push/PushRecordDetailMapper.xml index 06cdca169..ecbeef0cd 100644 --- a/src/com/engine/salary/mapper/push/PushRecordDetailMapper.xml +++ b/src/com/engine/salary/mapper/push/PushRecordDetailMapper.xml @@ -234,5 +234,11 @@ + + UPDATE hrsa_push_record_detail + SET delete_type=1 + WHERE record_id=#{recordId} + AND delete_type = 0 + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/push/PushRecordMapper.java b/src/com/engine/salary/mapper/push/PushRecordMapper.java index d87df17f2..dfcf7fd05 100644 --- a/src/com/engine/salary/mapper/push/PushRecordMapper.java +++ b/src/com/engine/salary/mapper/push/PushRecordMapper.java @@ -69,5 +69,7 @@ public interface PushRecordMapper { * @param ids 主键id集合 */ void deleteByIds(@Param("ids") Collection ids); + + int countBeforeBatch(Long batchId); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/push/PushRecordMapper.xml b/src/com/engine/salary/mapper/push/PushRecordMapper.xml index 5c740c64f..a93a05c9c 100644 --- a/src/com/engine/salary/mapper/push/PushRecordMapper.xml +++ b/src/com/engine/salary/mapper/push/PushRecordMapper.xml @@ -3,6 +3,9 @@ + + + @@ -20,6 +23,9 @@ t . acct_record_id + , t.batch_id + , t.mode_id + , t.table_name , t.create_time , t.creator , t.delete_type @@ -57,6 +63,15 @@ AND acct_record_id = #{acctRecordId} + + AND batch_id = #{batchId} + + + AND mode_id = #{modeId} + + + AND table_name = #{tableName} + AND create_time = #{createTime} @@ -102,6 +117,15 @@ INSERT INTO hrsa_push_record + + batch_id, + + + mode_id, + + + table_name, + acct_record_id, @@ -137,6 +161,15 @@ + + #{batchId}, + + + #{modeId}, + + + #{tableName}, + #{acctRecordId}, @@ -177,6 +210,9 @@ UPDATE hrsa_push_record + batch_id=#{batchId}, + mode_id=#{modeId}, + table_name=#{tableName}, acct_record_id=#{acctRecordId}, create_time=#{createTime}, creator=#{creator}, @@ -196,6 +232,15 @@ UPDATE hrsa_push_record + + batch_id=#{batchId}, + + + mode_id=#{modeId}, + + + table_name=#{tableName}, + acct_record_id=#{acctRecordId}, @@ -249,5 +294,12 @@ + \ No newline at end of file diff --git a/src/com/engine/salary/service/PushService.java b/src/com/engine/salary/service/PushService.java index be673826d..3deb75ad3 100644 --- a/src/com/engine/salary/service/PushService.java +++ b/src/com/engine/salary/service/PushService.java @@ -66,4 +66,6 @@ public interface PushService { void pushOneRecord(Long salaryAcctRecordId); void createPushRecord(Long salaryAcctRecordId); + + void removeBatch(Long batchId); } diff --git a/src/com/engine/salary/service/impl/PushServiceImpl.java b/src/com/engine/salary/service/impl/PushServiceImpl.java index 74045065a..491b2b785 100644 --- a/src/com/engine/salary/service/impl/PushServiceImpl.java +++ b/src/com/engine/salary/service/impl/PushServiceImpl.java @@ -26,8 +26,10 @@ import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.enums.push.PushItemFieldEnum; import com.engine.salary.enums.push.PushRecordDetailStatusEnum; import com.engine.salary.enums.push.PushRecordStatusEnum; +import com.engine.salary.enums.push.PushRecordTypeEnum; import com.engine.salary.enums.salaryformula.SalarySQLReferenceEnum; import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.push.PushRecordDetailMapper; import com.engine.salary.mapper.push.PushRecordMapper; import com.engine.salary.mapper.push.PushSettingItemMapper; import com.engine.salary.mapper.push.PushSettingMapper; @@ -39,6 +41,7 @@ import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.conn.RecordSet; @@ -58,6 +61,7 @@ import java.util.stream.Collectors; * @author qiantao * @version 1.0 **/ +@Slf4j public class PushServiceImpl extends Service implements PushService { private PushSettingMapper getPushSettingMapper() { @@ -72,6 +76,10 @@ public class PushServiceImpl extends Service implements PushService { return MapperProxyFactory.getProxy(PushRecordMapper.class); } + private PushRecordDetailMapper getPushRecordDetailMapper() { + return MapperProxyFactory.getProxy(PushRecordDetailMapper.class); + } + private SalaryEmployeeService getSalaryEmployeeService(User user) { return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } @@ -249,8 +257,9 @@ public class PushServiceImpl extends Service implements PushService { //查询核算人员 List salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId()); - List salaryItemPOS = getSalaryItemService(user).listAll(); + //薪资项目 + List salaryItemPOS = getSalaryItemService(user).listAll(); //查询薪资核算记录的薪资周期、考勤周期等 SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctRecordPO.getId()); @@ -327,7 +336,7 @@ public class PushServiceImpl extends Service implements PushService { String fieldName = item.getFieldName(); fields.add(fieldName); // 公式变量的值 - String field = item.getSource() + "_" + item.getItem(); + String field = item.getItem(); String value = formulaVarValueMap.getOrDefault(field, StringUtils.EMPTY); PushItemFieldEnum pushItemFieldEnum = PushItemFieldEnum.parseByValue(item.getFieldType()); values.add(pushItemFieldEnum.convertValue(value)); @@ -353,6 +362,7 @@ public class PushServiceImpl extends Service implements PushService { @Override public void createPushRecord(Long salaryAcctRecordId) { + Date now = new Date(); SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); if (salaryAcctRecordPO == null) { @@ -360,54 +370,210 @@ public class PushServiceImpl extends Service implements PushService { } List pushSettingPOS = getPushSettingMapper().listSome(PushSettingPO.builder().able(1).build()); - Date now = new Date(); - List pushRecordPOList = pushSettingPOS.stream() - .filter(po -> po.getSalarySobIds().contains(salaryAcctRecordPO.getSalarySobId())) - .map(po -> PushRecordPO.builder() - .id(IdGenerator.generate()) - .name(po.getName()) - .settingId(po.getId()) - .acctRecordId(salaryAcctRecordId) - .status(PushRecordStatusEnum.PREPARE.getValue()) - .createTime(now) - .updateTime(now) - .creator((long) user.getUID()) - .deleteType(NumberUtils.INTEGER_ZERO) - .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) - .build() - ) - .collect(Collectors.toList()); + //批次号 + long batchId = IdGenerator.generate(); - pushRecordPOList.forEach(record -> { - getPushRecordMapper().insertIgnoreNull(record); + try { + pushSettingPOS.stream() + .filter(setting -> setting.getSalarySobIds().contains(salaryAcctRecordPO.getSalarySobId())) + .forEach(setting -> { + PushRecordPO record = PushRecordPO.builder() + .id(IdGenerator.generate()) + .batchId(batchId) + .name(setting.getName()) + .settingId(setting.getId()) + .modeId(setting.getModeId()) + .tableName(setting.getTableName()) + .acctRecordId(salaryAcctRecordId) + .type(PushRecordTypeEnum.PUSH.getValue()) + .status(PushRecordStatusEnum.PREPARE.getValue()) + .createTime(now) + .updateTime(now) + .creator((long) user.getUID()) + .deleteType(NumberUtils.INTEGER_ZERO) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .build(); + + getPushRecordMapper().insertIgnoreNull(record); + + Long id = setting.getId(); + List pushSettingItemPOS = getPushSettingItemMapper().listSome(PushSettingItemPO.builder().settingId(id).build()); - //查询核算人员 - List salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId()); + //查询核算人员 + List salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId()); - salaryAcctEmployeePOS.stream().map(employee -> PushRecordDetailPO.builder() - .id(IdGenerator.generate()) - .acctEmpId(employee.getId()) - .recordId(record.getId()) - .status(PushRecordDetailStatusEnum.PREPARE.getValue()) - .createTime(now) - .updateTime(now) - .creator((long) user.getUID()) - .deleteType(NumberUtils.INTEGER_ZERO) - .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) - .build()) - .collect(Collectors.toList()); + //薪资项目 + List salaryItemPOS = getSalaryItemService(user).listAll(); + //查询薪资核算记录的薪资周期、考勤周期等 + SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctRecordPO.getId()); + + SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO() + .setSalaryAcctRecordPO(salaryAcctRecordPO) + .setSalarySobPO(new SalarySobPO()) + .setSalarySobCycleDTO(salarySobCycleDTO) + .setOtherSalaryAcctRecordPOS(new ArrayList<>()) + .setSalarySobItemPOS(new ArrayList<>()) + .setSalaryItemIdWithPriorityList(new ArrayList<>()) + .setExpressFormulas(new ArrayList<>()) + .setSalaryItemPOS(salaryItemPOS) + .setSalarySobAdjustRulePOS(new ArrayList<>()) + .setWelfareColumns(new HashMap<>()) + .setAttendQuoteFieldListDTOS(new ArrayList<>()) + .setSalaryAcctEmployeePOS(salaryAcctEmployeePOS) + .setIssuedFieldIds(new HashSet<>()) + .setChildMonitor(null) + .setResults(null) + .setCalculateKey(null) + .setVariableItems(new ArrayList<>()) + .setTaxDeclarationFunction(TaxDeclarationFunctionEnum.OPEN); - }); + List employeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getEmployeeId, Collectors.toList()); + List simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds); + List salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getId, Collectors.toList()); + List salaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); + + CalculateFormulaVarBO calculateFormulaVarBO = new CalculateFormulaVarBO(simpleEmployees, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), salaryAcctResultPOS, new ArrayList<>()); + Map> formulaVarMap = calculateFormulaVarBO.convert2FormulaVar(salaryAcctCalculateBO); + + salaryAcctEmployeePOS.forEach(emp -> { + + //1 获取当前薪资核算人员的公式中的变量的值 + List formulaVarValues = formulaVarMap.get(emp.getEmployeeId() + "_" + emp.getTaxAgentId()); + //2 人员信息 + List empInfo = formulaVarMap.get(emp.getEmployeeId() + ""); + formulaVarValues.addAll(empInfo); + Map formulaVarValueMap = SalaryEntityUtil.convert2Map(formulaVarValues, CalculateFormulaVarBO.FormulaVarValue::getFieldId, CalculateFormulaVarBO.FormulaVarValue::getFieldValue); + + Integer modeId = setting.getModeId(); + + List fields = new ArrayList() {{ + add("formmodeid"); + add("modedatacreater"); + add("modedatacreatertype"); + add("modedatacreatedate"); + add("modedatacreatetime"); + }}; + String currDate = TimeUtil.getCurrentDateString(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = sdf.format(new Date()); + List values = new ArrayList() {{ + add(modeId); + add(1); + add(0); + add(String.format("'%s'", currDate)); + add(String.format("'%s'", currTime)); + }}; + for (PushSettingItemPO item : pushSettingItemPOS) { + //数据库字段 + String fieldName = item.getFieldName(); + fields.add(fieldName); + // 公式变量的值 + String field = item.getItem(); + String value = formulaVarValueMap.getOrDefault(field, StringUtils.EMPTY); + PushItemFieldEnum pushItemFieldEnum = PushItemFieldEnum.parseByValue(item.getFieldType()); + values.add(pushItemFieldEnum.convertValue(value)); + } + String tableName = setting.getTableName(); + String sql = String.format("insert into %s (%s) values (%s)", tableName, String.join(",", fields), values.stream().map(Object::toString).collect(Collectors.joining(","))); + + PushRecordDetailPO pushRecordDetailPO = PushRecordDetailPO.builder() + .id(IdGenerator.generate()) + .acctEmpId(emp.getId()) + .recordId(record.getId()) + .status(PushRecordDetailStatusEnum.PREPARE.getValue()) + .execute(sql) + .createTime(now) + .updateTime(now) + .creator((long) user.getUID()) + .deleteType(NumberUtils.INTEGER_ZERO) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .build(); + getPushRecordDetailMapper().insertIgnoreNull(pushRecordDetailPO); + }); + + } + ); + } catch (Exception e) { + removeBatch(batchId); + log.error("推送失败", e); + throw new SalaryRunTimeException("推送失败"); + } + + + //开始 + startBatchPush(batchId); } + /** + * 启动推送 + * + * @param batchId + */ + private void startBatchPush(Long batchId) { + List pushRecordPOS = getPushRecordMapper().listSome(PushRecordPO.builder().batchId(batchId).build()); + pushRecordPOS.forEach( + pushRecord -> { + pushRecord.setStatus(PushRecordStatusEnum.WAITING.getValue()); + getPushRecordMapper().updateIgnoreNull(pushRecord); + } + ); - //创建推送记录 - - //推送记录明细 + //先查看是否还有前置批次没执行完 + while (true) { + int countBeforeBatch = getPushRecordMapper().countBeforeBatch(batchId); + if (countBeforeBatch > 0) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + break; + } + } + pushRecordPOS.forEach(pushRecordPO -> { + pushRecordPO.setStatus(PushRecordStatusEnum.PROGRESS.getValue()); + getPushRecordMapper().updateIgnoreNull(pushRecordPO); + + + List pushRecordDetailPOS = getPushRecordDetailMapper().listSome(PushRecordDetailPO.builder().recordId(pushRecordPO.getId()).build()); + pushRecordDetailPOS.forEach(pushRecordDetailPO -> { + String execute = pushRecordDetailPO.getExecute(); + RecordSet rs = new RecordSet(); + rs.execute(execute); + //建模需要权限重构 + Integer modeId = pushRecordPO.getModeId(); + if (modeId != null) { + String tableName = pushRecordPO.getTableName(); + rs.executeQuery("select max(id) from " + tableName); + int mainId = 0; + if (rs.next()) { + mainId = rs.getInt(1); + } + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, modeId, mainId); + } + }); + + pushRecordPO.setStatus(PushRecordStatusEnum.SUCCESS.getValue()); + getPushRecordMapper().updateIgnoreNull(pushRecordPO); + }); + } + + + @Override + public void removeBatch(Long batchId) { + List pushRecordPOS = getPushRecordMapper().listSome(PushRecordPO.builder().batchId(batchId).build()); + pushRecordPOS.forEach(pushRecordPO -> { + getPushRecordDetailMapper().deleteByRecordId(pushRecordPO.getId()); + getPushRecordMapper().delete(pushRecordPO); + }); + } } diff --git a/src/com/engine/salary/wrapper/PushWrapper.java b/src/com/engine/salary/wrapper/PushWrapper.java index 2ce0ea4e5..3e521bae0 100644 --- a/src/com/engine/salary/wrapper/PushWrapper.java +++ b/src/com/engine/salary/wrapper/PushWrapper.java @@ -59,7 +59,8 @@ public class PushWrapper extends Service { } public void push(PushParam pushParam) { - getPushService(user).pushOneRecord(pushParam.getSalaryAcctRecordId()); +// getPushService(user).pushOneRecord(pushParam.getSalaryAcctRecordId()); + getPushService(user).createPushRecord(pushParam.getSalaryAcctRecordId()); } }