weaver-hrm-salary/src/com/engine/salary/service/impl/LyPZServiceImpl.java

247 lines
11 KiB
Java
Raw Normal View History

2024-08-28 17:42:16 +08:00
package com.engine.salary.service.impl;
import cn.hutool.core.bean.BeanUtil;
2024-08-30 17:44:26 +08:00
import com.cloudstore.eccom.pc.table.WeaTableColumn;
2024-08-28 17:42:16 +08:00
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
2024-08-30 17:44:26 +08:00
import com.engine.salary.entity.ly.dto.LyPzPreview;
2024-08-28 17:42:16 +08:00
import com.engine.salary.entity.ly.param.LyPZGenParam;
import com.engine.salary.entity.ly.param.LySalaryReportQueryParam;
import com.engine.salary.entity.ly.po.LySalaryReportPO;
import com.engine.salary.entity.ly.po.LySocialReportPO;
2024-08-30 17:44:26 +08:00
import com.engine.salary.entity.ly.po.UfKjkmPO;
2024-08-28 17:42:16 +08:00
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.po.FormulaVar;
2024-08-30 17:44:26 +08:00
import com.engine.salary.enums.ly.LyJDDirectionTypeEnum;
2024-08-28 17:42:16 +08:00
import com.engine.salary.enums.ly.LyPZTypeEnum;
import com.engine.salary.enums.salaryformula.ReferenceTypeEnum;
import com.engine.salary.formlua.entity.parameter.DataType;
import com.engine.salary.formlua.entity.standard.ExcelResult;
2024-08-30 17:44:26 +08:00
import com.engine.salary.mapper.ly.UfKjkmMapper;
2024-08-28 17:42:16 +08:00
import com.engine.salary.service.FormulaRunService;
import com.engine.salary.service.LyPZService;
import com.engine.salary.service.LySalaryReportService;
import com.engine.salary.service.LySocialReportService;
2024-08-30 17:44:26 +08:00
import com.engine.salary.util.db.MapperProxyFactory;
2024-08-28 17:42:16 +08:00
import com.engine.salary.util.page.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.general.Util;
import weaver.hrm.User;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Harryxzy
* @ClassName LyPZServiceImpl
* @date 2024/08/27 10:14
* @description
*/
@Slf4j
public class LyPZServiceImpl extends Service implements LyPZService {
private LySalaryReportService getLySalaryReportService(User user) {
return ServiceUtil.getService(LySalaryReportServiceImpl.class, user);
}
private LySocialReportService getLySocialReportService(User user) {
return ServiceUtil.getService(LySocialReportServiceImpl.class, user);
}
private FormulaRunService getFormulaRunService(User user) {
return ServiceUtil.getService(FormulaRunServiceImpl.class, user);
}
2024-08-30 17:44:26 +08:00
private UfKjkmMapper getUfKjkmMapper() {
return MapperProxyFactory.getProxy(UfKjkmMapper.class);
}
2024-08-28 17:42:16 +08:00
@Override
2024-08-30 17:44:26 +08:00
public Map<String, Object> genPZ(LyPZGenParam queryParam) {
2024-08-28 17:42:16 +08:00
List<List<FormulaVar>> formulaVarsList = new ArrayList<>();
if (queryParam.getPzlx().equals(LyPZTypeEnum.XZFFPZ.getValue()) || queryParam.getPzlx().equals(LyPZTypeEnum.XZJTPZ.getValue())) {
// 是工资单凭证
2024-08-30 17:44:26 +08:00
Map<String, Object> resultMap = getLySalaryReportService(user).listSalaryReport(LySalaryReportQueryParam.builder().salaryMonth(queryParam.getSalaryMonth()).ffgsqc(queryParam.getFfgsqc()).export(true).build());
2024-08-28 17:42:16 +08:00
List<LySalaryReportPO> dataList = ((PageInfo<LySalaryReportPO>)resultMap.get("data")).getList();
// 将每一个结果转换成map的格式并作为变量存储
for (LySalaryReportPO po : dataList) {
Map<String, Object> dataMap = BeanUtil.beanToMap(po);
List<FormulaVar> formulaVars = new ArrayList<>();
for (Map.Entry<String,Object> entry : dataMap.entrySet()) {
FormulaVar build = FormulaVar.builder()
.fieldId(entry.getKey())
.content(Util.null2String(entry.getValue()))
2024-08-30 17:44:26 +08:00
.fieldType(DataType.NUMBER)
2024-08-28 17:42:16 +08:00
.build();
2024-08-30 17:44:26 +08:00
if(entry.getKey().equals("ffgsqc") || entry.getKey().equals("fycdgsqc") || entry.getKey().equals("znxmmc")) {
build.setFieldType(DataType.STRING);
}
2024-08-28 17:42:16 +08:00
formulaVars.add(build);
}
formulaVarsList.add(formulaVars);
}
} else {
// 是社保公积金凭证
2024-08-30 17:44:26 +08:00
Map<String, Object> resultMap = getLySocialReportService(user).listSIReport(LySalaryReportQueryParam.builder().salaryMonth(queryParam.getSalaryMonth()).ffgsqc(queryParam.getFfgsqc()).export(true).build());
2024-08-28 17:42:16 +08:00
List<LySocialReportPO> dataList = ((PageInfo<LySocialReportPO>)resultMap.get("data")).getList();
// 将每一个结果转换成map的格式并作为变量存储
for (LySocialReportPO po : dataList) {
Map<String, Object> dataMap = BeanUtil.beanToMap(po);
List<FormulaVar> formulaVars = new ArrayList<>();
for (Map.Entry<String,Object> entry : dataMap.entrySet()) {
FormulaVar build = FormulaVar.builder()
.fieldId(entry.getKey())
.content(Util.null2String(entry.getValue()))
2024-08-30 17:44:26 +08:00
.fieldType(DataType.NUMBER)
2024-08-28 17:42:16 +08:00
.build();
2024-08-30 17:44:26 +08:00
if(entry.getKey().equals("ffgsqc") || entry.getKey().equals("fycdgsqc") || entry.getKey().equals("znxmmc")) {
build.setFieldType(DataType.STRING);
}
2024-08-28 17:42:16 +08:00
formulaVars.add(build);
}
formulaVarsList.add(formulaVars);
}
}
// 根据科目编码获取科会计科目全路径名称
2024-08-30 17:44:26 +08:00
// 获取当前凭证对应的所有会计科目信息
List<UfKjkmPO> ufKjkmList = getUfKjkmMapper().listSome(UfKjkmPO.builder().pzlx(queryParam.getPzlx()).build());
// 封装会计科目对应的公式
for(UfKjkmPO kjkm: ufKjkmList) {
2024-08-28 17:42:16 +08:00
ExpressFormula expressFormula = ExpressFormula.builder().name("t")
.referenceType(ReferenceTypeEnum.FORMULA.getValue())
2024-08-30 17:44:26 +08:00
.formula(kjkm.getXzxm())
.formulaRunScript(kjkm.getXzxm())
2024-08-28 17:42:16 +08:00
.extendParam("{}")
.build();
2024-08-30 17:44:26 +08:00
kjkm.setKjkmSalaryItemFormula(expressFormula);
2024-08-28 17:42:16 +08:00
}
Map<String, BigDecimal> kjkmValueMap = new HashMap<>();
for(List<FormulaVar> varList : formulaVarsList) {
// 每一条记录都需要执行一遍公式并把结果相加
2024-08-30 17:44:26 +08:00
for (UfKjkmPO kjkm : ufKjkmList) {
2024-08-28 17:42:16 +08:00
// 给公式中的变量填入值
ExcelResult result = new ExcelResult();
try {
result = getFormulaRunService(user).run(kjkm.getKjkmSalaryItemFormula(), varList, null);
} catch (Exception e) {
log.error("express execute fail ", e);
result.setStatus(false);
result.setErrorMsg(e.getMessage());
}
//核算出错,给个默认值
if (!result.isStatus() || result.getData() == null) {
log.error("express execute fail status ", result.getErrorMsg());
result.setData("0");
}
String resultStr = result.getData() == null ? "0" : result.getData().toString();
BigDecimal resultBigDecimal = NumberUtils.isCreatable(resultStr) ? new BigDecimal(resultStr) : BigDecimal.ZERO;
2024-08-30 17:44:26 +08:00
kjkmValueMap.put(kjkm.getKmbm(), kjkmValueMap.getOrDefault(kjkm.getKmbm(), new BigDecimal(0)).add(resultBigDecimal));
2024-08-28 17:42:16 +08:00
}
}
2024-08-30 17:44:26 +08:00
// 封装会计科目的摘要信息、会计科目信息、借贷金额薪资,过滤金额为0的会计科目
List<LyPzPreview> lyPzPreviewList = new ArrayList<>();
Map<String, String> kmbmInfoMap = new HashMap<>();
List<UfKjkmPO> allKjkm = getUfKjkmMapper().listAll();
allKjkm.forEach(po -> kmbmInfoMap.put(po.getKmbm(), po.getKmmc()));
for (UfKjkmPO kjkm : ufKjkmList) {
BigDecimal value = kjkmValueMap.getOrDefault(kjkm.getKmbm(), BigDecimal.ZERO);
LyPzPreview build = LyPzPreview.builder()
.zy("")
.kjkm(getFullPathKjkm(kjkm.getKmbm(), kmbmInfoMap))
.jfValue(kjkm.getFx().equals(LyJDDirectionTypeEnum.DEBIT.getValue()) ? "0.00" : value.toString())
.dfValue(kjkm.getFx().equals(LyJDDirectionTypeEnum.CREDIT.getValue()) ? "0.00" : value.toString())
.build();
lyPzPreviewList.add(build);
}
List<WeaTableColumn> columns = new ArrayList<>();
columns.add(new WeaTableColumn("100px", "摘要" , "zy"));
columns.add(new WeaTableColumn("100px", "会计科目" , "kjkm"));
columns.add(new WeaTableColumn("100px", "借方金额" , "jfValue"));
columns.add(new WeaTableColumn("100px", "贷方金额" , "dfValue"));
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("columns" , columns);
resultMap.put("data", lyPzPreviewList);
return resultMap;
2024-08-28 17:42:16 +08:00
// 所有的结果都算好了,封装凭证预览
2024-08-30 17:44:26 +08:00
2024-08-28 17:42:16 +08:00
// test 生成xml
// List<LyVoucherAss> assList = new ArrayList<>();
// assList.add(LyVoucherAss.builder()
// .pkChecktype("first")
// .pkCheckvalue("ff")
// .build());
// assList.add(LyVoucherAss.builder()
// .pkChecktype("second")
// .pkCheckvalue("fd")
// .build());
//
// List<LyVoucherDetail> lyVoucherDetails = new ArrayList<>();
// lyVoucherDetails.add(LyVoucherDetail.builder()
// .detailindex("what")
// .explanation("hfdsuhfad")
// .debitamount("1000")
// .pkCurrtype("RMB")
// .pkAccasoa("kemu")
// .ass(assList)
// .build());
//
// LyVoucher build = LyVoucher.builder()
// .pkVoucher("123")
// .pkVouchertype("type")
// .year("2024")
// .pkSystem("system")
// .voucherkind("0")
// .pkAccountingbook("1")
// .period("04")
// .prepareddate("2024-08-01")
// .pkPrepared("par")
// .pkOrg("org")
// .details(lyVoucherDetails)
// .build();
//
// String xml = XStreamUtil.marshal(build);
// System.out.println(xml);
}
/**
* 根据科目编码获取对应的全路径名称
* @param kmbm
* @param kmbmInfoMap
* @return
*/
private String getFullPathKjkm(String kmbm, Map<String, String> kmbmInfoMap) {
int length = kmbm.length();
if (length == 4) {
// 是一级科目,不需要拼接
2024-08-30 17:44:26 +08:00
return kmbm + "\\" + kmbmInfoMap.getOrDefault(kmbm, "");
2024-08-28 17:42:16 +08:00
} else if (length == 6) {
// 是二级科目,先找一级科目
String firstKjkmbm = kmbm.substring(0, 4);
String firstKjkm = kmbmInfoMap.getOrDefault(firstKjkmbm, "");
2024-08-30 17:44:26 +08:00
return kmbm + "\\" + firstKjkm + "\\" + kmbmInfoMap.getOrDefault(kmbm, "");
2024-08-28 17:42:16 +08:00
} else if (length == 8) {
// 是三级科目
String firstKjkmbm = kmbm.substring(0, 4);
String firstKjkm = kmbmInfoMap.getOrDefault(firstKjkmbm, "");
String secondKjkmbm = kmbm.substring(0, 6);
String secondKjkm = kmbmInfoMap.getOrDefault(secondKjkmbm, "");
2024-08-30 17:44:26 +08:00
return kmbm + "\\" + firstKjkm + "\\" + secondKjkm + "\\" +kmbmInfoMap.getOrDefault(kmbm, "");
2024-08-28 17:42:16 +08:00
} else {
return "科目编码格式错误!";
}
}
}