Bläddra i källkod

Merge remote-tracking branch 'origin/master'

xuhao 6 månader sedan
förälder
incheckning
5444d9f333

+ 10 - 23
src/main/java/fi/cas/opplugin/PaymentProcessOpPlugin.java

@@ -63,7 +63,7 @@ public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
                 //循环数组获取结算状态,已结算金额,未结算金额
                 for (int c=0;c<gzDynamicObjects.length;c++) {
                     //应收挂帐单头数据包
-                    DynamicObject gzInfo = BusinessDataServiceHelper.loadSingle(gzDynamicObjects[i].getPkValue(), gzDynamicObjects[i].getDynamicObjectType().getName());
+                    DynamicObject gzInfo = BusinessDataServiceHelper.loadSingle(gzDynamicObjects[c].getPkValue(), gzDynamicObjects[c].getDynamicObjectType().getName());
                     //获取预付借款单id
                     String yfjkId = gzInfo.getString("sourcebillid");
                     if (!StringUtils.isEmpty(yfjkId)) {
@@ -90,8 +90,10 @@ public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
                         DynamicObject[] yfjkDynamicObjects = BusinessDataServiceHelper.load(nckd_er_prepaybill_ext,"id",new QFilter[] {nckd_yfjkFilter});
                         //循环数组获取结算状态,已结算金额,未结算金额
                         for (int d=0;d<yfjkDynamicObjects.length;d++) {
+                            BigDecimal nckd_amountfield5 = BigDecimal.ZERO;
+                            BigDecimal nckd_amountfield6 = BigDecimal.ZERO;
                             //预付借款单头数据包
-                            DynamicObject yfjkInfo = BusinessDataServiceHelper.loadSingle(yfjkDynamicObjects[i].getPkValue(), yfjkDynamicObjects[i].getDynamicObjectType().getName());
+                            DynamicObject yfjkInfo = BusinessDataServiceHelper.loadSingle(yfjkDynamicObjects[d].getPkValue(), yfjkDynamicObjects[d].getDynamicObjectType().getName());
                             //循环预付借款单预付借款信息分录
                             for (DynamicObject entryentity : yfjkInfo.getDynamicObjectCollection("expenseentryentity")) {
                                 //获取分录实付金额
@@ -102,7 +104,11 @@ public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
                                 //反写分录已结算金额,未结算金额
                                 entryentity.set("nckd_amountfield4",nckd_amountfield4);
                                 entryentity.set("nckd_amountfield3",nckd_amountfield3);
+                                nckd_amountfield5 = nckd_amountfield5.add(nckd_amountfield4);
+                                nckd_amountfield6 = nckd_amountfield6.add(nckd_amountfield3);
                             }
+                            yfjkInfo.set("nckd_amountfield5", nckd_amountfield5);
+                            yfjkInfo.set("nckd_amountfield6", nckd_amountfield6);
                             yfjkInfo.set("billstatus", "G");
                             SaveServiceHelper.save(new DynamicObject[]{yfjkInfo});
                         }
@@ -113,7 +119,7 @@ public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
                 //循环数组获取结算状态,已结算金额,未结算金额
                 for (int c=0;c<bxDynamicObjects.length;c++) {
                     //报销单头数据包
-                    DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[i].getPkValue(), bxDynamicObjects[i].getDynamicObjectType().getName());
+                    DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[c].getPkValue(), bxDynamicObjects[c].getDynamicObjectType().getName());
                     String nckd_sourcebillid = bxInfo.getString("nckd_sourcebillid");
                     //报账类型等于工程报账回写合同台账单
                     if (!StringUtils.isEmpty(nckd_sourcebillid)) {
@@ -124,7 +130,7 @@ public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
                         DynamicObject[] htDynamicObjects = BusinessDataServiceHelper.load(er_contractbill,"id",new QFilter[] {htFilter});
                         for (int j=0;j<htDynamicObjects.length;j++) {
                             //合同台账单头数据包
-                            DynamicObject htInfo = BusinessDataServiceHelper.loadSingle(htDynamicObjects[i].getPkValue(), htDynamicObjects[i].getDynamicObjectType().getName());
+                            DynamicObject htInfo = BusinessDataServiceHelper.loadSingle(htDynamicObjects[j].getPkValue(), htDynamicObjects[j].getDynamicObjectType().getName());
                             //反写付款明细
                             DynamicObjectCollection entryEntity = htInfo.getDynamicObjectCollection("nckd_payentry");
                             DynamicObject entry1 = entryEntity.addNew();
@@ -139,23 +145,4 @@ public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
             }
         }
     }
