BOS培訓(xùn)課件-應(yīng)用框架_第1頁(yè)
BOS培訓(xùn)課件-應(yīng)用框架_第2頁(yè)
BOS培訓(xùn)課件-應(yīng)用框架_第3頁(yè)
BOS培訓(xùn)課件-應(yīng)用框架_第4頁(yè)
BOS培訓(xùn)課件-應(yīng)用框架_第5頁(yè)
已閱讀5頁(yè),還剩63頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

應(yīng)用框架金蝶軟件(中國(guó))有限公司嚴(yán)冠裕單據(jù)發(fā)布代碼結(jié)構(gòu)及常用功能4BOS應(yīng)用框架詳細(xì)設(shè)計(jì)3BOS應(yīng)用框架總體設(shè)計(jì)2BOS應(yīng)用框架概述1目錄開(kāi)發(fā)常用接口介紹51.1什么是應(yīng)用框架框架(Framework)是整個(gè)或部分系統(tǒng)的可重用設(shè)計(jì),表現(xiàn)為一組抽象組件及組件實(shí)例間交互的方法;它規(guī)定了應(yīng)用的體系結(jié)構(gòu),闡明了整個(gè)設(shè)計(jì)、協(xié)作組件之間的依賴關(guān)系、責(zé)任分配和控制流程,表現(xiàn)為一組抽象類以及其實(shí)例之間協(xié)作的方法。應(yīng)用框架則是指實(shí)現(xiàn)了某應(yīng)用領(lǐng)域與業(yè)務(wù)無(wú)關(guān)的通用基礎(chǔ)功能和底層服務(wù)的可重用組件。1.2應(yīng)用框架的作用抽象通用的組件模型提供標(biāo)準(zhǔn)的基礎(chǔ)服務(wù)統(tǒng)一規(guī)范的編程模型降低大型應(yīng)用軟件系統(tǒng)的開(kāi)發(fā)難度縮短開(kāi)發(fā)周期提高開(kāi)發(fā)效率和質(zhì)量1.3BOS應(yīng)用框架BOS應(yīng)用框架是BOS在長(zhǎng)期的開(kāi)發(fā)實(shí)踐過(guò)程中,不斷積累技術(shù)和經(jīng)驗(yàn),逐漸建立的一套符合企業(yè)信息化大部分應(yīng)用場(chǎng)景的業(yè)務(wù)框架。開(kāi)發(fā)人員無(wú)需關(guān)注太多細(xì)節(jié)就可以直接在應(yīng)用框架的基礎(chǔ)上開(kāi)發(fā)具體的業(yè)務(wù)功能和組件。1.4BOS應(yīng)用框架的作用抽象通用的業(yè)務(wù)邏輯;如新增,修改,刪除等。集成標(biāo)準(zhǔn)的基礎(chǔ)服務(wù);如網(wǎng)絡(luò)互斥,權(quán)限等。規(guī)范統(tǒng)一的編程模型;如單據(jù),基礎(chǔ)資料等。統(tǒng)一編碼規(guī)范和接口;降低開(kāi)發(fā)的復(fù)雜度,提高開(kāi)發(fā)效率,最大限度的實(shí)現(xiàn)系統(tǒng)的設(shè)計(jì)重用和代碼重用。單據(jù)發(fā)布代碼結(jié)構(gòu)及常用功能4BOS應(yīng)用框架詳細(xì)設(shè)計(jì)3BOS應(yīng)用框架總體設(shè)計(jì)2BOS應(yīng)用框架概述1目錄開(kāi)發(fā)常用接口介紹52.1總體架構(gòu)表現(xiàn)層ORM-RPC協(xié)議層業(yè)務(wù)邏輯層持久對(duì)象層數(shù)據(jù)層單據(jù)發(fā)布代碼結(jié)構(gòu)及常用功能4BOS應(yīng)用框架詳細(xì)設(shè)計(jì)3BOS應(yīng)用框架總體設(shè)計(jì)2BOS應(yīng)用框架概述1目錄開(kāi)發(fā)常用接口介紹53.1BOS應(yīng)用框架詳細(xì)設(shè)計(jì)應(yīng)用框架主要接口和類的設(shè)計(jì)客戶端類繼承體系服務(wù)端類繼承體系核心業(yè)務(wù)邏輯的設(shè)計(jì)

