推送记录状态

This commit is contained in:
钱涛 2024-11-28 09:41:10 +08:00
parent 1e2d37ad2e
commit 3ba1ea6cc7
10 changed files with 360 additions and 42 deletions

View File

@ -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;

View File

@ -17,7 +17,7 @@ public enum PushRecordStatusEnum implements BaseEnum<Integer> {
PREPARE(0, "准备中", 87625),
WAITING(1, "等待中", 87625),
PROGRESS(2, "执行中", 85393),
success(3, "执行成功", 85393),
SUCCESS(3, "执行成功", 85393),
FAIL(4, "执行失败", 85393);
private int value;

View File

@ -0,0 +1,68 @@
package com.engine.salary.enums.push;
import com.engine.salary.enums.BaseEnum;
import java.util.Arrays;
import java.util.Objects;
/**
* 推送记录状态
* <p>Copyright: Copyright (c) 2024</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
public enum PushRecordTypeEnum implements BaseEnum<Integer> {
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 "";
}
}

View File

@ -68,5 +68,6 @@ public interface PushRecordDetailMapper {
* @param ids 主键id集合
*/
void deleteByIds(@Param("ids") Collection<Long> ids);
void deleteByRecordId(Long acctRecordId);
}

View File

@ -234,5 +234,11 @@
</foreach>
</delete>
<delete id="deleteByRecordId">
UPDATE hrsa_push_record_detail
SET delete_type=1
WHERE record_id=#{recordId}
AND delete_type = 0
</delete>
</mapper>

View File

@ -69,5 +69,7 @@ public interface PushRecordMapper {
* @param ids 主键id集合
*/
void deleteByIds(@Param("ids") Collection<Long> ids);
int countBeforeBatch(Long batchId);
}

View File

@ -3,6 +3,9 @@
<mapper namespace="com.engine.salary.mapper.push.PushRecordMapper">
<resultMap id="BaseResultMap" type="com.engine.salary.entity.push.po.PushRecordPO">
<result column="id" property="id"/>
<result column="batch_id" property="batchId"/>
<result column="mode_id" property="modeId"/>
<result column="table_name" property="tableName"/>
<result column="name" property="name"/>
<result column="type" property="type"/>
<result column="status" property="status"/>
@ -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 @@
<if test="acctRecordId != null">
AND acct_record_id = #{acctRecordId}
</if>
<if test="batchId != null">
AND batch_id = #{batchId}
</if>
<if test="modeId != null">
AND mode_id = #{modeId}
</if>
<if test="tableName != null">
AND table_name = #{tableName}
</if>
<if test="createTime != null">
AND create_time = #{createTime}
</if>
@ -102,6 +117,15 @@
INSERT INTO hrsa_push_record
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="batchId != null">
batch_id,
</if>
<if test="modeId != null">
mode_id,
</if>
<if test="tableName != null">
table_name,
</if>
<if test="acctRecordId != null">
acct_record_id,
</if>
@ -137,6 +161,15 @@
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="batchId != null">
#{batchId},
</if>
<if test="modeId != null">
#{modeId},
</if>
<if test="tableName != null">
#{tableName},
</if>
<if test="acctRecordId != null">
#{acctRecordId},
</if>
@ -177,6 +210,9 @@
<update id="update" parameterType="com.engine.salary.entity.push.po.PushRecordPO">
UPDATE hrsa_push_record
<set>
batch_id=#{batchId},
mode_id=#{modeId},
table_name=#{tableName},
acct_record_id=#{acctRecordId},
create_time=#{createTime},
creator=#{creator},
@ -196,6 +232,15 @@
<update id="updateIgnoreNull" parameterType="com.engine.salary.entity.push.po.PushRecordPO">
UPDATE hrsa_push_record
<set>
<if test="batchId != null">
batch_id=#{batchId},
</if>
<if test="modeId != null">
mode_id=#{modeId},
</if>
<if test="tableName != null">
table_name=#{tableName},
</if>
<if test="acctRecordId != null">
acct_record_id=#{acctRecordId},
</if>
@ -249,5 +294,12 @@
</foreach>
</delete>
<select id="countBeforeBatch" resultMap="BaseResultMap">
SELECT count(0)
FROM hrsa_push_record t
WHERE delete_type = 0
and batch_id <![CDATA[ < ]]> #{batchId}
and status not in (4, 5)
</select>
</mapper>

View File

@ -66,4 +66,6 @@ public interface PushService {
void pushOneRecord(Long salaryAcctRecordId);
void createPushRecord(Long salaryAcctRecordId);
void removeBatch(Long batchId);
}

View File

@ -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<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId());
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listAll();
//薪资项目
List<SalaryItemPO> 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<PushSettingPO> pushSettingPOS = getPushSettingMapper().listSome(PushSettingPO.builder().able(1).build());
Date now = new Date();
List<PushRecordPO> 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<PushSettingItemPO> pushSettingItemPOS = getPushSettingItemMapper().listSome(PushSettingItemPO.builder().settingId(id).build());
//查询核算人员
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId());
//查询核算人员
List<SalaryAcctEmployeePO> 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<SalaryItemPO> 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<Long> employeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getEmployeeId, Collectors.toList());
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getId, Collectors.toList());
List<SalaryAcctResultPO> 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<String, List<CalculateFormulaVarBO.FormulaVarValue>> formulaVarMap = calculateFormulaVarBO.convert2FormulaVar(salaryAcctCalculateBO);
salaryAcctEmployeePOS.forEach(emp -> {
//1 获取当前薪资核算人员的公式中的变量的值
List<CalculateFormulaVarBO.FormulaVarValue> formulaVarValues = formulaVarMap.get(emp.getEmployeeId() + "_" + emp.getTaxAgentId());
//2 人员信息
List<CalculateFormulaVarBO.FormulaVarValue> empInfo = formulaVarMap.get(emp.getEmployeeId() + "");
formulaVarValues.addAll(empInfo);
Map<String, String> formulaVarValueMap = SalaryEntityUtil.convert2Map(formulaVarValues, CalculateFormulaVarBO.FormulaVarValue::getFieldId, CalculateFormulaVarBO.FormulaVarValue::getFieldValue);
Integer modeId = setting.getModeId();
List<String> fields = new ArrayList<String>() {{
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<Object> values = new ArrayList<Object>() {{
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<PushRecordPO> 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<PushRecordDetailPO> 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<PushRecordPO> pushRecordPOS = getPushRecordMapper().listSome(PushRecordPO.builder().batchId(batchId).build());
pushRecordPOS.forEach(pushRecordPO -> {
getPushRecordDetailMapper().deleteByRecordId(pushRecordPO.getId());
getPushRecordMapper().delete(pushRecordPO);
});
}
}

View File

@ -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());
}
}