Parcourir la source

商旅对账单:
1.计算补助金额

lisheng il y a 3 semaines
Parent
commit
6fa464ef32

+ 18 - 3
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/common/constant/travelcheck/BusTravelCheckBillConstant.java

@@ -23,7 +23,8 @@ public interface BusTravelCheckBillConstant extends BillConstant {
 
     String NCKD_NCKD_SOURCEBILLID = "nckd_sourcebillid"; // 底稿确认单
 
-    List<String> BZ_EDITFIELD = Arrays.asList(NCKD_BZ_ENTRY.NCKD_BZ_SUPDAYS,NCKD_BZ_ENTRY.NCKD_BZ_SUMDAYS,NCKD_BZ_ENTRY.NCKD_BZ_ADJAMOUNT,NCKD_BZ_ENTRY.NCKD_BZ_CHECKAMT,NCKD_BZ_ENTRY.NCKD_BZ_DESCRIBE);
+    List<String> BZ_EDITFIELD = Arrays.asList(NCKD_BZ_ENTRY.NCKD_BZ_SUPDAYS,NCKD_BZ_ENTRY.NCKD_BZ_SUMDAYS,NCKD_BZ_ENTRY.NCKD_BZ_ADJAMOUNT,NCKD_BZ_ENTRY.NCKD_BZ_CHECKAMT,
+            NCKD_BZ_ENTRY.NCKD_BZ_DESCRIBE,NCKD_BZ_ENTRY.NCKD_BZ_PAYERBANK,NCKD_BZ_ENTRY.NCKD_BZ_ACCOUNT);
     List<String> SL_EDITFIELD = Arrays.asList(NCKD_SL_ENTRY.NCKD_SL_DESCRIBE);
     List<String> YC_EDITFIELD = Arrays.asList(NCKD_YC_ENTRY.NCKD_YC_DESCRIBE);
 
@@ -84,16 +85,28 @@ public interface BusTravelCheckBillConstant extends BillConstant {
          * 事由
          */
         String NCKD_DESCRIPTION = "nckd_description";
-
         /**
          * 未涵盖日期范围
          */
+        String NCKD_BZDATERANGE = "nckd_bzdaterange";
+        /**
+         * 未涵盖日期范围 - 开始时间
+         */
+        String NCKD_BZDATERANGE_RSTARTDATE = "nckd_rstartdate";
+        /**
+         * 未涵盖日期范围 - 结束时间
+         */
+        String NCKD_BZDATERANGE_RENDDATE = "nckd_renddate";
+
+        /**
+         * 出差天数
+         */
         String NCKD_SUPDAYS = "nckd_supdays";
 
         /**
          * 财务建议出差天数
          */
-        String NCKD_CHECKSUPDAY = "nckd_checksupday";
+        String NCKD_CHECKSUPDAYS = "nckd_checksupdays";
 
         /**
          * 补助金额
@@ -118,6 +131,8 @@ public interface BusTravelCheckBillConstant extends BillConstant {
         String NCKD_BZ_SUPDAYS = "nckd_bz_supdays"; // 补助未涵盖天数
         String NCKD_BZ_ADJAMOUNT = "nckd_bz_adjamount"; // 补助调整金额
         String NCKD_BZ_FINANDRAFT = "nckd_bz_finandraft"; // 财务对账底稿
+        String NCKD_BZ_PAYERBANK = "nckd_bz_payerbank"; // 银行账号
+        String NCKD_BZ_ACCOUNT = "nckd_bz_account"; // 开户行
     }
 
 

+ 59 - 15
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/travelcheck/BusTravelCheckBillEdit.java

@@ -1,21 +1,14 @@
 package nckd.jimin.jyyy.fi.plugin.form.travelcheck;
 
-import com.grapecity.documents.excel.Q;
 import kd.bos.bill.AbstractBillPlugIn;
 import kd.bos.context.RequestContext;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
-import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.MainEntityType;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
-import kd.bos.form.ShowType;
-import kd.bos.form.control.EntryGrid;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
-import kd.bos.form.events.HyperLinkClickEvent;
-import kd.bos.form.events.HyperLinkClickListener;
 import kd.bos.form.operate.FormOperate;
-import kd.bos.list.ListShowParameter;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
@@ -25,8 +18,11 @@ import nckd.jimin.jyyy.fi.common.constant.BillConstant;
 import nckd.jimin.jyyy.fi.common.constant.travelcheck.BusTravelCheckBillConstant;
 import nckd.jimin.jyyy.fi.common.constant.travelcheck.FinanceBillConfirmConstant;
 import nckd.jimin.jyyy.fi.common.constant.travelcheck.TripReqBillConstant;
-import nckd.jimin.jyyy.fi.common.constant.travelcheck.TravelFinanDraftConstant;
+import nckd.jimin.jyyy.fi.common.util.CommonUtils;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.EventObject;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +30,7 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 public class BusTravelCheckBillEdit extends AbstractBillPlugIn implements BusTravelCheckBillConstant {
+    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 
     @Override
     public void beforeBindData(EventObject e) {
@@ -143,13 +140,57 @@ public class BusTravelCheckBillEdit extends AbstractBillPlugIn implements BusTra
         int rowIndex = e.getChangeSet()[0].getRowIndex();
         Object oldValue = e.getChangeSet()[0].getOldValue();
         Object newValue = e.getChangeSet()[0].getNewValue();
+        DynamicObject entryRow = getModel().getEntryRowEntity(NCKD_BZ_SUPDATA.ENTITYID, rowIndex);
         // 出差申请单号
-        if(BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL.equals(name)){
+        if(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL.equals(name)){
             tripReqBillChanged(oldValue, newValue, rowIndex);
         }
-        if(BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_SUPDAYS.equals( name) || BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_SUAPMT.equals(name)){
+        if(NCKD_BZ_SUPDATA.NCKD_SUPDAYS.equals( name) || BusTravelCheckBillConstant.NCKD_BZ_SUPDATA.NCKD_SUAPMT.equals(name)){
             updateBzEntryFromUnCoveredData(rowIndex);
         }
+        //监听单据内设置字段的值改变,用于计算新的日期范围控件的最早可选日期
+
+//        if (NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE.equals(name)){
+//            Date startDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE);
+//            Date tripStartDate = new Date(entryRow.getDynamicObject(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL).getDate(TripReqBillConstant.RSTARTDATE).getTime());
+//            if(startDate != null && tripStartDate != null && startDate.before(tripStartDate)){
+//                getView().showTipNotification("未涵盖日期范围不能早于行程开始时间。");
+//                entryRow.set(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE,oldValue);
+//                getView().updateView(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE,rowIndex);
+//                return;
+//            }
+//        }
+//        if(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE.equals(name)){
+//            Date endDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE);
+//            Date tripEndDate = new Date(entryRow.getDynamicObject(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL).getDate(TripReqBillConstant.RENDDATE).getTime());
+//            if(endDate != null && tripEndDate != null && endDate.after(tripEndDate)){
+//                getView().showTipNotification("未涵盖日期范围不能晚于行程结束时间。");
+//                entryRow.set(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE,oldValue);
+//                getView().updateView(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE,rowIndex);
+//                return;
+//            }
+//        }
+        if (NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE.equals(name) ||
+                NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE.equals(name)){
+            Date startDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RSTARTDATE);
+            Date endDate = entryRow.getDate(NCKD_BZ_SUPDATA.NCKD_BZDATERANGE_RENDDATE);
+
+            if (startDate != null && endDate != null){
+                DynamicObject applierCpmpany = entryRow.getDynamicObject(NCKD_BZ_SUPDATA.NCKD_TRIPREQBILL).getDynamicObject(TripReqBillConstant.COMPANY);
+                int days = CommonUtils.getDaysByWorkCalandar(startDate, endDate, applierCpmpany);
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_SUPDAYS, days, rowIndex);
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS, days, rowIndex);
+            }else{
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_SUPDAYS, 0, rowIndex);
+                getModel().setValue(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS, 0, rowIndex);
+            }
+        }
+
+        if(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS.equals(name)){
+            Integer checkSupDay = (Integer) getModel().getValue(NCKD_BZ_SUPDATA.NCKD_CHECKSUPDAYS);
+            BigDecimal bzAmount = CommonUtils.getBzAmount();
+            getModel().setValue(NCKD_BZ_SUPDATA.NCKD_SUAPMT, bzAmount.multiply(new BigDecimal(checkSupDay)), rowIndex);
+        }
     }
     protected void tripReqBillChanged(Object oldValue , Object newValue, int rowIndex){
         if(oldValue != null){
@@ -177,11 +218,14 @@ public class BusTravelCheckBillEdit extends AbstractBillPlugIn implements BusTra
     protected int getApplierBzEntryRow(Long applierId){
         int entryRowCount = this.getModel().getEntryRowCount(NCKD_BZ_ENTRY.ENTITYID);
         for(int i = 0 ; i < entryRowCount ; i++){
-            DynamicObject traverInfo = (DynamicObject) getModel().getValue(NCKD_BZ_ENTRY.NCKD_BZ_TRAVELER, i);
-            // 通过出差人查询对应的补助分录
-            if(traverInfo != null
-                    && traverInfo.getLong(ID) == applierId){
-                return i;
+            DynamicObject bzInfo = (DynamicObject) getModel().getValue(NCKD_BZ_ENTRY.NCKD_BZ_INFO, i);
+            if(bzInfo != null){
+                DynamicObject traverInfo = bzInfo.getDynamicObject(NCKD_BZ_ENTRY.NCKD_BZ_TRAVELER);
+                // 通过出差人查询对应的补助分录
+                if(traverInfo != null
+                        && traverInfo.getLong(ID) == applierId){
+                    return i;
+                }
             }
         }
         return -1;

+ 74 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/DepSecretaryOp.java

@@ -0,0 +1,74 @@
+package nckd.jimin.jyyy.fi.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import nckd.jimin.jyyy.fi.common.constant.travelcheck.DepSecretaryConstant;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class DepSecretaryOp extends AbstractOperationServicePlugIn {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        e.getFieldKeys().add(DepSecretaryConstant.NCKD_SECRETARY);
+        e.getFieldKeys().add(DepSecretaryConstant.ENTITYID_ENTRY);
+        e.getFieldKeys().add(DepSecretaryConstant.NCKD_ORG);
+        e.getFieldKeys().add(DepSecretaryConstant.NCKD_REMARK);
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new AbstractValidator() {
+            @Override
+            public void validate() {
+                ExtendedDataEntity[] dataEntitys = this.getDataEntities();
+                for (ExtendedDataEntity dataEntity : dataEntitys) {
+                    // 校验存在重复的部门名称
+                    DynamicObject billInfo = dataEntity.getDataEntity();
+                    DynamicObjectCollection entryCol = billInfo.getDynamicObjectCollection(DepSecretaryConstant.ENTITYID_ENTRY);
+                    // 查询重复的部门
+                    Map<String,List<String>> repeatDept = new HashMap<>();
+                    for(DynamicObject entry : entryCol){
+                        DynamicObject dept = entry.getDynamicObject(DepSecretaryConstant.NCKD_ORG);
+                        if(dept != null){
+                            String deptName = dept.getString("fullname");
+                            String seqStr = String.format("第%s行",dept.getInt("seq") + 1);
+                            if(repeatDept.containsKey(deptName)){
+                                List<String> seqList = repeatDept.get(deptName);
+                                seqList.add(seqStr);
+                            }else{
+                                List<String> seqList = new ArrayList<>();
+                                seqList.add(seqStr);
+                                repeatDept.put(deptName,seqList);
+                            }
+                        }
+                    }
+
+                    StringBuffer showMsg = new StringBuffer();
+                    for(Map.Entry<String,List<String>> entry : repeatDept.entrySet()){
+                        if(entry.getValue().size() > 1){
+                            showMsg.append("部门名称重复:")
+                                    .append(entry.getKey())
+                                    .append("(").append(entry.getValue().stream().collect(Collectors.joining(","))).append(")").append("\r\n");
+                        }
+                    }
+                    if(showMsg.length() > 0){
+                        this.addErrorMessage(dataEntity,showMsg.toString());
+                        return;
+                    }
+                }
+            }
+        });
+    }
+}