UI界面的創(chuàng)建流程業(yè)務(wù)事件的響應(yīng)流程3.2客戶端類繼承體系3.3客戶端類繼承體系CoreUIObjectEAS中所有UI的基類,從KDPanel派生,這樣UI可以方便地嵌入到其它UI中,不包括業(yè)務(wù)邏輯CoreUI

所有UI界面對(duì)象的父類,集中處理服務(wù)ListUI

所有序時(shí)薄UI界面對(duì)象的父類

EditUI

所有編輯UI界面對(duì)象的父類

3.4客戶端類繼承體系CoreBillListUI,CoreBillEditUI

業(yè)務(wù)單據(jù)UI界面對(duì)象的父類

BillListUI,BillEditUI

CoreBillListUI,CoreBillEditUI的子類TreeListUI,TreeDetailListUI

樹(shù)形層次結(jié)構(gòu)序時(shí)薄UI界面對(duì)象的父類3.5服務(wù)端值對(duì)象類繼承體系3.6服務(wù)端值對(duì)象類繼承體系PropertyContainer

抽象定義了一個(gè)屬性容器,EAS值對(duì)象的存儲(chǔ)結(jié)構(gòu)IObjectValue,AbstractBaseObjectValue

EAS所有值對(duì)象的抽象父類CoreBaseInfo

所有具有ID屬性的值對(duì)象的抽象父類

3.7服務(wù)端

O

R

M

對(duì)象類繼承體系3.8服務(wù)端ORM對(duì)象類繼承體系IORMModel,ORMObject

ORM-RPC協(xié)議及服務(wù)的接口和實(shí)現(xiàn)IBOSObject,AbstractBOSObject

獲取BOS運(yùn)行引擎所需的上下文的接口和實(shí)現(xiàn)ICoreBase,CoreBase

所有ORM對(duì)象的抽象父類ICoreBillBase,CoreBillBaseEAS中所有業(yè)務(wù)單據(jù)ORM對(duì)象的抽象父類3.9服務(wù)端EJB對(duì)象類繼承體系3.10服務(wù)端EJB對(duì)象類繼承體系SessionBean

無(wú)狀態(tài)會(huì)話Bean的一系列操作接口AbstractBizControllerBean

EJB操作的基本實(shí)現(xiàn),獲取數(shù)據(jù)庫(kù)連接AbstractEntityControllerBeanORMapping引擎中數(shù)據(jù)訪問(wèn)對(duì)象(DAO)的獲取和調(diào)用

AbstractCoreBaseControllerBeanEAS中具體業(yè)務(wù)值對(duì)象對(duì)應(yīng)EJB的抽象父類3.11UI界面的創(chuàng)建流程3.12業(yè)務(wù)事件的響應(yīng)流程3.13序時(shí)簿虛模式取數(shù)序時(shí)簿取數(shù)方法實(shí)模式虛模式虛模式取數(shù)的優(yōu)點(diǎn)

取數(shù)效率高占用內(nèi)存小設(shè)置tblMain.getDataRequestManager().setDataRequestMode(KDTDataRequestManager.VIRTUAL_MODE_PAGE);KDTDataRequestManager.REAL_MODE3.14序時(shí)簿虛模式取數(shù)的流程虛模式取數(shù)的原理每次只取當(dāng)前顯示頁(yè)預(yù)取前一頁(yè)和后一頁(yè)單據(jù)發(fā)布代碼結(jié)構(gòu)及常用功能4BOS應(yīng)用框架詳細(xì)設(shè)計(jì)3BOS應(yīng)用框架總體設(shè)計(jì)2BOS應(yīng)用框架概述1目錄開(kāi)發(fā)常用接口介紹54.1開(kāi)發(fā)常用接口及功能介紹業(yè)務(wù)單元發(fā)布后生成代碼結(jié)構(gòu)說(shuō)明客戶端服務(wù)端應(yīng)用框架常用功能介紹開(kāi)發(fā)常用接口介紹4.2生成代碼結(jié)構(gòu)主要開(kāi)發(fā)類

