|
@@ -0,0 +1,323 @@
|
|
|
|
+package kd.fi.fa.business.cardgenerate;
|
|
|
|
+
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.HashSet;
|
|
|
|
+import java.util.Iterator;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
|
|
+import kd.bos.algo.DataSet;
|
|
|
|
+import kd.bos.algo.Row;
|
|
|
|
+import kd.bos.dataentity.OperateOption;
|
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
|
+import kd.bos.dataentity.entity.LocaleString;
|
|
|
|
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
|
|
|
|
+import kd.bos.dataentity.resource.ResManager;
|
|
|
|
+import kd.bos.entity.EntityMetadataCache;
|
|
|
|
+import kd.bos.entity.MainEntityType;
|
|
|
|
+import kd.bos.entity.operate.result.IOperateInfo;
|
|
|
|
+import kd.bos.entity.operate.result.OperationResult;
|
|
|
|
+import kd.bos.entity.property.EntryProp;
|
|
|
|
+import kd.bos.exception.KDBizException;
|
|
|
|
+import kd.bos.orm.query.QFilter;
|
|
|
|
+import kd.bos.orm.util.CollectionUtils;
|
|
|
|
+import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
|
|
+import kd.bos.servicehelper.DBServiceHelper;
|
|
|
|
+import kd.bos.servicehelper.QueryServiceHelper;
|
|
|
|
+import kd.bos.servicehelper.operation.OperationServiceHelper;
|
|
|
|
+import kd.bos.workflow.engine.impl.util.CollectionUtil;
|
|
|
|
+import kd.fi.fa.business.SourceFlagEnum;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.AbstractFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.AddCardToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.AssetCardToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.DispatchToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.DispatchToRealCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.EngineeringToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.InitLeaseContractToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.InventoryProfitToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.LeaseContractToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.cardgenerate.impl.PurchaseToFinCardGenerate;
|
|
|
|
+import kd.fi.fa.business.errorcode.FinCardErrorCode;
|
|
|
|
+import kd.fi.fa.business.utils.FaCommonUtils;
|
|
|
|
+import kd.fi.fa.business.utils.FaUtils;
|
|
|
|
+import kd.fi.fa.common.util.Fa;
|
|
|
|
+
|
|
|
|
+public class CardGenerateHelperEx {
|
|
|
|
+ public CardGenerateHelperEx() {
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static final Object[] generateRealCard(DynamicObject srcBill) {
|
|
|
|
+ IRealCardGenerate generate = null;
|
|
|
|
+ DynamicObjectType dt = srcBill.getDynamicObjectType();
|
|
|
|
+ if (!"fa_dispatch_in".equals(dt.getName()) && !"fa_dispatch".equals(dt.getName())) {
|
|
|
|
+ throw new KDBizException(FinCardErrorCode.FINCARD_GENERATE_ERROR, new Object[0]);
|
|
|
|
+ } else {
|
|
|
|
+ generate = new DispatchToRealCardGenerate(srcBill.getPkValue());
|
|
|
|
+ return generate.generateRealCard();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static void generateFinCard(List<DynamicObject> objects) {
|
|
|
|
+ MainEntityType finCardType = EntityMetadataCache.getDataEntityType("fa_card_fin");
|
|
|
|
+ DynamicObjectType billHeadType = ((EntryProp)finCardType.getProperty("billhead_lk")).getDynamicCollectionItemPropertyType();
|
|
|
|
+ Long realCardTableId = EntityMetadataCache.loadTableDefine("fa_card_real", "fa_card_real").getTableId();
|
|
|
|
+ AbstractFinCardGenerate generate = null;
|
|
|
|
+ List<DynamicObject> dynamicAdd = new ArrayList();
|
|
|
|
+ List<DynamicObject> dynamicPurchase = new ArrayList();
|
|
|
|
+ List<DynamicObject> dynamicDispatch = new ArrayList();
|
|
|
|
+ List<DynamicObject> dynamicInventory = new ArrayList();
|
|
|
|
+ List<DynamicObject> dynamicEnginner = new ArrayList();
|
|
|
|
+ List<DynamicObject> dynamicLease = new ArrayList();
|
|
|
|
+ List<DynamicObject> dynamicInitLease = new ArrayList();
|
|
|
|
+ List<DynamicObject> callbackFincards = new ArrayList();
|
|
|
|
+ Map<Object, DynamicObject[]> orgAssetBooksMap = getAssetBooksByOrg(objects);
|
|
|
|
+ Iterator var14 = objects.iterator();
|
|
|
|
+
|
|
|
|
+ while(true) {
|
|
|
|
+ while(var14.hasNext()) {
|
|
|
|
+ DynamicObject dynamicObject = (DynamicObject)var14.next();
|
|
|
|
+ long realCardId = dynamicObject.getLong("id");
|
|
|
|
+ Object sourceFlag = dynamicObject.get("sourceflag");
|
|
|
|
+ boolean justrealcard = dynamicObject.getBoolean("justrealcard");
|
|
|
|
+ if (justrealcard) {
|
|
|
|
+ dynamicObject.set("bizstatus", "READY");
|
|
|
|
+ } else if (!FaCommonUtils.equals(SourceFlagEnum.ADD, sourceFlag) && !FaCommonUtils.equals(SourceFlagEnum.IMPORT, sourceFlag) && !FaCommonUtils.equals(SourceFlagEnum.INITIAL, sourceFlag) && !FaCommonUtils.equals(SourceFlagEnum.INVENTORYPROFIT, sourceFlag) && !FaCommonUtils.equals(SourceFlagEnum.DATAASSET, sourceFlag) && !FaCommonUtils.equals(SourceFlagEnum.SCAN, sourceFlag)) {
|
|
|
|
+ if (FaCommonUtils.equals(SourceFlagEnum.PURCHASE, sourceFlag)) {
|
|
|
|
+ dynamicPurchase.add(dynamicObject);
|
|
|
|
+ } else if (FaCommonUtils.equals(SourceFlagEnum.DISPATCH, sourceFlag)) {
|
|
|
|
+ dynamicDispatch.add(dynamicObject);
|
|
|
|
+ } else if (FaCommonUtils.equals(SourceFlagEnum.INVENTORYPROFIT, sourceFlag)) {
|
|
|
|
+ dynamicInventory.add(dynamicObject);
|
|
|
|
+ } else if (FaCommonUtils.equals(SourceFlagEnum.ENGINEERINGTRANS, sourceFlag)) {
|
|
|
|
+ dynamicEnginner.add(dynamicObject);
|
|
|
|
+ } else if (FaCommonUtils.equals(SourceFlagEnum.LEASECONTRACT, sourceFlag)) {
|
|
|
|
+ dynamicLease.add(dynamicObject);
|
|
|
|
+ } else {
|
|
|
|
+ if (!FaCommonUtils.equals(SourceFlagEnum.INITLEASECONTRACT, sourceFlag)) {
|
|
|
|
+ throw new KDBizException(FinCardErrorCode.FINCARD_GENERATE_ERROR, new Object[0]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dynamicInitLease.add(dynamicObject);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ dynamicAdd.add(dynamicObject);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Map<Object, Object> finCardAndrealCard = new HashMap();
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dynamicAdd)) {
|
|
|
|
+ generate = new AddCardToFinCardGenerate();
|
|
|
|
+ callbackFincards.addAll(generate.generateDynamicFinCard(dynamicAdd, orgAssetBooksMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dynamicPurchase)) {
|
|
|
|
+ generate = new PurchaseToFinCardGenerate();
|
|
|
|
+ callbackFincards.addAll(generate.generateDynamicFinCard(dynamicPurchase, orgAssetBooksMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dynamicDispatch)) {
|
|
|
|
+ generate = new DispatchToFinCardGenerate();
|
|
|
|
+ callbackFincards.addAll(generate.generateDynamicFinCard(dynamicDispatch, orgAssetBooksMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dynamicInventory)) {
|
|
|
|
+ generate = new InventoryProfitToFinCardGenerate();
|
|
|
|
+ callbackFincards.addAll(generate.generateDynamicFinCard(dynamicInventory, orgAssetBooksMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dynamicEnginner)) {
|
|
|
|
+ generate = new EngineeringToFinCardGenerate();
|
|
|
|
+ callbackFincards.addAll(generate.generateDynamicFinCard(dynamicEnginner, orgAssetBooksMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dynamicLease)) {
|
|
|
|
+ generate = new LeaseContractToFinCardGenerate();
|
|
|
|
+ callbackFincards.addAll(generate.generateDynamicFinCard(dynamicLease, orgAssetBooksMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard));
|
|
|
|
+ Map<Long, Long> leaseMap = new HashMap<>();
|
|
|
|
+ for (DynamicObject object : dynamicLease) {
|
|
|
|
+ long id = object.getLong("id");
|
|
|
|
+ long srcbillid = object.getLong("srcbillid");
|
|
|
|
+ leaseMap.put(id, srcbillid);
|
|
|
|
+ }
|
|
|
|
+ for (DynamicObject callbackFincard : callbackFincards) {
|
|
|
|
+ long realcardmasterid = callbackFincard.getLong("realcardmasterid");
|
|
|
|
+ if (leaseMap.containsKey(realcardmasterid)) {
|
|
|
|
+ long srcbillid = leaseMap.get(realcardmasterid);
|
|
|
|
+ callbackFincard.set("nckd_bigintfield", srcbillid);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dynamicInitLease)) {
|
|
|
|
+ generate = new InitLeaseContractToFinCardGenerate();
|
|
|
|
+ callbackFincards.addAll(generate.generateDynamicFinCard(dynamicInitLease, orgAssetBooksMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ OperateOption operateOption = OperateOption.create();
|
|
|
|
+ operateOption.setVariableValue("genfincard", "true");
|
|
|
|
+ operateOption.setVariableValue("ignore_validate_initial_fincard", "true");
|
|
|
|
+ operateOption.setVariableValue("ignoreAssetBookStatus", "true");
|
|
|
|
+ OperationResult result = OperationServiceHelper.executeOperate("save", "fa_card_fin", (DynamicObject[])callbackFincards.toArray(new DynamicObject[0]), operateOption);
|
|
|
|
+ if (result.isSuccess()) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<IOperateInfo> allError = result.getAllErrorOrValidateInfo();
|
|
|
|
+ result.getAllErrorInfo();
|
|
|
|
+ StringBuilder errorInfo = new StringBuilder();
|
|
|
|
+ if (!CollectionUtils.isEmpty(allError)) {
|
|
|
|
+ Iterator var31 = allError.iterator();
|
|
|
|
+
|
|
|
|
+ while(var31.hasNext()) {
|
|
|
|
+ IOperateInfo in = (IOperateInfo)var31.next();
|
|
|
|
+ errorInfo.append(in.getMessage());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String msg = (new LocaleString(String.format("%s%s-%s", ResManager.loadKDString("生成财务卡片失败,审核事务失败", "CardGenerateHelper_0", "fi-fa-business", new Object[0]), result.getMessage(), errorInfo.toString()))).toString();
|
|
|
|
+ throw new KDBizException(msg);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static Map<Long, Map<Long, DynamicObject>> generateFinCardForAssetCard(List<DynamicObject> realCardList, String entityName) {
|
|
|
|
+ String finEntityName = "";
|
|
|
|
+ if (entityName.equals("fa_asset_card")) {
|
|
|
|
+ finEntityName = "fa_card_fin";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (entityName.equals("fa_asset_initcard")) {
|
|
|
|
+ finEntityName = "fa_initcard_fin";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ MainEntityType finCardType = EntityMetadataCache.getDataEntityType(finEntityName);
|
|
|
|
+ DynamicObjectType billHeadType = ((EntryProp)finCardType.getProperty("billhead_lk")).getDynamicCollectionItemPropertyType();
|
|
|
|
+ Long realCardTableId = EntityMetadataCache.loadTableDefine("fa_card_real", "fa_card_real").getTableId();
|
|
|
|
+ Map<Object, DynamicObject[]> orgAssetBookMap = getAssetBooksByOrg(realCardList);
|
|
|
|
+ Map<Object, Object> finCardAndrealCard = new HashMap(realCardList.size());
|
|
|
|
+ AbstractFinCardGenerate generate = new AssetCardToFinCardGenerate();
|
|
|
|
+ List<DynamicObject> finCardList = generate.generateDynamicFinCard(realCardList, orgAssetBookMap, finCardType, billHeadType, realCardTableId, finCardAndrealCard);
|
|
|
|
+ Map<Long, Map<Long, DynamicObject>> finCardMap = new HashMap(finCardList.size());
|
|
|
|
+ Iterator var11 = finCardList.iterator();
|
|
|
|
+
|
|
|
|
+ while(var11.hasNext()) {
|
|
|
|
+ DynamicObject finCard = (DynamicObject)var11.next();
|
|
|
|
+ long fid = DBServiceHelper.genGlobalLongId();
|
|
|
|
+ finCard.set("id", fid);
|
|
|
|
+ long realCardId = finCard.getLong(Fa.id("realcard"));
|
|
|
|
+ long depreUseId = finCard.getLong(Fa.id("depreuse"));
|
|
|
|
+ Map<Long, DynamicObject> depreUseCardMap = (Map)finCardMap.computeIfAbsent(realCardId, (v) -> {
|
|
|
|
+ return new HashMap(4);
|
|
|
|
+ });
|
|
|
|
+ depreUseCardMap.put(depreUseId, finCard);
|
|
|
|
+ finCard.getDynamicObjectCollection("billhead_lk").clear();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return finCardMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static Map<Object, DynamicObject[]> getAssetBooksByOrg(List<DynamicObject> realCards) {
|
|
|
|
+ Set<Long> orgIds = new HashSet(4);
|
|
|
|
+ Set<Long> realCardIds = new HashSet(FaUtils.getInitialCapacity43(realCards.size()));
|
|
|
|
+ Iterator var3 = realCards.iterator();
|
|
|
|
+
|
|
|
|
+ while(var3.hasNext()) {
|
|
|
|
+ DynamicObject realCard = (DynamicObject)var3.next();
|
|
|
|
+ orgIds.add(realCard.getLong(Fa.id("org")));
|
|
|
|
+ realCardIds.add(realCard.getLong("id"));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ QFilter filters = new QFilter("org", "in", orgIds);
|
|
|
|
+ String sic = Fa.join(",", new String[]{"id", "depreuse", "org", "ismainbook", "basecurrency", "periodtype", "depresystem", "curperiod", "isgroupbook", "exchangetable", "status", "startperiod"});
|
|
|
|
+ Map<Object, DynamicObject> assetBook4Load = BusinessDataServiceHelper.loadFromCache("fa_assetbook", sic, new QFilter[]{filters});
|
|
|
|
+ Map<Long, Set<DynamicObject>> org2AssetBooks = new HashMap(FaUtils.getInitialCapacity43(orgIds.size()));
|
|
|
|
+ Iterator var7 = assetBook4Load.values().iterator();
|
|
|
|
+
|
|
|
|
+ while(var7.hasNext()) {
|
|
|
|
+ DynamicObject assetBook = (DynamicObject)var7.next();
|
|
|
|
+ long orgId = assetBook.getLong(Fa.id("org"));
|
|
|
|
+ Set<DynamicObject> assetBooks = (Set)org2AssetBooks.computeIfAbsent(orgId, (k) -> {
|
|
|
|
+ return new HashSet(4);
|
|
|
|
+ });
|
|
|
|
+ assetBooks.add(assetBook);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DataSet finCards = QueryServiceHelper.queryDataSet("getAssetBooksByOrg.realCardsQueryFinCards", "fa_card_fin", Fa.comma(new String[]{"realcard", "assetbook"}), new QFilter[]{new QFilter("realcard", "in", realCardIds), new QFilter("endperiod", "=", 99999999999L)}, (String)null);
|
|
|
|
+ Map<Long, Set<Long>> realCardId2AssetBookIds = new HashMap(realCards.size());
|
|
|
|
+
|
|
|
|
+ while(finCards.hasNext()) {
|
|
|
|
+ Row next = finCards.next();
|
|
|
|
+ long realCardId = next.getLong("realcard");
|
|
|
|
+ Set<Long> assetBookIds = (Set)realCardId2AssetBookIds.computeIfAbsent(realCardId, (v) -> {
|
|
|
|
+ return new HashSet(4);
|
|
|
|
+ });
|
|
|
|
+ assetBookIds.add(next.getLong("assetbook"));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Map<Object, DynamicObject[]> realCardId2AssetBooks = new HashMap(FaUtils.getInitialCapacity43(realCards.size()));
|
|
|
|
+ Iterator var31 = realCards.iterator();
|
|
|
|
+
|
|
|
|
+ while(true) {
|
|
|
|
+ while(true) {
|
|
|
|
+ while(true) {
|
|
|
|
+ while(true) {
|
|
|
|
+ long realCardId;
|
|
|
|
+ boolean isFromLease;
|
|
|
|
+ Set assetBookIds;
|
|
|
|
+ Set assetBooks;
|
|
|
|
+ do {
|
|
|
|
+ if (!var31.hasNext()) {
|
|
|
|
+ return realCardId2AssetBooks;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DynamicObject realCard = (DynamicObject)var31.next();
|
|
|
|
+ long orgId = realCard.getLong(Fa.id("org"));
|
|
|
|
+ realCardId = realCard.getLong("id");
|
|
|
|
+ isFromLease = SourceFlagEnum.INITLEASECONTRACT.name().equals(realCard.getString("sourceflag")) || SourceFlagEnum.LEASECONTRACT.name().equals(realCard.getString("sourceflag"));
|
|
|
|
+ assetBookIds = (Set)realCardId2AssetBookIds.get(realCardId);
|
|
|
|
+ assetBooks = (Set)org2AssetBooks.get(orgId);
|
|
|
|
+ } while(assetBooks == null);
|
|
|
|
+
|
|
|
|
+ if (assetBookIds == null) {
|
|
|
|
+ if (isFromLease) {
|
|
|
|
+ Iterator var34 = assetBooks.iterator();
|
|
|
|
+
|
|
|
|
+ while(var34.hasNext()) {
|
|
|
|
+ DynamicObject assetBook = (DynamicObject)var34.next();
|
|
|
|
+ if (assetBook.getBoolean("ismainbook")) {
|
|
|
|
+ realCardId2AssetBooks.put(realCardId, new DynamicObject[]{assetBook});
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ DynamicObject[] array = (DynamicObject[]) assetBooks.toArray(new DynamicObject[0]);
|
|
|
|
+ realCardId2AssetBooks.put(realCardId, array);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ Set<DynamicObject> books = new HashSet(FaUtils.getInitialCapacity43(assetBooks.size()));
|
|
|
|
+ Iterator var20 = assetBooks.iterator();
|
|
|
|
+
|
|
|
|
+ while(var20.hasNext()) {
|
|
|
|
+ DynamicObject assetBook = (DynamicObject)var20.next();
|
|
|
|
+ boolean mainBook = assetBook.getBoolean("ismainbook");
|
|
|
|
+ long assetBookId = assetBook.getLong("id");
|
|
|
|
+ if (!assetBookIds.contains(assetBookId)) {
|
|
|
|
+ if (isFromLease) {
|
|
|
|
+ if (mainBook) {
|
|
|
|
+ books.add(assetBook);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ books.add(assetBook);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ realCardId2AssetBooks.put(realCardId, books.toArray(new DynamicObject[0]));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|