diff --git a/src/com/engine/salary/entity/push/dto/PushSettingDTO.java b/src/com/engine/salary/entity/push/dto/PushSettingDTO.java new file mode 100644 index 000000000..ed4e7006c --- /dev/null +++ b/src/com/engine/salary/entity/push/dto/PushSettingDTO.java @@ -0,0 +1,39 @@ +package com.engine.salary.entity.push.dto; + +import com.engine.salary.entity.push.po.PushSettingItemPO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 数据推送配置 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PushSettingDTO { + + private String sql; + + /** + * 建模id + */ + private Integer modeId; + + /** + * 模块名称 + */ + private String modeName; + + /** + * 数据库表 + */ + private String tableName; + + private List items; + +} \ No newline at end of file diff --git a/src/com/engine/salary/entity/push/param/PushParam.java b/src/com/engine/salary/entity/push/param/PushParam.java new file mode 100644 index 000000000..24f8c257e --- /dev/null +++ b/src/com/engine/salary/entity/push/param/PushParam.java @@ -0,0 +1,19 @@ +package com.engine.salary.entity.push.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PushParam { + + + private Long salaryAcctRecordId; + + +} \ No newline at end of file diff --git a/src/com/engine/salary/entity/push/param/PushSettingItemSaveParam.java b/src/com/engine/salary/entity/push/param/PushSettingItemSaveParam.java index af96be721..408a12bc6 100644 --- a/src/com/engine/salary/entity/push/param/PushSettingItemSaveParam.java +++ b/src/com/engine/salary/entity/push/param/PushSettingItemSaveParam.java @@ -1,7 +1,7 @@ package com.engine.salary.entity.push.param; import com.engine.salary.enums.push.PushItemFieldEnum; -import com.engine.salary.enums.push.PushItemSourceEnum; +import com.engine.salary.enums.salaryformula.SalarySQLReferenceEnum; import com.engine.salary.util.valid.DataCheck; import lombok.AllArgsConstructor; import lombok.Builder; @@ -44,7 +44,7 @@ public class PushSettingItemSaveParam { * 项目类型 */ @DataCheck(require = true, message = "数据来源") - private PushItemSourceEnum source; + private SalarySQLReferenceEnum source; /** * 数据库字段 diff --git a/src/com/engine/salary/entity/push/po/PushSettingItemPO.java b/src/com/engine/salary/entity/push/po/PushSettingItemPO.java index fdd9b1442..97693097d 100644 --- a/src/com/engine/salary/entity/push/po/PushSettingItemPO.java +++ b/src/com/engine/salary/entity/push/po/PushSettingItemPO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.push.po; import com.engine.hrmelog.annotation.ElogTransform; +import com.engine.salary.enums.salaryformula.SalarySQLReferenceEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -42,9 +43,10 @@ public class PushSettingItemPO { /** * 项目类型 + * @see SalarySQLReferenceEnum */ @ElogTransform(name = "项目类型") - private Integer source; + private String source; /** * 数据库字段 diff --git a/src/com/engine/salary/enums/push/PushItemFieldEnum.java b/src/com/engine/salary/enums/push/PushItemFieldEnum.java index fee779972..84b4bbbb4 100644 --- a/src/com/engine/salary/enums/push/PushItemFieldEnum.java +++ b/src/com/engine/salary/enums/push/PushItemFieldEnum.java @@ -1,10 +1,17 @@ package com.engine.salary.enums.push; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; import com.engine.salary.enums.BaseEnum; +import com.engine.salary.util.SalaryDateUtil; +import org.apache.commons.lang3.StringUtils; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Objects; +import static com.engine.salary.util.SalaryDateUtil.DATE_TIME_FORMATTER_PATTERN; + /** * 推送数据来源 *

Copyright: Copyright (c) 2024

@@ -15,12 +22,56 @@ import java.util.Objects; **/ public enum PushItemFieldEnum implements BaseEnum { - NUMBER(1, "数值", 87625), - TEXT(2, "文本", 85393), - DATE(3, "日期", 85393), - YEAR(4, "日期文本-年", 85393), - YEAR_MONTH(5, "日期文本-年月", 85393), - YEAR_MONTH_DAY(6, "日期文本-年月日", 85393); + NUMBER(1, "数值", 87625) { + @Override + public Object convertValue(String value) { + if (NumberUtil.isNumber(value)) { + return new BigDecimal(value).toPlainString(); + } + return "null"; + } + }, + TEXT(2, "文本", 85393) { + @Override + public Object convertValue(String value) { + return StrUtil.isEmpty(value) ? "''" : value; + } + }, + // DATE(3, "日期", 85393) { +// @Override +// public Object convertValue(String value) { +// +// //to_date('2022-05-10 16:03:02','yyyy-MM-dd HH24:mi:ss') +// return value; +// } +// }, + YEAR(4, "日期文本-年", 85393) { + @Override + public Object convertValue(String value) { + if (StringUtils.isNotBlank(value) && value.length() > 10 && SalaryDateUtil.parse(value, DATE_TIME_FORMATTER_PATTERN) != null) { + value = value.substring(0, 4); + } + return StrUtil.isEmpty(value) ? "''" : value; + } + }, + YEAR_MONTH(5, "日期文本-年月", 85393) { + @Override + public Object convertValue(String value) { + if (StringUtils.isNotBlank(value) && value.length() > 10 && SalaryDateUtil.parse(value, DATE_TIME_FORMATTER_PATTERN) != null) { + value = value.substring(0, 7); + } + return StrUtil.isEmpty(value) ? "''" : value; + } + }, + YEAR_MONTH_DAY(6, "日期文本-年月日", 85393) { + @Override + public Object convertValue(String value) { + if (StringUtils.isNotBlank(value) && value.length() > 10 && SalaryDateUtil.parse(value, DATE_TIME_FORMATTER_PATTERN) != null) { + value = value.substring(0, 10); + } + return StrUtil.isEmpty(value) ? "''" : value; + } + }; private int value; @@ -49,13 +100,15 @@ public enum PushItemFieldEnum implements BaseEnum { return labelId; } + public abstract Object convertValue(String value); + public static PushItemFieldEnum parseByValue(int value) { for (PushItemFieldEnum salaryDataSourceEnum : PushItemFieldEnum.values()) { if (Objects.equals(salaryDataSourceEnum.getValue(), value)) { return salaryDataSourceEnum; } } - return null; + return TEXT; } public static String getDefaultLabelByValue(Integer value) { @@ -63,7 +116,7 @@ public enum PushItemFieldEnum implements BaseEnum { return ""; } PushItemFieldEnum[] enumAry = PushItemFieldEnum.values(); - for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + for (int i = 0; i < Arrays.asList(enumAry).size(); i++) { if (enumAry[i].getValue().equals(value)) { return enumAry[i].getDefaultLabel(); } diff --git a/src/com/engine/salary/handle/LongListTypeHandler.java b/src/com/engine/salary/handle/LongListTypeHandler.java new file mode 100644 index 000000000..43b175a6f --- /dev/null +++ b/src/com/engine/salary/handle/LongListTypeHandler.java @@ -0,0 +1,49 @@ +package com.engine.salary.handle; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * 集合的转换 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Slf4j +public class LongListTypeHandler extends BaseTypeHandler> { + + @Override + public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException { + preparedStatement.setString(i, JSON.toJSONString(list)); + } + + @Override + public List getNullableResult(ResultSet resultSet, String s) throws SQLException { + List jsonArray = JSONArray.parseArray(resultSet.getString(s), Long.class); + return jsonArray == null ? new ArrayList<>() : jsonArray; + } + + @Override + public List getNullableResult(ResultSet resultSet, int i) throws SQLException { + List jsonArray = JSONArray.parseArray(resultSet.getString(i), Long.class); + return jsonArray == null ? new ArrayList<>() : jsonArray; + } + + @Override + public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException { + List jsonArray = JSONArray.parseArray(callableStatement.getString(i), Long.class); + return jsonArray == null ? new ArrayList<>() : jsonArray; + } +} diff --git a/src/com/engine/salary/mapper/push/PushSettingMapper.xml b/src/com/engine/salary/mapper/push/PushSettingMapper.xml index fa162f0b8..c421fa71f 100644 --- a/src/com/engine/salary/mapper/push/PushSettingMapper.xml +++ b/src/com/engine/salary/mapper/push/PushSettingMapper.xml @@ -5,7 +5,7 @@ - + @@ -81,7 +81,7 @@ AND mode_name = #{modeName} - AND salary_sob_ids = #{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.SalaryListTypeHandler} + AND salary_sob_ids = #{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.LongListTypeHandler} AND table_name = #{tableName} @@ -170,7 +170,7 @@ #{modeName}, - #{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.SalaryListTypeHandler}, + #{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.LongListTypeHandler}, #{tableName}, @@ -195,7 +195,7 @@ name=#{name}, mode_id=#{modeId}, mode_name=#{modeName}, - salary_sob_ids=#{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.SalaryListTypeHandler}, + salary_sob_ids=#{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.LongListTypeHandler}, table_name=#{tableName}, tenant_key=#{tenantKey}, update_time=#{updateTime}, @@ -230,7 +230,7 @@ mode_name=#{modeName}, - salary_sob_ids=#{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.SalaryListTypeHandler}, + salary_sob_ids=#{salarySobIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.LongListTypeHandler}, table_name=#{tableName}, diff --git a/src/com/engine/salary/service/PushService.java b/src/com/engine/salary/service/PushService.java index 3c9e60f66..a544947ea 100644 --- a/src/com/engine/salary/service/PushService.java +++ b/src/com/engine/salary/service/PushService.java @@ -1,10 +1,13 @@ package com.engine.salary.service; +import com.engine.salary.entity.push.dto.PushSettingDTO; import com.engine.salary.entity.push.param.PushSettingItemSaveParam; import com.engine.salary.entity.push.param.PushSettingSaveParam; import com.engine.salary.entity.push.po.PushSettingItemPO; import com.engine.salary.entity.push.po.PushSettingPO; +import java.util.List; + public interface PushService { /** @@ -18,4 +21,14 @@ public interface PushService { * @param param */ PushSettingItemPO saveItem(PushSettingItemSaveParam param); + + /** + * 推送一条核算记录下的所有数据 + * @param salarySobId + * @return + */ + List pushOneRecord(Long salarySobId); + + +// void push(List recodes); } diff --git a/src/com/engine/salary/service/impl/PushServiceImpl.java b/src/com/engine/salary/service/impl/PushServiceImpl.java index 2fa5678ac..fb9d9a085 100644 --- a/src/com/engine/salary/service/impl/PushServiceImpl.java +++ b/src/com/engine/salary/service/impl/PushServiceImpl.java @@ -3,21 +3,37 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.constant.SalaryDefaultTenantConstant; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.push.dto.PushSettingDTO; import com.engine.salary.entity.push.param.PushSettingItemSaveParam; import com.engine.salary.entity.push.param.PushSettingSaveParam; import com.engine.salary.entity.push.po.PushSettingItemPO; import com.engine.salary.entity.push.po.PushSettingPO; +import com.engine.salary.entity.salaryacct.bo.CalculateFormulaVarBO; +import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculateBO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; +import com.engine.salary.entity.salaryitem.po.SalaryItemPO; +import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO; +import com.engine.salary.entity.salarysob.po.SalarySobPO; +import com.engine.salary.enums.push.PushItemFieldEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.push.PushSettingItemMapper; import com.engine.salary.mapper.push.PushSettingMapper; -import com.engine.salary.service.PushService; -import com.engine.salary.service.TaxAgentService; +import com.engine.salary.service.*; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; +import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.db.IdGenerator; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.valid.ValidUtil; +import org.apache.commons.lang3.StringUtils; +import weaver.conn.RecordSet; +import weaver.formmode.setup.ModeRightInfo; import weaver.hrm.User; -import java.util.Date; +import java.util.*; +import java.util.stream.Collectors; /** * 推送服务 @@ -37,9 +53,24 @@ public class PushServiceImpl extends Service implements PushService { return MapperProxyFactory.getProxy(PushSettingItemMapper.class); } + private SalaryEmployeeService getSalaryEmployeeService(User user) { + return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); + } - private TaxAgentService getTaxAgentService(User user) { - return ServiceUtil.getService(TaxAgentServiceImpl.class, user); + private SalaryItemService getSalaryItemService(User user) { + return ServiceUtil.getService(SalaryItemServiceImpl.class, user); + } + + private SalaryAcctRecordService getSalaryAcctRecordService(User user) { + return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); + } + + private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { + return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); + } + + private SalaryAcctResultService getSalaryAcctResultService(User user) { + return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); } @Override @@ -131,4 +162,105 @@ public class PushServiceImpl extends Service implements PushService { return po; } + + @Override + public List pushOneRecord(Long salaryAcctRecordId) { + + SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); + + //查询核算人员 + List salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId()); + 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); + + + List pushSettingPOS = getPushSettingMapper().listSome(PushSettingPO.builder().able(1).build()); + pushSettingPOS.stream() + .filter(po -> po.getSalarySobIds().contains(salaryAcctRecordPO.getSalarySobId())) + .forEach(setting -> { + + Long id = setting.getId(); + List pushSettingItemPOS = getPushSettingItemMapper().listSome(PushSettingItemPO.builder().settingId(id).build()); + + + //每个人插入一条 + for (SalaryAcctEmployeePO emp : salaryAcctEmployeePOS) { + //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<>(); + List values = new ArrayList<>(); + for (PushSettingItemPO item : pushSettingItemPOS) { + //数据库字段 + String fieldName = item.getFieldName(); + fields.add(fieldName); + // 公式变量的值 + String field = item.getSource() + "_" + 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(","))); + System.out.println(sql); + RecordSet rs = new RecordSet(); + rs.execute(sql); + + if (modeId != null) { + 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); + } + } + + }); + return null; + + } + + } diff --git a/src/com/engine/salary/web/PushController.java b/src/com/engine/salary/web/PushController.java index f85626da1..5811d3d2b 100644 --- a/src/com/engine/salary/web/PushController.java +++ b/src/com/engine/salary/web/PushController.java @@ -1,6 +1,7 @@ package com.engine.salary.web; import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.push.param.PushParam; import com.engine.salary.entity.push.param.PushSettingItemSaveParam; import com.engine.salary.entity.push.param.PushSettingSaveParam; import com.engine.salary.entity.push.po.PushSettingItemPO; @@ -50,4 +51,11 @@ public class PushController { return new ResponseResult(user).run(getPushWrapper(user)::saveItem, param); } + @POST + @Path("/push") + @Produces(MediaType.APPLICATION_JSON) + public String saveitem(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody PushParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getPushWrapper(user)::push, param); + } } diff --git a/src/com/engine/salary/wrapper/PushWrapper.java b/src/com/engine/salary/wrapper/PushWrapper.java index 3c552f608..c459be943 100644 --- a/src/com/engine/salary/wrapper/PushWrapper.java +++ b/src/com/engine/salary/wrapper/PushWrapper.java @@ -2,6 +2,7 @@ package com.engine.salary.wrapper; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.entity.push.param.PushParam; import com.engine.salary.entity.push.param.PushSettingItemSaveParam; import com.engine.salary.entity.push.param.PushSettingSaveParam; import com.engine.salary.entity.push.po.PushSettingItemPO; @@ -25,4 +26,8 @@ public class PushWrapper extends Service { public PushSettingItemPO saveItem(PushSettingItemSaveParam param) { return getPushService(user).saveItem(param); } + + public void push(PushParam pushParam) { + getPushService(user).pushOneRecord(pushParam.getSalaryAcctRecordId()); + } }