XXXListUI.javaXXXEditUI.javaXXXControllerBean.java4.3生成代碼

客戶端生成代碼:

AbstractXXXEditUI.java

AbstractXXXListUI.java

XXXEditUI.java

XXXListUI.java

AbstractXXXEditUI_perties

AbstractXXXEditUI_perties

AbstractXXXEditUI_perties

AbstractXXXEditUI.properties

AbstractXXXListUI_pertiesAbstractTXXXListUI_pertiesAbstractTXXXListUI_pertiesAbstractXXXListUI.properties4.4生成代碼

服務(wù)端生成代碼:

AbstractXXXControllerBean.java

AbstractXXXEntryControllerBean.java

XXXController.java

XXXControllerBean.java

XXXEntryController.java

XXXEntryControllerBean.java

AbstractXXXEditUIHandler.java

AbstractXXXListUIHandler.java

XXXEditUIHandler.java

XXXListUIHandler.java4.5生成代碼

客戶端服務(wù)端公共代碼:

AbstractXXXInfo.java

AbstractXXXEntryInfo.java

IXXX.java

IXXXEntry.java

XXX.java

XXXEntry.java

XXXCollection.java

XXXEntryCollection.java

XXXFactory.java

XXXEntryFactory.java

XXXInfo.java

XXXEntryInfo.java4.6必須覆蓋的框架方法編輯界面類(EditUI):

