From 567082f52ca8b7c552afce69b1a21bbaec326f34 Mon Sep 17 00:00:00 2001 From: zhengyf Date: Tue, 29 Jul 2025 23:54:14 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=94=9F=E6=88=90=E5=87=AD=E8=AF=81?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generate/core/service/ICoreService.java | 2 +- .../core/service/impl/ICoreServiceImpl.java | 1791 ++++++++++++++++- .../ae/generate/core/vo/AccsubjVO.java | 20 + .../ae/generate/core/vo/CreateVoucherVO.java | 4 + .../ae/generate/core/vo/VoucherData.java | 65 +- 5 files changed, 1788 insertions(+), 94 deletions(-) create mode 100644 base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/AccsubjVO.java diff --git a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/ICoreService.java b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/ICoreService.java index be7fc69a..a0d984b4 100644 --- a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/ICoreService.java +++ b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/ICoreService.java @@ -10,7 +10,7 @@ import java.util.Map; * Created by zydd on 2025-07-09 10:11 */ public interface ICoreService { - void generateVoucher(CreateVoucherVO createVoucherVO); + void generateVoucher(CreateVoucherVO createVoucherVO)throws Exception; List> queryDataByMdmId(CreateVoucherVO createVoucherVO); } diff --git a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/impl/ICoreServiceImpl.java b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/impl/ICoreServiceImpl.java index 0faddac1..eff1e66b 100644 --- a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/impl/ICoreServiceImpl.java +++ b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/service/impl/ICoreServiceImpl.java @@ -1,33 +1,61 @@ package com.hzya.frame.voucher.ae.generate.core.service.impl; import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import com.hzya.frame.mdm.mdmModule.dao.IMdmModuleDao; import com.hzya.frame.mdm.mdmModule.entity.MdmModuleEntity; import com.hzya.frame.mdm.mdmModuleDb.dao.IMdmModuleDbDao; import com.hzya.frame.mdm.mdmModuleDb.entity.MdmModuleDbEntity; import com.hzya.frame.mdm.mdmModuleDbFileds.dao.IMdmModuleDbFiledsDao; import com.hzya.frame.mdm.mdmModuleDbFileds.entity.MdmModuleDbFiledsEntity; +import com.hzya.frame.mdm.mdmModuleDbFiledsRule.dao.IMdmModuleDbFiledsRuleDao; +import com.hzya.frame.mdm.mdmModuleDbFiledsRule.entity.MdmModuleDbFiledsRuleEntity; +import com.hzya.frame.voucher.ae.comf.bd.controller.BdController; +import com.hzya.frame.voucher.ae.comf.bd.dao.IAeConfBdAccsubjDao; import com.hzya.frame.voucher.ae.comf.bd.dao.IAeConfBdOrgBookVODao; import com.hzya.frame.voucher.ae.comf.bd.dao.IMdmDBQueryVODAO; import com.hzya.frame.voucher.ae.comf.bd.dao.IMdmDbFiledVODAO; -import com.hzya.frame.voucher.ae.comf.bd.entity.vo.BdVoucherTypeVO; -import com.hzya.frame.voucher.ae.comf.bd.entity.vo.MdmDBQueryVO; -import com.hzya.frame.voucher.ae.comf.bd.entity.vo.MdmDbFiledVO; -import com.hzya.frame.voucher.ae.comf.bd.entity.vo.OrgBookVO; +import com.hzya.frame.voucher.ae.comf.bd.entity.AeConfBdAccsubjEntity; +import com.hzya.frame.voucher.ae.comf.bd.entity.vo.*; +import com.hzya.frame.voucher.ae.comf.factor.dao.IAeConfInfluenceFactorCorrelationDao; +import com.hzya.frame.voucher.ae.comf.factor.dao.IAeConfInfluenceFactorDao; +import com.hzya.frame.voucher.ae.comf.factor.entity.AeConfInfluenceFactorCorrelationEntity; +import com.hzya.frame.voucher.ae.comf.factor.entity.AeConfInfluenceFactorEntity; +import com.hzya.frame.voucher.ae.comf.module.service.IMdmService; +import com.hzya.frame.voucher.ae.comf.subject.dao.IAeConfSubjectClassificationDao; +import com.hzya.frame.voucher.ae.comf.subject.dao.IAeConfSubjectContrastBDao; +import com.hzya.frame.voucher.ae.comf.subject.dao.IAeConfSubjectContrastDao; +import com.hzya.frame.voucher.ae.comf.subject.entity.AeConfSubjectClassificationEntity; +import com.hzya.frame.voucher.ae.comf.subject.entity.AeConfSubjectContrastBEntity; import com.hzya.frame.voucher.ae.comf.template.dao.IAeConfVoucherTemplateAssistDao; import com.hzya.frame.voucher.ae.comf.template.dao.IAeConfVoucherTemplateDao; import com.hzya.frame.voucher.ae.comf.template.dao.IAeConfVoucherTemplateTypeDao; +import com.hzya.frame.voucher.ae.comf.template.entity.AeConfVoucherTemplateAssistEntity; import com.hzya.frame.voucher.ae.comf.template.entity.AeConfVoucherTemplateEntity; import com.hzya.frame.voucher.ae.comf.template.entity.AeConfVoucherTemplateTypeEntity; +import com.hzya.frame.voucher.ae.comf.template.service.IAeConfVoucherTemplateService; import com.hzya.frame.voucher.ae.generate.core.dao.ICoreDao; import com.hzya.frame.voucher.ae.generate.core.service.ICoreService; +import com.hzya.frame.voucher.ae.generate.core.vo.AccsubjVO; import com.hzya.frame.voucher.ae.generate.core.vo.CreateVoucherVO; import com.hzya.frame.voucher.ae.generate.core.vo.VoucherData; +import com.hzya.frame.voucher.ae.push.dao.IAePushVoucherLogDao; +import com.hzya.frame.voucher.ae.push.entity.AePushVoucherLogEntity; +import com.hzya.frame.voucher.ae.push.service.IAePushVoucherLogService; +import org.apache.commons.beanutils.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.text.NumberFormat; +import java.text.ParseException; import java.util.*; import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -52,6 +80,8 @@ public class ICoreServiceImpl implements ICoreService { private IMdmModuleDbDao mdmModuleDbDao; @Autowired private IMdmModuleDbFiledsDao mdmModuleDbFiledsDao; + @Autowired + private IMdmModuleDbFiledsRuleDao mdmModuleDbFiledsRuleDao; @Autowired private IAeConfVoucherTemplateDao templateDao; @@ -60,6 +90,24 @@ public class ICoreServiceImpl implements ICoreService { @Autowired private IAeConfVoucherTemplateAssistDao templateAssDao; + @Autowired + private IAeConfVoucherTemplateService templateService; + @Autowired + private IAeConfSubjectClassificationDao subjectClassificationDao; + @Autowired + private IAeConfBdAccsubjDao aeConfBdAccsubjDao; + @Autowired + private IAeConfInfluenceFactorDao factorDao; + @Autowired + private IAeConfInfluenceFactorCorrelationDao factorCorrelationDao; + @Autowired + private IAeConfSubjectContrastDao subjectContrastDao; + @Autowired + private IAeConfSubjectContrastBDao subjectContrastBDao; + + @Autowired + private IAePushVoucherLogDao aePushVoucherLogDao; + @Override public List> queryDataByMdmId(CreateVoucherVO createVoucherVO) { @@ -76,12 +124,11 @@ public class ICoreServiceImpl implements ICoreService { String codefieldname = mdmDbFiledVOList.get(0).getCodefieldname(); String datefieldname = mdmDbFiledVOList.get(0).getDatefieldname(); if (codefieldname == null || "".equals(codefieldname)) { - Assert.state(false,"单据汇总字段(sys_code)为空,请检查。"); + Assert.state(false, "单据汇总字段(sys_code)为空,请检查。"); } if (datefieldname == null || "".equals(datefieldname)) { - Assert.state(false,"单据汇总字段(sys_date)为空,请检查。"); + Assert.state(false, "单据汇总字段(sys_date)为空,请检查。"); } - System.out.println(codefieldname); //查询单据信息 MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); @@ -89,16 +136,15 @@ public class ICoreServiceImpl implements ICoreService { mdmDBQueryVO.setProp1(codefieldname); mdmDBQueryVO.setProp2(datefieldname); //日期 - if(createVoucherVO.getTimeStart()!=null&&!"".equals(createVoucherVO.getTimeStart())){ + if (createVoucherVO.getTimeStart() != null && !"".equals(createVoucherVO.getTimeStart())) { mdmDBQueryVO.setProp3(datefieldname); mdmDBQueryVO.setPropValue3(createVoucherVO.getTimeStart()); } - if(createVoucherVO.getTimeEnd()!=null&&!"".equals(createVoucherVO.getTimeEnd())){ + if (createVoucherVO.getTimeEnd() != null && !"".equals(createVoucherVO.getTimeEnd())) { mdmDBQueryVO.setProp4(datefieldname); mdmDBQueryVO.setPropValue4(createVoucherVO.getTimeEnd()); } List> dateMaps = mdmDBQueryVODAO.queryDataByMdmIdGroupBy(mdmDBQueryVO); - System.out.println(dateMaps); return dateMaps; } @@ -116,98 +162,1665 @@ public class ICoreServiceImpl implements ICoreService { * 5、辅助核算值取单据上的字段,进行匹配,由此批注核算匹配完成。 */ @Override - public void generateVoucher(CreateVoucherVO createVoucherVO) { - Assert.notNull(createVoucherVO.getMdmId(), "生成凭证时,主数据id不能为空"); - Assert.notNull(createVoucherVO.getBillCode(), "生成凭证时,单据编号不能为空"); + public void generateVoucher(CreateVoucherVO createVoucherVO) throws Exception { - MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); - mdmModuleDbEntity.setDbType("1"); - mdmModuleDbEntity.setMdmId(createVoucherVO.getMdmId()); - List moduleDbList = mdmModuleDbDao.query(mdmModuleDbEntity); - if (moduleDbList.size() == 0 || moduleDbList.size() > 1) { - Assert.state(false, "根据mdmId:{},查询数据表为空,或数据不唯一请检查!", createVoucherVO.getMdmId()); - } - MdmModuleDbEntity mdmModuleDb = moduleDbList.get(0); + String date = null; + try { + Assert.notNull(createVoucherVO.getMdmId(), "生成凭证时,主数据id不能为空"); + Assert.notNull(createVoucherVO.getBillCode(), "生成凭证时,单据编号不能为空"); - //查询字段,转成map,方便查询字段 - MdmModuleDbFiledsEntity mdmModuleDbFiledsEntity = new MdmModuleDbFiledsEntity(); - mdmModuleDbFiledsEntity.setDbId(mdmModuleDb.getId()); - List moduleDbFiledsList = mdmModuleDbFiledsDao.query(mdmModuleDbFiledsEntity); - if (moduleDbFiledsList.size() == 0) { - Assert.state(false, "根据bdId:{},bdName:{},查询数据表字段为空,请检查!", mdmModuleDb.getId(), mdmModuleDb.getDbName()); - } - Map filedsMap = moduleDbFiledsList.stream().collect(Collectors.toMap(MdmModuleDbFiledsEntity::getId, MdmModuleDbFiledsEntity::getEnName)); - - //查询数据 - MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); - mdmDBQueryVO.setTablename(mdmModuleDb.getDbName()); - mdmDBQueryVO.setProp6("bill_code"); - mdmDBQueryVO.setPropValue6(createVoucherVO.getBillCode()); - List> dataMapList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); - - //获取汇总规则 - String mergeRules = mdmModuleDb.getMergeRules(); - String[] mergeRulesSplit = mergeRules.split(","); - //查询汇总字段 - List collectFileds = Arrays.stream(mergeRulesSplit).map(filedsMap::get).collect(Collectors.toList()); - String[] arrayFileds = collectFileds.toArray(new String[0]); - // 构建 grouping key(组合字段) - Function, List> grouper = map -> Arrays.stream(arrayFileds).map(map::get).collect(Collectors.toList()); - - //汇总分组 - Map, List>> groupedResult = dataMapList.stream().collect(Collectors.groupingBy(grouper)); - System.out.println(groupedResult); - - - //根据mdmId获取凭证模板 - AeConfVoucherTemplateEntity aeConfVoucherTemplateEntity = new AeConfVoucherTemplateEntity(); - aeConfVoucherTemplateEntity.setMdmId(createVoucherVO.getMdmId()); - List templateList = templateDao.query(aeConfVoucherTemplateEntity); - if (templateList.size() == 0) { - Assert.state(false, "根据mdmId:{},查询凭证模板为空,请检查!", createVoucherVO.getMdmId()); - } - //根据凭证类型分组 - Map> collectTempType = templateList.stream().collect(Collectors.groupingBy(index -> index.getPkGlorgbook() + "," + index.getVoucherTypeId() + "," + index.getTemplateTypeId())); - - System.out.println(collectTempType); - - List voucher = new ArrayList<>(); - - for (Map.Entry> entry : collectTempType.entrySet()) { - String key = entry.getKey(); - String[] split = key.split(","); - - VoucherData.Voucher vouche = new VoucherData.Voucher(); - voucher.add(vouche); - - //凭证组装头 - //pk_corp;//公司 - OrgBookVO orgBookVO = new OrgBookVO(); - orgBookVO.setPkglorgbook(split[0]); - List orgBookVOS = aeConfBdOrgBookVODao.queryOrgBookVO(orgBookVO); - if (orgBookVOS == null || orgBookVOS.size() == 0) { - Assert.state(false, "根据pk_glorgbook:{},查询公司为空,请检查!", split[0]); + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setDbType("1"); + mdmModuleDbEntity.setMdmId(createVoucherVO.getMdmId()); + List moduleDbList = mdmModuleDbDao.query(mdmModuleDbEntity); + if (moduleDbList.size() == 0 || moduleDbList.size() > 1) { + Assert.state(false, "根据mdmId:{},查询数据表为空,或数据不唯一请检查!", createVoucherVO.getMdmId()); } - vouche.setPk_corp(orgBookVOS.get(0).getPkentityorg()); - //pk_glorgbook;//账簿 - vouche.setPk_glorgbook(split[0]); + MdmModuleDbEntity mdmModuleDb = moduleDbList.get(0); - //pk_prepared;//制单人编码 - vouche.setPk_prepared("tbadmin"); + //查询字段,转成map,方便查询字段 + MdmModuleDbFiledsEntity mdmModuleDbFiledsEntity = new MdmModuleDbFiledsEntity(); + mdmModuleDbFiledsEntity.setDbId(mdmModuleDb.getId()); + List moduleDbFiledsList = mdmModuleDbFiledsDao.query(mdmModuleDbFiledsEntity); + if (moduleDbFiledsList.size() == 0) { + Assert.state(false, "根据bdId:{},bdName:{},查询数据表字段为空,请检查!", mdmModuleDb.getId(), mdmModuleDb.getDbName()); + } + Map filedsMap = moduleDbFiledsList.stream().collect(Collectors.toMap(MdmModuleDbFiledsEntity::getId, MdmModuleDbFiledsEntity::getEnName)); - //pk_vouchertype;//凭证类别简称 - BdVoucherTypeVO bdVoucherTypeVO = new BdVoucherTypeVO(); + //查询数据 + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setTablename(mdmModuleDb.getDbName()); + mdmDBQueryVO.setProp6("bill_code"); + mdmDBQueryVO.setPropValue6(createVoucherVO.getBillCode()); + List> dataMapList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); - List bdVoucherTypeVOS = mdmDBQueryVODAO.queryVoucherType(bdVoucherTypeVO); - String s = split[1]; + //获取汇总规则 + String mergeRules = mdmModuleDb.getMergeRules(); + String[] mergeRulesSplit = mergeRules.split(","); + //查询汇总字段 + List collectFileds = Arrays.stream(mergeRulesSplit).map(filedsMap::get).collect(Collectors.toList()); + String[] arrayFileds = collectFileds.toArray(new String[0]); + // 构建 grouping key(组合字段) + Function, List> grouper = map -> Arrays.stream(arrayFileds).map(map::get).collect(Collectors.toList()); + + //汇总分组--业务数据 + Map, List>> groupedResult = dataMapList.stream().collect(Collectors.groupingBy(grouper)); + + //获取单据日期 + String dateField = null; + for (MdmModuleDbFiledsEntity dbFiledsEntity : moduleDbFiledsList) { + if ("Y".equals(dbFiledsEntity.getIsSysDate())) { + dateField = dbFiledsEntity.getEnName(); + break; + } + } + String[] arrayFiledDate = new String[]{dateField}; + Function, List> grouperDate = map -> Arrays.stream(arrayFiledDate).map(map::get).collect(Collectors.toList()); + Map, List>> groupedResultDate = dataMapList.stream().collect(Collectors.groupingBy(grouperDate)); + Set> dateList = groupedResultDate.keySet(); + if (dateList.size() == 0 || dateList.size() > 1) { + Assert.state(false, "该单据日期查询失败,为查询到单据日期或单据日期不唯一,请检查单据信息->mdmId:{},bill_code:{}。", createVoucherVO.getMdmId(), createVoucherVO.getBillCode()); + } + String ts = dateList.iterator().next().get(0).toString(); + date = ts.substring(0, 10); + + //根据mdmId获取凭证模板 + AeConfVoucherTemplateEntity aeConfVoucherTemplateEntity = new AeConfVoucherTemplateEntity(); + aeConfVoucherTemplateEntity.setMdmId(createVoucherVO.getMdmId()); + List templateList = templateDao.query(aeConfVoucherTemplateEntity); + if (templateList.size() == 0) { + Assert.state(false, "根据mdmId:{},查询凭证模板为空,请检查!", createVoucherVO.getMdmId()); + } + if ("Y".equals(templateList.get(0).getTypeMerge())) {//不区分类别 + AeConfVoucherTemplateEntity aeConfVoucherTemplate = templateList.get(0); + List voucher = new ArrayList<>(); + List details = new ArrayList<>(); + //凭证组装头 + VoucherData.Voucher vouche = new VoucherData.Voucher(); + //pk_corp;//公司 + OrgBookVO orgBookVO = queryPkCorpByPkGlOrgBook(aeConfVoucherTemplate.getPkGlorgbook()); + vouche.setPk_corp(orgBookVO.getPkentityorg()); + vouche.setCorp_code(orgBookVO.getGlorgcode()); + vouche.setCorp_name(orgBookVO.getGlorgname()); + + //pk_glorgbook;//账簿 + vouche.setPk_glorgbook(orgBookVO.getPkglorgbook()); + vouche.setAccbookCode(orgBookVO.getGlorgbookcode()); + vouche.setAccbookName(orgBookVO.getGlorgbookname()); + + //pk_prepared;//制单人编码 + vouche.setPk_prepared("tbadmin"); + vouche.setPrepared("tbadmin"); + + //pk_vouchertype;//凭证类别简称 + BdVoucherTypeVO voucherTypeVO = queryGlOrgBookShortNameByVoucherTypeId(aeConfVoucherTemplate.getVoucherTypeId()); + System.out.println(voucherTypeVO); + vouche.setPk_vouchertype(voucherTypeVO.getPkVouchertype()); + vouche.setVouchertype_code(voucherTypeVO.getCode()); + vouche.setVouchertype_name(voucherTypeVO.getName()); + vouche.setVouchertype_shortname(voucherTypeVO.getShortname()); + + //prepareddate;//制单日期(格式示例:2021-04-27)) 根据sys_date找到单据日期字段 + vouche.setPrepareddate(date); + vouche.setYear(date.substring(0, 4)); + vouche.setPeriod(date.substring(5, 7)); + + //生成分录 + System.out.println(groupedResult); + for (Map.Entry, List>> dataEntry : groupedResult.entrySet()) { + try { + List dateKey = dataEntry.getKey(); + List> dataValue = dataEntry.getValue(); + System.out.println(dateKey); + System.out.println(dataValue); + for (AeConfVoucherTemplateEntity template : templateList) { + System.out.println(template); + VoucherData.Voucher.Detail detail = new VoucherData.Voucher.Detail(); + + //汇率:excrate2、locRate、groupRate、globalRate + String exchangeRate = template.getExchangeRate(); + detail.setExcrate2(exchangeRate); + detail.setLocRate(exchangeRate); + detail.setGroupRate(exchangeRate); + detail.setGlobalRate(exchangeRate); + + //单价:price + + //摘要:explanation + boolean b = templateService.checkAbstract(template); + if (!b) { + Assert.state(false, "根据Id:{},校验摘要失败!", template.getId()); + } + try { + transSbstractRes(createVoucherVO.getMdmId(), template, dataValue); + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "根据Id:{},转换摘要失败!失败原因:{}", template.getId(), e.getMessage()); + } + detail.setExplanation(template.getAbstractStr()); + + //科目:pk_accsubj、accountCode、accountName + //分类定义 查 影响因素,再根据影响因素 查 影响因素关联的字段。 + //分类定义 查 对照表 + //影响因素关联的字段,对应对照表的 会计计科目,如果没有对照表 去默认科目 都没有则跳过该条分录 + Long ClassificationId = template.getSubjectClassificationId(); + String ClassificationCode = template.getSubjectClassificationCode(); + String ClassificationName = template.getSubjectClassificationName(); + AeConfSubjectClassificationEntity aeConfSubjectClassificationEntity = new AeConfSubjectClassificationEntity(); + aeConfSubjectClassificationEntity.setId(String.valueOf(ClassificationId)); + List classificationList = subjectClassificationDao.query(aeConfSubjectClassificationEntity); + if (classificationList.size() == 0 || classificationList.size() > 1) { + Assert.state(false, "根据影响因素id:{}。未查询到分类定义或存在多个!{},{}", ClassificationId, ClassificationCode, ClassificationName); + } + AeConfSubjectClassificationEntity subjectClassification = classificationList.get(0); + String factorIds = subjectClassification.getFactorids();//影响因素定义 + String[] factorIdSplit = factorIds.split(","); + Map factorCorrelationMap = new LinkedHashMap<>();//影响因素关联map:影响因素id,单据选项 name中有公式,整个字段或者字段截取 + for (String factorId : factorIdSplit) { + AeConfInfluenceFactorCorrelationEntity factorCorrelationEntity = new AeConfInfluenceFactorCorrelationEntity(); + factorCorrelationEntity.setFactorId(Long.valueOf(factorId)); + List factorCorrelationEntityList = factorCorrelationDao.query(factorCorrelationEntity); + if (factorCorrelationEntityList.size() == 0 || factorCorrelationEntityList.size() > 1) { + Assert.state(false, "根据影响因素id:{}。未查询到或查询到多条影响因素关联。", factorId); + } + String mdmId = factorCorrelationEntityList.get(0).getMdmId(); + String mappingFieldName = factorCorrelationEntityList.get(0).getMappingFieldName(); + //如果存在substr公式,则切割,否则返回单据值 + String strValue = formulaTransFactorCorrelation(mdmId, mappingFieldName, dataValue); + + factorCorrelationMap.put(factorId, strValue); + } + System.out.println(factorCorrelationMap);//影响因素关联的解析 + +// for (Map.Entry factorCorrelationEntry : factorCorrelationMap.entrySet()) { +// String key = factorCorrelationEntry.getKey(); +// //查询影响因素对应的映射档案 +// AeConfInfluenceFactorEntity influenceFactorEntity = new AeConfInfluenceFactorEntity(); +// influenceFactorEntity.setId(key); +// List factorEntityList = factorDao.query(influenceFactorEntity); +// if (factorEntityList.size() == 0 || factorEntityList.size() > 1) { +//// Assert.state(false, "根据影响因素id:{}。未查询到或查询到多条影响因素。", factorId); +// } +// AeConfInfluenceFactorEntity influenceFactor = factorEntityList.get(0); +// String mappingFileId = influenceFactor.getMappingFileId(); +// MdmModuleEntity mdmModuleEntity = new MdmModuleEntity(); +// mdmModuleEntity.setId(mappingFileId); +// List mdmModuleEntityList = mdmModuleDao.query(mdmModuleEntity); +// if (mdmModuleEntityList.size() == 0 || mdmModuleEntityList.size() > 1) { +// Assert.state(false, "根据映射档案id:{}。未查询到或查询到多映射档案。", mappingFileId); +// } +// MdmModuleEntity mdmModule = mdmModuleEntityList.get(0); +// +// +// } +// + String contrastId = subjectClassification.getContrastId();//该分类定义下的对照表 + System.out.println(contrastId); + AeConfSubjectContrastBEntity aeConfSubjectContrastBEntity = new AeConfSubjectContrastBEntity(); + aeConfSubjectContrastBEntity.setContrastId(Long.valueOf(contrastId)); + List subjectContrastBEntityList = subjectContrastBDao.query(aeConfSubjectContrastBEntity); + System.out.println(subjectContrastBEntityList); + AeConfBdAccsubjEntity confBdAccsubj = matchSubj(factorCorrelationMap, subjectContrastBEntityList); + if (confBdAccsubj == null) {//没有匹配到对照表,查询分类定义是否有默认科目 + //分类的定义的默认科目 + String desdocvalueDefaultId = subjectClassification.getDesdocvalueDefaultId(); + String desdocvalueDefaultName = subjectClassification.getDesdocvalueDefaultName(); + if (desdocvalueDefaultId != null && !"".equals(desdocvalueDefaultId) && desdocvalueDefaultName != null && !"".equals(desdocvalueDefaultName)) { + + //查询科目 + AeConfBdAccsubjEntity accsubj = new AeConfBdAccsubjEntity(); + accsubj.setPkAccsubj(desdocvalueDefaultId); + List accsubjList = aeConfBdAccsubjDao.query(accsubj); + if (accsubjList.size() > 1 || accsubjList.size() == 0) { + Assert.state(false, "根据默认科目主键:{},默认科目名称:{},未查询到或存在多条科目,请检查", desdocvalueDefaultId, desdocvalueDefaultName); + } + detail.setPk_accsubj(accsubjList.get(0).getSubjcode());//u8c需要编码 + detail.setAccountId(desdocvalueDefaultId); + detail.setAccountCode(accsubjList.get(0).getSubjcode()); + detail.setAccountName(accsubjList.get(0).getSubjname()); + } else { + continue; + } + } else { + detail.setPk_accsubj(confBdAccsubj.getSubjcode());//u8c需要编码 + detail.setAccountId(confBdAccsubj.getPkAccsubj()); + detail.setAccountCode(confBdAccsubj.getSubjcode()); + detail.setAccountName(confBdAccsubj.getSubjname()); + } + + //币种编码:pk_currtype、currtypeCode、currtypeName + String currencyFieldName = template.getCurrencyFieldName(); + BdCurrtypeVO bdCurrtypeVO = formulaTransCurrency(currencyFieldName); + if (bdCurrtypeVO == null) { + Assert.state(false, "根据币种字段:{},转换失败"); + } + detail.setPk_currtype(bdCurrtypeVO.getCode()); + detail.setCurrtypeId(bdCurrtypeVO.getPkCurrtype()); + detail.setCurrtypeCode(bdCurrtypeVO.getCode()); + detail.setCurrtypeName(bdCurrtypeVO.getName()); - //prepareddate;//制单日期(格式示例:2021-04-27)) + //借方数量:debitquantity + BigDecimal jNumField = sumAmountAndNum(template.getjNumFieldName(), dataValue); + detail.setDebitquantity(jNumField.toString()); + //原币借方金额:debitamount + BigDecimal jYbSumField = sumAmountAndNum(template.getjYbSumFieldName(), dataValue); + detail.setDebitquantity(jYbSumField.toString()); + //本币借方金额:localdebitamount//本币为null,但是汇率右值,原币*汇率=本币 + if (template.getjBbSumFieldName() == null || "".equals(template.getjBbSumFieldName()) && exchangeRate != null) { + BigDecimal jbb = jYbSumField.divide(new BigDecimal(exchangeRate)); + detail.setDebitquantity(jbb.toString()); + } else { + BigDecimal jBbSumField = sumAmountAndNum(template.getjBbSumFieldName(), dataValue); + detail.setDebitquantity(jBbSumField.toString()); + } + + //贷方数量:creditquantity + BigDecimal dNumField = sumAmountAndNum(template.getdNumFieldName(), dataValue); + detail.setCreditquantity(dNumField.toString()); + //原币贷方金额:creditamount + BigDecimal dYbSumField = sumAmountAndNum(template.getdYbSumFieldName(), dataValue); + detail.setDebitquantity(dYbSumField.toString()); + //本币贷方金额:localcreditamount + if (template.getdBbSumFieldName() == null || "".equals(template.getdBbSumFieldName()) && exchangeRate != null) { + BigDecimal dbb = dYbSumField.divide(new BigDecimal(exchangeRate)); + detail.setLocalcreditamount(dbb.toString()); + } else { + BigDecimal dBbSumField = sumAmountAndNum(template.getdBbSumFieldName(), dataValue); + detail.setLocalcreditamount(dBbSumField.toString()); + } + + //业务日期:busidate + detail.setBusidate(date); + + //辅助核算 + //查询该科目下的辅助核算 + String templateId = template.getId(); + String pkGlorgbook = template.getPkGlorgbook(); + AeConfBdAccsubjEntity confBdAccsubj1 = new AeConfBdAccsubjEntity(); + confBdAccsubj1.setPkAccsubj(detail.getAccountId()); + confBdAccsubj1.setPkGlorgbook(pkGlorgbook); + List aeConfBdAccsubjEntities = aeConfBdAccsubjDao.queryAssist(confBdAccsubj1);//科目必要的辅助核算 + System.out.println(aeConfBdAccsubjEntities); + Map assCodeNameMap = transferSubjAss(aeConfBdAccsubjEntities); +// Map> assCodePkBdinfoMap = querySubjAssCodePkBdinfo(aeConfBdAccsubjEntities); + if (assCodeNameMap != null) {//不等于空,需要辅助核算 + + //查询科目下的辅助核算对应关系 + Map AssByBdCodeMap = queryAssByBdCode(aeConfBdAccsubjEntities); + System.out.println(AssByBdCodeMap); + + //查询该分录下配置的辅助核算,模板上的辅助核算 + AeConfVoucherTemplateAssistEntity assistEntity = new AeConfVoucherTemplateAssistEntity(); + assistEntity.setVoucherTemplateId(Long.valueOf(templateId)); + List templateAssist = templateAssDao.query(assistEntity); + System.out.println(templateAssist);//分录配置的辅助核算 + Map AssByMdmId = queryAssByMdmId(templateAssist); + System.out.println(AssByMdmId); + + List assList = new ArrayList<>(); + //根据科目的辅助核算匹配模板的配置 + for (Map.Entry assByBdCodeEntry : AssByBdCodeMap.entrySet()) { + + String key = assByBdCodeEntry.getKey(); + String value = assByBdCodeEntry.getValue(); + AeConfVoucherTemplateAssistEntity templateAssistEntity = AssByMdmId.get(key);//去单据辅助核算 + + //辅助核算取值 + Map assValue = getAssValue(templateAssistEntity, dataValue, orgBookVO); + System.out.println(assValue); + if(assValue.size()!=0){ + VoucherData.Voucher.Detail.Ass assEntity = new VoucherData.Voucher.Detail.Ass(); + assEntity.setChecktypecode(value); + assEntity.setCheckvaluecode(assValue.get("code")); + assList.add(assEntity); + } + + + } + if(assList.size()!=0){ + detail.setAss(assList); + } + + + } + details.add(detail); + + + } + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "分录生成失败,失败原因:{}", e.getMessage()); + } + + } + + vouche.setDetails(details); + voucher.add(vouche); + + //记录日志 + AePushVoucherLogEntity aePushVoucherLogEntity = new AePushVoucherLogEntity(); + aePushVoucherLogEntity.setMdmId(createVoucherVO.getMdmId()); + aePushVoucherLogEntity.setTemplateTypeId(null); + aePushVoucherLogEntity.setBillCode(createVoucherVO.getBillCode()); + aePushVoucherLogEntity.setBillDate(date); + aePushVoucherLogEntity.setBillStatus("Y"); + aePushVoucherLogDao.saveOrUpdateBymdmIdAndBillCodeAndTypeId(aePushVoucherLogEntity); + + + } else {//按类型生成不同的凭证 + //根据凭证类型分组 账簿主键+凭证类别+模板id + Map> collectTempType = + templateList.stream().collect(Collectors.groupingBy(index -> index.getPkGlorgbook() + "," + index.getVoucherTypeId() + "," + index.getTemplateTypeId())); + + List voucher = new ArrayList<>(); + + for (Map.Entry> entry : collectTempType.entrySet()) { + List details = new ArrayList<>(); + String key = entry.getKey(); + List value = entry.getValue(); + String[] split = key.split(","); + + VoucherData.Voucher vouche = new VoucherData.Voucher(); + voucher.add(vouche); + + //凭证组装头 + //pk_corp;//公司 + OrgBookVO orgBookVO = queryPkCorpByPkGlOrgBook(split[0]); + vouche.setPk_corp(orgBookVO.getPkentityorg()); + vouche.setCorp_code(orgBookVO.getGlorgcode()); + vouche.setCorp_name(orgBookVO.getGlorgname()); + + //pk_glorgbook;//账簿 + vouche.setPk_glorgbook(split[0]); + + //pk_prepared;//制单人编码 + vouche.setPk_prepared("tbadmin"); + + //pk_vouchertype;//凭证类别简称 +// BdVoucherTypeVO voucherTypeVO = queryGlOrgBookShortNameByVoucherTypeId(split[1]); +// System.out.println(voucherTypeVO); +// vouche.setPk_vouchertype(voucherTypeVO.getPkVouchertype()); +// vouche.setVouchertype_code(voucherTypeVO.getCode()); +// vouche.setVouchertype_name(voucherTypeVO.getName()); +// vouche.setVouchertype_shortname(voucherTypeVO.getShortname()); + + + //prepareddate;//制单日期(格式示例:2021-04-27)) 根据sys_date找到单据日期字段 + vouche.setPrepareddate(date); + + //凭证模板6行,数据三行,那就是18行分录 + for (Map.Entry, List>> dateListEntry : groupedResult.entrySet()) { + System.out.println(collectFileds);//单据汇总规则 + List dateKey = dateListEntry.getKey();//单据汇总规则 + List> dateValue = dateListEntry.getValue(); + if (dateValue.size() == 0) { + continue; + } + + System.out.println(dateKey); + System.out.println(dateValue); + + //生成分录,根据汇总规则金额相加 + for (AeConfVoucherTemplateEntity template : value) { + System.out.println(template); + VoucherData.Voucher.Detail detail = new VoucherData.Voucher.Detail(); + details.add(detail); + + //explanation 摘要--需要转换 + boolean b = templateService.checkAbstract(template); + if (!b) { + Assert.state(false, "根据Id:{},校验摘要失败!", template.getId()); + } + try { + transSbstractRes(createVoucherVO.getMdmId(), template, dateValue); + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "根据Id:{},转换摘要失败!失败原因:{}", template.getId(), e.getMessage()); + } + detail.setExplanation(template.getAbstractStr()); + + //pk_accsubj 科目 + //TODO...未根据影响因素,影响因素关联判断 + AeConfSubjectClassificationEntity aeConfSubjectClassificationEntity = new AeConfSubjectClassificationEntity(); + aeConfSubjectClassificationEntity.setId(String.valueOf(template.getSubjectClassificationId())); + List aeConfSubjectClassificationList = subjectClassificationDao.query(aeConfSubjectClassificationEntity); + if (aeConfSubjectClassificationList == null || aeConfSubjectClassificationList.size() == 0) { + Assert.state(false, "根据科目分类id:{},查询科目分类为空或不唯一,请检查!", template.getSubjectClassificationId()); + } + AeConfSubjectClassificationEntity aeConfSubjectClassification = aeConfSubjectClassificationList.get(0); + //取默认 + if (aeConfSubjectClassification.getDesdocvalueDefaultId() != null && !"".equals(aeConfSubjectClassification.getDesdocvalueDefaultId())) { + AeConfBdAccsubjEntity aeConfBdAccsubjEntity = new AeConfBdAccsubjEntity(); + aeConfBdAccsubjEntity.setPkAccsubj(aeConfSubjectClassification.getDesdocvalueDefaultId()); + List aeConfBdAccsubjList = aeConfBdAccsubjDao.query(aeConfBdAccsubjEntity); + //如果没有默认,则不生成该条分录 + if (aeConfBdAccsubjList == null || aeConfBdAccsubjList.size() == 0) { + continue; + } + detail.setPk_accsubj(aeConfBdAccsubjList.get(0).getSubjcode()); + } + + //pk_currtype 币种编码 + if (template.getCurrencyField() == null || "".equals(template.getCurrencyField())) { + detail.setPk_currtype("CNY"); + } + + //excrate2 汇率 + if (template.getExchangeRate() == null || "".equals(template.getExchangeRate())) { + detail.setExcrate2("1"); + } else { + detail.setExcrate2(template.getExchangeRate()); + } + + //原币*汇率=本币 + //debitquantity 借数量 + BigDecimal jNum = new BigDecimal(0); + String jNumFieldName = null; + if (template.getjNumField() != null && "".equals(template.getjNumField())) { + jNumFieldName = validFieldPath(createVoucherVO.getMdmId(), template.getjNumField()); + if (jNumFieldName != null) { + for (Map dateMap : dateValue) { + if (jNumFieldName != null) { + Object o = dateMap.get(jNumFieldName); + } + } + } + } + //localdebitamount 借本 + //debitamount 借原 + + + //creditquantity 贷数量 + //localcreditamount 贷本 + //creditamount 贷原 + + + //ass 辅助核算 + //辅助核算-checktypecode 辅助核算类型编码 + //辅助核算-checkvaluecode 辅助核算的值编码 + + + //cashflow 现金流映射 + //现金流映射-money 原币金额 + //现金流映射-pk_cashflow 现金流量表项编码 + //现金流映射-pk_currtype 现金流量币种编码 + + } + + } + vouche.setDetails(details); + + System.out.println(JSONUtil.toJsonStr(vouche)); + + } + + } + + } catch (Exception e) { + e.printStackTrace(); + //记录日志 + AePushVoucherLogEntity aePushVoucherLogEntity = new AePushVoucherLogEntity(); + aePushVoucherLogEntity.setMdmId(createVoucherVO.getMdmId()); + aePushVoucherLogEntity.setBillCode(createVoucherVO.getBillCode()); + aePushVoucherLogEntity.setBillDate(date); + aePushVoucherLogEntity.setBillStatus("N"); + aePushVoucherLogEntity.setPushRes(e.getMessage()); + aePushVoucherLogDao.save(aePushVoucherLogEntity); + Assert.state(false, "生成凭证过程报错,报错信息:{}", e.getMessage()); + } + } + + /** + * 将res转换后给str + */ + private void transSbstractRes(String mdmId, AeConfVoucherTemplateEntity template, List> dateValue) { + Map dateMap = dateValue.get(0); + String abstractRes = template.getAbstractRes(); + StringBuffer sb = new StringBuffer(); + if (abstractRes.contains("++") || abstractRes.startsWith("+") || abstractRes.endsWith("+")) { + Assert.state(false, "根据Id:{},摘要转换规则有误,请检查!", template.getId()); + } + String[] parts = abstractRes.split("\\+"); + for (String part : parts) { + if (!part.startsWith("@@$")) { + sb.append(part); + } + try { + //字段查询 + if (part.startsWith("@@$")) { + String fieldPath = part.substring(3); // 去除 @@$ + String field = validFieldPath(mdmId, fieldPath); + Object o = dateMap.get(field); + if (o != null) { + sb.append(o.toString()); + } + } + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "摘要转换字段查询失败!失败原因:{}", e.getMessage()); + } + } + template.setAbstractStr(String.valueOf(sb)); + } + + private String validFieldPath(String mdmId, String fieldPath) { + String[] pathParts = fieldPath.split("\\."); + MdmModuleDbEntity currentDb = queryDb(mdmId, pathParts[0]); + if (currentDb == null) { + Assert.state(false, "根据mdmId:{},表名:{},查询数据表失败", mdmId, pathParts[0]); + } + MdmModuleDbFiledsEntity field = null; + for (int i = 1; i < pathParts.length; i++) { + String fieldName = pathParts[i]; + + // 查询当前表中的字段 + field = queryFileds(currentDb.getId(), fieldName); + if (field == null) { + Assert.state(false, "根据dbId:{},字段:{},查询字段失败", currentDb.getId(), fieldName); + } + + // 如果不是最后一个字段,继续查找关联表 + if (i < pathParts.length - 1) { + currentDb = queryFiledRelevanceDb(field); + if (currentDb == null) { + Assert.state(false, "根据字段:{},联查数据表失败,请检查关联关系。", field.getId()); + } + } + } + return field.getEnName(); + } + + private String validFieldPath(String fieldPath) { + String[] pathParts = fieldPath.split("\\."); + MdmModuleDbEntity currentDb = queryDb(pathParts[0]); + if (currentDb == null) { + Assert.state(false, "根据表名:{},查询数据表失败", pathParts[0]); + } + MdmModuleDbFiledsEntity field = null; + for (int i = 1; i < pathParts.length; i++) { + String fieldName = pathParts[i]; + + // 查询当前表中的字段 + field = queryFileds(currentDb.getId(), fieldName); + if (field == null) { + Assert.state(false, "根据dbId:{},字段:{},查询字段失败", currentDb.getId(), fieldName); + } + + // 如果不是最后一个字段,继续查找关联表 + if (i < pathParts.length - 1) { + currentDb = queryFiledRelevanceDb(field); + if (currentDb == null) { + Assert.state(false, "根据字段:{},联查数据表失败,请检查关联关系。", field.getId()); + } + } + } + return field.getEnName(); + } + + /** + * 查询数据表 + */ + public MdmModuleDbEntity queryDb(String mdmId, String remark) { + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setMdmId(mdmId); + mdmModuleDbEntity.setRemark(remark); + List dbList = mdmModuleDbDao.query(mdmModuleDbEntity); + if (dbList.size() == 0 || dbList.size() > 1) { + return null; + } + return dbList.get(0); + } + + /** + * 查询数据表 + */ + public MdmModuleDbEntity queryDb(String remark) { + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setRemark(remark); + List dbList = mdmModuleDbDao.query(mdmModuleDbEntity); + if (dbList.size() == 0 || dbList.size() > 1) { + return null; + } + return dbList.get(0); + } + + /** + * 查询字段们 + */ + public MdmModuleDbFiledsEntity queryFileds(String dbId, String filedName) { + MdmModuleDbFiledsEntity mdmModuleDbFiledsEntity = new MdmModuleDbFiledsEntity(); + mdmModuleDbFiledsEntity.setDbId(dbId); + List filedsList = mdmModuleDbFiledsDao.query(mdmModuleDbFiledsEntity); + for (MdmModuleDbFiledsEntity dbFiledsEntity : filedsList) { + if (filedName.equals(dbFiledsEntity.getChName())) { + return dbFiledsEntity; + } + } + return null; + } + + + /** + * 查找字段关联表 + */ + public MdmModuleDbEntity queryFiledRelevanceDb(MdmModuleDbFiledsEntity filedsEntity) { + //查询字段的rules + MdmModuleDbFiledsRuleEntity mdmModuleDbFiledsRuleEntity = new MdmModuleDbFiledsRuleEntity(); + mdmModuleDbFiledsRuleEntity.setFiledId(filedsEntity.getId()); + List ruleList = mdmModuleDbFiledsRuleDao.query(mdmModuleDbFiledsRuleEntity); + for (MdmModuleDbFiledsRuleEntity filedRule : ruleList) { + if ("typeOptionRuleForm".equals(filedRule.getFormName()) && "service".equals(filedRule.getRuleCode())) { + String ruleValue = filedRule.getRuleValue(); + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setDbName(ruleValue); + List dbList = mdmModuleDbDao.query(mdmModuleDbEntity); + if (dbList.size() == 0 || dbList.size() > 1) { + return null; + } + return dbList.get(0); + } + } + return null; + } + + /** + * 根据账簿主键查询公司 + */ + public OrgBookVO queryPkCorpByPkGlOrgBook(String pkGlOrgBook) { + OrgBookVO orgBookVO = new OrgBookVO(); + orgBookVO.setPkglorgbook(pkGlOrgBook); + List orgBookVOS = aeConfBdOrgBookVODao.queryOrgBookVO(orgBookVO); + if (orgBookVOS == null || orgBookVOS.size() == 0) { + Assert.state(false, "根据pk_glorgbook:{},查询公司为空,请检查!", pkGlOrgBook); + } + return orgBookVOS.get(0); + } + + /** + * 根据账簿类型id查询账簿编码 + */ + public OrgBookVO queryGlOrgBookCodeByVoucherTypeId(String pkGlOrgBook) { + OrgBookVO orgBookVO = new OrgBookVO(); + orgBookVO.setPkglorgbook(pkGlOrgBook); + List orgBookVOS = aeConfBdOrgBookVODao.queryOrgBookVO(orgBookVO); + if (orgBookVOS == null || orgBookVOS.size() == 0) { + Assert.state(false, "根据pk_glorgbook:{},查询公司为空,请检查!", pkGlOrgBook); + } + return orgBookVOS.get(0); + + } + + /** + * 根据账簿类型id查询账簿简称 + */ + public BdVoucherTypeVO queryGlOrgBookShortNameByVoucherTypeId(String voucherTypeId) { + BdVoucherTypeVO bdVoucherTypeVO = new BdVoucherTypeVO(); + bdVoucherTypeVO.setId(voucherTypeId); + List bdVoucherTypeVOS = mdmDBQueryVODAO.queryVoucherType(bdVoucherTypeVO); + if (bdVoucherTypeVOS == null || bdVoucherTypeVOS.size() == 0) { + Assert.state(false, "根据voucherTypeId:{},查询凭证类别为空,请检查!", voucherTypeId); + } + return bdVoucherTypeVOS.get(0); + } + + + /** + * 影响因素关联公式转换 + */ + public String formulaTransFactorCorrelation(String mdmId, String formula, List> dataValue) { + StringBuffer sb = new StringBuffer(); + System.out.println(dataValue); + try { + String[] parts = formula.split("\\+"); + for (String part : parts) { + System.out.println(part); + + if (!part.startsWith("@@$") && !part.startsWith("substr")) { + sb.append(part); + } + + //字段查询 + if (part.startsWith("@@$")) { + String fieldPath = part.substring(3); // 去除 @@$ + String field = validFieldPath(mdmId, fieldPath); + System.out.println(field); + Object o = dataValue.get(0).get(field); + if (o != null) { + sb.append(o.toString()); + } + } + + if (part.startsWith("substr(")) { + // 定义正则表达式模式 + String regex = "substr\\(([^(),]+|([^()]*\\([^()]*\\)[^()]*)*),\\s*(\\d+),\\s*(\\d+)\\)"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(part); + if (matcher.find()) { + String param1 = matcher.group(1); + String param2 = matcher.group(3); + String param3 = matcher.group(4); + if (param1.startsWith("@@$")) { + String fieldPath = param1.substring(3); // 去除 @@$ + String field = validFieldPath(mdmId, fieldPath); + System.out.println(field); + Object o = dataValue.get(0).get(field); + if (o == null) { + return null; + } else { + String fileValue = o.toString(); + if (fileValue.length() < Integer.valueOf(param3)) { + Assert.state(false, "substr表达式设置错误,业务数据截取失败。"); + } + } + sb.append(o.toString().substring(Integer.valueOf(param2), Integer.valueOf(param3))); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "影响因素关联公式转换!失败原因:{}", e.getMessage()); + } + + + return sb.toString(); + } + +//////////////////////////////////////////////////////////////////////////////// + + /** + * 公式转换币种 + */ + public BdCurrtypeVO formulaTransCurrency(String currencyFieldName) { + String[] parts = currencyFieldName.split("\\+"); + if (parts.length > 1) { + Assert.state(false, "币种转换失败!,请检查币种公式,请输入币种编码或者选取币种档案"); + } + + if (currencyFieldName.startsWith("@@$")) { + //币种档案 + String fieldPath = currencyFieldName.substring(3); // 去除 @@$ + String[] split = fieldPath.split("="); + String remark = split[0].substring(0, split[0].length() - 3);//表名 + + MdmModuleDbEntity mdmModuleDbEntity = queryDb(remark); + if (mdmModuleDbEntity == null) { + Assert.state(false, "根据remark:{},查询数据表失败", remark); + } + //查值 + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setTablename(mdmModuleDbEntity.getDbName()); + mdmDBQueryVO.setProp1("id"); + mdmDBQueryVO.setPropValue1(split[1]); + List> objectList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); + if (objectList == null || objectList.size() == 0) { + Assert.state(false, "根据id:{},查询币种失败", split[1]); + } + Map stringObjectMap = objectList.get(0); + BdCurrtypeVO bdCurrtypeVO = new BdCurrtypeVO(); + try { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + bdCurrtypeVO = objectMapper.convertValue(stringObjectMap, BdCurrtypeVO.class); + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "转换失败,失败原因:{}。", e.getMessage()); + } + return bdCurrtypeVO; + + } + if (!currencyFieldName.startsWith("@@$")) { + //直接输入 + MdmModuleDbEntity mdmModuleDbEntity = queryDb("基础数据:币种表"); + if (mdmModuleDbEntity == null) { + Assert.state(false, "根据remark:{},查询数据表失败", "基础数据:币种表"); + } + //查值 + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setTablename(mdmModuleDbEntity.getDbName()); + mdmDBQueryVO.setProp1("code"); + mdmDBQueryVO.setPropValue1(currencyFieldName); + List> objectList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); + if (objectList == null || objectList.size() == 0) { + Assert.state(false, "根据id:{},查询币种失败", currencyFieldName); + } + Map stringObjectMap = objectList.get(0); + BdCurrtypeVO bdCurrtypeVO = new BdCurrtypeVO(); + try { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + bdCurrtypeVO = objectMapper.convertValue(stringObjectMap, BdCurrtypeVO.class); + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "转换失败,失败原因:{}。", e.getMessage()); + } + return bdCurrtypeVO; + } + return null; + } +//////////////////////////////////////////////////////////////////////////////// + + + /** + * 根据字段路径查询字段名称 + */ + public MdmDbFiledVO queryBdinfoList(MdmModuleDbEntity mappingMdmModule) { + MdmDbFiledVO mdmDbFiledVO = new MdmDbFiledVO(); + mdmDbFiledVO.setMdmType("1");//1、档案 2、单据 + mdmDbFiledVO.setMdmId(mappingMdmModule.getMdmId()); + mdmDbFiledVO.setDbName(mappingMdmModule.getDbName()); + List all = new ArrayList<>(); + List mdmDbFiledVOList = mdmDbFiledVODAO.queryMdmDbFiledVO(mdmDbFiledVO); + for (MdmDbFiledVO dbFiledVO : mdmDbFiledVOList) { + dbFiledVO.setPkBdinfo(dbFiledVO.getMdmId()); + dbFiledVO.setBdcode(dbFiledVO.getMdmCode()); + dbFiledVO.setBdname(dbFiledVO.getMdmName()); + } + return mdmDbFiledVOList.get(0); + } + + + /** + * 匹配科目 + * + * @param factorCorrelationMap <影响因素id,单据字段值> + * @param subjectContrastBEntityList 对照表子表 + * @return + */ + public AeConfBdAccsubjEntity matchSubj(Map factorCorrelationMap, List subjectContrastBEntityList) { + try { + int size = factorCorrelationMap.size(); + String a = "factortable"; + String b = "factorpk"; + String c = "factorid"; + String d = "factorname"; + + //提取 单据字段值 拼接为字符串 + String fieldValuesStr = String.join(",", factorCorrelationMap.values()); + System.out.println(fieldValuesStr); + List fieldValuesList = new ArrayList<>(factorCorrelationMap.values()); + System.out.println(fieldValuesList); + + //科目map + Map subjectMap = new LinkedHashMap<>(); + +// for (AeConfSubjectContrastBEntity aeConfSubjectContrastBEntity : subjectContrastBEntityList) { +// Map contrastMap = transContrastBMap(aeConfSubjectContrastBEntity); +// System.out.println(contrastMap); +// +// // 匹配科目 +// switch (size) { +// case 1: { +// String v1 = fieldValuesList.get(0); +// if (v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 2: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 3: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// String v3 = fieldValuesList.get(2); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2))) +// && (v3.equals(contrastMap.get(b + 3)) || v3.equals(contrastMap.get(c + 3)) || v3.equals(contrastMap.get(d + 3)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 4: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// String v3 = fieldValuesList.get(2); +// String v4 = fieldValuesList.get(3); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2))) +// && (v3.equals(contrastMap.get(b + 3)) || v3.equals(contrastMap.get(c + 3)) || v3.equals(contrastMap.get(d + 3))) +// && (v4.equals(contrastMap.get(b + 4)) || v4.equals(contrastMap.get(c + 4)) || v4.equals(contrastMap.get(d + 4)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 5: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// String v3 = fieldValuesList.get(2); +// String v4 = fieldValuesList.get(3); +// String v5 = fieldValuesList.get(4); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2))) +// && (v3.equals(contrastMap.get(b + 3)) || v3.equals(contrastMap.get(c + 3)) || v3.equals(contrastMap.get(d + 3))) +// && (v4.equals(contrastMap.get(b + 4)) || v4.equals(contrastMap.get(c + 4)) || v4.equals(contrastMap.get(d + 4))) +// && (v5.equals(contrastMap.get(b + 5)) || v5.equals(contrastMap.get(c + 5)) || v5.equals(contrastMap.get(d + 5)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 6: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// String v3 = fieldValuesList.get(2); +// String v4 = fieldValuesList.get(3); +// String v5 = fieldValuesList.get(4); +// String v6 = fieldValuesList.get(5); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2))) +// && (v3.equals(contrastMap.get(b + 3)) || v3.equals(contrastMap.get(c + 3)) || v3.equals(contrastMap.get(d + 3))) +// && (v4.equals(contrastMap.get(b + 4)) || v4.equals(contrastMap.get(c + 4)) || v4.equals(contrastMap.get(d + 4))) +// && (v5.equals(contrastMap.get(b + 5)) || v5.equals(contrastMap.get(c + 5)) || v5.equals(contrastMap.get(d + 5))) +// && (v6.equals(contrastMap.get(b + 6)) || v6.equals(contrastMap.get(c + 6)) || v6.equals(contrastMap.get(d + 6)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 7: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// String v3 = fieldValuesList.get(2); +// String v4 = fieldValuesList.get(3); +// String v5 = fieldValuesList.get(4); +// String v6 = fieldValuesList.get(5); +// String v7 = fieldValuesList.get(6); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2))) +// && (v3.equals(contrastMap.get(b + 3)) || v3.equals(contrastMap.get(c + 3)) || v3.equals(contrastMap.get(d + 3))) +// && (v4.equals(contrastMap.get(b + 4)) || v4.equals(contrastMap.get(c + 4)) || v4.equals(contrastMap.get(d + 4))) +// && (v5.equals(contrastMap.get(b + 5)) || v5.equals(contrastMap.get(c + 5)) || v5.equals(contrastMap.get(d + 5))) +// && (v6.equals(contrastMap.get(b + 6)) || v6.equals(contrastMap.get(c + 6)) || v6.equals(contrastMap.get(d + 6))) +// && (v7.equals(contrastMap.get(b + 7)) || v7.equals(contrastMap.get(c + 7)) || v7.equals(contrastMap.get(d + 7)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 8: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// String v3 = fieldValuesList.get(2); +// String v4 = fieldValuesList.get(3); +// String v5 = fieldValuesList.get(4); +// String v6 = fieldValuesList.get(5); +// String v7 = fieldValuesList.get(6); +// String v8 = fieldValuesList.get(7); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2))) +// && (v3.equals(contrastMap.get(b + 3)) || v3.equals(contrastMap.get(c + 3)) || v3.equals(contrastMap.get(d + 3))) +// && (v4.equals(contrastMap.get(b + 4)) || v4.equals(contrastMap.get(c + 4)) || v4.equals(contrastMap.get(d + 4))) +// && (v5.equals(contrastMap.get(b + 5)) || v5.equals(contrastMap.get(c + 5)) || v5.equals(contrastMap.get(d + 5))) +// && (v6.equals(contrastMap.get(b + 6)) || v6.equals(contrastMap.get(c + 6)) || v6.equals(contrastMap.get(d + 6))) +// && (v7.equals(contrastMap.get(b + 7)) || v7.equals(contrastMap.get(c + 7)) || v7.equals(contrastMap.get(d + 7))) +// && (v8.equals(contrastMap.get(b + 8)) || v8.equals(contrastMap.get(c + 8)) || v8.equals(contrastMap.get(d + 8)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// case 9: { +// String v1 = fieldValuesList.get(0); +// String v2 = fieldValuesList.get(1); +// String v3 = fieldValuesList.get(2); +// String v4 = fieldValuesList.get(3); +// String v5 = fieldValuesList.get(4); +// String v6 = fieldValuesList.get(5); +// String v7 = fieldValuesList.get(6); +// String v8 = fieldValuesList.get(7); +// String v9 = fieldValuesList.get(8); +// if ((v1.equals(contrastMap.get(b + 1)) || v1.equals(contrastMap.get(c + 1)) || v1.equals(contrastMap.get(d + 1))) +// && (v2.equals(contrastMap.get(b + 2)) || v2.equals(contrastMap.get(c + 2)) || v2.equals(contrastMap.get(d + 2))) +// && (v3.equals(contrastMap.get(b + 3)) || v3.equals(contrastMap.get(c + 3)) || v3.equals(contrastMap.get(d + 3))) +// && (v4.equals(contrastMap.get(b + 4)) || v4.equals(contrastMap.get(c + 4)) || v4.equals(contrastMap.get(d + 4))) +// && (v5.equals(contrastMap.get(b + 5)) || v5.equals(contrastMap.get(c + 5)) || v5.equals(contrastMap.get(d + 5))) +// && (v6.equals(contrastMap.get(b + 6)) || v6.equals(contrastMap.get(c + 6)) || v6.equals(contrastMap.get(d + 6))) +// && (v7.equals(contrastMap.get(b + 7)) || v7.equals(contrastMap.get(c + 7)) || v7.equals(contrastMap.get(d + 7))) +// && (v8.equals(contrastMap.get(b + 8)) || v8.equals(contrastMap.get(c + 8)) || v8.equals(contrastMap.get(d + 8))) +// && (v9.equals(contrastMap.get(b + 9)) || v9.equals(contrastMap.get(c + 9)) || v9.equals(contrastMap.get(d + 9)))) { +// subjectMap.put("glorgname", aeConfSubjectContrastBEntity.getGlorgname()); +// subjectMap.put("pkAccsubj", aeConfSubjectContrastBEntity.getPkAccsubj()); +// subjectMap.put("desdocvalue", aeConfSubjectContrastBEntity.getDesdocvalue()); +// } +// } +// break; +// } +// } + + + for (AeConfSubjectContrastBEntity entity : subjectContrastBEntityList) { + Map contrastMap = transContrastBMap(entity); + System.out.println(contrastMap); + + // 获取字段值列表的大小(原switch的size变量,命名更清晰) + int fieldValuesSize = fieldValuesList.size(); + + // 标记是否所有字段都匹配成功 + boolean isAllMatch = true; + + // 循环校验每个字段(替代原switch的多个case) + for (int i = 0; i < fieldValuesSize; i++) { + // 当前字段索引(从1开始,对应原逻辑的b+1、b+2...) + int pos = i + 1; + // 获取当前字段值(原v1~v9) + String currentValue = fieldValuesList.get(i); + + // 生成对比的map键(原b+pos、c+pos、d+pos) + String bKey = b + pos; + String cKey = c + pos; + String dKey = d + pos; + + // 校验当前字段是否匹配(用Objects.equals避免空指针) + boolean currentMatch = Objects.equals(currentValue, contrastMap.get(bKey)) + || Objects.equals(currentValue, contrastMap.get(cKey)) + || Objects.equals(currentValue, contrastMap.get(dKey)); + + if (!currentMatch) { + isAllMatch = false; + break; // 有一个不匹配则跳出循环 + } + } + + // 所有字段都匹配时,设置subjectMap + if (isAllMatch) { + subjectMap.put("glorgname", entity.getGlorgname()); + subjectMap.put("pkAccsubj", entity.getPkAccsubj()); + subjectMap.put("desdocvalue", entity.getDesdocvalue()); + } + } + + + //形成科目对象 + if (subjectMap.size() != 0) { + AeConfBdAccsubjEntity confBdAccsubj = new AeConfBdAccsubjEntity(); + confBdAccsubj.setPkAccsubj(subjectMap.get("pkAccsubj")); + List query = aeConfBdAccsubjDao.query(confBdAccsubj); + if (query.size() > 1 || query.size() == 0) { + Assert.state(false, "根据pkAccsubj:{},desdocvalue:{},未查询到或存在多条科目,请检查", subjectMap.get("pkAccsubj"), subjectMap.get("desdocvalue")); + } + return query.get(0); + + } else { + return null; + } + + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "匹配科目失败,失败原因:{}。", e.getMessage()); + } + return null; + + } + + private Map transContrastBMap(AeConfSubjectContrastBEntity entity) throws Exception { + Map map = new LinkedHashMap<>(); + + // 定义需要处理的字段前缀 + String[] prefixes = { + "factortable", + "factorpk", + "factorid", + "factorname" + }; + + for (String prefix : prefixes) { + for (int i = 1; i <= 9; i++) { + String fieldName = prefix + i; + try { + Field field = entity.getClass().getDeclaredField(fieldName); + field.setAccessible(true); // 允许访问私有字段 + Object value = field.get(entity); + map.put(fieldName, value == null ? null : value.toString()); + } catch (NoSuchFieldException e) { + // 可选:记录日志,字段不存在 + map.put(fieldName, null); + } + } + } + + return map; + } + + /** + * 根据档案id获取档案的 + * + * @@$基础数据:币种表:id=9173b721-5624-11f0-82fc-00090ffe0001 mdm_module_db 的remark:id=[id] + */ + public void queryFileValueByFileId() { } + /** + * 金额取原币 + * 去单据上的数量,金额相加功能。 + * 先遍历单行数据的,再相加 + */ + public BigDecimal sumAmountAndNum(String filedStr, List> dataValue) throws ParseException { + BigDecimal bigDecimal = new BigDecimal(0); + if (filedStr == null || "".equals(filedStr)) { + return bigDecimal; + } + try { + for (Map dataMap : dataValue) { + //解析字段获取数值,可能存在相加的情况 + String[] parts = filedStr.split("\\+"); + for (String part : parts) { + //字段查询 + if (part.startsWith("@@$")) { + String fieldPath = part.substring(3); // 去除 @@$ + String field = validFieldPath(fieldPath); + System.out.println(field); + if (dataMap.get(field) != null) { + String value = (String) dataMap.get(field); + // 使用 NumberFormat 解析,自动处理千分位逗号和小数点 + NumberFormat format = NumberFormat.getInstance(Locale.US); + Number number = format.parse(value); + BigDecimal amount = new BigDecimal(number.toString()); + bigDecimal = bigDecimal.add(amount); + } + } + } + + + } + + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "数量转换失败,失败原因:{}", e.getMessage()); + } + return bigDecimal; + } + + + /** + * bdcode,bdname + */ + public Map transferSubjAss(List aeConfBdAccsubjEntities) { + Map assMap = new LinkedHashMap<>(); + for (AeConfBdAccsubjEntity aeConfBdAccsubjEntity : aeConfBdAccsubjEntities) { + String bdcode = aeConfBdAccsubjEntity.getBdcode(); + String bdname = aeConfBdAccsubjEntity.getBdname(); + if (bdcode != null || bdname != null) { + assMap.put(bdcode, bdname); + } + } + if (assMap.size() == 0) { + return null; + } + return assMap; + } + + /** + * 根据bdcode查询pk_bdinfo + */ + public Map queryAssByBdCode(List aeConfBdAccsubjEntities) { + Map map = new LinkedHashMap<>(); + try { + for (AeConfBdAccsubjEntity aeConfBdAccsubjEntity : aeConfBdAccsubjEntities) { + String bdcode = aeConfBdAccsubjEntity.getBdcode(); + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setTablename("mdm_bd_bdinfo"); + mdmDBQueryVO.setProp1("bdcode"); + mdmDBQueryVO.setPropValue1(bdcode); + List> objectList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); + if (objectList.size() == 0 || objectList.size() > 1) { + Assert.state(false, "根据bdcode:{}。查询:mdm_bd_bdinfo失败,结果集为0或>1", bdcode); + } + String pk_bdinfo = objectList.get(0).get("pk_bdinfo").toString(); + map.put(pk_bdinfo, bdcode); + + } + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "科目辅助核算,查询基础数据表,失败原因:{}", e.getMessage()); + + } + return map; + + } + + + /** + * 分录的mdmId,查询模块关联的档案id, + */ + public Map queryAssByMdmId(List templateAssist) { + Map map = new LinkedHashMap<>(); + try { + for (AeConfVoucherTemplateAssistEntity aeConfVoucherTemplateAssistEntity : templateAssist) { + String mdmId = aeConfVoucherTemplateAssistEntity.getMdmId(); + MdmModuleEntity mdmModuleEntity = new MdmModuleEntity(); + mdmModuleEntity.setId(mdmId); + List mdmModuleEntityList = mdmModuleDao.query(mdmModuleEntity); + if (mdmModuleEntityList.size() == 0 || mdmModuleEntityList.size() > 1) { + Assert.state(false, "根据mdmId:{}。分录查询失败,结果集为0或>1", mdmId); + } + String u8cDbPk = mdmModuleEntityList.get(0).getU8cDbPk(); + map.put(u8cDbPk, aeConfVoucherTemplateAssistEntity); + } + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "分录辅助核算,查询基础数据表,失败原因:{}", e.getMessage()); + + } + return map; + } + + + /** + * 查询基础数据表,编码加主键 + * bdcode,pk_bdinfo + */ + public Map> querySubjAssCodePkBdinfo(List aeConfBdAccsubjEntities) { + Map> assMap = new LinkedHashMap<>(); + try { + for (AeConfBdAccsubjEntity aeConfBdAccsubjEntity : aeConfBdAccsubjEntities) { + String bdcode = aeConfBdAccsubjEntity.getBdcode(); + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setTablename("mdm_bd_bdinfo"); + mdmDBQueryVO.setProp1("bdcode"); + mdmDBQueryVO.setPropValue1(bdcode); + List> objectList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); + if (objectList.size() == 0 || objectList.size() > 1) { + Assert.state(false, "根据bdcode:{}。查询:mdm_bd_bdinfo失败,结果集为0或>1", bdcode); + } + assMap.put(bdcode, objectList.get(0)); + } + if (assMap.size() == 0) { + return null; + } + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "辅助核算,查询基础数据表,失败原因:{}", e.getMessage()); + } + return assMap; + } + + /** + * 辅助核算取值,档案的pk,编码,名称。 + */ + public Map getAssValue(AeConfVoucherTemplateAssistEntity templateAssistEntity, List> dataValue, OrgBookVO orgBookVO) { + Map dataMap = dataValue.get(0); + Map map = new LinkedHashMap<>(); + try { + String fieldName = templateAssistEntity.getFieldName(); + map = validFieldPathAss(templateAssistEntity, dataMap, orgBookVO); + } catch (Exception e) { + e.printStackTrace(); + Assert.state(false, "辅助核算取值失败,失败原因:{}", e.getMessage()); + } + return map; + } + + @Autowired + private IMdmService mdmService; + /** + * pathParts=2:单据上的字段 + * + * @param file 辅助核算档案 + * @param dataMap 业务数据 + * @param orgBookVO 公司账簿信息 + * @return + */ + private Map validFieldPathAss(AeConfVoucherTemplateAssistEntity file, Map dataMap, OrgBookVO orgBookVO) { + Map map=new LinkedHashMap<>(); + //查询档案数据 + List> fileDataMap = queryDataMapByMdmId(file.getMdmId(), orgBookVO); + //查需该档案的pk,code,name字段 + MdmDbFiledVO mdmDbFiledVO = queryDataPkCodeNameFiledByMdmId(file.getMdmId()); + + String[] pathParts = file.getFieldName().split("\\."); + String fileMdmId = file.getMdmId(); + switch (pathParts.length) { + case 1: { + Assert.state(false, ":{}。辅助核算字段关联报错,请检查", pathParts); + } + break; + case 2: { + MdmModuleDbEntity currentDb = queryDb(pathParts[0]); + MdmModuleDbFiledsEntity field = queryFileds(currentDb.getId(), pathParts[1]); + String dataValue = dataMap.get(field.getEnName()).toString(); + //匹配档案数据 + Map stringObjectMap = dataComparison(fileDataMap, mdmDbFiledVO, dataValue); + if (stringObjectMap == null) { + Assert.state(false, "辅助核算内容匹配失败!"); + } + map.put("pk", stringObjectMap.get("pk")); + map.put("code", stringObjectMap.get("code")); + map.put("name", stringObjectMap.get("name")); + } + break; + case 3: { + //取业务数据pathParts[1]字段的值。 + //查询pathParts[1]关联的表,查询关联表的所有字段 + //使用pathParts[2]匹配字段 + MdmModuleDbEntity currentDb = queryDb(pathParts[0]); + MdmModuleDbFiledsEntity field1 = queryFileds(currentDb.getId(), pathParts[1]); + String dataValue = dataMap.get(field1.getEnName()).toString();//循环匹配的值 + + //查询pathParts[1]关联的表,查询关联表的所有字段 + String field1Id = field1.getId(); + MdmModuleDbFiledsRuleEntity filedsRule1 = new MdmModuleDbFiledsRuleEntity(); + filedsRule1.setFiledId(field1Id); + List field1Rules = mdmModuleDbFiledsRuleDao.query(filedsRule1); + MdmModuleDbFiledsRuleEntity rule1Value_bdName=null;//关联的表 + MdmModuleDbFiledsRuleEntity rule1Value_contFiled=null;//关联的字段 + for (MdmModuleDbFiledsRuleEntity field1Rule : field1Rules) { + if ("typeOptionRuleForm".equals(field1Rule.getFormName()) && "service".equals(field1Rule.getRuleCode())) { + rule1Value_bdName = field1Rule; + } + if ("typeOptionRuleForm".equals(field1Rule.getFormName()) && "label".equals(field1Rule.getRuleCode())) { + rule1Value_contFiled = field1Rule; + } + } + System.out.println(rule1Value_bdName); + System.out.println(rule1Value_contFiled); + //字段跟踪,表+字段+数据+公司 + Map map1 = valueDispose(rule1Value_bdName,rule1Value_contFiled,dataValue,orgBookVO); + System.out.println(map1); + //根据bdName查询该档案的pk,code,name字段 + MdmDbFiledVO mdmDbFiledVO1 = queryPkCodeNameByBdName(rule1Value_bdName.getRuleValue()); + String tablepkname1 = mdmDbFiledVO1.getTablepkname(); + String codefieldname1 = mdmDbFiledVO1.getCodefieldname(); + String namefieldname1 = mdmDbFiledVO1.getNamefieldname(); + map.put("pk",map1.get(tablepkname1)==null?null:map1.get(tablepkname1).toString()); + map.put("code",map1.get(codefieldname1)==null?null:map1.get(codefieldname1).toString()); + map.put("name",map1.get(namefieldname1)==null?null:map1.get(namefieldname1).toString()); + } + break; + case 4:{ + //取业务数据pathParts[1]字段的值。 + //查询pathParts[1]关联的表,查询关联表的所有字段 + //使用pathParts[2]匹配字段 + //查询pathParts[2]关联的表,查需关联表的所有字段 + //使用pathParts[3]匹配字段 + MdmModuleDbEntity currentDb = queryDb(pathParts[0]); + MdmModuleDbFiledsEntity field1 = queryFileds(currentDb.getId(), pathParts[1]); + String dataValue = dataMap.get(field1.getEnName()).toString();//循环匹配的值 + + //查询pathParts[1]关联的表,查询关联表的所有字段 + String field1Id = field1.getId(); + MdmModuleDbFiledsRuleEntity filedsRule1 = new MdmModuleDbFiledsRuleEntity(); + filedsRule1.setFiledId(field1Id); + List field1Rules = mdmModuleDbFiledsRuleDao.query(filedsRule1); + MdmModuleDbFiledsRuleEntity rule1Value_bdName=null;//关联的表 + MdmModuleDbFiledsRuleEntity rule1Value_contFiled=null;//关联的字段 + for (MdmModuleDbFiledsRuleEntity field1Rule : field1Rules) { + if ("typeOptionRuleForm".equals(field1Rule.getFormName()) && "service".equals(field1Rule.getRuleCode())) { + rule1Value_bdName = field1Rule; + } + if ("typeOptionRuleForm".equals(field1Rule.getFormName()) && "label".equals(field1Rule.getRuleCode())) { + rule1Value_contFiled = field1Rule; + } + } + System.out.println(rule1Value_bdName); + System.out.println(rule1Value_contFiled); + //字段跟踪,表+字段+数据+公司 + Map map1 = valueDispose(rule1Value_bdName,rule1Value_contFiled,dataValue,orgBookVO); + System.out.println(map1); + //根据bdName查询该档案的pk,code,name字段 + MdmDbFiledVO mdmDbFiledVO1 = queryPkCodeNameByBdName(rule1Value_bdName.getRuleValue()); + String tablepkname1 = mdmDbFiledVO1.getTablepkname(); + String codefieldname1 = mdmDbFiledVO1.getCodefieldname(); + String namefieldname1 = mdmDbFiledVO1.getNamefieldname(); + + + //查询pathParts[2]关联的表,查需关联表的所有字段 + String bdName2 = rule1Value_bdName.getRuleValue(); + //查询mdm_module_bd2 + MdmModuleDbEntity mdmModuleDb2Entity = new MdmModuleDbEntity(); + mdmModuleDb2Entity.setDbName(bdName2); + List dbEntity2List = mdmModuleDbDao.query(mdmModuleDb2Entity); + if(dbEntity2List.size()==0||dbEntity2List.size()>1){ + Assert.state(false,"根据bdName2:{},查询mdm_module_bd2表失败",bdName2); + } + MdmModuleDbEntity mdmModuleDb2 = dbEntity2List.get(0); + //查询字段 + MdmModuleDbFiledsEntity field2 = queryFileds(mdmModuleDb2.getId(), pathParts[2]); + System.out.println(field2); + String field2Id = field2.getId(); + MdmModuleDbFiledsRuleEntity filedsRule2 = new MdmModuleDbFiledsRuleEntity(); + filedsRule2.setFiledId(field2Id); + List field2Rules = mdmModuleDbFiledsRuleDao.query(filedsRule2); + MdmModuleDbFiledsRuleEntity rule2Value_bdName=null;//关联的表 + MdmModuleDbFiledsRuleEntity rule2Value_contFiled=null;//关联的字段 + for (MdmModuleDbFiledsRuleEntity field2Rule : field2Rules) { + if ("typeOptionRuleForm".equals(field2Rule.getFormName()) && "service".equals(field2Rule.getRuleCode())) { + rule2Value_bdName = field2Rule; + } + if ("typeOptionRuleForm".equals(field2Rule.getFormName()) && "label".equals(field2Rule.getRuleCode())) { + rule2Value_contFiled = field2Rule; + } + } + System.out.println(rule2Value_bdName); + System.out.println(rule2Value_contFiled); + + + Object o2 = map1.get(field2.getEnName()); + if(o2==null){ + Assert.state(false,"根据字段:{},查询上层数据失败",map1); + } + String value2 = map1.get(field2.getEnName()).toString(); + Map map2 = valueDispose(rule2Value_bdName,rule2Value_contFiled,value2,orgBookVO); + System.out.println(map2); + MdmDbFiledVO mdmDbFiledVO2 = queryPkCodeNameByBdName(rule2Value_bdName.getRuleValue()); + String tablepkname2 = mdmDbFiledVO2.getTablepkname(); + String codefieldname2 = mdmDbFiledVO2.getCodefieldname(); + String namefieldname2 = mdmDbFiledVO2.getNamefieldname(); + map.put("pk",map2.get(tablepkname2)==null?null:map2.get(tablepkname2).toString()); + map.put("code",map2.get(codefieldname2)==null?null:map2.get(codefieldname2).toString()); + map.put("name",map2.get(namefieldname2)==null?null:map2.get(namefieldname2).toString()); + } + break; + + } + + return map; + } + + + + + /** + * 根据mdmId查询数据, + * + * @param mdmId + * @return + */ + private List> queryDataMapByMdmId(String mdmId, OrgBookVO orgBookVO) { + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setMdmId(mdmId); + mdmModuleDbEntity.setDbType("1"); + List mdmModuleDbEntityList = mdmModuleDbDao.query(mdmModuleDbEntity); + if (mdmModuleDbEntityList == null || mdmModuleDbEntityList.size() == 0) { + Assert.state(false, "根据mdmId:{},查询数据表失败", mdmId); + } + String dbName = mdmModuleDbEntityList.get(0).getDbName(); + String remark = mdmModuleDbEntityList.get(0).getRemark(); + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setPkentityorg(orgBookVO.getPkentityorg()); + if (remark != null && !"".equals(remark)) { + if (!remark.contains("管理")) { + mdmDBQueryVO.setPkentityorg(null); + } + } + mdmDBQueryVO.setTablename(dbName); + List> dataMap = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); + return dataMap; + } + + /** + * 根据mdmId查询数据,pk,code,name字段 + * @param mdmId + * @return + */ + private MdmDbFiledVO queryDataPkCodeNameFiledByMdmId(String mdmId) { + MdmDbFiledVO mdmDbFiledVO = new MdmDbFiledVO(); + mdmDbFiledVO.setMdmId(mdmId); + List mdmDbFiledVOList = mdmDbFiledVODAO.queryMdmDbFiledVO(mdmDbFiledVO); + for (MdmDbFiledVO dbFiledVO : mdmDbFiledVOList) { + dbFiledVO.setPkBdinfo(dbFiledVO.getMdmId()); + dbFiledVO.setBdcode(dbFiledVO.getMdmCode()); + dbFiledVO.setBdname(dbFiledVO.getMdmName()); +// dbFiledVO.setTablepkname("id"); + dbFiledVO.setTablepkname(dbFiledVO.getTablepkname()); + } + if(mdmDbFiledVOList.size()!=0){ + return mdmDbFiledVOList.get(0); + }else { + return null; + } + } + + /** + * 档案数据,单据数据比对 + */ + public Map dataComparison(List> fileDataListMap,MdmDbFiledVO mdmDbFiledVO,String dataValue){ + Map map=new LinkedHashMap<>(); + //获取对应字段 + String tablepkname = mdmDbFiledVO.getTablepkname(); + String codefieldname = mdmDbFiledVO.getCodefieldname(); + String namefieldname = mdmDbFiledVO.getNamefieldname(); + + for (Map stringObjectMap : fileDataListMap) { + String pk = stringObjectMap.get(tablepkname)==null?null:stringObjectMap.get(tablepkname).toString(); + String code = stringObjectMap.get(codefieldname)==null?null:stringObjectMap.get(codefieldname).toString(); + String name = stringObjectMap.get(namefieldname)==null?null:stringObjectMap.get(namefieldname).toString(); + if(dataValue.equals(code)||dataValue.equals(name)){ + map.put("pk",pk); + map.put("code",code); + map.put("name",name); + return map; + } + } + return null; + } + + + /** + * + * @param ruleValueBdName 来源表名 + * @param ruleValueConFiled 来源字段 + * @param map 关联数据 + * @return + */ + private Map queryDataByTableNameAndFiledAndValue(String ruleValueBdName, String ruleValueConFiled, Map map,OrgBookVO orgBookVO) { + Map data=new HashMap<>(); + try { + System.out.println(map.get("code")); + String code = map.get("code"); + //查值 + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setTablename(ruleValueBdName); + mdmDBQueryVO.setProp7(ruleValueConFiled); + mdmDBQueryVO.setPropValue7(code); + mdmDBQueryVO.setPkentityorg(orgBookVO.getPkentityorg()); + + //查询表remark,是否包含管理 + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setDbName(ruleValueBdName); + List dbEntityList = mdmModuleDbDao.query(mdmModuleDbEntity); + if (dbEntityList.size() == 0) { + Assert.state(false, "根据表名:{},查询数据表失败", ruleValueBdName); + } + String remark = dbEntityList.get(0).getRemark(); + if (remark != null && !"".equals(remark)) { + if (!remark.contains("管理")) { + mdmDBQueryVO.setPkentityorg(null); + } + } + + List> objectList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); + System.out.println(objectList); + + data=objectList.get(0); + + + }catch (Exception e){ + e.printStackTrace(); + Assert.state(false,"表名:{},字段:{},map:{},关联数据转换失败,失败原因:{}。",ruleValueBdName,ruleValueConFiled,map,e.getMessage()); + } + return data; + } + + /** + * + * @param rule1ValueBdName 关联表名 + * @param rule1ValueContFiled 关联字段 + * @param dataValue 值 + * @param orgBookVO 组织 + * @return 档案的pk,code,name + */ + private Map valueDispose(MdmModuleDbFiledsRuleEntity rule1ValueBdName, MdmModuleDbFiledsRuleEntity rule1ValueContFiled, String dataValue, OrgBookVO orgBookVO) { + Map map = new HashMap<>(); + try { + String bdName = rule1ValueBdName.getRuleValue(); + String contFiled = rule1ValueContFiled.getRuleValue(); + System.out.println(rule1ValueBdName); + MdmDBQueryVO mdmDBQueryVO = new MdmDBQueryVO(); + mdmDBQueryVO.setTablename(bdName); + mdmDBQueryVO.setProp7(contFiled); + mdmDBQueryVO.setPropValue7(dataValue); + + //查询表remark,是否包含管理 + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setDbName(bdName); + List dbEntityList = mdmModuleDbDao.query(mdmModuleDbEntity); + if (dbEntityList.size() == 0) { + Assert.state(false, "根据表名:{},查询数据表失败", bdName); + } + String remark = dbEntityList.get(0).getRemark(); + if (remark != null && !"".equals(remark)) { + if (!remark.contains("管理")) { + mdmDBQueryVO.setPkentityorg(null); + } + } + List> objectList = mdmDBQueryVODAO.queryMdmDb(mdmDBQueryVO); + map=objectList.get(0); + + }catch (Exception e){ + e.printStackTrace(); + Assert.state(false,"bdName:{},valueFiled:{},dataValue:{}.字段跟踪失败,失败原因:{}。",rule1ValueBdName,rule1ValueContFiled,dataValue,e.getMessage()); + } + return map; + } + + private MdmDbFiledVO queryPkCodeNameByBdName(String dbName) { + MdmModuleDbEntity mdmModuleDbEntity = new MdmModuleDbEntity(); + mdmModuleDbEntity.setDbName(dbName); + List mdmModuleDbEntityList = mdmModuleDbDao.query(mdmModuleDbEntity); + if(mdmModuleDbEntityList.size()==0||mdmModuleDbEntityList.size()>1){ + Assert.state(false,"根据表名:{},查询数据表失败", dbName); + } + MdmModuleDbEntity mdmModuleDbEntity1 = mdmModuleDbEntityList.get(0); + MdmDbFiledVO mdmDbFiledVO = new MdmDbFiledVO(); + mdmDbFiledVO.setMdmId(mdmModuleDbEntity1.getMdmId()); + List mdmDbFiledVOList = mdmDbFiledVODAO.queryMdmDbFiledVO(mdmDbFiledVO); + return mdmDbFiledVOList.get(0); + + } + } diff --git a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/AccsubjVO.java b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/AccsubjVO.java new file mode 100644 index 00000000..2d788443 --- /dev/null +++ b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/AccsubjVO.java @@ -0,0 +1,20 @@ +package com.hzya.frame.voucher.ae.generate.core.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * Created by zydd on 2025-07-25 11:39 + * 科目VO + */ +@Data +public class AccsubjVO implements Serializable { + private String id; + private String pk_accsubj; + private String subjcode; + private String subjname; + private String dispname; + private String pk_glorgbook; + +} diff --git a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/CreateVoucherVO.java b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/CreateVoucherVO.java index 1659d4ac..2e6dd8ba 100644 --- a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/CreateVoucherVO.java +++ b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/CreateVoucherVO.java @@ -20,4 +20,8 @@ public class CreateVoucherVO implements Serializable { private String billCode; private String timeStart; private String timeEnd; + /** + * 0 未生成 1 已生成 2 生成失败 + */ + private String status; } diff --git a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/VoucherData.java b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/VoucherData.java index b2824599..50f0cb29 100644 --- a/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/VoucherData.java +++ b/base-buildpackage/src/main/java/com/hzya/frame/voucher/ae/generate/core/vo/VoucherData.java @@ -15,14 +15,35 @@ public class VoucherData { public static class Voucher { private String attachment;//附单据数 private String pk_corp;//公司 + private String corp_name; + private String corp_code; private String pk_glorgbook;//账簿 private String pk_prepared;//制单人编码 private String pk_vouchertype;//凭证类别简称 private String prepareddate;//制单日期(格式示例:2021-04-27)) + + //u8c + private String voucherkind;//凭证类型 + private String no;//凭证号 + private String modifyflag;//修改标志(当不想让界面修改时传三个N) + private String isdifflag;//是否差异凭证 + private String explanation;//凭证摘要 + private String hasCashflowModified;//凭证是否手动修改了现金流量分析(如果传现金流量此属性传Y,如果没有现金流量分析,此属性不传或传N) + //ncc + private String prepared;//制单人编码 + private String vouchertype_code;//凭证类别编码 + private String vouchertype_name;//凭证类别名称 + private String vouchertype_shortname;//凭证类别编码 + private String num;//凭证号 + private String accbookCode;//核算账簿编码 + private String accbookName;//核算账簿名称 + private String year;//会计年度 + private String period;//会计期间 + private List details; @Data - public class Detail { + public static class Detail { private String detailindex;//分录号 private String excrate2;//汇率(2.7版本及以前版本不支持外面传进来,需要在外币汇率节点设置) private String price;//单价 @@ -30,30 +51,66 @@ public class VoucherData { private String pk_accsubj;//科目 private String pk_currtype;//币种编码 //借 - private String debitquantity;// 借方数量 + private String debitquantity;//借方数量 private String debitamount;//原币借方金额(必填,没有就传0就行了) private String localdebitamount;//本币借方金额(必填,没有就传0就行了) //贷 private String creditquantity;//贷方数量 private String creditamount;//原币贷方金额(必填,没有就传0就行了) private String localcreditamount;//本币贷方金额(必填,没有就传0就行了) + + //u8c + private String modifyflag;//修改标志(不允许修改时传是16个N) + //ncc + private String currtypeId;//币种编码 + private String currtypeCode;//币种编码 + private String currtypeName;//币种名称 + private String accountId;//科目编码` + private String accountCode;//科目编码` + private String accountName;//科目名称` + private String quantity;//数量 + private String amount;//原币金额 + private String groupdebitamount;//借-集团本币借方金额 + private String globaldebitamount;//借-全局本币借方金额 + private String groupcreditamount;//贷-集团本币贷方金额 + private String globalcreditamount;//贷-全局本币贷方金额 + private String locRate;//组织本币汇率 + private String groupRate;//集团本币汇率 + private String globalRate;//全局本币汇率 + private String unitCode;//业务单元编码 + private String busidate;//业务日期 + //辅助核算 private List ass; private List cashflow; @Data - public class Ass { + public static class Ass { + private String checktypeid;//辅助核算类型编码 private String checktypecode;//辅助核算类型编码 + private String checktypename;//辅助核算类型编码 + private String checkvalueid;//辅助核算的值编码 private String checkvaluecode;//辅助核算的值编码 + private String checkvaluename;//辅助核算的值编码 } @Data - public class Cashflow { + public static class Cashflow { private String memo;//备注(v5.1开始支持) private String money;//原币金额 private String moneyass;//辅币(v5.1开始支持) private String moneymain;//主币(v5.1开始支持) private String pk_cashflow;//现金流量表项编码 private String pk_currtype;//现金流量币种编码 + + //ncc + private String mainCode;//主表表项 + private String subCode;//附表表项 + private String innercorpCode;//内部单位 + private String amount;//表项原币金额 + private String localamount;//表项组织本币金额 + private String groupamount;//表项集团本币金额 + private String globalamount;//表项全局本币金额 + } } }