-
-    /*
-     * 给结算状态,结算金额,未结算金额赋值
-     * */
-    private void settleMethod(DynamicObject object ,String settlestatus ,String settleamount ,String unsettleamount ,BigDecimal totalSettledamt ,BigDecimal totalUnsettledamt) {
-        if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) == 0) {
-            object.set(settlestatus, SettlementStatusEnum.已结算.getValue());
-            object.set(settleamount, totalSettledamt);
-            object.set(unsettleamount, totalUnsettledamt);
-        } else if (totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0 && totalSettledamt.compareTo(BigDecimal.ZERO) == 0) {
-            object.set(settlestatus, SettlementStatusEnum.未结算.getValue());
-            object.set(settleamount, totalSettledamt);
-            object.set(unsettleamount, totalUnsettledamt);
-        } else if (totalSettledamt.compareTo(BigDecimal.ZERO) > 0 && totalUnsettledamt.compareTo(BigDecimal.ZERO) > 0) {
-            object.set(settlestatus, SettlementStatusEnum.部分结算.getValue());
-            object.set(settleamount, totalSettledamt);
-            object.set(unsettleamount, totalUnsettledamt);
-        }
-    }
 }

+ 78 - 5
src/main/java/fi/er/opplugin/PublicreimburOpPlugin.java

@@ -9,6 +9,7 @@ import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import java.math.BigDecimal;
 import java.util.Arrays;
@@ -66,8 +67,12 @@ public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn {
 
                 //反写预付借款单
                 DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("writeoffmoney");
-                DynamicObject saveInfo = BusinessDataServiceHelper.loadSingle(info.getPkValue(), info.getDynamicObjectType().getName());
-                if (saveInfo != null) {
+                Boolean exist = QueryServiceHelper.exists(info.getDynamicObjectType().getName(),  info.getPkValue());
+                if (!exist) {
+                    // 如果没有保存的信息,直接反写
+                    writeBackFinarbill(writeoffmoneys);
+                }else {
+                    DynamicObject saveInfo = BusinessDataServiceHelper.loadSingle(info.getPkValue(), info.getDynamicObjectType().getName());
                     DynamicObjectCollection saveWriteoffmoneys = saveInfo.getDynamicObjectCollection("writeoffmoney");
                     // 处理在 saveWriteoffmoneys 中但不在 writeoffmoneys 中的元素
                     DynamicObjectCollection toDelete = getDifference(saveWriteoffmoneys, writeoffmoneys);
@@ -79,10 +84,17 @@ public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn {
                     if (toWriteBack.size() != 0) {
                         writeBackFinarbill(toWriteBack);
                     }
-                } else {
-                    // 如果没有保存的信息,直接反写
-                    writeBackFinarbill(writeoffmoneys);
+                    // 获取在 writeoffmoneys 和 saveWriteoffmoneys 中都有的元素并执行反写
+                    DynamicObjectCollection commonItems = getCommonItems(writeoffmoneys, saveWriteoffmoneys);
+                    if (commonItems.size() != 0) {
+                        commonBackFinarbill(commonItems);
+                    }
                 }
+            } else if (StringUtils.equals(e.getOperationKey(),"delete")) {
+                //当前单头数据包
+                DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+                DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("writeoffmoney");
+                deleteBackFinarbill(writeoffmoneys);
             }
         }
     }
@@ -167,6 +179,46 @@ public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn {
         }
     }
 