protectedIObjectValuecreateNewData(){

//returnnewXXXInfo();returnnull;}protectedICoreBasegetBizInterface()throwsException{

//returnXXXFactory.getRemoteInstance();returnnull;}protectedIObjectValuecreateNewDetailData(KDTabletable){

//returnnewXXXEntryInfo();returnnull;}4.7必須覆蓋的框架方法列表界面類(ListUI):

protectedStringgetEditUIName(){

//returnXXXEditUI.class.getName();returnnull;}protectedICoreBasegetBizInterface()throwsException{

//returnXXXFactory.getRemoteInstance();returnnull;}4.8應(yīng)用框架常用功能介紹UI界面的創(chuàng)建UI界面的數(shù)據(jù)綁定對(duì)序時(shí)簿查詢的擴(kuò)展UI界面右鍵表格設(shè)置EAS系統(tǒng)中各種類型ID的轉(zhuǎn)換4.9UI界面的創(chuàng)建UI界面(窗口)的創(chuàng)建代碼UIContextuiContext=newUIContext(this);IUIWindowiWindow=UIFactory.createUIFactory(UIFactoryName.MODEL).create(uiName,uiContext,null,OprtState.VIEW);iWindow.show();4.9UI界面的創(chuàng)建創(chuàng)建一個(gè)UI的panel對(duì)象,并加入到容器中。實(shí)例化一個(gè)UI,此實(shí)例化不能直接newUIContextuiContext=newUIContext(this);IUIObjectuiObject=UIFactoryHelper.initUIObject.(getEditUIName(),uiContext,null,OprtState.VIEW);***UIcurUI=(***UI)uiObject;在實(shí)例化完ui后轉(zhuǎn)型成自己定義的ui,并根據(jù)業(yè)務(wù)需求添加到某個(gè)容器中。4.10UI界面的創(chuàng)建UI打開(kāi)模式包括:

UIFactoryName.FIXTAB:固定頁(yè)簽打開(kāi)方式。

UIFactoryName.NEWTAB:新頁(yè)簽打開(kāi)方式。

UIFactoryName.NEWWIN:新窗口打開(kāi)方式。

UIFactoryName.MODEL:模態(tài)窗口打開(kāi)方式。UI打開(kāi)模式包括:

OprtState.VIEW:查看OprtState.ADDNEW:新增OprtState.EDIT:編輯4.11UI界面的數(shù)據(jù)綁定序時(shí)簿界面的數(shù)據(jù)綁定

KDTable的setFormatXML方法:完成表格列的定義

KDTable的putBindContents方法:設(shè)置綁定關(guān)系

KDTalbe的doRequestRowSet事件:數(shù)據(jù)獲取與顯示編輯界面的數(shù)據(jù)綁定

loadFields和storeFields方法4.12對(duì)序時(shí)簿查詢的擴(kuò)展添加查詢字段(Sql語(yǔ)句中的select子句內(nèi)容)SelectorItemCollectionsic=newSelectorItemCollection();sic.add(newSelectorItemInfo("id"));sic.add(newSelectorItemInfo("name"));this.mainQuery.getSelectors().addObjectCollection(sic);EntityViewInfo對(duì)象mainQuery中添加查詢條件:4.13對(duì)序時(shí)簿查詢的擴(kuò)展添加過(guò)濾條件(Sql語(yǔ)句中的where子句內(nèi)容)FilterInfofilterInfo=newFilterInfo();StringBuffermaskString=newStringBuffer();filterInfo.getFilterItems().add(newFilterItemInfo("id",idLists,CompareType.INCLUDE));filterInfo.getFilterItems().add(newFilterItemInfo("fiVouchered",Boolean.TRUE));maskString.append("#0AND#1");filterInfo.setMaskString(maskString.toString());filterInfo.mergeFilter(this.mainQuery.getFilter(),"AND");this.mainQuery.setFilter(filterInfo);4.14對(duì)序時(shí)簿查詢的擴(kuò)展添加排序條件(Sql語(yǔ)句中的where子句內(nèi)容)SorterItemInfosorterInfo=newSorterItemInfo("owner.number")sorterInfo.setSortType(SortType.ASCEND);this.mainQuery.getSorter().add(sorterInfo);4.15EAS中各種類型ID的轉(zhuǎn)換BOSUuidIObjectPKString4.16EAS中各種類型ID的轉(zhuǎn)換BOSUuid->IObjectPK

IObjectPKpk=newObjectUuidPK(uuid);IObjectPK->BOSUuid

BOSUuid.read(pk.toString());BOSUuid和IObjectPK->String

uuid.toString()和pk.toString();String->BOSUuid和IObjectPK

BOSUuiduuid=BOSUuid.read(id);

IObjectPKpk=newObjectUuidPK(uuid);4.17UI之間參數(shù)傳遞當(dāng)從序事薄打開(kāi)一個(gè)編輯窗口的時(shí)候,需要傳遞一些參數(shù),傳遞和獲取方式如下:

UIContextuiContext=newUIContext(this);uiContext.put(“name”,”tester”);

然后創(chuàng)建窗口時(shí)作為參數(shù)傳入,在編輯窗口獲取的方式如下:

tester=(String)uiContext.get(“name”);4.18上下文與資源文件

獲取客戶端的系統(tǒng)上下文參數(shù)

SysContextctx=SysContext.getSysContext()

UserInfouserInfo=(UserInfo)ctx.getCurrentUserInfo()獲取某個(gè)資源文件的鍵值EASResource.getString("com.kingdee.eas.base.TestResource","periodName")單據(jù)發(fā)布代碼結(jié)構(gòu)及常用功能4BOS應(yīng)用框架詳細(xì)設(shè)計(jì)3BOS應(yīng)用框架總體設(shè)計(jì)2BOS應(yīng)用框架概述1目錄開(kāi)發(fā)常用接口介紹55.1開(kāi)發(fā)常用接口介紹通用UI頁(yè)面(CoreUI)序時(shí)簿頁(yè)面(ListUI)編輯界面(EditUI)左樹(shù)右表序時(shí)簿界面(TreeListUI,TreeDetailListUI)5.2通用UI頁(yè)面(CoreUI)如何設(shè)置并顯示狀態(tài)欄中的信息如何開(kāi)啟附件功能并顯示如何屏蔽表格右鍵菜單中的復(fù)制粘貼菜單如何添加一個(gè)序時(shí)簿中表格右鍵菜單項(xiàng)5.3設(shè)置并顯示狀態(tài)欄中的信息設(shè)置狀態(tài)欄中信息:

設(shè)置狀態(tài)欄消息:setMessageText(Stringstr);

設(shè)置狀態(tài)欄圖標(biāo):setMessageIcon(Iconicon);

設(shè)置狀態(tài)欄背景色:setMessageBgcolor(Colorcolor);設(shè)置狀態(tài)欄中信息:

showMessage();5.4如何開(kāi)啟附件功能并顯示開(kāi)啟并顯示附件的步驟:

覆蓋ListUI和EditUI的isShowAttachmentAction方法;返回true在客戶端的client\deploy\client目錄下新建

attachCperties文件,并在文件中加入需要顯示附件的單據(jù)的編輯界面的全路徑類名參數(shù)。例如:

com.kingdee.eas.framework1.test.client.TestBizUnitEditUI=true將attachCperties文件放到服務(wù)端

server\deploy\fileserver.ear\easWebClient\deploy\client

目錄下5.5屏蔽右鍵菜單的復(fù)制粘貼菜單只屏蔽粘貼菜單,保留復(fù)制菜單:

table.getStyleAttributes().setLocked(true)復(fù)制粘貼菜單都屏蔽掉:

在調(diào)用父類onload方法之前調(diào)用CoreUI的setCanCopyPaste方法,設(shè)置為false5.6添加序時(shí)簿中表格右鍵菜單項(xiàng)覆蓋CoreUI的addCommonMenusToTable方法并在調(diào)用父類方法后加入自定義的菜單:publicvoidaddCommonMenusToTable(KDTabletable){super.addCommonMenusToTable(table);PopupMenuManagermgr=this.getPopupMenuManager(table);MenuSectionsection=newMenuSection("test");mgr.addMenuSection(section);JMenuItemmenuItem=newJMenuItem();menuItem.setName("test");menuItem.setText("test");section.insertAfter(menuItem);}

5.7序時(shí)簿頁(yè)面(ListUI)表格中表頭的排序功能查詢功能表格右鍵菜單獲取表格中所選單據(jù)的id集合5.8表格中表頭的排序功能屏蔽表格中所有列表頭的排序功能:

ListUI類中的isCanOrderTable

ListUI類中的isOrderForClickTableHead

如果屏蔽只需覆蓋任意一個(gè)方法并返回fasle即可屏蔽表格中某些列的排序功能:

重寫(xiě)ListUI類中的getNotOrderColumns方法并返回不排序的表格列的綁定字段的集合

5.9查詢功能

在查詢前如何增加或修改查詢條件:

在打開(kāi)單據(jù)和執(zhí)行通用過(guò)濾查詢都要改變查詢條件:重寫(xiě)ListUI的beforeExcutQuery方法

只在執(zhí)行通用過(guò)濾查詢時(shí)要改變查詢條件:重寫(xiě)ListUI的prepareQuery方法5.10查詢功能讓單據(jù)查詢時(shí)忽略CU過(guò)濾:重寫(xiě)ListUI的isIgnoreCUFilter方法:

true:忽略

false:過(guò)濾顯示序時(shí)簿表格中的合計(jì)行:

重寫(xiě)ListUI的isFootVisible方法:

true:顯示false:屏蔽5.11查詢功能

設(shè)置打開(kāi)序時(shí)簿前先彈出通用過(guò)濾對(duì)話框:

重寫(xiě)ListUI的initDefaultFilter方法:

true:彈框false:直接打開(kāi)

確保查詢方案中沒(méi)有方案選中“下次直接以該方案進(jìn)入”5.12表格右鍵菜單屏蔽序時(shí)簿中表格右鍵菜單:

CoreUI的tHelper對(duì)象提供的方法:

this.tHelper.getDisabledTables().add(table);table:需要屏蔽的表格對(duì)象(如:this.tblMain)獲取序時(shí)簿中表格右鍵菜單項(xiàng):

使用CoreUI的提供的方法:

this.getMenuManager(table).getMenu()5.13獲取表格中所選單據(jù)的id集合ListUI的取Id方法:

protectedStringgetSelectedKeyValue()

獲取默認(rèn)表格(tblMain)選擇列表第一行的的主鍵值

protectedArrayListgetSelectedIdValues()

獲取默認(rèn)表格(tblMain)所有選擇行的主鍵值protectedfinalArrayListgetSelectIdForTableSelect(KDTabletable)

獲取指定表格選擇行的主鍵值5.14編輯界面(EditUI)增刪查改功能合計(jì)行5.15增刪查改功能在保存或提交單據(jù)之前和之后加入業(yè)務(wù)邏輯:覆蓋EditUI的doBeforeSave和doAfterSave方法覆蓋EditUI的doBeforeSubmit和doAfterSubmit方法判斷單據(jù)是否被修改:

EditUI的isModify方法新增一個(gè)單據(jù)時(shí)如何初始化單據(jù)的字段:

重寫(xiě)EditUI的applyDefaultValue方法,對(duì)this.editData進(jìn)行初始化5.16增刪查改功能在修改單據(jù)后關(guān)閉時(shí)選擇暫存還是提交單據(jù):

重寫(xiě)EditUI的isModifySave方法:

true:暫存false:提交獲取當(dāng)前單據(jù)的id(PK):

EditUI的getSelectedKeyForAll方法判斷或設(shè)置當(dāng)前編輯對(duì)象是否獲得對(duì)象更新鎖:

EditUI的isHasObjectUpdateLock方法

EditUI的setHasObjectUpdateLock方法5.17合計(jì)行顯示和設(shè)置編輯界面表格的合計(jì)行列:調(diào)用EditUI的setTableToSumField方法參數(shù)說(shuō)明:

table:表格對(duì)象

columnFields:默認(rèn)顯示格式則傳入:

{"colname1","colname2"}

如果自定義顯示格式則傳入:

{"colname1@0.0","colname2@#.##"}列表界面setIsCountAndSumRow(boolean)true:顯示合計(jì)結(jié)果false:表格下方雙擊顯示合計(jì)結(jié)果5.18左樹(shù)右表序時(shí)簿界面TreeListUI和TreeDetailListUI樹(shù)節(jié)點(diǎn)查詢功能TreeListUI:多級(jí)別左樹(shù)右表單據(jù)TreeDetailListUI:分組左樹(shù)右表單據(jù)區(qū)別:

TreeListUI:樹(shù)和表屬同一實(shí)體,表中數(shù)據(jù)有多個(gè)級(jí)別,具有父子關(guān)系

TreeDetailListUI:樹(shù)和表屬不同實(shí)體,表中數(shù)據(jù)分為不同的組別,可以對(duì)組別進(jìn)行增刪查改5.19TreeListUI和TreeDetailListUI獲取選中的樹(shù)節(jié)點(diǎn):

getSelectedTreeNode方法獲取選中的樹(shù)節(jié)點(diǎn)的id:

getSelectedNodeKeyValue方法判斷和設(shè)置是否包含所有子孫節(jié)點(diǎn):

isIncludeAllChildren或setIncludeAllChildren方法

isIsIncludeChild或setIsIncludeChild方法5.20樹(shù)節(jié)點(diǎn)移動(dòng)樹(shù)節(jié)點(diǎn)功能:

isMoveTree方法

isMoveTree或isMoveGroup方法移動(dòng)樹(shù)節(jié)點(diǎn)到根節(jié)點(diǎn)下:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論