职务消费台账单据穿透功能

This commit is contained in:
zhangzhiguo 2025-09-08 09:40:25 +08:00
parent 995be21b22
commit 27543528fd
3 changed files with 103 additions and 27 deletions

View File

@ -22,11 +22,13 @@ class ExpenseReport {
private BigDecimal correspondence = BigDecimal.ZERO;//通信费用 private BigDecimal correspondence = BigDecimal.ZERO;//通信费用
private BigDecimal training = BigDecimal.ZERO;//培训费用 private BigDecimal training = BigDecimal.ZERO;//培训费用
private BigDecimal total = BigDecimal.ZERO;//合计 private BigDecimal total = BigDecimal.ZERO;//合计
private String billType;
public ExpenseReport(Long reimburser, String billNumber, String happenDateStr) { public ExpenseReport(Long reimburser, String billNumber, String happenDateStr,String billType) {
this.reimburser = reimburser; this.reimburser = reimburser;
this.billNumber = billNumber; this.billNumber = billNumber;
this.happenDateStr = happenDateStr; this.happenDateStr = happenDateStr;
this.billType = billType;
} }
public Long getReimburser() { public Long getReimburser() {
@ -157,6 +159,14 @@ class ExpenseReport {
this.total = total; this.total = total;
} }
public String getBillType() {
return billType;
}
public void setBillType(String billType) {
this.billType = billType;
}
public Object[] toRow() { public Object[] toRow() {
return new Object[]{ return new Object[]{
this.reimburser, this.reimburser,
@ -174,7 +184,8 @@ class ExpenseReport {
this.health, this.health,
this.correspondence, this.correspondence,
this.training, this.training,
this.total this.total,
this.billType
}; };
} }
} }

View File

@ -1,18 +1,29 @@
package zcgj.zcdev.zcdev.fs.plugin.report; package zcgj.zcdev.zcdev.fs.plugin.report;
import kd.bos.bill.BillShowParameter;
import kd.bos.context.RequestContext; import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.datamodel.IDataModel; import kd.bos.entity.datamodel.IDataModel;
import kd.bos.entity.datamodel.events.PackageDataEvent; import kd.bos.entity.datamodel.events.PackageDataEvent;
import kd.bos.entity.report.FilterInfo; import kd.bos.entity.report.FilterInfo;
import kd.bos.entity.report.ReportColumn;
import kd.bos.entity.report.ReportQueryParam; import kd.bos.entity.report.ReportQueryParam;
import kd.bos.form.FormShowParameter;
import kd.bos.form.ShowType;
import kd.bos.form.StyleCss;
import kd.bos.form.events.HyperLinkClickEvent;
import kd.bos.form.events.HyperLinkClickListener;
import kd.bos.orm.query.QFilter;
import kd.bos.report.ReportList;
import kd.bos.report.events.CellStyleRule; import kd.bos.report.events.CellStyleRule;
import kd.bos.report.events.SortAndFilterEvent; import kd.bos.report.events.SortAndFilterEvent;
import kd.bos.report.plugin.AbstractReportFormPlugin; import kd.bos.report.plugin.AbstractReportFormPlugin;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
import zcgj.zcdev.zcdev.fs.utils.OrgCheckUtils; import zcgj.zcdev.zcdev.fs.utils.OrgCheckUtils;
import java.util.Date; import java.util.Date;
import java.util.EventObject;
import java.util.List; import java.util.List;
/** /**
@ -21,8 +32,8 @@ import java.util.List;
*/ */
public class PositionFeesRptListPlugin extends AbstractReportFormPlugin implements Plugin { public class PositionFeesRptListPlugin extends AbstractReportFormPlugin implements Plugin {
private static final String MERGECOLUM= "shxr_username";//合并单元格字段 private static final String MERGECOLUM= "zcgj_username";//合并单元格字段
private static final String CONDITION_FIELD="shxr_username";//条件字段 private static final String CONDITION_FIELD="zcgj_username";//条件字段
private static final String DEV_KEY="zcgj"; private static final String DEV_KEY="zcgj";
private static final String[] FIELDS = { private static final String[] FIELDS = {
@ -36,7 +47,8 @@ public class PositionFeesRptListPlugin extends AbstractReportFormPlugin implemen
}; };
@Override @Override
public void setMergeColums(List<String> columns) { public void setMergeColums(List<String> columns) {
columns.add(MERGECOLUM); columns.add(DEV_KEY+"_bill_number");
columns.add(DEV_KEY+"_username");
super.setMergeColums(columns); super.setMergeColums(columns);
} }
@ -68,6 +80,27 @@ public class PositionFeesRptListPlugin extends AbstractReportFormPlugin implemen
@Override @Override
public void packageData(PackageDataEvent packageDataEvent) { public void packageData(PackageDataEvent packageDataEvent) {
ReportColumn c = (ReportColumn)packageDataEvent.getSource();
if(((DEV_KEY+"_username").equals(c.getFieldKey()) || (DEV_KEY+"_bill_number").equals(c.getFieldKey()))){
if(packageDataEvent.getFormatValue()!=null && "人员合计".equals(packageDataEvent.getFormatValue().toString())){
packageDataEvent.getNoMergeKey().add(c.getFieldKey());
}
}
/*ReportColumn c = (ReportColumn) packageDataEvent.getSource();
String fieldKey = c.getFieldKey();
if (fieldKey.equals(DEV_KEY+"_bill_number")) {
if(packageDataEvent.getFormatValue()!=null){
String s = packageDataEvent.getFormatValue().toString();
String condition_prevalue = this.getPageCache().get("rpt_billno");
if (condition_prevalue == null || condition_prevalue.isEmpty()) {
;
} else if (!condition_prevalue.equals(s)) {
packageDataEvent.getNoMergeKey().add(DEV_KEY+"_bill_number");
}
this.getPageCache().put("rpt_billno", s);
}
}*/
super.packageData(packageDataEvent); super.packageData(packageDataEvent);
} }
@ -94,18 +127,36 @@ public class PositionFeesRptListPlugin extends AbstractReportFormPlugin implemen
super.setCellStyleRules(cellStyleRules); super.setCellStyleRules(cellStyleRules);
} }
/**
* 设置过滤排序列
*
* @param allColumns 报表列
*/
/*@Override
public void setSortAndFilter(List<SortAndFilterEvent> allColumns) {
super.setSortAndFilter(allColumns);
for (SortAndFilterEvent ent : allColumns) {
ent.setFilter(true);
ent.setSort(true);
}
}*/
@Override
public void registerListener(EventObject e) {
//监听报表超链接点击事件
super.registerListener(e);
ReportList reportList = getControl("reportlistap");
reportList.addHyperClickListener(new HyperLinkClickListener() {
@Override
public void hyperLinkClick(HyperLinkClickEvent hyperLinkClickEvent) {
String fieldName = hyperLinkClickEvent.getFieldName();
int rowIndex = hyperLinkClickEvent.getRowIndex();
if(rowIndex > 0){
ReportList reportList = getView().getControl("reportlistap");
DynamicObject rowData = reportList.getReportModel().getRowData(rowIndex);
//row.getString()
if(rowData!=null && rowData.get("zcgj_bill_number") != null){
String billNo = (String)rowData.get("zcgj_bill_number");
String billType = (String)rowData.get("zcgj_billtype");
QFilter filter = new QFilter("billno", "=", billNo);
DynamicObject billData = BusinessDataServiceHelper.loadSingle(billType, "id", new QFilter[]{filter});
BillShowParameter billShowParameter= new BillShowParameter();;
billShowParameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
billShowParameter.setFormId(billType);
billShowParameter.setPkId(billData.get("id"));
getView().showForm(billShowParameter);
}
}
}
});
}
} }