+    public void commonBackFinarbill(DynamicObjectCollection writeoffmoneys) {
+        //报销单冲预付借款分录
+        for (DynamicObject writeoffmoney : writeoffmoneys) {
+            //预付借款单id
+            String sourcebillid = writeoffmoney.getString("sourcebillid");
+            //预付借款单预付借款信息分录id
+            Long srcofsrcentryid = writeoffmoney.getLong("srcofsrcentryid");
+            //冲销金额
+            BigDecimal nckd_amountfield13 = writeoffmoney.getBigDecimal("nckd_amountfield13");
+            //查询应收挂账单
+            QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid);
+            DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter});
+            for (DynamicObject finarbill : finarbills) {
+                DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName());
+                //应收挂账单明细分录
+                DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry");
+                for (DynamicObject entry : entrys) {
+                    //预付借款单预付借款信息分录id
+                    Long e_srcentryid = entry.getLong("e_srcentryid");
+                    //销账金额
+                    BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt");
+                    //已结算金额
+                    BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt");
+                    //未结算金额
+                    BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt");
+                    //已结算金额(本位币)
+                    BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt");
+                    //未结算金额(本位币)
+                    BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt");
+                    if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) {
+                        entry.set("nckd_e_settledamt", nckd_e_settledamt.add(nckd_amountfield13));
+                        entry.set("e_settledamt", e_settledamt.add(nckd_amountfield13));
+                        entry.set("e_unsettleamt", e_unsettleamt.subtract(nckd_amountfield13));
+                    }
+                }
+                SaveServiceHelper.save(new DynamicObject[]{finarbillInfo});
+            }
+        }
+    }
+
     // 获取在 source 中但不在 target 中的元素集合
     private DynamicObjectCollection getDifference(DynamicObjectCollection source, DynamicObjectCollection target) {
         DynamicObjectCollection difference = new DynamicObjectCollection();
@@ -185,4 +237,25 @@ public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn {
         }
         return difference;
     }
+
+    // 获取在 source 和 target 中都有的元素集合
+    private DynamicObjectCollection getCommonItems(DynamicObjectCollection source, DynamicObjectCollection target) {
+        DynamicObjectCollection commonItems = new DynamicObjectCollection();
+        for (DynamicObject sourceItem : source) {
+            for (DynamicObject targetItem : target) {
+                // 根据某个唯一标识符判断是否存在
+                if (sourceItem.getPkValue().equals(targetItem.getPkValue())) {
+                    BigDecimal sourceAmount = sourceItem.getBigDecimal("accloanamount");
+                    BigDecimal targetAmount = targetItem.getBigDecimal("accloanamount");
+                    BigDecimal nckd_amountfield13 = sourceAmount.subtract(targetAmount);
+                    if (nckd_amountfield13.compareTo(BigDecimal.ZERO) != 0) {
+                        sourceItem.set("nckd_amountfield13", nckd_amountfield13);
+                        commonItems.add(sourceItem);
+                        break; // 找到共同项后跳出内层循环
+                    }
+                }
+            }
+        }
+        return commonItems;
+    }
 }

+ 4 - 0
src/main/java/fi/fa/formPlugin/EcardListPlugin.java

@@ -37,6 +37,10 @@ public class EcardListPlugin extends AbstractListPlugin {
             }else {
                 ListShowParameter showParameter = ShowFormHelper.createShowListForm("fa_assetcategory", false, 2);
                 showParameter.setFormId("bos_templatetreelistf7");
+                ListFilterParameter listFilterParameter = showParameter.getListFilterParameter();
+                QFilter filter = new QFilter("isleaf", QCP.equals, true);
+                listFilterParameter.setFilter(filter);
+                showParameter.setListFilterParameter(listFilterParameter);
                 showParameter.setCloseCallBack(new CloseCallBack(this, itemKey));
                 this.getView().showForm(showParameter);
             }

+ 7 - 2
src/main/java/fi/fa/opplugin/BusProcessBillOpPlugin.java

