领悦报表逻辑修改调整222
This commit is contained in:
parent
7622a5f60f
commit
40212f5cca
|
|
@ -18,6 +18,8 @@ import lombok.NoArgsConstructor;
|
|||
public class UfGjjInfo {
|
||||
private Long id;
|
||||
|
||||
private String dyxzzq;
|
||||
|
||||
// 分部
|
||||
private Long fb;
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,9 @@ import lombok.NoArgsConstructor;
|
|||
public class UfSbInfo {
|
||||
private Long id;
|
||||
|
||||
// 对应薪资周期
|
||||
private String dyxzzq;
|
||||
|
||||
// 分部
|
||||
private Integer fb;
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
<result column="ylbxgrjn1" property="ylbxgrjn1" />
|
||||
<result column="znxmlb" property="znxmlb" />
|
||||
<result column="znxmmc" property="znxmmc" />
|
||||
<result column="dyxzzq" property="dyxzzq" />
|
||||
</resultMap>
|
||||
|
||||
<!-- 表字段 -->
|
||||
|
|
@ -71,6 +72,7 @@
|
|||
, t.ylbxgrjn1
|
||||
, t.znxmlb
|
||||
, t.znxmmc
|
||||
, t.dyxzzq
|
||||
</sql>
|
||||
|
||||
<!-- 查询全部 -->
|
||||
|
|
@ -108,6 +110,7 @@
|
|||
<result column="yg" property="yg" />
|
||||
<result column="znxmlb" property="znxmlb" />
|
||||
<result column="znxmmc" property="znxmmc" />
|
||||
<result column="dyxzzq" property="dyxzzq" />
|
||||
</resultMap>
|
||||
|
||||
<!-- 表字段 -->
|
||||
|
|
@ -127,6 +130,7 @@
|
|||
, t.yg
|
||||
, t.znxmlb
|
||||
, t.znxmmc
|
||||
, t.dyxzzq
|
||||
</sql>
|
||||
|
||||
<!-- 查询全部 -->
|
||||
|
|
|
|||
|
|
@ -492,6 +492,8 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
}
|
||||
// 主键id
|
||||
map.put("id", e.getId());
|
||||
// 薪资所属月
|
||||
map.put("salaryMonth", SalaryDateUtil.getFormatYearMonth(e.getSalaryMonth()));
|
||||
//人员id
|
||||
map.put("employeeId", e.getEmployeeId());
|
||||
map.put("userName", fieldValueMap.get("username"));
|
||||
|
|
@ -532,6 +534,7 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
itemSum.put("employeeId", CollectionUtils.isEmpty(value) ? "" : value.get(0).get("employeeId"));
|
||||
itemSum.put("subcompanyId", CollectionUtils.isEmpty(value) ? "" : value.get(0).get("subcompanyId") == null ? "0" : value.get(0).get("subcompanyId"));
|
||||
itemSum.put("departmentId", CollectionUtils.isEmpty(value) ? "" : value.get(0).get("departmentId") == null ? "0" : value.get(0).get("departmentId"));
|
||||
itemSum.put("salaryMonth", CollectionUtils.isEmpty(value) ? "" : value.get(0).get("salaryMonth") == null ? " " : value.get(0).get("salaryMonth"));
|
||||
if (ffgsztItemId != null) {
|
||||
Map<String, Object> map = value.get(0);
|
||||
String rylb = map.get(ffgsztItemId.toString()) == null ? "" : map.get(ffgsztItemId.toString()).toString();
|
||||
|
|
@ -2124,8 +2127,23 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
}
|
||||
|
||||
// 获取当月导入社保数据
|
||||
// List<UfSbInfo> ufSbInfos = getLyUfSbgjjMapper().listSbInfoByFyssq(salaryMonth);
|
||||
List<UfSbInfo> ufSbInfos = getLyUfSbgjjMapper().listSbInfoByDyxzzq(salaryMonth);
|
||||
List<UfSbInfo> ufSbInfos = getLyUfSbgjjMapper().listSbInfoByFyssq(salaryMonth);
|
||||
// 根据人员id汇总
|
||||
Map<Long, List<UfSbInfo>> ufGroupByYg = SalaryEntityUtil.group2Map(ufSbInfos, UfSbInfo::getYg);
|
||||
ufSbInfos = ufSbInfos.stream().filter(uf -> {
|
||||
List<UfSbInfo> list = ufGroupByYg.get(uf.getYg());
|
||||
if (CollectionUtils.isNotEmpty(list) && list.size() > 1) {
|
||||
return !(uf.getSbgrjnhj() == null || uf.getSbgrjnhj().compareTo(Double.valueOf("0")) == 0);
|
||||
}
|
||||
return true;
|
||||
}).collect(Collectors.toList());
|
||||
List<Date> dateList = ufSbInfos.stream().map(UfSbInfo::getDyxzzq)
|
||||
.distinct()
|
||||
.map(date -> SalaryDateUtil.dateStrToLocalYearMonth(date))
|
||||
.filter(date -> date != null).distinct()
|
||||
.sorted(Comparator.comparing(Date::getTime))
|
||||
.collect(Collectors.toList());
|
||||
// List<UfSbInfo> ufSbInfos = getLyUfSbgjjMapper().listSbInfoByDyxzzq(salaryMonth);
|
||||
ufSbInfos = ufSbInfos.stream().map(info -> {
|
||||
if (info.getGmgsqc() == null) {
|
||||
info.setGmgsqc("");
|
||||
|
|
@ -2186,28 +2204,35 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
// 查询核算账套
|
||||
List<SalarySobPO> salarySobList = getSalarySobService(user).listAll();
|
||||
List<Long> salarySobIds = salarySobList.stream().map(SalarySobPO::getId).collect(Collectors.toList());
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build();
|
||||
// 查询所有薪资所属月下核算数据
|
||||
List<Long> salaryAcctRecordIds = new ArrayList<>();
|
||||
Map<String, List<Map<String, Object>>> resultGroupByKey = new HashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(dateList)) {
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(dateList.get(0)).endDate(dateList.get(dateList.size()-1)).build();
|
||||
// 获取核算记录
|
||||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange);
|
||||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
|
||||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
LinkedHashMap<String, Map<String, Object>> acctSbSumByGsMap = new LinkedHashMap<>();
|
||||
salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmpList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||||
// 查新薪资核算结果
|
||||
List<SalaryAcctResultPO> acctResultPOList = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(salaryAcctRecordIds, salaryItemIdList);
|
||||
List<Map<String, Object>> resultMapList = buildData4LyReport(salaryItemList, salaryAcctEmpList, new ArrayList<>(), acctResultPOList, false);
|
||||
// 根据社保购买公司进行分组
|
||||
Map<String, List<Map<String, Object>>> resultGroupByGmgs = SalaryEntityUtil.group2Map(resultMapList, map -> (map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString()));
|
||||
List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
|
||||
acctSbSumByGsMap = getSumResultByGroup(resultGroupByGmgs, Collections.emptyList(), numberItems, null ,Collections.emptyList());
|
||||
// 根据年月 社保购买公司 人员id进行分组
|
||||
resultGroupByKey = SalaryEntityUtil.group2Map(resultMapList,
|
||||
map -> (map.get("salaryMonth") == null ? " " : map.get("salaryMonth") + "_split" +(map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString())) + "_split" +(map.get("employeeId") == null ? " " : map.get("employeeId").toString()));
|
||||
// List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
|
||||
// LinkedHashMap<String, Map<String, Object>> acctSbSumByGsAndDateMap = getSumResultByGroup(resultGroupByGmgsAndDate, Collections.emptyList(), numberItems, null ,Collections.emptyList());
|
||||
}
|
||||
|
||||
// 取建模、核算中购买公司合集
|
||||
|
||||
// 取建模、核算中购买公司合集(中文)
|
||||
Set<String> totalGs = new HashSet<>();
|
||||
Set<String> acctGs = acctSbSumByGsMap.keySet();
|
||||
// Set<String> acctGs = acctSbSumByGsAndDateMap.keySet().stream().map(key -> key.split("_split")[1]).collect(Collectors.toSet());
|
||||
totalGs.addAll(ufSbSumByGsMap.keySet());
|
||||
totalGs.addAll(acctGs);
|
||||
// totalGs.addAll(acctGs);
|
||||
|
||||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||||
|
|
@ -2221,6 +2246,7 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
// 插入前先删除
|
||||
String deleteSql ="delete from uf_dbhzb where yf = '"+ salaryMonth + "'";
|
||||
rs.execute(deleteSql);
|
||||
Map<String, List<Map<String, Object>>> finalResultGroupByKey = resultGroupByKey;
|
||||
for (List<String> part : partition) {
|
||||
// 插入对比数据
|
||||
// StringBuilder sbSql = new StringBuilder("insert into uf_dbhzb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime," +
|
||||
|
|
@ -2262,14 +2288,36 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
"yf,gmgs,sbdrrs,xcffrs,drje,gzkkje,ce) values ");
|
||||
for (String gmgs : part) {
|
||||
String gmgsId = frztNameMap.get(gmgs);
|
||||
Map<String, Object> acctSumMap = acctSbSumByGsMap.getOrDefault(gmgs, new HashMap<>());
|
||||
// Map<String, Object> acctSumMap = acctSbSumByGsMap.getOrDefault(gmgs, new HashMap<>());
|
||||
Map<String, BigDecimal> ufSumMap = ufSbSumByGsMap.getOrDefault(gmgs, new HashMap<>());
|
||||
// 社保合计
|
||||
String sbAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(grjnheItemId.toString()))).toPlainString();
|
||||
BigDecimal sbAcct = new BigDecimal("0");
|
||||
// 获取该社保购买公司下建模数据
|
||||
List<UfSbInfo> ufSbInfosList = ufSbInfoGroupMap.get(gmgsId);
|
||||
// 核算人数
|
||||
int[] countEmp = {0};
|
||||
if (CollectionUtils.isNotEmpty(ufSbInfosList)) {
|
||||
sbAcct = ufSbInfosList.stream().map(uf -> {
|
||||
String key = uf.getDyxzzq() + "_split" + gmgs + "_split" + uf.getYg();
|
||||
List<Map<String, Object>> maps = finalResultGroupByKey.get(key);
|
||||
BigDecimal sum = new BigDecimal("0");
|
||||
if (CollectionUtils.isNotEmpty(maps)) {
|
||||
countEmp[0] = countEmp[0] + 1;
|
||||
List<String> itemValue = maps.stream().filter(v -> v.get(grjnheItemId.toString()) != null).map(v -> (String) v.get(grjnheItemId.toString())).collect(Collectors.toList());
|
||||
sum = itemValue
|
||||
.stream()
|
||||
.filter(NumberUtils::isCreatable)
|
||||
.map(BigDecimal::new)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
return sum;
|
||||
}).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
// String sbAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(grjnheItemId.toString()))).toPlainString();
|
||||
String sbUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("sbgrjnhj"))).toPlainString();
|
||||
String ce = new BigDecimal(sbUf).subtract(new BigDecimal(sbAcct)).toPlainString();
|
||||
String ce = new BigDecimal(sbUf).subtract(sbAcct).toPlainString();
|
||||
// 人数
|
||||
String empNumsAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get("empNums"))).toPlainString();
|
||||
String empNumsAcct =String.valueOf(countEmp[0]);
|
||||
String empNumsUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("empNums"))).toPlainString();
|
||||
sbSql.append("(").append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'");
|
||||
sbSql.append(salaryMonth).append("','")
|
||||
|
|
@ -2318,7 +2366,23 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
}
|
||||
|
||||
// 获取当月导入公积金数据
|
||||
List<UfGjjInfo> ufGjjInfos = getLyUfSbgjjMapper().listGjjInfoByDyxzzq(salaryMonth);
|
||||
// List<UfGjjInfo> ufGjjInfos = getLyUfSbgjjMapper().listGjjInfoByDyxzzq(salaryMonth);
|
||||
List<UfGjjInfo> ufGjjInfos = getLyUfSbgjjMapper().listGjjInfoByFyssq(salaryMonth);
|
||||
// 根据人员id汇总
|
||||
Map<Long, List<UfGjjInfo>> ufGroupByYg = SalaryEntityUtil.group2Map(ufGjjInfos, UfGjjInfo::getYg);
|
||||
ufGjjInfos = ufGjjInfos.stream().filter(uf -> {
|
||||
List<UfGjjInfo> list = ufGroupByYg.get(uf.getYg());
|
||||
if (CollectionUtils.isNotEmpty(list) && list.size() > 1) {
|
||||
return !(uf.getGjjgrjn() == null || uf.getGjjgrjn().compareTo(Double.valueOf("0")) == 0);
|
||||
}
|
||||
return true;
|
||||
}).collect(Collectors.toList());
|
||||
List<Date> dateList = ufGjjInfos.stream().map(UfGjjInfo::getDyxzzq)
|
||||
.distinct()
|
||||
.map(date -> SalaryDateUtil.dateStrToLocalYearMonth(date))
|
||||
.filter(date -> date != null).distinct()
|
||||
.sorted(Comparator.comparing(Date::getTime))
|
||||
.collect(Collectors.toList());
|
||||
// 根据公积金购买公司汇总
|
||||
ufGjjInfos = ufGjjInfos.stream().map(value -> {
|
||||
if (value.getFycdgsqc() == null) {
|
||||
|
|
@ -2352,28 +2416,31 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
// 查询核算账套
|
||||
List<SalarySobPO> salarySobList = getSalarySobService(user).listAll();
|
||||
List<Long> salarySobIds = salarySobList.stream().map(SalarySobPO::getId).collect(Collectors.toList());
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build();
|
||||
|
||||
List<Long> salaryAcctRecordIds = new ArrayList<>();
|
||||
Map<String, List<Map<String, Object>>> resultGroupByKey = new HashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(dateList)) {
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(dateList.get(0)).endDate(dateList.get(dateList.size()-1)).build();
|
||||
// 获取核算记录
|
||||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange);
|
||||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
|
||||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
LinkedHashMap<String, Map<String, Object>> acctSbSumByGsMap = new LinkedHashMap<>();
|
||||
salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmpList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||||
// 查新薪资核算结果
|
||||
List<SalaryAcctResultPO> acctResultPOList = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(salaryAcctRecordIds, salaryItemIdList);
|
||||
List<Map<String, Object>> resultMapList = buildData4LyReport(salaryItemList, salaryAcctEmpList, new ArrayList<>(), acctResultPOList, false);
|
||||
// 根据公积金购买公司进行分组
|
||||
Map<String, List<Map<String, Object>>> resultGroupByGmgs = SalaryEntityUtil.group2Map(resultMapList, map -> (map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString()));
|
||||
List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
|
||||
acctSbSumByGsMap = getSumResultByGroup(resultGroupByGmgs, Collections.emptyList(), numberItems, null ,Collections.emptyList());
|
||||
// 根据年月 公积金购买公司 人员id进行分组
|
||||
resultGroupByKey = SalaryEntityUtil.group2Map(resultMapList,
|
||||
map -> (map.get("salaryMonth") == null ? " " : map.get("salaryMonth") + "_split" +(map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString())) + "_split" +(map.get("employeeId") == null ? " " : map.get("employeeId").toString()));
|
||||
}
|
||||
|
||||
// 取建模、核算中购买公司合集
|
||||
Set<String> totalGs = new HashSet<>();
|
||||
Set<String> acctGs = acctSbSumByGsMap.keySet();
|
||||
// Set<String> acctGs = acctSbSumByGsMap.keySet();
|
||||
totalGs.addAll(ufGjjSumByGsMap.keySet());
|
||||
totalGs.addAll(acctGs);
|
||||
// totalGs.addAll(acctGs);
|
||||
|
||||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||||
|
|
@ -2387,20 +2454,44 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
// 插入前先删除
|
||||
String deleteSql ="delete from uf_dbhzbgjj where yf = '"+ salaryMonth + "'";
|
||||
rs.execute(deleteSql);
|
||||
Map<String, List<Map<String, Object>>> finalResultGroupByKey = resultGroupByKey;
|
||||
for (List<String> part : partition) {
|
||||
// 插入对比数据
|
||||
StringBuilder sbSql = new StringBuilder("insert into uf_dbhzbgjj(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime," +
|
||||
"yf,gmgs,gjjdrrs,xcffrs,gjjdrsj,gjjxcff,ce) values ");
|
||||
for (String gmgs : part) {
|
||||
String gmgsId = frztNameMap.get(gmgs);
|
||||
Map<String, Object> acctSumMap = acctSbSumByGsMap.getOrDefault(gmgs, new HashMap<>());
|
||||
// Map<String, Object> acctSumMap = acctSbSumByGsMap.getOrDefault(gmgs, new HashMap<>());
|
||||
Map<String, BigDecimal> ufSumMap = ufGjjSumByGsMap.getOrDefault(gmgs, new HashMap<>());
|
||||
// 公积金
|
||||
String gjjAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(gjjItemId.toString()))).toPlainString();
|
||||
BigDecimal gjjAcct = new BigDecimal("0");
|
||||
// 获取该公积金购买公司下建模数据
|
||||
List<UfGjjInfo> ufGjjInfosList = ufGjjInfoGroupMap.get(gmgsId);
|
||||
// 核算人数
|
||||
int[] countEmp = {0};
|
||||
if (CollectionUtils.isNotEmpty(ufGjjInfosList)) {
|
||||
gjjAcct = ufGjjInfosList.stream().map(uf -> {
|
||||
String key = uf.getDyxzzq() + "_split" + gmgs + "_split" + uf.getYg();
|
||||
List<Map<String, Object>> maps = finalResultGroupByKey.get(key);
|
||||
BigDecimal sum = new BigDecimal("0");
|
||||
if (CollectionUtils.isNotEmpty(maps)) {
|
||||
countEmp[0] = countEmp[0] + 1;
|
||||
List<String> itemValue = maps.stream().filter(v -> v.get(gjjItemId.toString()) != null).map(v -> (String) v.get(gjjItemId.toString())).collect(Collectors.toList());
|
||||
sum = itemValue
|
||||
.stream()
|
||||
.filter(NumberUtils::isCreatable)
|
||||
.map(BigDecimal::new)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
return sum;
|
||||
}).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
// String gjjAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(gjjItemId.toString()))).toPlainString();
|
||||
String gjjUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("gjj"))).toPlainString();
|
||||
String ce = new BigDecimal(gjjUf).subtract(new BigDecimal(gjjAcct)).toPlainString();
|
||||
String ce = new BigDecimal(gjjUf).subtract(gjjAcct).toPlainString();
|
||||
// 人数
|
||||
String empNumsAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get("empNums"))).toPlainString();
|
||||
// String empNumsAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get("empNums"))).toPlainString();
|
||||
String empNumsAcct =String.valueOf(countEmp[0]);
|
||||
String empNumsUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("empNums"))).toPlainString();
|
||||
sbSql.append("(").append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'");
|
||||
sbSql.append(salaryMonth).append("','")
|
||||
|
|
@ -2449,15 +2540,33 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
}
|
||||
|
||||
// 获取当月导入社保数据
|
||||
List<UfSbInfo> ufSbInfos = getLyUfSbgjjMapper().listSbInfoByDyxzzq(salaryMonth);
|
||||
// List<UfSbInfo> ufSbInfos = getLyUfSbgjjMapper().listSbInfoByDyxzzq(salaryMonth);
|
||||
List<UfSbInfo> ufSbInfos = getLyUfSbgjjMapper().listSbInfoByFyssq(salaryMonth);
|
||||
// 根据人员id汇总
|
||||
Map<Long, List<UfSbInfo>> ufGroupByYg = SalaryEntityUtil.group2Map(ufSbInfos, UfSbInfo::getYg);
|
||||
ufSbInfos = ufSbInfos.stream().filter(uf -> {
|
||||
List<UfSbInfo> list = ufGroupByYg.get(uf.getYg());
|
||||
if (CollectionUtils.isNotEmpty(list) && list.size() > 1) {
|
||||
return !(uf.getSbgrjnhj() == null || uf.getSbgrjnhj().compareTo(Double.valueOf("0")) == 0);
|
||||
}
|
||||
return true;
|
||||
}).collect(Collectors.toList());
|
||||
List<Date> dateList = ufSbInfos.stream().map(UfSbInfo::getDyxzzq)
|
||||
.distinct()
|
||||
.map(date -> SalaryDateUtil.dateStrToLocalYearMonth(date))
|
||||
.filter(date -> date != null).distinct()
|
||||
.sorted(Comparator.comparing(Date::getTime))
|
||||
.collect(Collectors.toList());
|
||||
ufSbInfos = ufSbInfos.stream().map(value -> {
|
||||
if (value.getGmgsqc() == null) {
|
||||
value.setGmgsqc("");
|
||||
}
|
||||
return value;
|
||||
}).collect(Collectors.toList());
|
||||
// 根据社保购买公司汇总
|
||||
// 根据社保购买公司员工汇总
|
||||
Map<String, List<UfSbInfo>> ufSbInfoGroupMap = SalaryEntityUtil.group2Map(ufSbInfos, ufSbInfo -> Utils.null2String(ufSbInfo.getGmgsqc()) + "_split" + Utils.null2String(ufSbInfo.getYg()));
|
||||
Map<String, List<UfSbInfo>> ufSbInfoNameGroupMap = SalaryEntityUtil.group2Map(ufSbInfos, ufSbInfo -> Utils.null2String(frztMap.get(Utils.null2String(ufSbInfo.getGmgsqc()))) + "_split" + Utils.null2String(ufSbInfo.getYg()));
|
||||
|
||||
// 以购买公司维度求和
|
||||
Map<String, Map<String, BigDecimal>> ufSbSumByGsMap = new HashMap<>();
|
||||
for (Map.Entry<String, List<UfSbInfo>> entry : ufSbInfoGroupMap.entrySet()) {
|
||||
|
|
@ -2511,69 +2620,61 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
// 查询核算账套
|
||||
List<SalarySobPO> salarySobList = getSalarySobService(user).listAll();
|
||||
List<Long> salarySobIds = salarySobList.stream().map(SalarySobPO::getId).collect(Collectors.toList());
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build();
|
||||
// 查询所有薪资所属月下核算数据
|
||||
List<Long> salaryAcctRecordIds = new ArrayList<>();
|
||||
Map<String, List<Map<String, Object>>> resultGroupByKey = new HashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(dateList)) {
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(dateList.get(0)).endDate(dateList.get(dateList.size()-1)).build();
|
||||
// 获取核算记录
|
||||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange);
|
||||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
|
||||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
LinkedHashMap<String, Map<String, Object>> acctSbSumByGsMap = new LinkedHashMap<>();
|
||||
salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmpList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||||
// 查新薪资核算结果
|
||||
List<SalaryAcctResultPO> acctResultPOList = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(salaryAcctRecordIds, salaryItemIdList);
|
||||
List<Map<String, Object>> resultMapList = buildData4LyReport(salaryItemList, salaryAcctEmpList, new ArrayList<>(), acctResultPOList, false);
|
||||
// 根据社保购买公司进行分组
|
||||
Map<String, List<Map<String, Object>>> resultGroupByGmgsEmp = SalaryEntityUtil.group2Map(resultMapList,
|
||||
map -> (map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString() + "_split" + Utils.null2String(map.get("employeeId")) ));
|
||||
List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
|
||||
acctSbSumByGsMap = getSumResultByGroup(resultGroupByGmgsEmp, Collections.emptyList(), numberItems, null ,Collections.emptyList());
|
||||
// 根据年月 社保购买公司 人员id进行分组
|
||||
resultGroupByKey = SalaryEntityUtil.group2Map(resultMapList,
|
||||
map -> (map.get("salaryMonth") == null ? " " : map.get("salaryMonth") + "_split" +(map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString())) + "_split" +(map.get("employeeId") == null ? " " : map.get("employeeId").toString()));
|
||||
// List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
|
||||
// LinkedHashMap<String, Map<String, Object>> acctSbSumByGsAndDateMap = getSumResultByGroup(resultGroupByGmgsAndDate, Collections.emptyList(), numberItems, null ,Collections.emptyList());
|
||||
}
|
||||
|
||||
// 取建模、核算中购买公司_split人员id 合集
|
||||
Set<String> totalKey = new HashSet<>();
|
||||
Set<String> acctGs = acctSbSumByGsMap.keySet();
|
||||
// Set<String> acctGs = acctSbSumByGsMap.keySet();
|
||||
totalKey.addAll(ufSbSumByGsMap.keySet());
|
||||
totalKey.addAll(acctGs);
|
||||
// totalKey.addAll(acctGs);
|
||||
|
||||
// 对比建模、核算数据过滤出有差异的key
|
||||
List<Map<String, Object>> diffList = new ArrayList<>();
|
||||
Map<String, List<Map<String, Object>>> finalResultGroupByKey = resultGroupByKey;
|
||||
for (String key : totalKey) {
|
||||
boolean hasDiff = false;
|
||||
Map<String, Object> acctSumMap = acctSbSumByGsMap.getOrDefault(key, new HashMap<>());
|
||||
Map<String, BigDecimal> ufSumMap = ufSbSumByGsMap.getOrDefault(key, new HashMap<>());
|
||||
// // 养老
|
||||
// BigDecimal ylAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(ylItemId.toString())));
|
||||
// BigDecimal ylUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("yl")));
|
||||
// if (ylAcct.compareTo(ylUf) != 0) {
|
||||
// hasDiff = true;
|
||||
// }
|
||||
// // 医疗
|
||||
// BigDecimal yliaoAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(yliaoItemId.toString())));
|
||||
// BigDecimal yliaoUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("yliao")));
|
||||
// if (yliaoAcct.compareTo(yliaoUf) != 0) {
|
||||
// hasDiff = true;
|
||||
// }
|
||||
// // 生育
|
||||
// BigDecimal syAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(syItemId.toString())));
|
||||
// BigDecimal syUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("sy")));
|
||||
// if (syAcct.compareTo(syUf) != 0) {
|
||||
// hasDiff = true;
|
||||
// }
|
||||
// // 工伤
|
||||
// BigDecimal gsAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(gsItemId.toString())));
|
||||
// BigDecimal gsUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("gs")));
|
||||
// if (gsAcct.compareTo(gsUf) != 0) {
|
||||
// hasDiff = true;
|
||||
// }
|
||||
// // 失业
|
||||
// BigDecimal syeAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(syeItemId.toString())));
|
||||
// BigDecimal syeUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("sye")));
|
||||
// if (syeAcct.compareTo(syeUf) != 0) {
|
||||
// hasDiff = true;
|
||||
// }
|
||||
|
||||
// 社保合计
|
||||
BigDecimal sbAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(grjnheItemId.toString())));
|
||||
BigDecimal sbAcct = new BigDecimal("0");
|
||||
// 获取该社保购买公司下建模数据
|
||||
List<UfSbInfo> ufSbInfosList = ufSbInfoNameGroupMap.get(key);
|
||||
if (CollectionUtils.isNotEmpty(ufSbInfosList)) {
|
||||
sbAcct = ufSbInfosList.stream().map(uf -> {
|
||||
List<Map<String, Object>> maps = finalResultGroupByKey.get(uf.getDyxzzq() + "_split" + key);
|
||||
BigDecimal sum = new BigDecimal("0");
|
||||
if (CollectionUtils.isNotEmpty(maps)) {
|
||||
List<String> itemValue = maps.stream().filter(v -> v.get(grjnheItemId.toString()) != null).map(v -> (String) v.get(grjnheItemId.toString())).collect(Collectors.toList());
|
||||
sum = itemValue
|
||||
.stream()
|
||||
.filter(NumberUtils::isCreatable)
|
||||
.map(BigDecimal::new)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
return sum;
|
||||
}).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
BigDecimal sbUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("sbgrjnhj")));
|
||||
if (sbAcct.compareTo(sbUf) != 0) {
|
||||
hasDiff = true;
|
||||
|
|
@ -2584,16 +2685,6 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
Long empId = splitKey.length > 1 && NumberUtils.isCreatable(splitKey[1]) ? Long.valueOf(splitKey[1]) : 0;
|
||||
if (hasDiff) {
|
||||
Map<String, Object> singleDiffMap = new HashMap<>();
|
||||
// singleDiffMap.put("ylAcct", ylAcct);
|
||||
// singleDiffMap.put("ylUf", ylUf);
|
||||
// singleDiffMap.put("yliaoAcct", yliaoAcct);
|
||||
// singleDiffMap.put("yliaoUf", yliaoUf);
|
||||
// singleDiffMap.put("syAcct", syAcct);
|
||||
// singleDiffMap.put("syUf", syUf);
|
||||
// singleDiffMap.put("gsAcct", gsAcct);
|
||||
// singleDiffMap.put("gsUf", gsUf);
|
||||
// singleDiffMap.put("syeAcct", syeAcct);
|
||||
// singleDiffMap.put("syeUf", syeUf);
|
||||
singleDiffMap.put("sbAcct", sbAcct);
|
||||
singleDiffMap.put("sbUf", sbUf);
|
||||
singleDiffMap.put("xm", empId);
|
||||
|
|
@ -2678,7 +2769,23 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
}
|
||||
|
||||
// 获取当月导入社保数据
|
||||
List<UfGjjInfo> ufGjjInfos = getLyUfSbgjjMapper().listGjjInfoByDyxzzq(salaryMonth);
|
||||
// List<UfGjjInfo> ufGjjInfos = getLyUfSbgjjMapper().listGjjInfoByDyxzzq(salaryMonth);
|
||||
List<UfGjjInfo> ufGjjInfos = getLyUfSbgjjMapper().listGjjInfoByFyssq(salaryMonth);
|
||||
// 根据人员id汇总
|
||||
Map<Long, List<UfGjjInfo>> ufGroupByYg = SalaryEntityUtil.group2Map(ufGjjInfos, UfGjjInfo::getYg);
|
||||
ufGjjInfos = ufGjjInfos.stream().filter(uf -> {
|
||||
List<UfGjjInfo> list = ufGroupByYg.get(uf.getYg());
|
||||
if (CollectionUtils.isNotEmpty(list) && list.size() > 1) {
|
||||
return !(uf.getGjjgrjn() == null || uf.getGjjgrjn().compareTo(Double.valueOf("0")) == 0);
|
||||
}
|
||||
return true;
|
||||
}).collect(Collectors.toList());
|
||||
List<Date> dateList = ufGjjInfos.stream().map(UfGjjInfo::getDyxzzq)
|
||||
.distinct()
|
||||
.map(date -> SalaryDateUtil.dateStrToLocalYearMonth(date))
|
||||
.filter(date -> date != null).distinct()
|
||||
.sorted(Comparator.comparing(Date::getTime))
|
||||
.collect(Collectors.toList());
|
||||
ufGjjInfos = ufGjjInfos.stream().map(value -> {
|
||||
if (value.getFycdgsqc() == null) {
|
||||
value.setFycdgsqc("");
|
||||
|
|
@ -2687,6 +2794,8 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
}).collect(Collectors.toList());
|
||||
// 根据社保购买公司汇总
|
||||
Map<String, List<UfGjjInfo>> ufGjjInfoGroupMap = SalaryEntityUtil.group2Map(ufGjjInfos, ufGjjInfo -> Utils.null2String(ufGjjInfo.getFycdgsqc()) + "_split" + Utils.null2String(ufGjjInfo.getYg()));
|
||||
Map<String, List<UfGjjInfo>> ufGjjInfoNameGroupMap = SalaryEntityUtil.group2Map(ufGjjInfos, ufGjjInfo -> Utils.null2String(frztMap.get(Utils.null2String(ufGjjInfo.getFycdgsqc()))) + "_split" + Utils.null2String(ufGjjInfo.getYg()));
|
||||
|
||||
// 以购买公司维度求和
|
||||
Map<String, Map<String, BigDecimal>> ufGjjSumByGsMap = new HashMap<>();
|
||||
for (Map.Entry<String, List<UfGjjInfo>> entry : ufGjjInfoGroupMap.entrySet()) {
|
||||
|
|
@ -2714,11 +2823,18 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
// 查询核算账套
|
||||
List<SalarySobPO> salarySobList = getSalarySobService(user).listAll();
|
||||
List<Long> salarySobIds = salarySobList.stream().map(SalarySobPO::getId).collect(Collectors.toList());
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build();
|
||||
|
||||
// 查询所有薪资所属月下核算数据
|
||||
List<Long> salaryAcctRecordIds = new ArrayList<>();
|
||||
Map<String, List<Map<String, Object>>> resultGroupByKey = new HashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(dateList)) {
|
||||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(dateList.get(0)).endDate(dateList.get(dateList.size()-1)).build();
|
||||
// 获取核算记录
|
||||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange);
|
||||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
|
||||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
LinkedHashMap<String, Map<String, Object>> acctSbSumByGsMap = new LinkedHashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmpList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||||
|
|
@ -2726,26 +2842,50 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
|||
List<SalaryAcctResultPO> acctResultPOList = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(salaryAcctRecordIds, salaryItemIdList);
|
||||
List<Map<String, Object>> resultMapList = buildData4LyReport(salaryItemList, salaryAcctEmpList, new ArrayList<>(), acctResultPOList, false);
|
||||
// 根据社保购买公司进行分组
|
||||
Map<String, List<Map<String, Object>>> resultGroupByGmgsEmp = SalaryEntityUtil.group2Map(resultMapList,
|
||||
map -> (map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString() + "_split" + Utils.null2String(map.get("employeeId")) ));
|
||||
List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
|
||||
acctSbSumByGsMap = getSumResultByGroup(resultGroupByGmgsEmp, Collections.emptyList(), numberItems, null ,Collections.emptyList());
|
||||
// Map<String, List<Map<String, Object>>> resultGroupByGmgsEmp = SalaryEntityUtil.group2Map(resultMapList,
|
||||
// map -> (map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString() + "_split" + Utils.null2String(map.get("employeeId")) ));
|
||||
// List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
|
||||
// acctSbSumByGsMap = getSumResultByGroup(resultGroupByGmgsEmp, Collections.emptyList(), numberItems, null ,Collections.emptyList());
|
||||
|
||||
// 根据年月 公积金购买公司 人员id进行分组
|
||||
resultGroupByKey = SalaryEntityUtil.group2Map(resultMapList,
|
||||
map -> (map.get("salaryMonth") == null ? " " : map.get("salaryMonth") + "_split" +(map.get(gmgsItemId.toString()) == null ? " " : map.get(gmgsItemId.toString()).toString())) + "_split" +(map.get("employeeId") == null ? " " : map.get("employeeId").toString()));
|
||||
}
|
||||
|
||||
// 取建模、核算中购买公司_split人员id 合集
|
||||
Set<String> totalKey = new HashSet<>();
|
||||
Set<String> acctGs = acctSbSumByGsMap.keySet();
|
||||
// Set<String> acctGs = acctSbSumByGsMap.keySet();
|
||||
totalKey.addAll(ufGjjSumByGsMap.keySet());
|
||||
totalKey.addAll(acctGs);
|
||||
// totalKey.addAll(acctGs);
|
||||
|
||||
// 对比建模、核算数据过滤出有差异的key
|
||||
List<Map<String, Object>> diffList = new ArrayList<>();
|
||||
Map<String, List<Map<String, Object>>> finalResultGroupByKey = resultGroupByKey;
|
||||
for (String key : totalKey) {
|
||||
boolean hasDiff = false;
|
||||
Map<String, Object> acctSumMap = acctSbSumByGsMap.getOrDefault(key, new HashMap<>());
|
||||
// Map<String, Object> acctSumMap = acctSbSumByGsMap.getOrDefault(key, new HashMap<>());
|
||||
Map<String, BigDecimal> ufSumMap = ufGjjSumByGsMap.getOrDefault(key, new HashMap<>());
|
||||
// 公积金
|
||||
BigDecimal gjjAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(gjjItemId.toString())));
|
||||
BigDecimal gjjAcct = new BigDecimal("0");
|
||||
// 获取该社保购买公司下建模数据
|
||||
List<UfGjjInfo> ufGjjInfosList = ufGjjInfoNameGroupMap.get(key);
|
||||
if (CollectionUtils.isNotEmpty(ufGjjInfosList)) {
|
||||
gjjAcct = ufGjjInfosList.stream().map(uf -> {
|
||||
List<Map<String, Object>> maps = finalResultGroupByKey.get(uf.getDyxzzq() + "_split" + key);
|
||||
BigDecimal sum = new BigDecimal("0");
|
||||
if (CollectionUtils.isNotEmpty(maps)) {
|
||||
List<String> itemValue = maps.stream().filter(v -> v.get(gjjItemId.toString()) != null).map(v -> (String) v.get(gjjItemId.toString())).collect(Collectors.toList());
|
||||
sum = itemValue
|
||||
.stream()
|
||||
.filter(NumberUtils::isCreatable)
|
||||
.map(BigDecimal::new)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
return sum;
|
||||
}).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
|
||||
// BigDecimal gjjAcct = SalaryEntityUtil.empty2Zero(Utils.null2String(acctSumMap.get(gjjItemId.toString())));
|
||||
BigDecimal gjjUf = SalaryEntityUtil.empty2Zero(Utils.null2String(ufSumMap.get("gjj")));
|
||||
if (gjjAcct.compareTo(gjjUf) != 0) {
|
||||
hasDiff = true;
|
||||
|
|
|
|||
Loading…
Reference in New Issue