View File

@ -79,7 +79,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
DEV_KEY+"_serve_souvenir",DEV_KEY+"_serve_total", DEV_KEY+"_serve_souvenir",DEV_KEY+"_serve_total",
DEV_KEY+"_travel",DEV_KEY+"_abroad_travel", DEV_KEY+"_travel",DEV_KEY+"_abroad_travel",
DEV_KEY+"_health",DEV_KEY+"_correspondence",DEV_KEY+"_training", DEV_KEY+"_health",DEV_KEY+"_correspondence",DEV_KEY+"_training",
DEV_KEY+"_total" DEV_KEY+"_total",DEV_KEY+"_billtype"
}; };
DataType[] DATATYPES = { DataType[] DATATYPES = {
DataType.LongType,DataType.StringType, DataType.StringType,DataType.StringType, DataType.LongType,DataType.StringType, DataType.StringType,DataType.StringType,
@ -88,7 +88,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
DataType.BigDecimalType,DataType.BigDecimalType, DataType.BigDecimalType,DataType.BigDecimalType,
DataType.BigDecimalType,DataType.BigDecimalType, DataType.BigDecimalType,DataType.BigDecimalType,
DataType.BigDecimalType,DataType.BigDecimalType,DataType.BigDecimalType, DataType.BigDecimalType,DataType.BigDecimalType,DataType.BigDecimalType,
DataType.BigDecimalType DataType.BigDecimalType,DataType.StringType
}; };
Set<String> itemSet = new HashSet<>(); Set<String> itemSet = new HashSet<>();
itemSet.add(FYF); itemSet.add(FYF);
@ -134,7 +134,6 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
for (Long userId : allUsersOfOrg) { for (Long userId : allUsersOfOrg) {
//费用报销单数据-费用归属领导数据 //费用报销单数据-费用归属领导数据
DynamicObject[] dailyreimbursebillDataSet = getDailyreimbursebillDataSet(userId, year); DynamicObject[] dailyreimbursebillDataSet = getDailyreimbursebillDataSet(userId, year);
for (DynamicObject dynamicObject : dailyreimbursebillDataSet) { for (DynamicObject dynamicObject : dailyreimbursebillDataSet) {
String billno = dynamicObject.getString("billno");//单据编号 String billno = dynamicObject.getString("billno");//单据编号
//判罚是否因公出国 //判罚是否因公出国
@ -170,7 +169,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
// 根据键获取报表对象 // 根据键获取报表对象
ExpenseReport report = reportMap.get(key); ExpenseReport report = reportMap.get(key);
if (report == null) { if (report == null) {
report = new ExpenseReport(userId, billno, happendateStr); report = new ExpenseReport(userId, billno, happendateStr,"er_dailyreimbursebill");//费用报销单
reportMap.put(key, report); reportMap.put(key, report);
} }
if(!isBusinessForeign){ if(!isBusinessForeign){
@ -255,7 +254,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
// 根据键获取报表对象 // 根据键获取报表对象
ExpenseReport report = reportMap.get(key); ExpenseReport report = reportMap.get(key);
if (report == null) { if (report == null) {
report = new ExpenseReport(userId, billno, happendateStr); report = new ExpenseReport(userId, billno, happendateStr,"er_publicreimbursebill");//对公报销
reportMap.put(key, report); reportMap.put(key, report);
} }
// 为该行添加费用 // 为该行添加费用
@ -299,6 +298,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
} }
} }
} }
//费用报销单申请人查询 //费用报销单申请人查询
if(positionfeesstaffingList != null && positionfeesstaffingList.contains(userId)){ if(positionfeesstaffingList != null && positionfeesstaffingList.contains(userId)){
DynamicObject[] dailyreimbursebillDataSetByApplier = getDailyreimbursebillDataSetByApplier(userId, year); DynamicObject[] dailyreimbursebillDataSetByApplier = getDailyreimbursebillDataSetByApplier(userId, year);
@ -337,7 +337,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
// 根据键获取报表对象 // 根据键获取报表对象
ExpenseReport report = reportMap.get(key); ExpenseReport report = reportMap.get(key);
if (report == null) { if (report == null) {
report = new ExpenseReport(userId, billno, happendateStr); report = new ExpenseReport(userId, billno, happendateStr,"er_dailyreimbursebill");//费用报销单
reportMap.put(key, report); reportMap.put(key, report);
} }
if(!isBusinessForeign){ if(!isBusinessForeign){
@ -413,7 +413,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
// 根据键获取报表对象 // 根据键获取报表对象
ExpenseReport report = reportMap.get(key); ExpenseReport report = reportMap.get(key);
if (report == null) { if (report == null) {
report = new ExpenseReport(userId, billno, happendateStr); report = new ExpenseReport(userId, billno, happendateStr,"er_tripreimbursebill");
reportMap.put(key, report); reportMap.put(key, report);
} }
if(!isBusinessForeign){ if(!isBusinessForeign){
@ -431,7 +431,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
} }
} }
//合计汇总 //合计汇总
ExpenseReport totalReport = new ExpenseReport(null, null, null); ExpenseReport totalReport = new ExpenseReport(null, null, null,null);
Set<String> strings = reportMap.keySet(); Set<String> strings = reportMap.keySet();
@ -456,7 +456,8 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
for (Long userId : userIdDataMap.keySet()) { for (Long userId : userIdDataMap.keySet()) {
Map<String, ExpenseReport> stringExpenseReportMap = userIdDataMap.get(userId); Map<String, ExpenseReport> stringExpenseReportMap = userIdDataMap.get(userId);
ArrayList<ExpenseReport> reportsList = new ArrayList<>(stringExpenseReportMap.values()); ArrayList<ExpenseReport> reportsList = new ArrayList<>(stringExpenseReportMap.values());
ExpenseReport userTotalReport = new ExpenseReport(null, null, null); sortByBillNumber(reportsList);//增加排序
ExpenseReport userTotalReport = new ExpenseReport(null, null, null,null);
// 打印每一行报表 // 打印每一行报表
for (ExpenseReport report : reportsList) { for (ExpenseReport report : reportsList) {
@ -524,6 +525,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
totalReport.setTotal(totalReport.getTotal().add(total)); totalReport.setTotal(totalReport.getTotal().add(total));
userTotalReport.setTotal(userTotalReport.getTotal().add(total)); userTotalReport.setTotal(userTotalReport.getTotal().add(total));
tempData[16] = total; tempData[16] = total;
tempData[17] = report.getBillType();
} }
Object [] tempDataUserTotal = new Object [FIELDS.length]; Object [] tempDataUserTotal = new Object [FIELDS.length];
coll.add(tempDataUserTotal); coll.add(tempDataUserTotal);
@ -541,6 +543,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
tempDataUserTotal[14] = userTotalReport.getCorrespondence(); tempDataUserTotal[14] = userTotalReport.getCorrespondence();
tempDataUserTotal[15] = userTotalReport.getTraining(); tempDataUserTotal[15] = userTotalReport.getTraining();
tempDataUserTotal[16] = userTotalReport.getTotal(); tempDataUserTotal[16] = userTotalReport.getTotal();
tempDataUserTotal[17] = "-";
} }
@ -548,6 +551,8 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
Object [] tempData = new Object [FIELDS.length]; Object [] tempData = new Object [FIELDS.length];
coll.add(tempData); coll.add(tempData);
tempData[1] = "合计"; tempData[1] = "合计";
tempData[2] = "-";
tempData[3] = "-";
tempData[4] = totalReport.getBusinessEntertainment(); tempData[4] = totalReport.getBusinessEntertainment();
tempData[5] = totalReport.getForeignEntertainment(); tempData[5] = totalReport.getForeignEntertainment();
tempData[6] = totalReport.getImportantOfficial(); tempData[6] = totalReport.getImportantOfficial();
@ -561,6 +566,7 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
tempData[14] = totalReport.getCorrespondence(); tempData[14] = totalReport.getCorrespondence();
tempData[15] = totalReport.getTraining(); tempData[15] = totalReport.getTraining();
tempData[16] = totalReport.getTotal(); tempData[16] = totalReport.getTotal();
tempData[17] = "-";
return resultDataSet; return resultDataSet;
@ -735,4 +741,12 @@ public class PositionFeesRptQueryPlugin extends AbstractReportListDataPlugin {
.toLocalDate(); .toLocalDate();
} }
public static void sortByBillNumber(ArrayList<ExpenseReport> list) {
Collections.sort(list, new Comparator<ExpenseReport>() {
@Override
public int compare(ExpenseReport e1, ExpenseReport e2) {
return e1.getBillNumber().compareTo(e2.getBillNumber());
}
});
}
} }