@@ -10,6 +10,9 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 
+import java.util.Arrays;
+import java.util.List;
+
 //业务处理单
 public class BusProcessBillOpPlugin extends AbstractOperationServicePlugIn {
     @Override
@@ -131,7 +134,8 @@ public class BusProcessBillOpPlugin extends AbstractOperationServicePlugIn {
                 }
             } else if (StringUtils.equals(e.getOperationKey(),"delete")) {
                 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
-                if ("D".equals(info.getString("nckd_detailtype"))) {
+                List<String> list = Arrays.asList("D", "E", "N");
+                if (list.contains(info.getString("nckd_detailtype"))) {
                     String type = info.getString("nckd_source_type");
                     Long nckd_mid_assert = info.getLong("nckd_mid_assert");
                     if (!StringUtils.isEmpty(type)) {
@@ -141,7 +145,8 @@ public class BusProcessBillOpPlugin extends AbstractOperationServicePlugIn {
                         for (int j = 0; j < midObjects.length; j++) {
                             DynamicObject midInfo = BusinessDataServiceHelper.loadSingle(midObjects[j].getPkValue(), midObjects[j].getDynamicObjectType().getName());
                             //回写e管家实物清单字段
-                            midInfo.set("nckd_flag", "0");//是否报废
+                            midInfo.set("nckd_flag", "0");
+                            midInfo.set("nckd_ywcl", 0);
                             SaveServiceHelper.save(new DynamicObject[]{midInfo});
                         }
                     }

+ 71 - 45
src/main/java/fi/fa/opplugin/utils/ChangeDataUtils.java

@@ -135,6 +135,7 @@ public class ChangeDataUtils {
         String dispatchType = info.getString("nckd_dispatch_type");//调拨类型
         String nckd_card_real_code = info.getString("nckd_card_number");
         String nckd_storeplace = info.getString("nckd_storeplace");
+        String user = info.getString("nckd_used_user");
         String[] asset = nckd_card_real_code.split(",");
         if (nckd_card_real_code.isEmpty()) {
             return "单据" + billno + "未绑定资产信息,生成调拨单失败";
@@ -151,60 +152,75 @@ public class ChangeDataUtils {
 
         //组织相同则处理
         if (isSame) {
+            //经费系统实物卡片编码
+            List<String> cardNumberList = new ArrayList<>();
+            //经费系统实物卡片关联的e管家实物卡片编码
+            List<String> eCardNumberList = new ArrayList<>();
+            //numberList 中有而 eCardNumberList 中没有的元素
+            List<String> missingInECard = new ArrayList<>();
             String e_orgId = Arrays.stream(asset).map(item -> item.split(":")[1]).collect(Collectors.toList()).get(0);
             //查询e管家实物卡片清单
             QFilter filter = new QFilter("number", QCP.in,numberList);
-            DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
-            if (dynamicObjects.length == 0 || dynamicObjects.length != numberList.size()) {
+            DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id,nckd_card_real_code",new QFilter[] {filter});
+            //查询e管家实物卡片关联的经费系统实物卡片
+            for (DynamicObject eCard : dynamicObjects) {
+                String cardNumber = eCard.getString("nckd_card_real_code");
+                cardNumberList.add(cardNumber);
+            }
+            //再查经费系统实物卡片关联的e管家实物卡片
+            QFilter filter1 = new QFilter("nckd_card_real_code", QCP.in,cardNumberList);
+            DynamicObject[] edynamicObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter1});
+            //获取e管家实物卡片编码
+            for (DynamicObject eCard : edynamicObjects) {
+                String number = eCard.getString("number");
+                eCardNumberList.add(number);
+            }
+            //对比中间表关联的e管家实物卡片和查询到的e管家实物卡片
+            if (eCardNumberList.size() > numberList.size()) {
                 return "单据"+billno+"绑定的资产有未同步至星瀚的数据,生成调拨单失败";
+            } else if (eCardNumberList.size() == numberList.size()) {
+                boolean areEqual = areListsEqual(numberList, eCardNumberList);
+                if (!areEqual) {
+                    return "单据"+billno+"绑定的资产与经费系统实物卡片绑定的资产不一致,生成调拨单失败";
+                }
             }else {
-                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(dynamicObjects[0].getPkValue(), dynamicObjects[0].getDynamicObjectType().getName());
-                //获取星瀚资产编码,查询关联的e管家实物卡片清单数量
-                String code  = cardInfo.getString("nckd_card_real_code");
-                if (StringUtils.isEmpty(code)) {
-                    //星瀚未生成实物卡片,更新实物卡片清单数据-查询组织对照表
-                    Long orgId = getOrg(e_orgId);
-                    if (ObjectUtils.isNotEmpty(orgId) && ("0".equals(dispatchType))) {
-                        //更新归属机构,归属部门,使用人
-                        for (int a = 0; a < dynamicObjects.length ; a++) {
-                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
-                            Long deptId = getOrg(info.getString("nckd_dept_in"));
-                            ecardInfoList.set("nckd_orgfield", getRelation(deptId));
-                            ecardInfoList.set("nckd_dept", deptId);
-                            ecardInfoList.set("nckd_local", nckd_storeplace);
-                            ecardInfoList.set("nckd_use_name", info.getString("user"));
-                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
-                        }
-                    }else if (ObjectUtils.isNotEmpty(orgId) && "1".equals(dispatchType)) {
-                        //更新是否报废为是
-                        for (int a = 0; a < dynamicObjects.length ; a++) {
-                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
-                            ecardInfoList.set("nckd_dept", getOrg(info.getString("nckd_dept_in")));
-                            ecardInfoList.set("nckd_local", nckd_storeplace);
-                            ecardInfoList.set("nckd_use_name", info.getString("user"));
-                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
-                        }
+                // 检查 eCardNumberList 是否有 numberList 没有的元素
+                for (String eCard : eCardNumberList) {
+                    if (!numberList.contains(eCard)) {
+                        return "单据"+billno+"绑定的资产与经费系统实物卡片绑定的资产不一致,生成调拨单失败";
                     }
-                    else if (ObjectUtils.isNotEmpty(orgId) && "2".equals(dispatchType)) {
-                        //更新是否报废为是
-                        for (int a = 0; a < dynamicObjects.length ; a++) {
-                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
-                            ecardInfoList.set("nckd_discard",1);
-                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
-                        }
-                    } else {
-                        return "资产信息的组织在组织对照表中未查询到数据,生成调拨单失败";
+                }
+
+                for (String number : numberList) {
+                    if (!eCardNumberList.contains(number)) {
+                        missingInECard.add(number);
                     }
-                    return "星瀚系统未生成实物卡片,已更新e管家实物卡片清单";
+                }
+            }
+            //查询未匹配到的e管家实物卡片做更新
+            QFilter filter2 = new QFilter("number", QCP.in,missingInECard);
+            DynamicObject[] missingObject = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter2});
+            Long deptId = getOrg(info.getString("nckd_dept_in"));
+            Long orgId = getRelation(deptId);
+            for (DynamicObject object : missingObject) {
+                DynamicObject eCardInfo = BusinessDataServiceHelper.loadSingle(object.getPkValue(), object.getDynamicObjectType().getName());
+                if ("0".equals(dispatchType)) {
+                    //调出单更新组织部门人员存放地点
+                    eCardInfo.set("nckd_orgfield", orgId);
+                    eCardInfo.set("nckd_dept", deptId);
+                    eCardInfo.set("nckd_local", nckd_storeplace);
+                    eCardInfo.set("nckd_use_name", user);
+
+                } else if ("1".equals(dispatchType)) {
+                    //变更单更新部门人员存放地点
+                    eCardInfo.set("nckd_dept", deptId);
+                    eCardInfo.set("nckd_local", nckd_storeplace);
+                    eCardInfo.set("nckd_use_name", user);
                 }else {
-                    //查询e管家实物卡片清单
-                    QFilter qfilter = new QFilter("nckd_card_real_code", QCP.equals,code);
-                    DynamicObject[] cardObject = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {qfilter});
-                    //e管家推送的清单和星瀚系统保存的清单数量不一致,返回错误信息并且不能生成调拨单
-                    if (cardObject.length > 0 && asset.length != cardObject.length) {
-                        return "单据"+billno+"绑定的资产信息与星瀚实物卡片数量不一致,生成调拨单失败";
-                    }
+                    //更新是否报废为是
+                    eCardInfo.set("nckd_discard", 1);
                 }
+                SaveServiceHelper.save(new DynamicObject[]{eCardInfo});
             }
         }else {
             //资产信息组织不同
@@ -227,4 +243,14 @@ public class ChangeDataUtils {
         }
         return codeList;
     }
+
+    public static boolean areListsEqual(List<String> list1, List<String> list2) {
+        for (int i = 0; i < list1.size(); i++) {
+            if (!list1.get(i).equals(list2.get(i))) {
+                return false; // 发现元素不相同
+            }
+        }
+        return true; // 所有元素相同
+    }
+
 }