本文是金蝶EAS项目报表开发的一个案例,可供有兴趣者参考。
1.设计UI
1.1筛选界面UI
BOS设计工具新建目录如下
新建Web用户界面,继承父类com.kingdee.eas.framework.report.client.CommRptBaseConditionUI
右键添加需要的控件如下所示
1.2报表UI
同样的新建Web用户界面,继承com.kingdee.eas.framework.report.client.CommRptBaseUI
添加表格,并编辑表信息
表列
表头
1.3 Facade设计
在report --> app文件夹下新建查询
将查询的父对象设置为com.kingdee.eas.framework.report.app.CommRptBase
全部设计完毕之后将选中整个文件夹右键发布,以后若对任意UI修改,都要进行发布
2.设计查询
此报表要用到SQL中的行转列,也就是会用到case when语句
2.1会用到的表格
- T_CAS_PaymentBill 付款单
- T_CAS_PaymentBillEntry 付款单分录
- T_BD_GeneralAsstActType 自定义核算项目 fid
- T_CAS_AssItemsForCashPay 付款单自定义核算项目中间表 ffromid
- T_CAS_ReceivingBill 收款单
- T_CAS_ReceivingBillEntry 收款单分录
- T_CAS_FeeType 收付类别
- CT_CAS_RecDetail 收付明细
- T_BD_SettlementType 结算方式
- T_ORG_Company 公司
2.2表格之间的关联关系
关于付款单的表格关系图如下
关于收款单表关系图如下
2.2 得出SQL语句
-- 付款单SQL语句
SELECT
company.fname_l2 as company,
general.fnumber as contractNumber,
general.fname_l2 as contractName,
SUM(case when recdetail.FNUMBER in('SF-032','SF-031') then entry.FActualLocAmt else 0 end) as projIncome, --工程收入
SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashBack,
SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER not in('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashBack,
SUM(case when recdetail.FNUMBER in('SF-033') then entry.FActualLocAmt else 0 end) as saleIncome,
SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sCashBack,
SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sNCashBack,
SUM(case when recdetail.FNUMBER in('SF-034') then entry.FActualLocAmt else 0 end) as disIncome,
SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashBack,
SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashBack,
SUM(case when recdetail.FNUMBER in('SF-035', 'SF-036') then entry.FActualLocAmt else 0 end) as billCashIncome,
SUM(case when recdetail.FNUMBER in('SF-037', 'SF-038') then entry.FActualLocAmt else 0 end) as deposit,
SUM(case when recdetail.FNUMBER in('SF-039') then entry.FActualLocAmt else 0 end) as fiSubIncome,
SUM(case when recdetail.FNUMBER in('SF-040','SF-048') then entry.FActualLocAmt else 0 end) as otherIncome, --其他收款 待收款
SUM(case when recdetail.FNUMBER in('SF-041') then entry.FActualLocAmt else 0 end) as absorbInvest,
SUM(case when recdetail.FNUMBER in('SF-042') then entry.FActualLocAmt else 0 end) as lNewLoan,
SUM(case when recdetail.FNUMBER in('SF-043') then entry.FActualLocAmt else 0 end) as interIncome, --利息收入
SUM(case when recdetail.FNUMBER in('SF-044', 'SF-045') then entry.FActualLocAmt else 0 end) as groupConta, --集团往来收入 groupConta
SUM(case when recdetail.FNUMBER in('SF-046') then entry.FActualLocAmt else 0 end) as investDivid,--investDivid
SUM(case when recdetail.FNUMBER in('SF-047') then entry.FActualLocAmt else 0 end) as assetsCZ, --assetsCZ
SUM(case when recdetail.FNUMBER in('SF-001','SF-002') then entry.FActualLocAmt else 0 end) as projExpend,--projExpend
SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashPay,--pCashPay
SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashExpend, -- pNCashExpend
SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') then entry.FActualLocAmt else 0 end) as disPay,-- disPay
SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashPay,-- dCashPay
SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashExpend,-- dNCashExpend
SUM(case when recdetail.FNUMBER in('SF-007','SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fiBillExpend,-- fiBillExpend
SUM(case when recdetail.FNUMBER in('SF-007') then entry.FActualLocAmt else 0 end) as fAcceptAmout,-- fAcceptAmout
SUM(case when recdetail.FNUMBER in('SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fInvoicingExpend, -- fInvoicingExpend
SUM(case when recdetail.FNUMBER in('SF-003','SF-010') then entry.FActualLocAmt else 0 end) as dPeriodCost, -- dPeriodCost 取收付明细中“费用报销”+“支付银行手续费”
SUM(case when recdetail.FNUMBER in('SF-049','SF-050','SF-011') then entry.FActualLocAmt else 0 end) as dReverseExpend, -- dReverseExpend 取收付明细中“备用金/个人借款”-“收备用金”
SUM(case when recdetail.FNUMBER in('SF-012') then entry.FActualLocAmt else 0 end) as sWage, -- sWage
SUM(case when recdetail.FNUMBER in('SF-013') then entry.FActualLocAmt else 0 end) as sFive, -- sFive
SUM(case when recdetail.FNUMBER in('SF-014') then entry.FActualLocAmt else 0 end) as sOther, -- sOther
SUM(case when recdetail.FNUMBER in('SF-015') then entry.FActualLocAmt else 0 end) as taxExpend, -- taxExpend
SUM(case when recdetail.FNUMBER in('SF-016') then entry.FActualLocAmt else 0 end) as fineExpend, -- fineExpend
SUM(case when recdetail.FNUMBER in('SF-017') then entry.FActualLocAmt else 0 end) as depositExpend, -- depositExpend
SUM(case when recdetail.FNUMBER in('SF-018') then entry.FActualLocAmt else 0 end) as donateExpend, -- donateExpend
SUM(case when recdetail.FNUMBER in('SF-028','SF-029','SF-030') then entry.FActualLocAmt else 0 end) as otherExpend, -- otherExpend
SUM(case when recdetail.FNUMBER in('SF-019') then entry.FActualLocAmt else 0 end) as repayLoan, -- repayLoan 偿还贷款支出
SUM(case when recdetail.FNUMBER in('SF-020') then entry.FActualLocAmt else 0 end) as pfLoanInter, -- pfLoanInter
SUM(case when recdetail.FNUMBER in('SF-021') then entry.FActualLocAmt else 0 end) as pfFinanceFee, -- pfFinanceFee
SUM(case when recdetail.FNUMBER in('SF-022') then entry.FActualLocAmt else 0 end) as dividedPayout, -- dividedPayout
SUM(case when recdetail.FNUMBER in('SF-023', 'SF-024','SF-025') then entry.FActualLocAmt else 0 end) as groupContacts, -- groupContacts
SUM(case when recdetail.FNUMBER in('SF-026') then entry.FActualLocAmt else 0 end) as outInvest, -- outInvest
SUM(case when recdetail.FNUMBER in('SF-027') then entry.FActualLocAmt else 0 end) as buyAssets -- buyAssets
FROM T_CAS_PaymentBill as payment
left join T_CAS_PaymentBillEntry as entry
on payment.fid = entry.FPaymentBillID
INNER JOIN T_ORG_Company AS company
ON payment.FCompanyID = COMPANY.FID
left join T_BD_SettlementType as settle
on payment.fsettlementtypeID = settle.FID
left join T_CAS_AssItemsForCashPay payAssItem
on payAssItem.fentryparentid = entry.fid
left join T_BD_GeneralAsstActType as general -- 自定义核算项目
on payAssItem.ffromid = general.fid
left join T_CAS_FeeType feetype
on payment.ffeetypeid = feetype.fid
left join CT_CAS_RecDetail recdetail
on feetype.FID = recdetail.CFFEETYPEID
WHERE 1=1
group by company.fname_l2, general.fnumber, general.fname_l2
-- 收款单SQL语句
SELECT company.fname_l2 as company, general.fnumber as contractNumber, general.fname_l2 as contractName,
SUM(case when recdetail.FNUMBER in('SF-032','SF-031') then entry.FActualLocAmt else 0 end) as projIncome,
SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashBack,
SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER not in('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashBack,
SUM(case when recdetail.FNUMBER in('SF-033') then entry.FActualLocAmt else 0 end) as saleIncome,
SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sCashBack,
SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sNCashBack,
SUM(case when recdetail.FNUMBER in('SF-034') then entry.FActualLocAmt else 0 end) as disIncome,
SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashBack,
SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashBack,
SUM(case when recdetail.FNUMBER in('SF-035', 'SF-036') then entry.FActualLocAmt else 0 end) as billCashIncome,
SUM(case when recdetail.FNUMBER in('SF-037', 'SF-038') then entry.FActualLocAmt else 0 end) as deposit,
SUM(case when recdetail.FNUMBER in('SF-039') then entry.FActualLocAmt else 0 end) as fiSubIncome,
SUM(case when recdetail.FNUMBER in('SF-040','SF-048') then entry.FActualLocAmt else 0 end) as otherIncome,
SUM(case when recdetail.FNUMBER in('SF-041') then entry.FActualLocAmt else 0 end) as absorbInvest,
SUM(case when recdetail.FNUMBER in('SF-042') then entry.FActualLocAmt else 0 end) as lNewLoan,
SUM(case when recdetail.FNUMBER in('SF-043') then entry.FActualLocAmt else 0 end) as interIncome,
SUM(case when recdetail.FNUMBER in('SF-044', 'SF-045') then entry.FActualLocAmt else 0 end) as groupConta,
SUM(case when recdetail.FNUMBER in('SF-046') then entry.FActualLocAmt else 0 end) as investDivid,
SUM(case when recdetail.FNUMBER in('SF-047') then entry.FActualLocAmt else 0 end) as assetsCZ,
SUM(case when recdetail.FNUMBER in('SF-001','SF-002') then entry.FActualLocAmt else 0 end) as projExpend,
SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashPay,
SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashExpend,
SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') then entry.FActualLocAmt else 0 end) as disPay,
SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashPay,
SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashExpend,
SUM(case when recdetail.FNUMBER in('SF-007','SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fiBillExpend,
SUM(case when recdetail.FNUMBER in('SF-007') then entry.FActualLocAmt else 0 end) as fAcceptAmout,
SUM(case when recdetail.FNUMBER in('SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fInvoicingExpend,
SUM(case when recdetail.FNUMBER in('SF-003','SF-010') then entry.FActualLocAmt else 0 end) as dPeriodCost,
SUM(case when recdetail.FNUMBER in('SF-049','SF-050','SF-011') then entry.FActualLocAmt else 0 end) as dReverseExpend,
SUM(case when recdetail.FNUMBER in('SF-012') then entry.FActualLocAmt else 0 end) as sWage,
SUM(case when recdetail.FNUMBER in('SF-013') then entry.FActualLocAmt else 0 end) as sFive,
SUM(case when recdetail.FNUMBER in('SF-014') then entry.FActualLocAmt else 0 end) as sOther,
SUM(case when recdetail.FNUMBER in('SF-015') then entry.FActualLocAmt else 0 end) as taxExpend,
SUM(case when recdetail.FNUMBER in('SF-016') then entry.FActualLocAmt else 0 end) as fineExpend,
SUM(case when recdetail.FNUMBER in('SF-017') then entry.FActualLocAmt else 0 end) as depositExpend,
SUM(case when recdetail.FNUMBER in('SF-018') then entry.FActualLocAmt else 0 end) as donateExpend,
SUM(case when recdetail.FNUMBER in('SF-028','SF-029','SF-030') then entry.FActualLocAmt else 0 end) as otherExpend,
SUM(case when recdetail.FNUMBER in('SF-019') then entry.FActualLocAmt else 0 end) as repayLoan,
SUM(case when recdetail.FNUMBER in('SF-020') then entry.FActualLocAmt else 0 end) as pfLoanInter,
SUM(case when recdetail.FNUMBER in('SF-021') then entry.FActualLocAmt else 0 end) as pfFinanceFee,
SUM(case when recdetail.FNUMBER in('SF-022') then entry.FActualLocAmt else 0 end) as dividedPayout,
SUM(case when recdetail.FNUMBER in('SF-023', 'SF-024','SF-025') then entry.FActualLocAmt else 0 end) as groupContacts,
SUM(case when recdetail.FNUMBER in('SF-026') then entry.FActualLocAmt else 0 end) as outInvest,
SUM(case when recdetail.FNUMBER in('SF-027') then entry.FActualLocAmt else 0 end) as buyAssets
FROM T_CAS_ReceivingBill as payment
left join T_CAS_ReceivingBillEntry as entry
on payment.fid = entry.FReceivingBillID
INNER JOIN T_ORG_Company AS company
ON payment.FCompanyID = COMPANY.FID
left join T_BD_SettlementType as settle
on payment.fsettlementtypeID = settle.FID
left join T_CAS_AssItemsForCashRec payAssItem
on payAssItem.fentryparentid = entry.fid
left join T_BD_GeneralAsstActType as general
on payAssItem.ffromid = general.fid
left join T_CAS_FeeType feetype
on payment.ffeetypeid = feetype.fid
left join CT_CAS_RecDetail recdetail
on feetype.FID = recdetail.CFFEETYPEID
WHERE 1 = 1
group by company.fname_l2, general.fnumber, general.fname_l2
Java视图窗口在如下目录的ControllerBean.java文件中重写query方法添加一下代码进行查询
if (null == params) {
throw new EASBizException(new NumericExceptionSubItem("0003","请先设置过滤条件.."));
}
String prmtcompany=null;
if (null!=params.getObject("prmtcompany")) {
CompanyOrgUnitInfo object = (CompanyOrgUnitInfo)params.getObject("prmtcompany");
prmtcompany=object.toString();
}
String prmtperiod=null;
if (null!=params.getObject("prmtperiod")) {
prmtperiod = params.getObject("prmtperiod").toString();
}
String customproject=null;
if (null!=params.getObject("customproject")) {
customproject = params.getObject("customproject").toString();
}
StringBuffer sql = new StringBuffer();
SqlParams sp = new SqlParams();
sql.append("SELECT company.fname_l2 as company, general.fnumber as contractNumber, general.fname_l2 as contractName,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-032','SF-031') then entry.FActualLocAmt else 0 end) as projIncome, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashBack,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER not in('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashBack,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-033') then entry.FActualLocAmt else 0 end) as saleIncome,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sCashBack,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sNCashBack,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-034') then entry.FActualLocAmt else 0 end) as disIncome,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashBack,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashBack,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-035', 'SF-036') then entry.FActualLocAmt else 0 end) as billCashIncome,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-037', 'SF-038') then entry.FActualLocAmt else 0 end) as deposit,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-039') then entry.FActualLocAmt else 0 end) as fiSubIncome,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-040','SF-048') then entry.FActualLocAmt else 0 end) as otherIncome, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-041') then entry.FActualLocAmt else 0 end) as absorbInvest, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-042') then entry.FActualLocAmt else 0 end) as lNewLoan, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-043') then entry.FActualLocAmt else 0 end) as interIncome,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-044', 'SF-045') then entry.FActualLocAmt else 0 end) as groupConta, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-046') then entry.FActualLocAmt else 0 end) as investDivid,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-047') then entry.FActualLocAmt else 0 end) as assetsCZ, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-001','SF-002') then entry.FActualLocAmt else 0 end) as projExpend,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashPay,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') then entry.FActualLocAmt else 0 end) as disPay,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashPay,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashExpend,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-007','SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fiBillExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-007') then entry.FActualLocAmt else 0 end) as fAcceptAmout,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fInvoicingExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-003','SF-010') then entry.FActualLocAmt else 0 end) as dPeriodCost, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-049','SF-050','SF-011') then entry.FActualLocAmt else 0 end) as dReverseExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-012') then entry.FActualLocAmt else 0 end) as sWage, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-013') then entry.FActualLocAmt else 0 end) as sFive, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-014') then entry.FActualLocAmt else 0 end) as sOther, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-015') then entry.FActualLocAmt else 0 end) as taxExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-016') then entry.FActualLocAmt else 0 end) as fineExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-017') then entry.FActualLocAmt else 0 end) as depositExpend,\n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-018') then entry.FActualLocAmt else 0 end) as donateExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-028','SF-029','SF-030') then entry.FActualLocAmt else 0 end) as otherExpend, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-019') then entry.FActualLocAmt else 0 end) as repayLoan, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-020') then entry.FActualLocAmt else 0 end) as pfLoanInter, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-021') then entry.FActualLocAmt else 0 end) as pfFinanceFee, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-022') then entry.FActualLocAmt else 0 end) as dividedPayout, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-023', 'SF-024','SF-025') then entry.FActualLocAmt else 0 end) as groupContacts, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-026') then entry.FActualLocAmt else 0 end) as outInvest, \n\r");
sql.append("SUM(case when recdetail.FNUMBER in('SF-027') then entry.FActualLocAmt else 0 end) as buyAssets \n\r");
sql.append("FROM T_CAS_PaymentBill as payment \n\r");
sql.append("left join T_CAS_PaymentBillEntry as entry \n\r");
sql.append("on payment.fid = entry.FPaymentBillID \n\r");
sql.append("INNER JOIN T_ORG_Company AS company\n\r");
sql.append("ON payment.FCompanyID = COMPANY.FID\n\r");
sql.append("left join T_BD_SettlementType as settle \n\r");
sql.append("on payment.fsettlementtypeID = settle.FID \n\r");
sql.append("left join T_CAS_AssItemsForCashPay payAssItem\n\r");
sql.append("on payAssItem.fentryparentid = entry.fid\n\r");
sql.append("left join T_BD_GeneralAsstActType as general \n\r");
sql.append("on payAssItem.ffromid = general.fid \n\r");
sql.append("left join T_CAS_FeeType feetype \n\r");
sql.append("on payment.ffeetypeid = feetype.fid \n\r");
sql.append("left join CT_CAS_RecDetail recdetail \n\r");
sql.append("on feetype.FID = recdetail.CFFEETYPEID \n\r");
sql.append("WHERE 1 = 1 \n\r");
if (null != prmtcompany) {
sql.append("and company.fname_l2=? \r\n");
sp.addString(prmtcompany);
}
if (null != prmtperiod) {
String syear = prmtperiod.substring(0,4);
int year = Integer.valueOf(syear).intValue();
String smonth = prmtperiod.substring(5, prmtperiod.indexOf("期"));
int month = Integer.valueOf(smonth).intValue();
// 最后一天
Calendar calLast = Calendar.getInstance();
calLast.set(Calendar.YEAR, year);
calLast.set(Calendar.MONTH, month);
int lastDay = calLast.getMinimum(Calendar.DATE);
calLast.set(Calendar.DAY_OF_MONTH, lastDay - 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String lastDate = sdf.format(calLast.getTime());
// 第一天
Calendar calFirst = Calendar.getInstance();
calFirst.set(Calendar.DAY_OF_MONTH, calFirst.getActualMinimum(Calendar.DAY_OF_MONTH));
String firstDate = sdf.format(calFirst.getTime());
sql.append("and payment.fpaydate between to_date(?) and to_date(?) \r\n");
sp.addString(firstDate);
sp.addString(lastDate);
}
if (null != customproject) {
sql.append("and general.fname_l2=? \r\n");
sp.addString(customproject);
}
sql.append("group by company.fname_l2, general.fnumber, general.fname_l2 \r\n");
System.out.println(sql);
IRowSet rs = DbUtil.executeQuery(ctx, sql.toString(), sp.getParams());
if(rs.size()>0) {
params.setObject("rows", rs);
}
// 收款单
StringBuffer sqlRec = new StringBuffer();
SqlParams spRec = new SqlParams();
sqlRec.append("SELECT company.fname_l2 as company, general.fnumber as contractNumber, general.fname_l2 as contractName,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-032','SF-031') then entry.FActualLocAmt else 0 end) as projIncome, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashBack,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-032','SF-031') and settle.FNUMBER not in('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashBack,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-033') then entry.FActualLocAmt else 0 end) as saleIncome,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sCashBack,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-033') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as sNCashBack,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-034') then entry.FActualLocAmt else 0 end) as disIncome,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashBack,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-034') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashBack,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-035', 'SF-036') then entry.FActualLocAmt else 0 end) as billCashIncome,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-037', 'SF-038') then entry.FActualLocAmt else 0 end) as deposit,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-039') then entry.FActualLocAmt else 0 end) as fiSubIncome,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-040','SF-048') then entry.FActualLocAmt else 0 end) as otherIncome, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-041') then entry.FActualLocAmt else 0 end) as absorbInvest, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-042') then entry.FActualLocAmt else 0 end) as lNewLoan, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-043') then entry.FActualLocAmt else 0 end) as interIncome,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-044', 'SF-045') then entry.FActualLocAmt else 0 end) as groupConta, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-046') then entry.FActualLocAmt else 0 end) as investDivid,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-047') then entry.FActualLocAmt else 0 end) as assetsCZ, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-001','SF-002') then entry.FActualLocAmt else 0 end) as projExpend,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pCashPay,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-001','SF-002') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as pNCashExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') then entry.FActualLocAmt else 0 end) as disPay,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dCashPay,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-004','SF-005','SF-006') and settle.FNUMBER not in ('01','02','03','06','07','08','31') then entry.FActualLocAmt else 0 end) as dNCashExpend,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-007','SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fiBillExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-007') then entry.FActualLocAmt else 0 end) as fAcceptAmout,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-008','SF-009') then entry.FActualLocAmt else 0 end) as fInvoicingExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-003','SF-010') then entry.FActualLocAmt else 0 end) as dPeriodCost, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-049','SF-050','SF-011') then entry.FActualLocAmt else 0 end) as dReverseExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-012') then entry.FActualLocAmt else 0 end) as sWage, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-013') then entry.FActualLocAmt else 0 end) as sFive, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-014') then entry.FActualLocAmt else 0 end) as sOther, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-015') then entry.FActualLocAmt else 0 end) as taxExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-016') then entry.FActualLocAmt else 0 end) as fineExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-017') then entry.FActualLocAmt else 0 end) as depositExpend,\r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-018') then entry.FActualLocAmt else 0 end) as donateExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-028','SF-029','SF-030') then entry.FActualLocAmt else 0 end) as otherExpend, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-019') then entry.FActualLocAmt else 0 end) as repayLoan, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-020') then entry.FActualLocAmt else 0 end) as pfLoanInter, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-021') then entry.FActualLocAmt else 0 end) as pfFinanceFee, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-022') then entry.FActualLocAmt else 0 end) as dividedPayout, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-023', 'SF-024','SF-025') then entry.FActualLocAmt else 0 end) as groupContacts, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-026') then entry.FActualLocAmt else 0 end) as outInvest, \r\n");
sqlRec.append("SUM(case when recdetail.FNUMBER in('SF-027') then entry.FActualLocAmt else 0 end) as buyAssets \r\n");
sqlRec.append("FROM T_CAS_ReceivingBill as payment \n\r");
sqlRec.append("left join T_CAS_ReceivingBillEntry as entry \n\r");
sqlRec.append("on payment.fid = entry.FReceivingBillID \n\r");
sqlRec.append("INNER JOIN T_ORG_Company AS company\n\r");
sqlRec.append("ON payment.FCompanyID = COMPANY.FID\n\r");
sqlRec.append("left join T_BD_SettlementType as settle \n\r");
sqlRec.append("on payment.fsettlementtypeID = settle.FID \n\r");
sqlRec.append("left join T_CAS_AssItemsForCashRec payAssItem\n\r");
sqlRec.append("on payAssItem.fentryparentid = entry.fid\n\r");
sqlRec.append("left join T_BD_GeneralAsstActType as general \n\r");
sqlRec.append("on payAssItem.ffromid = general.fid \n\r");
sqlRec.append("left join T_CAS_FeeType feetype \n\r");
sqlRec.append("on payment.ffeetypeid = feetype.fid \n\r");
sqlRec.append("left join CT_CAS_RecDetail recdetail \n\r");
sqlRec.append("on feetype.FID = recdetail.CFFEETYPEID \n\r");
sqlRec.append("WHERE 1 = 1 \n\r");
if (null != prmtcompany) {
sqlRec.append("and company.fname_l2=? \r\n");
spRec.addString(prmtcompany);
}
if (null != prmtperiod) {
String syear = prmtperiod.substring(0,4);
int year = Integer.valueOf(syear).intValue();
String smonth = prmtperiod.substring(5, prmtperiod.indexOf("期"));
int month = Integer.valueOf(smonth).intValue();
// 最后一天
Calendar calLast = Calendar.getInstance();
calLast.set(Calendar.YEAR, year);
calLast.set(Calendar.MONTH, month);
int lastDay = calLast.getMinimum(Calendar.DATE);
calLast.set(Calendar.DAY_OF_MONTH, lastDay - 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String lastDate = sdf.format(calLast.getTime());
// 第一天
Calendar calFirst = Calendar.getInstance();
calFirst.set(Calendar.DAY_OF_MONTH, calFirst.getActualMinimum(Calendar.DAY_OF_MONTH));
String firstDate = sdf.format(calFirst.getTime());
sqlRec.append("and payment.frecdate between to_date(?) and to_date(?) \r\n");
spRec.addString(firstDate);
spRec.addString(lastDate);
}
if (null != customproject) {
sqlRec.append("and general.fname_l2=? \r\n");
spRec.addString(customproject);
}
sqlRec.append("group by company.fname_l2, general.fnumber, general.fname_l2 \r\n");
System.out.println(sqlRec);
IRowSet rsRec = DbUtil.executeQuery(ctx, sqlRec.toString(), spRec.getParams());
if(rsRec.size()>0) {
params.setObject("rowsRec", rsRec);
}
return params;
这样就拿到了结果集
2.3 处理结果集并填充表格
Java视图窗口在ReportUI.java中重写query方法,参考代码如下:
@Override
protected void query() {
// 查询条件设置到界面
initParamToUI(params);
kDTable1.checkParsed();
kDTable1.setEditable(false);
try {
//设置光标处于等待状态
setCursorOfWair();
//查询数据,在Facade查询方法里返回值是RptParams,需要把查询集保存到RptParams里,再通过界面取出即可
RptParams rps = getRemoteInstance().query(params);
if(rps!=null){
IRowSet conReport = ((IRowSet)rps.getObject("rows")) ;
IRowSet conReportRec = ((IRowSet)rps.getObject("rowsRec")) ;
if(conReport!=null){
fillTable(conReport);
kDTable1.getSelectManager().setSelectMode(KDTSelectManager.ROW_SELECT);
}
if(conReportRec!=null){
fillTable(conReportRec);
kDTable1.getSelectManager().setSelectMode(KDTSelectManager.ROW_SELECT);
}
}
} catch (Exception e) {
e.printStackTrace();
this.handUIException(e);
} finally {
this.setCursorOfDefault();
}
}
填充表格方法可参考:
private int fillTable(IRowSet rs) throws SQLException {
// TODO Auto-generated method stub
DecimalFormat df = new DecimalFormat("0.00");
// kDTable1.removeRows();
while (rs.next()) {
IRow row = kDTable1.addRow();
row.getCell("company").setValue(rs.getString("company"));
row.getCell("contractNumber").setValue(rs.getString("contractNumber"));
row.getCell("contractName").setValue(rs.getString("contractName"));
row.getCell("manageInflow").setValue(rs.getDouble("projIncome") + rs.getDouble("saleIncome")
+ rs.getDouble("disIncome") + rs.getDouble("billCashIncome") + rs.getDouble("deposit")
+ rs.getDouble("fiSubIncome") + rs.getDouble("otherIncome"));
row.getCell("projIncome").setValue(rs.getDouble("projIncome"));
row.getCell("pCashBack").setValue(rs.getDouble("pCashBack"));
row.getCell("pNCashBack").setValue(rs.getDouble("pNCashBack"));
row.getCell("saleIncome").setValue(rs.getDouble("saleIncome"));
row.getCell("sCashBack").setValue(rs.getDouble("sCashBack"));
row.getCell("disIncome").setValue(rs.getDouble("disIncome"));
row.getCell("dCashBack").setValue(rs.getDouble("dCashBack"));
row.getCell("dNCashBack").setValue(rs.getDouble("dCashBack"));
row.getCell("billCashIncome").setValue(rs.getDouble("billCashIncome"));
row.getCell("deposit").setValue(rs.getDouble("deposit"));
row.getCell("fiSubIncome").setValue(rs.getDouble("fiSubIncome"));
row.getCell("otherIncome").setValue(rs.getDouble("otherIncome"));
row.getCell("raiseInflow").setValue(rs.getDouble("absorbInvest") + rs.getDouble("interIncome") + rs.getDouble("groupConta"));
row.getCell("absorbInvest").setValue(rs.getDouble("absorbInvest"));
row.getCell("loanIncome").setValue(rs.getDouble("lNewLoan")); //
row.getCell("lNewLoan").setValue(rs.getDouble("lNewLoan"));
row.getCell("lContiLoan").setValue(null); //续贷款无编码
row.getCell("interIncome").setValue(rs.getDouble("interIncome"));
row.getCell("groupConta").setValue(rs.getDouble("groupConta"));
row.getCell("investInflow").setValue(rs.getDouble("investDivid") + rs.getDouble("assetsCZ"));
row.getCell("investDivid").setValue(rs.getDouble("investDivid"));
row.getCell("assetsCZ").setValue(rs.getDouble("assetsCZ"));
row.getCell("inflowSub").setValue(rs.getDouble("projIncome") + rs.getDouble("saleIncome")
+ rs.getDouble("disIncome") + rs.getDouble("billCashIncome") + rs.getDouble("deposit")
+ rs.getDouble("fiSubIncome") + rs.getDouble("otherIncome") + rs.getDouble("absorbInvest")
+ rs.getDouble("interIncome") + rs.getDouble("groupConta") + rs.getDouble("investDivid")
+ rs.getDouble("assetsCZ"));
row.getCell("manageOutflow").setValue(rs.getDouble("pCashPay") + rs.getDouble("dCashPay") + rs.getDouble("fiBillExpend")
+ rs.getDouble("dPeriodCost") + rs.getDouble("dReverseExpend") + rs.getDouble("sWage")
+ rs.getDouble("sFive") + rs.getDouble("sOther") + rs.getDouble("taxExpend") + rs.getDouble("fineExpend")
+ rs.getDouble("depositExpend") + rs.getDouble("donateExpend") + rs.getDouble("otherExpend"));
row.getCell("projExpend").setValue(rs.getDouble("projExpend"));
row.getCell("pCashPay").setValue(rs.getDouble("pCashPay"));
row.getCell("pNCashExpend").setValue(rs.getDouble("pNCashExpend"));
row.getCell("disPay").setValue(rs.getDouble("disPay"));
row.getCell("dCashPay").setValue(rs.getDouble("dCashPay"));
row.getCell("dNCashExpend").setValue(rs.getDouble("dNCashExpend"));
row.getCell("fiBillExpend").setValue(rs.getDouble("fiBillExpend"));
row.getCell("fAcceptAmout").setValue(rs.getDouble("fAcceptAmout"));
row.getCell("fInvoicingExpend").setValue(rs.getDouble("fInvoicingExpend"));
row.getCell("dailyExpend").setValue(rs.getDouble("dPeriodCost") + rs.getDouble("dReverseExpend"));
row.getCell("dPeriodCost").setValue(rs.getDouble("dPeriodCost"));
row.getCell("dReverseExpend").setValue(rs.getDouble("dReverseExpend"));
row.getCell("staffSalary").setValue(rs.getDouble("sWage") + rs.getDouble("sFive") + rs.getDouble("sOther"));
row.getCell("sWage").setValue(rs.getDouble("sWage"));
row.getCell("sFive").setValue(rs.getDouble("sFive"));
row.getCell("sOther").setValue(rs.getDouble("sOther"));
row.getCell("taxExpend").setValue(rs.getDouble("taxExpend"));
row.getCell("fineExpend").setValue(rs.getDouble("fineExpend"));
row.getCell("depositExpend").setValue(rs.getDouble("depositExpend"));
row.getCell("donateExpend").setValue(rs.getDouble("donateExpend"));
row.getCell("otherExpend").setValue(rs.getDouble("otherExpend"));
row.getCell("fundOutflow").setValue(rs.getDouble("repayLoan") + rs.getDouble("pfLoanInter") + rs.getDouble("pfFinanceFee")
+ rs.getDouble("dividedPayout") + rs.getDouble("groupContacts"));
row.getCell("repayLoan").setValue(rs.getDouble("repayLoan"));
row.getCell("payFinance").setValue(rs.getDouble("pfLoanInter") + rs.getDouble("pfFinanceFee"));
row.getCell("pfLoanInter").setValue(rs.getDouble("pfLoanInter"));
row.getCell("pfFinanceFee").setValue(rs.getDouble("pfFinanceFee"));
row.getCell("dividedPayout").setValue(rs.getDouble("dividedPayout"));
row.getCell("groupContacts").setValue(rs.getDouble("groupContacts"));
row.getCell("investOutflow").setValue(rs.getDouble("outInvest") + rs.getDouble("buyAssets"));
row.getCell("outInvest").setValue(rs.getDouble("outInvest"));
row.getCell("buyAssets").setValue(rs.getDouble("buyAssets"));
row.getCell("outflowSub").setValue(rs.getDouble("pCashPay") + rs.getDouble("dCashPay") + rs.getDouble("fiBillExpend")
+ rs.getDouble("dPeriodCost") + rs.getDouble("dReverseExpend") + rs.getDouble("sWage")
+ rs.getDouble("sFive") + rs.getDouble("sOther") + rs.getDouble("taxExpend") + rs.getDouble("fineExpend")
+ rs.getDouble("depositExpend") + rs.getDouble("donateExpend") + rs.getDouble("otherExpend") + rs.getDouble("repayLoan")
+ rs.getDouble("pfLoanInter") + rs.getDouble("pfFinanceFee") + rs.getDouble("dividedPayout") + rs.getDouble("groupContacts")
+ rs.getDouble("outInvest") + rs.getDouble("buyAssets"));
}
return kDTable1.getRowCount();
}
2.4 FilterUI
筛选界面的Java文件只需要重写getCustomCondition,setCustomCondition,和verify方法即可
代码参考如下
@Override
public RptParams getCustomCondition() {
// TODO Auto-generated method stub
RptParams param = new RptParams();
// 放置本界面的参数
RptConditionManager rcm = new RptConditionManager();
// 财务组织
if (null != this.prmtcompany.getValue()) {
rcm.setProperty("prmtcompany", this.prmtcompany.getValue());
} else {
rcm.setProperty("prmtcompany", null);
}
// 期间
if (null != this.prmtperiod.getValue()) {
rcm.setProperty("prmtperiod", this.prmtperiod.getValue());
} else {
rcm.setProperty("prmtperiod", null);
}
// 自定义核算项目
if (null != this.customproject.getValue()) {
rcm.setProperty("customproject", this.customproject.getValue());
} else {
rcm.setProperty("customproject", null);
}
Map map = rcm.toMap();
param.putAll(map);
return param;
}
@Override
public void setCustomCondition(RptParams params) {
// TODO Auto-generated method stub
if (null != params.getObject("prmtcompany")) {
prmtcompany.setValue(params.getObject("prmtcompany"));
} else {
prmtcompany.setValue(null);
}
if (null != params.getObject("prmtperiod")) {
prmtperiod.setValue(params.getObject("prmtperiod"));
} else {
prmtperiod.setValue(null);
}
if (null != params.getObject("customproject")) {
customproject.setValue(params.getObject("customproject"));
} else {
customproject.setValue(null);
}
}
@Override
public boolean verify() {
// TODO Auto-generated method stub
if(this.prmtcompany.getValue() == null) {
MsgBox.showError("请选择公司");
SysUtil.abort();
}
if(this.prmtperiod.getValue() == null) {
MsgBox.showError("请选择期间");
SysUtil.abort();
}
return super.verify();
}
2.5 客户化菜单
用administrator账号登录,选择系统–>客户化菜单编辑
这里的UI对象选择上述的ReportUI的完整文件路径,保存重启即可
3效果
指定路径下找到菜单并双击打开