package com.engine.salary.service.impl; import cn.hutool.core.bean.BeanUtil; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.entity.ly.dto.LyPzPreview; 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; import com.engine.salary.entity.ly.po.UfKjkmPO; import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.enums.ly.LyJDDirectionTypeEnum; 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; import com.engine.salary.mapper.ly.UfKjkmMapper; import com.engine.salary.service.FormulaRunService; import com.engine.salary.service.LyPZService; import com.engine.salary.service.LySalaryReportService; import com.engine.salary.service.LySocialReportService; import com.engine.salary.util.db.MapperProxyFactory; 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); } private UfKjkmMapper getUfKjkmMapper() { return MapperProxyFactory.getProxy(UfKjkmMapper.class); } @Override public Map genPZ(LyPZGenParam queryParam) { List> formulaVarsList = new ArrayList<>(); if (queryParam.getPzlx().equals(LyPZTypeEnum.XZFFPZ.getValue()) || queryParam.getPzlx().equals(LyPZTypeEnum.XZJTPZ.getValue())) { // 是工资单凭证 Map resultMap = getLySalaryReportService(user).listSalaryReport(LySalaryReportQueryParam.builder().salaryMonth(queryParam.getSalaryMonth()).ffgsqc(queryParam.getFfgsqc()).export(true).build()); List dataList = ((PageInfo)resultMap.get("data")).getList(); // 将每一个结果转换成map的格式并作为变量存储 for (LySalaryReportPO po : dataList) { Map dataMap = BeanUtil.beanToMap(po); List formulaVars = new ArrayList<>(); for (Map.Entry entry : dataMap.entrySet()) { FormulaVar build = FormulaVar.builder() .fieldId(entry.getKey()) .content(Util.null2String(entry.getValue())) .fieldType(DataType.NUMBER) .build(); if(entry.getKey().equals("ffgsqc") || entry.getKey().equals("fycdgsqc") || entry.getKey().equals("znxmmc")) { build.setFieldType(DataType.STRING); } formulaVars.add(build); } formulaVarsList.add(formulaVars); } } else { // 是社保公积金凭证 Map resultMap = getLySocialReportService(user).listSIReport(LySalaryReportQueryParam.builder().salaryMonth(queryParam.getSalaryMonth()).ffgsqc(queryParam.getFfgsqc()).export(true).build()); List dataList = ((PageInfo)resultMap.get("data")).getList(); // 将每一个结果转换成map的格式并作为变量存储 for (LySocialReportPO po : dataList) { Map dataMap = BeanUtil.beanToMap(po); List formulaVars = new ArrayList<>(); for (Map.Entry entry : dataMap.entrySet()) { FormulaVar build = FormulaVar.builder() .fieldId(entry.getKey()) .content(Util.null2String(entry.getValue())) .fieldType(DataType.NUMBER) .build(); if(entry.getKey().equals("ffgsqc") || entry.getKey().equals("fycdgsqc") || entry.getKey().equals("znxmmc")) { build.setFieldType(DataType.STRING); } formulaVars.add(build); } formulaVarsList.add(formulaVars); } } // 根据科目编码获取科会计科目全路径名称 // 获取当前凭证对应的所有会计科目信息 List ufKjkmList = getUfKjkmMapper().listSome(UfKjkmPO.builder().pzlx(queryParam.getPzlx()).build()); // 封装会计科目对应的公式 for(UfKjkmPO kjkm: ufKjkmList) { ExpressFormula expressFormula = ExpressFormula.builder().name("t") .referenceType(ReferenceTypeEnum.FORMULA.getValue()) .formula(kjkm.getXzxm()) .formulaRunScript(kjkm.getXzxm()) .extendParam("{}") .build(); kjkm.setKjkmSalaryItemFormula(expressFormula); } Map kjkmValueMap = new HashMap<>(); for(List varList : formulaVarsList) { // 每一条记录都需要执行一遍公式并把结果相加 for (UfKjkmPO kjkm : ufKjkmList) { // 给公式中的变量填入值 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; kjkmValueMap.put(kjkm.getKmbm(), kjkmValueMap.getOrDefault(kjkm.getKmbm(), new BigDecimal(0)).add(resultBigDecimal)); } } // 封装会计科目的摘要信息、会计科目信息、借贷金额薪资,过滤金额为0的会计科目 List lyPzPreviewList = new ArrayList<>(); Map kmbmInfoMap = new HashMap<>(); List 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 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 resultMap = new HashMap<>(); resultMap.put("columns" , columns); resultMap.put("data", lyPzPreviewList); return resultMap; // 所有的结果都算好了,封装凭证预览 // test 生成xml // List assList = new ArrayList<>(); // assList.add(LyVoucherAss.builder() // .pkChecktype("first") // .pkCheckvalue("ff") // .build()); // assList.add(LyVoucherAss.builder() // .pkChecktype("second") // .pkCheckvalue("fd") // .build()); // // List 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 kmbmInfoMap) { int length = kmbm.length(); if (length == 4) { // 是一级科目,不需要拼接 return kmbm + "\\" + kmbmInfoMap.getOrDefault(kmbm, ""); } else if (length == 6) { // 是二级科目,先找一级科目 String firstKjkmbm = kmbm.substring(0, 4); String firstKjkm = kmbmInfoMap.getOrDefault(firstKjkmbm, ""); return kmbm + "\\" + firstKjkm + "\\" + kmbmInfoMap.getOrDefault(kmbm, ""); } 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, ""); return kmbm + "\\" + firstKjkm + "\\" + secondKjkm + "\\" +kmbmInfoMap.getOrDefault(kmbm, ""); } else { return "科目编码格式错误!"; } } }