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 "科目编码格式错误!";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|