cobjList.jsp 89 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643
  1. <%@ page language="java" pageEncoding="UTF-8" isELIgnored="false" %>
  2. <%@ taglib uri="/ssTag" prefix="ss" %>
  3. <%pageContext.setAttribute("wdpageinformation", "{'hastab':'0'}");%>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta http-equiv="pragma" content="no-cache">
  8. <meta http-equiv="cache-control" content="no-cache">
  9. <meta http-equiv="expires" content="0">
  10. <script>window.loginStatus = "${empty sessionScope['ssUser']?'0':'1'}"</script>
  11. <ss:skin file='main.css'/>
  12. <script type="text/javascript" src="/ss/jquery/jquery.js"></script>
  13. <script type="text/javascript" src="/ss/artdialog/artDialogUtil.js"></script>
  14. <script type="text/javascript" src="/ss/js/base.js"></script>
  15. <script> if (!window.wd) var wd = {};
  16. if (!wd.display) wd.display = {};
  17. wd.display.wdDialogId = "cobjList";
  18. if (!wd.app) wd.app = {};
  19. wd.app.name = 'pms';</script>
  20. <script type="text/javascript" src="/ss/js/masklayer.js"></script>
  21. <script type="text/javascript" src="/ss/js/wdDialogInit.js"></script>
  22. <script type="text/javascript" src="/ss/js/common.js"></script>
  23. <script type="text/javascript" src="/ss/js/display.js"></script>
  24. <script type="text/javascript" src="/ss/js/edit.js"></script>
  25. <script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.js"></script>
  26. <script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.iframehelper.min.js"></script>
  27. <link rel="stylesheet" type="text/css" href="/ss/window/theme/dhtmlxwindows.css">
  28. <link rel="stylesheet" type="text/css" href="/ss/window/theme/dhx_blue/dhtmlxwindows_dhx_blue.css">
  29. <script type="text/javascript" src="/ss/window/dhtmlxcommon.js"></script>
  30. <script type="text/javascript" src="/ss/window/dhtmlxwindows.js"></script>
  31. <script type="text/javascript" src="/ss/window/dhtmlxcontainer.js"></script>
  32. <script type="text/javascript" src="/ss/js/common.js"></script>
  33. <script type="text/javascript" src="/ss/js/display.js"></script>
  34. <script type="text/javascript" src="/ss/datePicker/WdatePicker.js"></script>
  35. <script type="text/javascript" src="/ss/js/edit.js"></script>
  36. <ssDlg setPval="true"/>
  37. <%-- setValue="true" close="true"。Lin --%>
  38. <script type="text/javascript" src="/ss/js/growHeight.js"></script>
  39. <script type="text/javascript" src="/ss/jquery/jquery.ellipsis.js"></script>
  40. <script type="text/javascript" src="/ss/datePicker/WdatePicker.js"></script>
  41. <script type="text/javascript" src="/ss/js/edit.js"></script>
  42. <script type="text/javascript" src="/ss/echarts/echarts.js"></script>
  43. <%-- 新UI引入的JS --%>
  44. <script src="/js/load.js"></script>
  45. <%-- ="/newUI/ss/js/base.js"。Lin(新UI) --%>
  46. <script src="/js/pageC.js"></script>
  47. <%-- 对象变动、修改、查看页,左则选项卡宽度 在里面定义 Ben(20251213) --%>
  48. <style>
  49. <%--巨大div--%>
  50. <%--报表样式--%>
  51. <%--内容--%>
  52. <%--调大小手柄--%>
  53. <%--设置报表--%>
  54. <%--page--%>
  55. .pagination {
  56. margin-right: 20px;
  57. }
  58. .icon-openFolder {
  59. line-height: 40px !important;
  60. }
  61. <%-- // 功能说明:二级列表搜索/翻页 loading 动效(参考 objList 样式并居中展示) by xu 20260115 --%>
  62. /* 功能说明:二级列表搜索/翻页 loading 动效(避免点“所有/搜索”无反馈) by xu 20260115 */
  63. .cobj-loading {
  64. width: 100%;
  65. min-height: 260px;
  66. flex: 1 0 100%;
  67. box-sizing: border-box;
  68. display: flex;
  69. align-items: center;
  70. justify-content: center;
  71. }
  72. /* 功能说明:二级列表接口返回 ssCode/ssMsg 时展示错误信息 by xu 20260206 */
  73. .cobj-error {
  74. width: 100%;
  75. min-height: 260px;
  76. flex: 1 0 100%;
  77. box-sizing: border-box;
  78. display: flex;
  79. align-items: center;
  80. justify-content: center;
  81. color: #d03050;
  82. font-size: 14px;
  83. text-align: center;
  84. padding: 0 16px;
  85. }
  86. .cobj-spinner {
  87. width: 18px;
  88. height: 18px;
  89. border-radius: 50%;
  90. border: 2px solid rgba(0, 0, 0, 0.2);
  91. border-top-color: rgba(0, 0, 0, 0.65);
  92. animation: cobjSpin 0.8s linear infinite;
  93. }
  94. @keyframes cobjSpin {
  95. from {
  96. transform: rotate(0deg);
  97. }
  98. to {
  99. transform: rotate(360deg);
  100. }
  101. }
  102. </style>
  103. <%-- 改为 <data@ss name="prt"/>。Lin
  104. <tab@ss name="print" enable="viewobject.funcMap.play.print"/> --%>
  105. <ss:data name='prt'/>
  106. <%--批量打印--%>
  107. <%-- 去掉,改为 <jsp@ss file="/ss/prtIcon.jsp"/>。Lin
  108. 不用 "wdBatchPrint",统一用 "wdPrint" -- 写在 prtIcon.jsp 里
  109. <equal@ss val="${empty prt}" val2="false">
  110. <script>
  111. $(function(){
  112. try{
  113. var wdDialogId=wd.display.getwdDialogId();
  114. var win=wd.topWindow.dhxWins.window(wdDialogId);
  115. win.button("wdBatchPrint").show();
  116. win.button("wdBatchPrint").onclick=function(){
  117. <varServ@ss dlg="true" name="${prt.servName}" dest="${prt.dest}" parm="${prt.parm}" title="${prt.title}" width="${prt.width}" height="${prt.height}" minHeight="${prt.minHeight}" maxHeight="${prt.maxHeight}"/>
  118. }
  119. }catch(e){
  120. console.log(e);
  121. }
  122. })
  123. </script>
  124. </equal@ss>
  125. --%>
  126. <%@include file="/ss/clip/prtIcon.jsp" %>
  127. <script>
  128. window.SS.dom.formElemConfig = window.SS.dom.formElemConfig || {};
  129. </script>
  130. </head>
  131. <body>
  132. <div id="app">
  133. <form class="page-container" id="myForm"
  134. action="<ss:serv name='${currentService.servName}' dest='${currentService.dest}' parm='${currentService.parm}'/>"
  135. method="post">
  136. <input type="hidden" name="isAnd" value='${isAnd}'/>
  137. <input name="management" type="hidden" value="${management}"/>
  138. <input name="isFulltext" type="hidden" value="${isFulltext}"/>
  139. <%-- // 功能说明:补齐分页隐藏字段,供前端翻页/序列化入参使用 by xu 20260115 --%>
  140. <input type="hidden" name="pageNo" v-model="ssPaging.pageNo"/>
  141. <input type="hidden" name="rowNumPer" v-model="ssPaging.rowNumPer"/>
  142. <input type="hidden" name="rowNum" v-model="ssPaging.rowNum"/>
  143. <%--搜索条件start--%>
  144. <div class="search-bar">
  145. <ss-breadcrumb></ss-breadcrumb>
  146. <div class="search-bar-contaienr">
  147. <%-- // 功能说明:优先用接口返回的 searchFieldList 渲染搜索条件(无右侧栏) by xu 20260115 --%>
  148. <template v-if="searchFieldList && searchFieldList.length">
  149. <template v-for="f in searchFieldList" :key="f.name">
  150. <template v-if="f && f.cbName">
  151. <%-- // 功能说明:下拉选项由前端拉取并绑定 opt,保证选择后能回显选中项 by xu 20260115 --%>
  152. <ss-objp
  153. v-model="searchForm[f.name]"
  154. :name="f.name"
  155. :opt="searchFieldOptMap[f.name] || []"
  156. :placeholder="f.desc || ''"
  157. width="120"
  158. inp="true"
  159. url="/service?ssServ=loadObjpOpt&objectpickerdropdown1=1"
  160. :cb="f.cbName"
  161. ></ss-objp>
  162. </template>
  163. <template v-else>
  164. <ss-search-input
  165. :name="f.name"
  166. :placeholder="f.desc || ''"
  167. v-model="searchForm[f.name]"
  168. width="100px"
  169. @search="doSearch"
  170. ></ss-search-input>
  171. </template>
  172. </template>
  173. <template v-if="hasKeyWord">
  174. <ss-search-input
  175. name="ssKeyword"
  176. placeholder="关键词"
  177. v-model="searchForm.ssKeyword"
  178. width="100px"
  179. @search="doSearch"
  180. ></ss-search-input>
  181. </template>
  182. </template>
  183. <template v-else>
  184. <%--关键词--%>
  185. <%-- 再去掉 -- 只支持一行。Lin
  186. <ss:rpt name='searchableFields' id='fieldsList'>
  187. --%>
  188. <ss:rpt name='fieldsList' id='searchItem'>
  189. <%
  190. ss.obj.ObjFieldB f = (ss.obj.ObjFieldB) pageContext.getAttribute("searchItem");
  191. pageContext.setAttribute("searchItemValue", request.getParameter(f.getName()));
  192. %>
  193. <%--codebook 使用select下拉--%>
  194. <ss:equal val='${empty searchItem.cbName}' val2='false'>
  195. <%--<input type="text" name="${searchItem.name}" value="${searchItemValue}"/>
  196. <input type="text" name="${searchItem.name}Name" placeholder="${searchItem.desc}" style="width:${searchItem.width};min-width: 108px;"/>
  197. <ss:equal val='${empty cadcadingInputs[searchItem.name]}' val2='true'>
  198. <ss:objp name='${searchItem.name}' cb='${searchItem.cbName}' inp='true'/>
  199. </ss:equal>--%>
  200. <ss-objp
  201. v-model="${searchItem.name}"
  202. name="${searchItem.name}"
  203. :opt="${searchItem.name}Option"
  204. placeholder="${searchItem.desc}"
  205. width="120"
  206. inp="true"
  207. url="/service?ssServ=loadObjpOpt&objectpickerdropdown1=1"
  208. cb="${searchItem.cbName}"
  209. ></ss-objp>
  210. <script>
  211. /**
  212. * objectPicker(如:性别码)
  213. * optUrl:加载下拉菜单option选项的url
  214. */
  215. window.SS.dom.formElemConfig.${searchItem.name} = {
  216. desc: '${searchItem.desc}',
  217. value: '${searchItemValue}',
  218. optUrl: '123456',
  219. type: 2
  220. };//放当前页面表单元素配置的变量
  221. </script>
  222. </ss:equal>
  223. <%--codebook 使用input输入框--%>
  224. <ss:equal val='${empty searchItem.cbName}' val2='true'>
  225. <%--日期--%>
  226. <ss:equal val='${searchItem.type}'
  227. valList='3,11'> <%-- 改 equal:val1="true" val2='${searchItem.type == "time"}'。Lin --%>
  228. <div class="input-inside">
  229. <%--年度--%>
  230. <%--
  231. <ss:equal val='${searchItem.enrolDate}' val2='true'>
  232. <input type='hidden' placeholder="${searchItem.desc}" name='${searchItem.name}'
  233. value='<ss:txt val='${searchItemValue}'/>'/>
  234. <div><input type="text" name="${searchItem.name}_year" autocomplete="off" />
  235. <input name="${searchItem.name}_month" type="button" value="春季" ssVal="3"/>
  236. <input name="${searchItem.name}_month" type="button" value="秋季" ssVal="9"/>
  237. </div><script>(function(){wd.edit.onoffInit('radio','${searchItem.name}_month','',false,null,null,null,'edit');})();</script>
  238. <script>(function(){
  239. wd.display.initEnrolDate('${searchItem.name}','edit');
  240. })()
  241. </script>
  242. </ss:equal>--%>
  243. <%--日期--%>
  244. <ss:equal val='${searchItem.type==11}' val2='true'>
  245. <%--<input type='text' autocomplete="off" placeholder="${searchItem.desc}" name='${searchItem.name}'
  246. value='<ss:txt val='${searchItemValue}'/>' format="${searchItem.fmt}"/>
  247. <input type="button" ssType="date" ssName="${searchItem.name}"/>--%>
  248. <ss-search-date-picker
  249. v-model="${searchItem.name}"
  250. name="${searchItem.name}"
  251. type="date"
  252. placeholder="${searchItem.desc}"
  253. width="100px"
  254. ></ss-search-date-picker>
  255. <script>
  256. //日期类型(如:出生日期)
  257. window.SS.dom.formElemConfig.${searchItem.name} = {
  258. desc: '${searchItem.desc}',
  259. value: '${searchItemValue}',
  260. type: 3,
  261. name: '${searchItem.name}'
  262. };//放当前页面表单元素配置的变量
  263. </script>
  264. </ss:equal>
  265. </div>
  266. </ss:equal>
  267. <%--文本--%>
  268. <ss:notEqual val='${searchItem.type}'
  269. valList='3,11'> <%-- 改 equal:val1="false" val2='${searchItem.type == "time"}'。Lin --%>
  270. <%--<input name='${searchItem.name}' placeholder="${searchItem.desc}" type='text'
  271. value='<ss:txt val='${searchItemValue}'/>'/>
  272. <input type="hidden" ssType="and" ssName="${searchItem.name}"/>--%>
  273. <%--<script>wd.edit.addClearTextButton("${searchItem.name}");</script>--%>
  274. <ss-search-input
  275. name="${searchItem.name}"
  276. placeholder="${searchItem.desc}"
  277. v-model="${searchItem.name}"
  278. width="100px"
  279. >
  280. </ss-search-input>
  281. <script>
  282. //日期类型(如:出生日期)
  283. window.SS.dom.formElemConfig.${searchItem.name} = {
  284. desc: '${searchItem.desc}',
  285. value: '${searchItemValue}',
  286. type: 31,
  287. name: '${searchItem.name}'
  288. };//放当前页面表单元素配置的变量
  289. </script>
  290. </ss:notEqual>
  291. </ss:equal>
  292. </ss:rpt>
  293. <%-- 再去掉 -- 只支持一行。Lin
  294. </ss:rpt>
  295. --%>
  296. <ss:rpt name='cadcadingName' id='item'><%-- 级联菜单,还不知道怎么出来的 --%>
  297. <ss:ccp name='${item}'/>
  298. </ss:rpt>
  299. <ss:equal val='${hasKeyWord}' val2='true'>
  300. <%--<input name="ssKeyword" value="${ssKeyword}" type="text" placeholder="关键词"/>
  301. <script>wd.edit.addClearTextButton("ssKeyword");</script>--%>
  302. <ss-search-input
  303. name="ssKeyword"
  304. placeholder="关键词"
  305. v-model="ssKeyword"
  306. width="100px"
  307. >
  308. </ss-search-input>
  309. <script>
  310. //关键词
  311. window.SS.dom.formElemConfig.ssKeyword = {
  312. value: '${ssKeyword}',
  313. name: "ssKeyword",
  314. desc: "关键词",
  315. type: 31
  316. };//放当前页面表单元素配置的变量
  317. </script>
  318. </ss:equal>
  319. </template>
  320. <ss-search-button
  321. text="所有"
  322. icon-class="nav-icon-search"
  323. :opt="searchButtonConfig"
  324. :check-id="searchButtonConfigCheckId"
  325. ></ss-search-button>
  326. <%-- // 功能说明:优先用接口返回的 rootFuncList 渲染根按钮 by xu 20260115 --%>
  327. <template v-if="rootFuncList && rootFuncList.length">
  328. <template v-for="func in rootFuncList" :key="func.id || func.servName">
  329. <ss-search-button
  330. :text="func.desc || func.title || ''"
  331. icon-class="nav-icon-add"
  332. :opt="[]"
  333. :check-id="0"
  334. @click="openServiceDialog(func)"
  335. ></ss-search-button>
  336. </template>
  337. </template>
  338. <%--<input type="submit" name="ssSearch" value="搜索" class="content-invertButton"/>--%>
  339. <%--跨对象搜索隐藏全文按钮--%>
  340. <ss:equal val='${isMultipleObject}' val2='false'>
  341. <%-- "全文" 按钮,"button" 改为 "hidden"。
  342. 原来的会加上 style="display: none;",不知在哪加的???Lin
  343. objList.ss.jsp 里,原来就有 type="hidden"
  344. --%>
  345. <input type="hidden" ssType="fts" ssName="fts"
  346. value="全文"/> <%-- wdType="isFulltext" wdName="isFulltext"。Lin --%>
  347. </ss:equal>
  348. <%-- // 功能说明:rootFuncList 由接口返回时,隐藏旧 JSP 注入的 buttonList(避免重复按钮) by xu 20260115 --%>
  349. <template v-if="!rootFuncList || !rootFuncList.length">
  350. <%--管理按钮start--%>
  351. <script>
  352. <%-- 根按钮(管理按钮) --%>
  353. window.SS.dom.btnElemConfig = window.SS.dom.btnElemConfig || {};
  354. </script>
  355. <ss:rpt name='buttonList' id='button'>
  356. <ss:equal val='${dataType}'
  357. valList='normal,update,change,bdplay'> <%-- 增加,查看时隐去管理按钮。原来会去掉管理按钮,不知在哪去掉的???Lin --%>
  358. <ss:auth serv='${button.servName}'>
  359. <ss:equal val='${empty button.pluginList}' val2='true'>
  360. <%--<input type="button" name="${button.name}" value="${button.buttonName}" class="content-button"
  361. onclick='wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='${button.servName}' dest='${button.dest}' parm='${button.parm}'/>",title:"${button.title}",width:"${button.width}",height:"${button.height}",minHeight:"${button.minHeight}",maxHeight:"${button.maxHeight}",showTitle:"${button.showTitle}"});'/>--%>
  362. <script>
  363. function ${button.id}handleClick() {
  364. wd.display.showComponent({
  365. show: ["wdDialog"],
  366. url: "<ss:serv name='${button.servName}' dest='${button.dest}' parm='${button.parm}'/>",
  367. title: "${button.title}",
  368. width: "${button.width}",
  369. height: "${button.height}",
  370. minHeight: "${button.minHeight}",
  371. maxHeight: "${button.maxHeight+100}",
  372. showTitle: "${button.showTitle}"
  373. });
  374. }
  375. window.SS.dom.btnElemConfig.${button.id} = {
  376. desc: "${button.buttonName}",
  377. id: "${button.id}",
  378. dropOptions: [],
  379. onclick: () => {
  380. wd.display.showComponent({
  381. show: ["wdDialog"],
  382. url: "<ss:serv name='${button.servName}' dest='${button.dest}' parm='${button.parm}'/>",
  383. title: "${button.title}",
  384. width: "${button.width}",
  385. height: "${button.height}",
  386. minHeight: "${button.minHeight}",
  387. maxHeight: "${button.maxHeight+100}",
  388. showTitle: "${button.showTitle}"
  389. });
  390. }
  391. };
  392. </script>
  393. <ss-search-button
  394. text="${button.buttonName}"
  395. icon-class="nav-icon-add"
  396. :opt="[]"
  397. :check-id="0"
  398. onclick="${button.id}handleClick()"
  399. ></ss-search-button>
  400. </ss:equal>
  401. <ss:equal val='${empty button.pluginList}' val2='false'>
  402. <ss:rpt name='${button.pluginList}' id='plugin'>
  403. <%--<span style="display:none;" class="${button.id}children" value="${plugin.plugin.desc}"
  404. onclick='wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='${plugin.servName}' dest='${plugin.dest}' parm='${plugin.parm}'/>",title:"${plugin.title}",width:"${plugin.width}",height:"${plugin.height}",minHeight:"${plugin.minHeight}",maxHeight:"${plugin.maxHeight}",showTitle:"${plugin.showTitle}"});'>
  405. </span>
  406. </ss:rpt>
  407. <input type="button" id="${button.id}" name="${button.name}" value="${button.buttonName}" class="content-button" onclick='void(0)'/>
  408. <script>wd.display.attachButton("${button.id}","${button.id}children",null,false,true)</script>
  409. --%>
  410. <%-- window.SS.dom.btnElemConfig.${button.id}.onclick --%>
  411. <%-- :opt改为取vue.data中的变量,而不取window.ss.dom.btnElemConfig(因为取不到),onclick改为:onclick xu(20251209) --%>
  412. <ss-search-button
  413. text="${button.buttonName}"
  414. icon-class="nav-icon-add"
  415. :opt="btnElemConfig.${button.id}.dropOptions"
  416. check-id="${management}"
  417. onclick="${button.id}handleClick()"
  418. ></ss-search-button>
  419. <script><%-- 新UI生成按钮下拉菜单 --%>
  420. function ${button.id}handleClick() {
  421. wd.display.showComponent({
  422. show: ["wdDialog"],
  423. url: "<ss:serv name='${plugin.servName}' dest='${plugin.dest}' parm='${plugin.parm}'/>",
  424. title: "${plugin.title}",
  425. width: "${plugin.width}",
  426. height: "${plugin.height}",
  427. minHeight: "${plugin.minHeight}",
  428. maxHeight: "${plugin.maxHeight}",
  429. showTitle: "${plugin.showTitle}"
  430. });
  431. }
  432. window.SS.dom.btnElemConfig.${button.id} = {
  433. id: "${button.id}", dropOptions: [],
  434. onclick: () => {
  435. wd.display.showComponent({
  436. show: ["wdDialog"],
  437. url: "<ss:serv name='${plugin.servName}' dest='${plugin.dest}' parm='${plugin.parm}'/>",
  438. title: "${plugin.title}",
  439. width: "${plugin.width}",
  440. height: "${plugin.height}",
  441. minHeight: "${plugin.统计minHeight}",
  442. maxHeight: "${plugin.maxHeight}",
  443. showTitle: "${plugin.showTitle}"
  444. });
  445. }
  446. };
  447. <%-- 循环生成按钮数组 --%>
  448. <ss:rpt name='${button.pluginList}' id='plugin'>
  449. window.SS.dom.btnElemConfig
  450. .${button.id}.
  451. dropOptions.push(
  452. {
  453. desc: '${plugin.plugin.desc}', <%-- 按钮名 --%>
  454. callback: function () {
  455. wd.display.showComponent({
  456. show: ["wdDialog"],
  457. url: "<ss:serv name='${plugin.servName}' dest='${plugin.dest}' parm='${plugin.parm}'/>",
  458. title: "${plugin.title}",
  459. width: "${plugin.width}",
  460. height: "${plugin.height}",
  461. minHeight: "${plugin.minHeight}",
  462. maxHeight: "${plugin.maxHeight}",
  463. showTitle: "${plugin.showTitle}"
  464. });
  465. }
  466. }
  467. );
  468. </ss:rpt>
  469. </script>
  470. <%-- 新UI end Ben --%>
  471. </ss:rpt>
  472. </ss:equal>
  473. </ss:auth>
  474. </ss:equal>
  475. </ss:rpt>
  476. <%--管理按钮end--%>
  477. </template>
  478. <%--</div>--%>
  479. <%--管理类别start--%>
  480. <%-- <ss:equal val='${dataType}' valList='normal,update,change,bdplay'>--%>
  481. <%-- <ss:equal val='${"1"==isReady && !isMultipleObject && isTopObject}' val2='true'>--%>
  482. <%-- <div class="hLine" style="height: 48px;margin: 0px 17px 0px 11px;padding-left: 14px;padding-top:11px;box-sizing: border-box;">--%>
  483. <%-- <ul style="list-style: none;display: inline-block;">--%>
  484. <%--&lt;%&ndash; 再改,management(String) 为 scopeType(int) -- 0 为未指定,99 为所有(原为 "0")。Lin--%>
  485. <%-- <li wdType="manage" wdVal="0">所有</li> &ndash;%&gt;--%>
  486. <%-- <li ssType="searchScope" ssVal=99>所有</li>--%>
  487. <%-- &lt;%&ndash; <li wdType="manage" wdVal="2">管理</li>&ndash;%&gt;--%>
  488. <%--&lt;%&ndash; 再改,management(String) 为 scopeType(int) -- 0 为未指定,99 为所有(原为 "0")。Lin--%>
  489. <%-- <li wdType="manage" wdVal="1">创建</li> &ndash;%&gt;--%>
  490. <%-- <li ssType="searchScope" ssVal=1>创建</li>--%>
  491. <%-- &lt;%&ndash;<li wdType="manage" wdVal="3">已办</li>&ndash;%&gt;--%>
  492. <%--&lt;%&ndash; 再改,management(String) 为 scopeType(int) -- 0 为未指定,99 为所有(原为 "0")。Lin--%>
  493. <%-- <li wdType="manage" wdVal="55">停用</li> &ndash;%&gt;--%>
  494. <%-- <li ssType="searchScope" ssVal=55>停用</li>--%>
  495. <%-- </ul>--%>
  496. <%-- </div>--%>
  497. <%-- </ss:equal>--%>
  498. <%-- </ss:equal>--%>
  499. <%--管理类别end--%>
  500. <%--翻页--%>
  501. <%-- <%@include file="/ss/clip/paging.jsp"%> --%>
  502. </div>
  503. </div>
  504. <%--搜索条件end--%>
  505. <%--个人统计表start${!isMultipleObject}--%>
  506. <ss:equal val='${"1"!=isReady && !isMultipleObject}' val2='true'>
  507. <%-- 再改为 WebC.REQ_objName,避免与数据表里的 对象名 字段重名。用到再确认。Lin
  508. 传到 objList.ss.jsp 的是 ${ssObjName},传给 addPstat 的是 dxm(统计指标.对象名、个人统计.对象名)
  509. <input name="addgrtjUrl" type="hidden" value="<serv@ss name='add_grtj' parm='{dxm:"${dxm}"}'/>"/> --%>
  510. <input name="addgrtjUrl" type="hidden"
  511. value="<ss:serv name='addPcht' parm='{"dxm":"${ssObjName}"}'/>"/> <%-- {"wdConfirmationCaptchaService":"0",。Lin --%>
  512. <input name="grtjSizeUrl" type="hidden"
  513. value="<ss:serv name='savePstatSize' parm='{"grtjSize":"ssVal{grtjSize}"}'/>"/> <%-- name='save_grtjSize'。{"wdConfirmationCaptchaService":"0",。Lin --%>
  514. <input name="getgrtjJsonUrl" type="hidden"
  515. value="<ss:serv name='getgrtjJson'/>"/> <%-- parm='{"wdConfirmationCaptchaService":"0"}'。Lin --%>
  516. <div class="graph scrollbar" style="padding-right: 16px;">
  517. <ss:rpt name='${grtjList}' id='item'>
  518. <div class="graph-list" grtjid="${item.grtjid}" style="width:${item.kd};height:${item.gd};">
  519. <div class="graph-list-body" style="height: 100%;">${item.mc}</div>
  520. <span class="graph-list-mask"></span>
  521. <span class="graph-list-resize"></span>
  522. <span class="vLine"
  523. style="height: 40px;width: 1px;position: absolute;right: 70px;top: 0px"></span>
  524. <span class="hLine-highlight"
  525. style="width: 100%;height: 0px;position: absolute;top: 40px;left: 0px;"></span>
  526. <span class="icon-set" style="position: absolute;right: 0px;top: 0px;width: 70px;height: 40px;"
  527. <%-- 再改为 WebC.REQ_objName,避免与数据表里的 对象名 字段重名。用到再确认。Lin
  528. onclick='<serv@ss dlg="true" name="getZbInfo" dest="grtj_sz" parm="{grtjid:&quot;${item.grtjid}&quot;,dxm:&quot;${dxm}&quot;}"/>'> --%>
  529. onclick='wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='getZbInfo'
  530. parm='{"grtjid":"${item.grtjid}","ssObjName":"${ssObjName}"}'
  531. dest='grtj_sz'/>",title:"挑选指标",width:1000,height:800});'>
  532. <%-- {"wdConfirmationCaptchaService":"0",。Lin --%>
  533. </span>
  534. </div>
  535. </ss:rpt>
  536. <div>
  537. <%--<div class="graphButton button icon-add" style="height: 60px;line-height: 82px;float: right;margin-right: 0px;margin-top: 0px;">增加</div>
  538. <input name="initTj" onclick='@service{name:"initTj",dest:"sys_info",show:"wdDialog"}@' value="初始化" type="button" />--%>
  539. </div>
  540. </div>
  541. </ss:equal>
  542. <%--个人统计表end--%>
  543. <div style="clear: both;"></div>
  544. <script type="text/javascript" src="/ss/env/env_search.js"></script>
  545. <%--搜索结果start--%>
  546. <%--<div class="longCardList-div" style="box-sizing: border-box;" ssFith="true">
  547. <table class="scrollbar" style="max-height: 100%;width: 100%;">
  548. <tbody style="width: 100%;padding: 0px 16px 0px 11px;box-sizing: border-box;" ssFith='{list:true,rowHeight:35}'>--%><%-- 去掉 id="wdTbody0",好像没用到。Lin --%>
  549. <%-- <ss:rpt name='bgmbList' id='item'>--%>
  550. <%-- <tr>--%>
  551. <%-- <td class="hLine"--%>
  552. <%-- onClick='wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='stat_tableDesign_bb' parm='{"wdConfirmationCaptchaService":"0","bgmbid":"${item.bgmbid}"}' dest='bgmb_xsmb'/>",title:"显示模板",width:1010,height:750});'>--%>
  553. <%-- <div class="longCardList-info bb" style="font-size: 0px;display: inline-block;float: left;">--%>
  554. <%-- <span class="longCardList-highlight" style="margin-bottom: 3px;">--%>
  555. <%-- <a>${item.mc}</a>--%>
  556. <%-- </span>--%>
  557. <%-- <div id="${item.bgmbid}" class="longCardList-dim growHeightDiv" width='750' height='45px'>--%>
  558. <%-- <ss:txt val='${item.ms}'/>--%>
  559. <%-- </div>--%>
  560. <%-- <script type="text/javascript" charset="utf-8" src="/ss/js/growHeight.js"></script>--%>
  561. <%--<script type="text/javascript" charset="utf-8" src="/ss/js/display.js"></script>--%>
  562. <%--<script type="text/javascript" charset="utf-8" >--%>
  563. <%--wd.display.initGrowHigh('${item.bgmbid}','80px',{},null,false);--%>
  564. <%--</script>--%>
  565. <%-- <div id="${item.bgmbid}${index}" class="longCardList" width='750' height='18px'>--%>
  566. <%-- <ss:txt val='${item.lmms}'/>--%>
  567. <%-- </div>--%>
  568. <%-- <script type="text/javascript" charset="utf-8" src="/ss/js/growHeight.js"></script>--%>
  569. <%--<script type="text/javascript" charset="utf-8" src="/ss/js/display.js"></script>--%>
  570. <%--<script type="text/javascript" charset="utf-8" >--%>
  571. <%--wd.display.initGrowHigh('${item.bgmbid}${index}','80px',{},null,false);--%>
  572. <%--</script>--%>
  573. <%-- </div>--%>
  574. <%-- <a class="button icon-change"--%>
  575. <%-- onClick='wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='stat_tableDesign_load' parm='{"wdConfirmationCaptchaService":"0","bgmbid":"${item.bgmbid}"}' dest='bgmb_sj'/>",title:"变动表格模板",width:1010,height:780});'>--%>
  576. <%-- 变动--%>
  577. <%-- </a>--%>
  578. <%-- </td>--%>
  579. <%-- </tr>--%>
  580. <%-- </ss:rpt>--%>
  581. <%-- 新UI初始化查询列表数据的JS --%>
  582. <script>
  583. <%-- 打印新UI相关json对象 --%>
  584. window.SS.dom.listConfig = window.SS.dom.listConfig || {};
  585. //二级对象 草稿箱
  586. window.SS.dom.listConfig.draftbox = [];
  587. <%-- 草稿箱start --%>
  588. <ss:rpt name='cgxList' id='item'>
  589. {
  590. let item = {};
  591. window.SS.dom.listConfig.draftbox.push(item);
  592. item.tags = [];
  593. <%-- item.tags如果值为空,则会vue组件初始化失败,把item.tags的初始化变为提到条件之外,变成一定会初始化 Ben --%>
  594. <%-- 查看事件 --%>
  595. <ss:equal val='${empty item.service.play}' val2='false'>
  596. item.onclick = function () {
  597. wd.display.showComponent({
  598. show: ["wdDialog"],
  599. url: "<ss:serv name='${item.service.play.servName}' dest='${item.service.play.dest}' parm='${item.service.play.parm}'/>",
  600. title: "${item.service.play.title}",
  601. width: "${item.service.play.width}",
  602. height: "${item.service.play.height}",
  603. minHeight: "${item.service.play.minHeight}",
  604. maxHeight: "${item.service.play.maxHeight}"
  605. });
  606. };
  607. </ss:equal>
  608. <ss:equal val='${item.service.lbm==1 && not empty item.service.update}' val2='true'>
  609. item.onclick = function () {
  610. wd.display.showComponent({
  611. show: ["wdDialog"],
  612. url: "<ss:serv name='${item.service.update.servName}' dest='${item.service.update.dest}' parm='${item.service.update.parm}'/>",
  613. title: "${item.service.update.title}",
  614. width: "${item.service.update.width}",
  615. height: "${item.service.update.height}",
  616. minHeight: "${item.service.update.minHeight}",
  617. maxHeight: "${item.service.update.maxHeight}"
  618. });
  619. };
  620. </ss:equal>
  621. <ss:equal val='${item.service.lbm==11 && not empty item.service.change}' val2='true'>
  622. item.onclick = function () {
  623. wd.display.showComponent({
  624. show: ["wdDialog"],
  625. url: "<ss:serv name='${item.service.change.servName}' dest='${item.service.change.dest}' parm='${item.service.change.parm}'/>",
  626. title: "${item.service.change.title}",
  627. width: "${item.service.change.width}",
  628. height: "${item.service.change.height}",
  629. minHeight: "${item.service.change.minHeight}",
  630. maxHeight: "${item.service.change.maxHeight}"
  631. });
  632. };
  633. </ss:equal>
  634. <ss:equal val='${dataType}' valList='normal,change'>
  635. <ss:equal val='${item.service.lbm}' valList='51,55'>
  636. item.onclick = function () {
  637. wd.display.showComponent({
  638. show: ["wdDialog"],
  639. url: "<ss:serv name='delChildChg' parm='{"sqid":"${item.sqid}"}' dest='childChgDelSure'/>", // {"wdConfirmationCaptchaService":"0",。Lin
  640. title: "删除二级对象的变动",
  641. width: 901,
  642. height: 380,
  643. minHeight: 53,
  644. maxHeight: 432
  645. });
  646. };
  647. </ss:equal>
  648. </ss:equal>
  649. <%-- 增加,审核时查看 基本情况变动。Start。Lin --%>
  650. <ss:equal val='${dataType}' val2='bdplay'>
  651. <ss:equal val='${item.service.lbm}' val2='11'>
  652. item.onclick = function () {
  653. wd.display.showComponent({
  654. show: ["wdDialog"],
  655. url: "<ss:serv name='selChgInfo' parm='{"sqid":"${item.sqid}"}' dest='childChgInfo'/>", // {"wdConfirmationCaptchaService":"0",。Lin
  656. title: "二级对象的变动信息",
  657. width: 1020,
  658. height: 215,
  659. minHeight: 200,
  660. maxHeight: 660
  661. });
  662. };
  663. </ss:equal>
  664. </ss:equal>
  665. <%-- 增加,审核时查看 基本情况变动。End。Lin --%>
  666. <%--图标--%>
  667. <ss:equal val='${item.service.lbm}' val2='1'>
  668. item.titlexxx = "增加";
  669. item.icon = "icon-add";
  670. </ss:equal>
  671. <ss:equal val='${item.service.lbm}' val2='11'>
  672. item.titlexxx = "变动";
  673. item.icon = "icon-change";
  674. </ss:equal>
  675. <ss:equal val='${item.service.lbm}' val2='51'>
  676. item.titlexxx = "停用";
  677. item.icon = "icon-disable";
  678. </ss:equal>
  679. <ss:equal val='${item.service.lbm}' val2='55'>
  680. item.titlexxx = "启用";
  681. item.icon = "icon-enable";
  682. </ss:equal>
  683. <%--缩略图--%>
  684. <ss:equal val='${empty item.thumbnail}' val2='false'>
  685. <ss:equal val='${item.service.state}' val2='0'>
  686. item.thumb = "${sessionScope['ssUser'].skinDir}image/object/default-${item.ssObjName}.png";
  687. </ss:equal>
  688. <ss:notEqual val='${item.service.state}' val2='0'>
  689. item.thumb = "<ss:serv name='dlByHttp' parm='{"path":"${item.thumbnail.value}","type":"img"}'/>"; // {"wdConfirmationCaptchaService":"0",。Lin
  690. </ss:notEqual>
  691. item.errorThumb = '${sessionScope['ssUser'].skinDir}image/object/default.png';
  692. </ss:equal>
  693. <%--标题--%>
  694. <ss:equal val='${empty item.first}' val2='false'> <%-- 改 equal:val1="true" val2="${not empty item.first}"。Lin --%>
  695. <%--不带codebook--%>
  696. <ss:equal val='${empty item.first.field.cbName}' val2='true'>
  697. item.title = '<ss:txt val='${item.first.value}' fmt='${item.first.field.fmt}'/>';
  698. </ss:equal>
  699. <%--带codebook--%>
  700. <ss:equal val='${empty item.first.field.cbName}' val2='false'>
  701. item.title = '<ss:cbTrans cb='${item.first.field.cbName}' val='${item.first.value}'/>';
  702. </ss:equal>
  703. </ss:equal>
  704. <%--缺标题显示属性start--%>
  705. <ss:equal val='${empty item.first && not empty item.third}' val2='true'>
  706. <ss:rpt name='${item.third}' id='itemList'>
  707. <ss:rpt name='${itemList}' id='item2'>
  708. item.title = '${item2.field.desc}:';
  709. <%--不带codebook--%>
  710. <ss:equal val='${empty item2.field.cbName}' val2='true'>
  711. item.title += '<ss:txt val='${item2.value}' fmt='${item2.field.fmt}' miniDate='false'/>&nbsp;';
  712. </ss:equal>
  713. <%--带codebook--%>
  714. <ss:equal val='${empty item2.field.cbName}' val2='false'>
  715. item.title += '<ss:cbTrans cb='${item2.field.cbName}' val='${item2.value}'/>&nbsp;';
  716. </ss:equal>
  717. </ss:rpt>
  718. </ss:rpt>
  719. </ss:equal>
  720. <%--正文或摘要--%>
  721. <ss:equal val='${empty item.second}' val2='false'>
  722. item.summary = '${item.second.value}';
  723. </ss:equal>
  724. <%-- 列表底部的对象属性(tags) --%>
  725. <ss:equal val='${empty item.first || empty item.third}' val2='false'>
  726. <%-- item.tags=[]; item.tags如果值为空,则会vue组件初始化失败,把item.tags的初始化变为提到条件之外,变成一定会初始化 Ben --%>
  727. <ss:rpt name='${item.third}' id='itemList'>
  728. <ss:rpt name='${itemList}' id='item2'>
  729. {
  730. let v;
  731. <%--不带codebook--%>
  732. <ss:equal val='${empty item2.field.cbName}' val2='true'>
  733. v = '<ss:txt val='${item2.value}' fmt='${item2.field.fmt}' miniDate='false'/>';
  734. </ss:equal>
  735. <%--带codebook--%>
  736. <ss:equal val='${empty item2.field.cbName}' val2='false'>
  737. v = '<ss:cbTrans cb='${item2.field.cbName}' val='${item2.value}'/>';
  738. </ss:equal>
  739. item.tags.push({'${item2.field.desc}': v});
  740. }
  741. </ss:rpt>
  742. </ss:rpt>
  743. </ss:equal>
  744. <%-- 对象变动前后属性列表 --%>
  745. item.changeItems = [];
  746. <ss:rpt name='${item.forth}' id='item3'>
  747. item.changeItems.push({
  748. name: '${item3.name}', oldValue: '${item3.oldValue}', newValue: '${item3.newValue}',
  749. onclick: function () {
  750. <ss:equal val='${item3.field["type"]}' val2='8'> <%-- ="html" --%>
  751. wd.display.showComponent({
  752. show: ["wdDialog"],
  753. url: "<ss:serv parm='{"newValue":"${item3.newValue}","oldValue":"${item3.oldValue}","type":"html"}' dest='bd_zwdb'/>", // {"wdConfirmationCaptchaService":"0",。Lin
  754. title: "正文对比",
  755. width: 1010,
  756. height: 540
  757. });
  758. </ss:equal>
  759. <ss:equal val='${item3.field["type"]}' valList='5,6'> <%-- ="picture,photo" --%>
  760. wd.display.showComponent({
  761. show: ["wdDialog"],
  762. url: "<ss:serv parm='{"newValue":"${item3.newValue}","oldValue":"${item3.oldValue}"}' dest='bd_tpdb'/>", // {"wdConfirmationCaptchaService":"0",。Lin
  763. title: "图片对比",
  764. width: 1010,
  765. height: 530
  766. });
  767. </ss:equal>
  768. <ss:equal val='${item3.field["type"]}' valList='2,3,1,9'> <%-- ="number,time,text,cms" --%>
  769. <%-- 原代码这里什么也没 --%>
  770. </ss:equal>
  771. }
  772. });
  773. </ss:rpt>
  774. <%-- 二级对象申请查看页面 --%>
  775. <ss:equal val='${dataType}' val2='bdplay'>
  776. item.buttons = [];
  777. item.buttons.push(
  778. {
  779. id: "${btn.btnID}",
  780. titlexxx: "申请查看",
  781. class: "cart-list-setting",
  782. title: "申请查看",
  783. onclick: () => {
  784. wd.display.showComponent({
  785. show: ["wdDialog"],
  786. url: "<ss:serv name='${btn.servName}' dest='${btn.dest}' parm='${btn.parm}'/>",
  787. title: "${btn.title}",
  788. width: "${btn.width}",
  789. height: "${btn.height}",
  790. minHeight: "${btn.minHeight}",
  791. maxHeight: "${btn.maxHeight}"
  792. });
  793. }
  794. }
  795. );
  796. </ss:equal>
  797. }
  798. </ss:rpt>
  799. <%-- 草稿箱end --%>
  800. //在用或停用的对象列表
  801. window.SS.dom.listConfig.list = [];
  802. <ss:rpt name='objectList' id='item'><%-- 循环一次生成一行列表 start --%>
  803. {
  804. let item = {};//列表的其中一行的属性
  805. window.SS.dom.listConfig.list.push(item);
  806. item.tags = [];
  807. <%-- item.tags如果值为空,则会vue组件初始化失败,把item.tags的初始化变为提到条件之外,变成一定会初始化 Ben --%>
  808. <ss:equal val='${item.service.state}' val2='0'><%-- 借阅 --%>
  809. item.onclick = function () {
  810. wd.display.showComponent({
  811. show: ["wdDialog"],
  812. url: "<ss:serv name='ydsq_tj' parm='{"ssObjId":"${item.ssObjId}","ssObjName":"${item.ssObjName}"}' dest='ydsq_tj'/>", // {"wdConfirmationCaptchaService":"0",。Lin
  813. title: "借阅",
  814. width: 613,
  815. height: 387
  816. });
  817. }
  818. </ss:equal>
  819. <ss:equal val='${empty item.service.play}' val2='false'><%-- 查看播放 --%>
  820. item.titlexxx = '${item.service.play.title}';
  821. item.onclick = function () {
  822. wd.display.showComponent({
  823. show: ["wdDialog"],
  824. url: "<ss:serv name='${item.service.play.servName}' dest='${item.service.play.dest}' parm='${item.service.play.parm}'/>",
  825. title: "${item.service.play.title}",
  826. width: ((${item.service.play.width}+DOM_SIZE_objInfoTabWidth) + ""),
  827. height: "${item.service.play.height}",
  828. minHeight: "${item.service.play.minHeight}",
  829. maxHeight: "${item.service.play.maxHeight}"
  830. });
  831. }
  832. </ss:equal>
  833. <%-- 缩略图 --%>
  834. <ss:equal val='${empty item.thumbnail}' val2='false'>
  835. <ss:equal val='${item.service.state}' val2='0'> <%-- 改 equal:val1="${item.service.state==0}" val2="true"。Lin --%>
  836. item.thumb = "${sessionScope['ssUser'].skinDir}image/object/default-${item.ssObjName}.png";
  837. item.errorThumb = '${sessionScope['ssUser'].skinDir}image/object/default.png';
  838. </ss:equal>
  839. <ss:notEqual val='${item.service.state}' val2='0'>
  840. item.thumb = "<ss:serv name='dlByHttp' parm='{"path":"${item.thumbnail.value}","type":"img"}'/>"; // {"wdConfirmationCaptchaService":"0",。Lin
  841. </ss:notEqual>
  842. </ss:equal>
  843. <%-- 标题 --%>
  844. <ss:equal val='${empty item.first}' val2='false'>
  845. <%--不带codebook--%>
  846. <ss:equal val='${empty item.first.field.cbName}' val2='true'>
  847. item.title = "<ss:txt val='${item.first.value}' fmt='${item.first.field.fmt}' miniDate='false'/>";
  848. </ss:equal>
  849. <%--带codebook--%>
  850. <ss:equal val='${empty item.first.field.cbName}' val2='false'>
  851. item.title = "<ss:cbTrans cb='${item.first.field.cbName}' val='${item.first.value}'/>";
  852. </ss:equal>
  853. </ss:equal>
  854. <%--缺标题显示属性start--%>
  855. <ss:equal val='${empty item.first && not empty item.third}' val2='true'>
  856. item.title = '';
  857. <ss:rpt name='${item.third}' id='itemList'>
  858. <ss:rpt name='${itemList}' id='item2'>
  859. item.title += '${item2.field.desc}:';
  860. <%--属性名--%>
  861. <%--不带codebook--%>
  862. <ss:equal val='${empty item2.field.cbName}' val2='true'>
  863. item.title += "<ss:txt val='${item2.value}' fmt='${item2.field.fmt}' miniDate='false'/>&nbsp;";
  864. </ss:equal>
  865. <%--带codebook--%>
  866. <ss:equal val='${empty item2.field.cbName}' val2='false'>
  867. item.title += "<ss:cbTrans cb='${item2.field.cbName}' val='${item2.value}'/>&nbsp;";
  868. </ss:equal>
  869. </ss:rpt>
  870. </ss:rpt>
  871. </ss:equal>
  872. <%--缺标题显示属性end--%>
  873. <%-- 摘要 --%>
  874. <ss:equal val='${empty item.second}' val2='false'>
  875. item.summary = '${item.second.value}';
  876. </ss:equal>
  877. <%-- 列表底部的对象标签组 --%>
  878. <ss:equal val='${empty item.first || empty item.third}' val2='false'>
  879. <%--item.tags=[]; item.tags如果值为空,则会vue组件初始化失败,把item.tags的初始化变为提到条件之外,变成一定会初始化 Ben --%>
  880. <ss:rpt name='${item.third}' id='itemList'>
  881. <ss:rpt name='${itemList}' id='item2'>
  882. {
  883. let v;
  884. <%--不带codebook--%>
  885. <ss:equal val='${empty item2.field.cbName}' val2='true'>
  886. v = '<ss:txt val='${item2.value}' fmt='${item2.field.fmt}' miniDate='false'/>';
  887. </ss:equal>
  888. <%--带codebook--%>
  889. <ss:equal val='${empty item2.field.cbName}' val2='false'>
  890. v = '<ss:cbTrans cb='${item2.field.cbName}' val='${item2.value}'/>';
  891. </ss:equal>
  892. item.tags.push({
  893. ${item2.field.desc}:
  894. v
  895. })
  896. ;
  897. }
  898. </ss:rpt>
  899. </ss:rpt>
  900. </ss:equal>
  901. <%--按钮--%>
  902. item.buttons = [];
  903. <ss:equal val='${empty item.service.change}' val2='false'>
  904. item.buttons.push(
  905. {
  906. id: "${'chg'==item.service.change.function.name?'change':'enable'}",
  907. titlexxx: "${item.service.change.title}",
  908. class: "cart-list-setting",
  909. title: "${'submRes'==item.service.change.function.name?'启用':'变动'}",
  910. onclick: () => {
  911. <%-- 下面的宽度width,如果是变动,则加上选项卡宽度 Ben(20251214) --%>
  912. wd.display.showComponent({
  913. show: ["wdDialog"],
  914. url: "<ss:serv name='${item.service.change.servName}' dest='${item.service.change.dest}' parm='${item.service.change.parm}'/>",
  915. title: "${item.service.change.title}",
  916. width: ((${item.service.change.width}+${'chg'==item.service.change.function.name?'DOM_SIZE_objInfoTabWidth':'0'}) + ""),
  917. height: "${item.service.change.height}",
  918. minHeight: "${item.service.change.minHeight}",
  919. maxHeight: "${item.service.change.maxHeight}"
  920. });
  921. }
  922. }
  923. );
  924. </ss:equal>
  925. <ss:equal val='${empty item.service.update}' val2='false'>
  926. item.buttons.push(
  927. {
  928. id: "update",
  929. titlexxx: "${item.service.update.title}",
  930. class: "cart-list-setting",
  931. title: "修改",
  932. onclick: () => {
  933. wd.display.showComponent({
  934. show: ["wdDialog"],
  935. url: "<ss:serv name='${item.service.update.servName}' dest='${item.service.update.dest}' parm='${item.service.update.parm}'/>",
  936. title: "${item.service.update.title}",
  937. width: ((${item.service.update.width}+DOM_SIZE_objInfoTabWidth) + ""),
  938. height: "${item.service.update.height}",
  939. minHeight: "${item.service.update.minHeight}",
  940. maxHeight: "${item.service.update.maxHeight}"
  941. });
  942. }
  943. }
  944. );
  945. </ss:equal>
  946. }
  947. </ss:rpt><%-- 循环一次生成一行列表 end --%>
  948. </script>
  949. <%-- <div class="search-bar">--%>
  950. <%-- <ss-breadcrumb></ss-breadcrumb>--%>
  951. <%-- <div class="search-bar-contaienr">--%>
  952. <!-- <ss-objp
  953. v-model="csd"
  954. name="csd"
  955. :opt="[{ label: '广东', value: '1' },{ label: '广西', value: '2' }]"
  956. placeholder="省份"
  957. width="150"
  958. input="true"
  959. ></ss-objp> -->
  960. <!-- <ss-search-input
  961. name="keyword"
  962. placeholder="关键词"
  963. v-model="form.keyword"
  964. width="200px"
  965. >
  966. </ss-search-input> -->
  967. <%-- <template v-for="item in formElemConfig">
  968. <template v-if="item.type == systemType.SEARCHDATE">
  969. <ss-search-date-picker
  970. v-model="item.value"
  971. :name="item.name"
  972. type="date"
  973. :placeholder="item.desc"
  974. width="100px"
  975. ></ss-search-date-picker>
  976. </template>
  977. <template v-if="item.type == systemType.SEARCHTIME">
  978. <ss-search-date-picker
  979. v-model="item.value"
  980. :name="item.name"
  981. type="time"
  982. :placeholder="item.desc"
  983. width="100px"
  984. ></ss-search-date-picker>
  985. </template>
  986. <template v-if="item.type == systemType.SEARCHDATETIME">
  987. <ss-search-date-picker
  988. v-model="item.value"
  989. :name="item.name"
  990. type="datetime"
  991. :placeholder="item.desc"
  992. width="200px"
  993. ></ss-search-date-picker>
  994. </template>
  995. <template v-if="item.type == systemType.OBJPICKER">
  996. <ss-objp
  997. v-model="item.value"
  998. :name="item.name"
  999. :opt="item.options"
  1000. :placeholder="item.desc"
  1001. width="150"
  1002. input="true"
  1003. ></ss-objp>
  1004. </template>
  1005. <template v-if="item.type == systemType.SEARCHINPUT">
  1006. <ss-search-input
  1007. :name="item.name"
  1008. :placeholder="item.desc"
  1009. v-model="item.value"
  1010. width="100px"
  1011. >
  1012. </ss-search-input>
  1013. </template>
  1014. </template>
  1015. <ss-search-button
  1016. text="所有"
  1017. icon-class="nav-icon-search"
  1018. :opt="searchButtonConfig"
  1019. :check-id="searchButtonConfigCheckId"
  1020. ></ss-search-button>
  1021. <template v-for="item in btnElemConfig">
  1022. <ss-search-button
  1023. :text="item.desc"
  1024. icon-class="nav-icon-add"
  1025. :opt="item.dropOptions"
  1026. :check-id="item.dropOptionsCheckId"
  1027. :onclick="item.onclick"
  1028. ></ss-search-button>
  1029. </template> --%>
  1030. <!-- <ss-search-button
  1031. text="新增(无下拉)"
  1032. icon-class="nav-icon-add"
  1033. onclick="console.log('点击了')"
  1034. ></ss-search-button> -->
  1035. <%-- </div>--%>
  1036. <%-- </div>--%>
  1037. <div class="content-area item-content-area" style="gap: 20px">
  1038. <%-- // 功能说明:二级列表加载中提示(搜索/翻页走接口刷新) by xu 20260115 --%>
  1039. <div v-if="loadingCobj" class="cobj-loading">
  1040. <div class="cobj-spinner"></div>
  1041. </div>
  1042. <!-- // 功能说明:二级列表接口返回 ssCode/ssMsg 时展示错误信息 by xu 20260206 -->
  1043. <div v-else-if="cobjInitError" class="cobj-error">{{ cobjInitError }}</div>
  1044. <template v-else>
  1045. <template v-for="(item, i) in listConfig.draftbox" :key="i">
  1046. <ss-folder-card v-if="item.children" :item="item"></ss-folder-card>
  1047. <ss-cobj-card-list v-else :item="item" :ss-obj-name="ssObjName"></ss-cobj-card-list>
  1048. <!-- // 功能说明:二级对象列表使用 ss-cobj-card-list(新卡片样式但仅查看) by xu 20260115 -->
  1049. </template>
  1050. <template v-for="(item, i) in listConfig.list" :key="i">
  1051. <ss-folder-card v-if="item.children" :item="item"></ss-folder-card>
  1052. <ss-cobj-card-list v-else :item="item" :ss-obj-name="ssObjName"></ss-cobj-card-list>
  1053. <!-- // 功能说明:二级对象列表使用 ss-cobj-card-list(新卡片样式但仅查看) by xu 20260115 -->
  1054. </template>
  1055. <%-- // 功能说明:二级对象翻页:改用前端 ssPaging(接口返回)驱动分页组件 by xu 20260115 --%>
  1056. <ss-page
  1057. v-show="Number(ssPaging && ssPaging.rowNum || 0) > 0"
  1058. :total="Number(ssPaging && ssPaging.rowNum || 0)"
  1059. :size="Number(ssPaging && ssPaging.rowNumPer || 12)" <%-- // 功能说明:分页默认每页12条 by xu 20260116 --%>
  1060. :page="Number(ssPaging && ssPaging.pageNo || 1)"
  1061. @change="handlePageChange">
  1062. </ss-page>
  1063. </template>
  1064. </div>
  1065. <input name='wdComponentID' type='hidden' value='cobjList'/>
  1066. </form>
  1067. </div>
  1068. <script>
  1069. var all = $("tr[searchid][searchpid='']");
  1070. for (var i = 0; i < all.length; i++) {
  1071. var searchid = $(all[i]).attr("searchid");
  1072. var child = $("tr[searchpid='" + searchid + "' ]").length;
  1073. console.log(child);
  1074. $("tr[searchid][searchpid='']").eq(i).find('.listnumber').html(child);
  1075. }
  1076. </script>
  1077. <script type="text/javascript">var wdRecordValue = '${wdRecordValue}';</script>
  1078. <script type="text/javascript" src="/ss/js/wdRecord.js"></script>
  1079. <script type="text/javascript">(function () {
  1080. wdRecord("cobjList");
  1081. })();</script>
  1082. <script type="text/javascript" src="/ss/js/wdFitHeight.js"></script>
  1083. <script type="text/javascript">initWdFitHeight(100)</script>
  1084. <script type="text/javascript">initWdFitHeightFunction = function () {
  1085. initWdFitHeight(100);
  1086. };</script>
  1087. <ss:equal val="${empty resizeComponent}" val2="false">
  1088. <script>{
  1089. var iframe = wd.display.getFrameOfWindow();
  1090. if (iframe && iframe.contentWindow == window)
  1091. wd.display.resizeComponent(${resizeComponent.width}, ${resizeComponent.height}, ${empty resizeComponent.minHeight?'null':resizeComponent.minHeight}, ${empty resizeComponent.maxHeight?'null':resizeComponent.maxHeight});
  1092. }</script>
  1093. </ss:equal>
  1094. <ss:help/>
  1095. </body>
  1096. <script type="text/javascript">
  1097. try {
  1098. wd.display.showMsgPopup('${msg}');
  1099. } catch (err) {
  1100. console.error(err);
  1101. }
  1102. </script>
  1103. <ss:equal val="${empty wdclosewindowparam}" val2="false">
  1104. <script type="text/javascript">
  1105. try {
  1106. wd.display.setCloseWindowParam('${wdclosewindowparam}');
  1107. } catch (err) {
  1108. console.error(err);
  1109. }
  1110. </script>
  1111. </ss:equal>
  1112. </html>
  1113. <script type="module">
  1114. <%-- 打印新UI相关json对象 --%>
  1115. console.log('搜索条件:' + JSON.stringify(window.SS.dom.formElemConfig));
  1116. console.log('按钮:' + JSON.stringify(window.SS.dom.btnElemConfig));
  1117. console.log('列表:' + JSON.stringify(window.SS.dom.listConfig));
  1118. function objectPickMockAjax(url) {
  1119. return new Promise((resolve) => {
  1120. setTimeout(() => {
  1121. resolve([
  1122. {label: '学校领导', value: '190'},
  1123. {label: '业务部', value: '101241'},
  1124. {label: '男', value: '1'},
  1125. {label: '女', value: '2'}
  1126. ]);
  1127. }, 1000);
  1128. });
  1129. }
  1130. // 定义 objPickerLoad 函数
  1131. async function objPickerLoad(url, optionsName) {
  1132. const result = await objectPickMockAjax(url);
  1133. return result;
  1134. }
  1135. console.log(window.SS.dom.formElemConfig);
  1136. const data = {
  1137. systemType: window.SS.dom.TYPE,
  1138. listConfig: window.SS.dom.listConfig,
  1139. formElemConfig: window.SS.dom.formElemConfig,
  1140. btnElemConfig: window.SS.dom.btnElemConfig,
  1141. // 功能说明:二级对象查询服务名(首次/后续统一一个),用于初始化时调接口打印返回 by xu 20260115
  1142. ssSearchCobjServName: "${ssSearchCobjServName}",
  1143. ssPobjName:"${ssPobjName}", // requestParentViewObject:"${requestParentViewObject}",。Lin
  1144. dataType:"${dataType}", // 增加,传递给 searchCobjByA()。Lin
  1145. // 功能说明:从 JSP 注入当前对象信息,供二级对象初始化接口拼参使用(key=ssObjName+'id') by xu 20260115
  1146. ssObjName: "${ssObjName}",
  1147. ssObjId: "${ssObjId}",
  1148. ssPobjIdName: "${ssPobjIdName}",
  1149. // 功能说明:二级对象页面:接口返回的搜索/按钮/草稿/列表/翻页数据(无右侧栏) by xu 20260115
  1150. searchFieldList: [],
  1151. rootFuncList: [],
  1152. hasKeyWord: false,
  1153. searchForm: {},
  1154. // 功能说明:搜索条件下拉 option 映射(key=字段名,value=options数组),用于回显选中 by xu 20260115
  1155. searchFieldOptMap: {},
  1156. // 功能说明:缩略图类型(与 objList 一致:1=thumbnail,2=photo),用于卡片占位区域判断 by xu 20260115
  1157. thnType: 0,
  1158. ssPaging: {pageNo: 1, rowNumPer: 12, rowNum: 0}, // 功能说明:默认每页12条 by xu 20260116
  1159. // 功能说明:二级列表接口加载状态(搜索/翻页) by xu 20260115
  1160. loadingCobj: false,
  1161. // 功能说明:二级列表接口错误信息(返回 ssCode/ssMsg 时展示) by xu 20260206
  1162. cobjInitError: "",
  1163. // 功能说明:二级列表请求序号,避免并发返回覆盖(取最后一次) by xu 20260115
  1164. cobjReqId: 0,
  1165. searchButtonConfigCheckId: '${management}',
  1166. searchButtonConfig: [
  1167. {id: "99", desc: "所有"},
  1168. {id: "2", desc: "管理"},
  1169. {id: "1", desc: "创建"},
  1170. {id: "3", desc: "已办"},
  1171. {id: "55", desc: "停用"},
  1172. ],
  1173. }
  1174. if (window.SS.dom.formElemConfig) {
  1175. Object.entries(window.SS.dom.formElemConfig).forEach(([key, config]) => {
  1176. data[key] = config.value;
  1177. // 处理 objPicker
  1178. if (config.type === window.SS.dom.TYPE.OBJPICKER) {
  1179. data[key + "ObjPicker"] = true;
  1180. data[key + "Option"] = [];
  1181. data[key + "Url"] = config.optUrl;
  1182. }
  1183. })
  1184. }
  1185. console.log('data:' + JSON.stringify(data));
  1186. SS.ready(function () {
  1187. try {
  1188. window.ss.dom.initializeFormApp({
  1189. el: "#app",
  1190. data() {
  1191. return data;
  1192. },
  1193. methods: {
  1194. // 功能说明:从表单提取参数,供二级对象初始化接口调用 by xu 20260115
  1195. getSearchFormParams() {
  1196. var params = {};
  1197. // 功能说明:二级对象初始化接口仅传查询相关参数,过滤统计图等无关隐藏字段 by xu 20260115
  1198. // 功能说明:分页参数以 pageNo/rowNumPer/rowNum 为准,过滤旧分页/组件标识字段,避免入参混乱 by xu 20260115
  1199. // 功能说明:rowNum/pageCount/rowCountPerPage 这类为回显/统计字段,初始化查询不需要传给后端 by xu 20260115
  1200. var skip = {
  1201. addgrtjUrl: 1,
  1202. grtjSizeUrl: 1,
  1203. getgrtjJsonUrl: 1,
  1204. pageCount: 1,
  1205. rowCountPerPage: 1,
  1206. wdComponentID: 1,
  1207. rowNum: 1
  1208. };
  1209. try {
  1210. var arr = $("#myForm").serializeArray();
  1211. arr.forEach(function (it) {
  1212. if (!it || !it.name) return;
  1213. if (skip[it.name]) return;
  1214. params[it.name] = it.value;
  1215. });
  1216. } catch (e) {
  1217. console.log("getSearchFormParams failed", e);
  1218. }
  1219. // 功能说明:接口驱动搜索条件时,searchForm 可能不落到 DOM input,上行序列化取不到;这里补充合并 by xu 20260115
  1220. try {
  1221. var sf = this.searchForm || {};
  1222. Object.keys(sf).forEach(function (k) {
  1223. var v = sf[k];
  1224. if (v === undefined || v === null) return;
  1225. if (typeof v === "object") return;
  1226. params[k] = String(v);
  1227. });
  1228. } catch (e) {
  1229. }
  1230. // 功能说明:分页参数以页面 ssPaging 为准(仅传 pageNo/rowNumPer),避免把 rowNum(总数) 回传后端 by xu 20260115
  1231. try {
  1232. if (this.ssPaging) {
  1233. params.pageNo = Number(this.ssPaging.pageNo || 1);
  1234. params.rowNumPer = Number(this.ssPaging.rowNumPer || 12); // 功能说明:分页默认每页12条 by xu 20260116
  1235. }
  1236. } catch (e) {
  1237. }
  1238. return params;
  1239. },
  1240. // 功能说明:触发搜索(重置页码并重新调用接口) by xu 20260115
  1241. doSearch() {
  1242. try {
  1243. this.ssPaging.pageNo = 1;
  1244. } catch (e) {
  1245. }
  1246. this.loadCobjInit();
  1247. },
  1248. // 功能说明:切换范围(所有/管理/创建/已办/停用)不再提交表单,改为走接口刷新 by xu 20260115
  1249. switchScope(management) {
  1250. try {
  1251. document.getElementsByName("management")[0].value = String(management);
  1252. } catch (e) {
  1253. }
  1254. try {
  1255. this.searchButtonConfigCheckId = String(management);
  1256. } catch (e) {
  1257. }
  1258. this.doSearch();
  1259. },
  1260. // 功能说明:调用 /service?ssServ=... 并解析 JSON,供二级对象初始化调试使用 by xu 20260115
  1261. callSsService(ssServ, extraParams) {
  1262. if (!ssServ) return Promise.resolve(null);
  1263. var p = extraParams || {};
  1264. return new Promise(function (resolve) {
  1265. $.ajax({
  1266. type: "get",
  1267. url: "/service",
  1268. data: Object.assign({ssServ: ssServ}, p),
  1269. dataType: "text",
  1270. })
  1271. .done(function (text) {
  1272. if (typeof text !== "string") return resolve(text);
  1273. var t = String(text || "").trim();
  1274. if (!t) return resolve(null);
  1275. try {
  1276. return resolve(JSON.parse(t));
  1277. } catch (e) {
  1278. return resolve(text);
  1279. }
  1280. })
  1281. .fail(function (xhr, status, err) {
  1282. console.log("callSsService failed", ssServ, status, err);
  1283. resolve(null);
  1284. });
  1285. });
  1286. },
  1287. // 功能说明:二级对象页面初始化时调用 ssSearchCobjServName 并打印返回(仅联调用) by xu 20260115
  1288. loadCobjInit() {
  1289. var self = this;
  1290. var ssServ = this.ssSearchCobjServName;
  1291. if (!ssServ) return;
  1292. // 功能说明:进入 loading,并递增请求序号(只处理最后一次返回) by xu 20260115
  1293. var reqId = (this.cobjReqId = Number(this.cobjReqId || 0) + 1);
  1294. var startedAt = Date.now();
  1295. this.loadingCobj = true;
  1296. // 功能说明:发起新请求前清空上一次接口错误提示 by xu 20260206
  1297. this.cobjInitError = "";
  1298. var params = this.getSearchFormParams();
  1299. // 功能说明:二级对象查询额外携带“当前对象id”(key=ssObjName+'id',value=ssObjId),由 JSP 注入 by xu 20260115
  1300. try {
  1301. var objName = String(this.ssObjName || "").trim();
  1302. var objId = String(this.ssObjId || "").trim();
  1303. if (objName && objId) params[this.ssPobjIdName] = objId;
  1304. } catch (e) {
  1305. }
  1306. // 功能说明:二级对象查询额外携带 requestParentViewObject(由 JSP 注入),用于后端识别父视图对象请求场景 by xu 20260126
  1307. try {
  1308. var rpv = String(this.ssPobjName || "").trim(); // (this.requestParentViewObject ||。Lin
  1309. if (rpv) params.ssPobjName = rpv; // .requestParentViewObject =。Lin
  1310. /// 增加,传递给 searchCobjByA()。Lin
  1311. var dtv = String(this.dataType || "").trim();
  1312. if (dtv) params.dataType = dtv;
  1313. ///
  1314. } catch (e) {
  1315. }
  1316. // 功能说明:打印最终请求参数,避免不清楚拼接了什么 by xu 20260115
  1317. try {
  1318. console.log("[cobj] init params", params);
  1319. console.log("[cobj] init qs", $.param(Object.assign({ssServ: ssServ}, params)));
  1320. } catch (e) {
  1321. }
  1322. this.callSsService(ssServ, params)
  1323. .then(function (res) {
  1324. if (reqId !== self.cobjReqId) return;
  1325. console.log("[cobj] init", ssServ, res);
  1326. // 功能说明:接口返回同时包含 ssCode/ssMsg 时按错误态展示在页面 by xu 20260206
  1327. var isBizError = !!(res && typeof res === "object"
  1328. && Object.prototype.hasOwnProperty.call(res, "ssCode")
  1329. && Object.prototype.hasOwnProperty.call(res, "ssMsg"));
  1330. if (isBizError) {
  1331. self.cobjInitError = "错误(" + String(res.ssCode) + "):" + String(res.ssMsg == null ? "" : res.ssMsg);
  1332. return;
  1333. }
  1334. // 功能说明:将接口返回写回页面(搜索条件/根按钮/草稿箱/列表/翻页),用于二级对象新UI渲染 by xu 20260115
  1335. try {
  1336. var ssData = res && typeof res === "object" ? (res.ssData || res) : null;
  1337. if (ssData) self.applyCobjData(ssData);
  1338. } catch (e) {
  1339. }
  1340. })
  1341. .finally(function () {
  1342. if (reqId !== self.cobjReqId) return;
  1343. var delay = Math.max(0, 200 - (Date.now() - startedAt));
  1344. setTimeout(function () {
  1345. if (reqId !== self.cobjReqId) return;
  1346. self.loadingCobj = false;
  1347. }, delay);
  1348. });
  1349. },
  1350. // 功能说明:将 cobjList 接口返回映射到页面状态(无右侧栏) by xu 20260115
  1351. applyCobjData(ssData) {
  1352. if (!ssData || typeof ssData !== "object") return;
  1353. this.searchFieldList = Array.isArray(ssData.searchFieldList) ? ssData.searchFieldList : [];
  1354. this.rootFuncList = Array.isArray(ssData.rootFuncList) ? ssData.rootFuncList : [];
  1355. this.hasKeyWord = !!ssData.hasKeyWord;
  1356. // 功能说明:缩略图类型 thnType 由接口返回(若存在),用于统一控制卡片是否保留缩略图区域 by xu 20260115
  1357. try {
  1358. if (ssData.thnType != null) this.thnType = Number(ssData.thnType || 0);
  1359. } catch (e) {
  1360. }
  1361. // 功能说明:根据 searchFieldList 拉取下拉选项(cbName),用于回显选中项 by xu 20260115
  1362. this.loadSearchFieldOptions();
  1363. if (ssData.ssPaging && typeof ssData.ssPaging === "object") {
  1364. this.ssPaging = {
  1365. pageNo: Number(ssData.ssPaging.pageNo || 1),
  1366. rowNumPer: Number(ssData.ssPaging.rowNumPer || 12), // 功能说明:分页默认每页12条 by xu 20260116
  1367. rowNum: Number(ssData.ssPaging.rowNum || 0),
  1368. };
  1369. }
  1370. var self = this;
  1371. // 功能说明:二级对象卡片字段规范化(title/catList 支持 fmt 时间格式化),逻辑参考 objList by xu 20260115
  1372. function pad2(n) {
  1373. return String(n).padStart(2, "0");
  1374. }
  1375. function toDate(val) {
  1376. if (val == null) return null;
  1377. if (val instanceof Date) return isNaN(val.getTime()) ? null : val;
  1378. try {
  1379. var s = String(val);
  1380. s = s.replace(/\u00a0|\u202f/g, " ").replace(/ /g, " ").trim();
  1381. var d = new Date(s);
  1382. return isNaN(d.getTime()) ? null : d;
  1383. } catch (e) {
  1384. return null;
  1385. }
  1386. }
  1387. function normalizeVal(v) {
  1388. if (v === undefined || v === null) return "";
  1389. if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") return String(v);
  1390. if (typeof v === "object") {
  1391. if (v.val != null) {
  1392. if (v.fmt) return window.ssTools.formatValByFmt(v.val, v.fmt);
  1393. return String(v.val);
  1394. }
  1395. }
  1396. return String(v);
  1397. }
  1398. function normalizeTitle(t) {
  1399. return normalizeVal(t);
  1400. }
  1401. function normalizeCard(raw) {
  1402. var card = raw && typeof raw === "object" ? Object.assign({}, raw) : {};
  1403. card.title = normalizeTitle(raw && raw.title);
  1404. // 功能说明:二级对象卡片缩略图规则参考 objList:用 thumbType 控制“是否保留缩略图区域”,thumb 有值才渲染图片(无图显示占位) by xu 20260115
  1405. try {
  1406. var thnType = Number(self.thnType || 0);
  1407. if (thnType === 1) card.thumbType = "thumbnail";
  1408. else if (thnType === 2) card.thumbType = "photo";
  1409. } catch (e) {
  1410. }
  1411. // 功能说明:thn 不为空 => 有图片(否则组件按 thumbType 显示占位 icon);URL 走 dlByHttp by xu 20260115
  1412. try {
  1413. var thn = raw && raw.thn;
  1414. if (thn) card.thumb = window.ssTools.buildThumbUrl(thn);
  1415. } catch (e) {
  1416. }
  1417. // 功能说明:二级对象卡片标签:由 catList(desc/val) 映射到组件 item.tags(key:desc, value:val) by xu 20260115
  1418. card.tags = [];
  1419. try {
  1420. var catList = raw && Array.isArray(raw.catList) ? raw.catList : [];
  1421. card.tags = catList.map(function (c) {
  1422. if (!c || typeof c !== "object") return null;
  1423. var k = c.desc != null ? String(c.desc) : "";
  1424. if (!k) return null;
  1425. var v = c.fmt ? window.ssTools.formatValByFmt(c.val, c.fmt) : normalizeVal(c.val);
  1426. var o = {};
  1427. o[k] = v;
  1428. return o;
  1429. }).filter(Boolean);
  1430. } catch (e) {
  1431. }
  1432. card.buttons = [];
  1433. if (raw && raw.chg) {
  1434. card.buttons.push({
  1435. id: "change",
  1436. class: "cart-list-setting",
  1437. title: "变动",
  1438. onclick: function () {
  1439. self.openServiceDialog(raw.chg);
  1440. },
  1441. });
  1442. }
  1443. card.onclick = function () {
  1444. if (raw && raw.play) return self.openServiceDialog(raw.play);
  1445. };
  1446. return card;
  1447. }
  1448. var draftList = Array.isArray(ssData.draftList) ? ssData.draftList : [];
  1449. var objList = Array.isArray(ssData.objList) ? ssData.objList : [];
  1450. this.listConfig = this.listConfig || {};
  1451. this.listConfig.draftbox = draftList.map(normalizeCard);
  1452. this.listConfig.list = objList.map(normalizeCard);
  1453. // 功能说明:强制触发一次 listConfig 更新,避免 Vue 不刷新 by xu 20260115
  1454. this.listConfig = Object.assign({}, this.listConfig);
  1455. },
  1456. // 功能说明:缩略图 URL 构建(参考 objList:dlByHttp 直出图片) by xu 20260115
  1457. // 功能说明:拉取 searchFieldList 中 cbName 下拉的 options,并写入 searchFieldOptMap by xu 20260115
  1458. loadSearchFieldOptions() {
  1459. var self = this;
  1460. var list = Array.isArray(this.searchFieldList) ? this.searchFieldList : [];
  1461. if (!list.length) return;
  1462. list.forEach(function (f) {
  1463. if (!f || !f.name || !f.cbName) return;
  1464. if (self.searchFieldOptMap && Array.isArray(self.searchFieldOptMap[f.name]) && self.searchFieldOptMap[f.name].length) return;
  1465. self.callSsService("loadObjpOpt", {
  1466. objectpickerdropdown1: 1,
  1467. cb: f.cbName
  1468. }).then(function (res) {
  1469. var raw = null;
  1470. if (Array.isArray(res)) raw = res;
  1471. else if (res && typeof res === "object") raw = res.ssData || res.data || res.dataArray || null;
  1472. if (!Array.isArray(raw)) raw = [];
  1473. var opts = raw.map(function (it) {
  1474. if (!it || typeof it !== "object") return null;
  1475. var label = it.label != null ? it.label : (it.mc != null ? it.mc : (it.desc != null ? it.desc : ""));
  1476. var value = it.value != null ? it.value : (it.val != null ? it.val : (it.id != null ? it.id : (it.bm != null ? it.bm : "")));
  1477. if (label == null || label === "") label = String(value || "");
  1478. return {label: String(label), value: String(value)};
  1479. }).filter(Boolean);
  1480. self.searchFieldOptMap = Object.assign({}, (self.searchFieldOptMap || {}), {[f.name]: opts});
  1481. });
  1482. });
  1483. },
  1484. // 功能说明:二级对象页面打开服务(兼容 ssToken 与 servName/dest/parm) by xu 20260115
  1485. openServiceDialog(srv) {
  1486. // 功能说明:使用 tools.js 统一封装的 openServiceDialog by xu 20260122
  1487. if (!srv) return;
  1488. window.ssTools.openServiceDialog(srv);
  1489. },
  1490. handlePageChange({pageNo, rowNumPer, rowNum}) {
  1491. // 功能说明:二级对象翻页:更新 ssPaging 后重新调用接口刷新列表 by xu 20260115
  1492. this.ssPaging.pageNo = pageNo;
  1493. this.ssPaging.rowNumPer = rowNumPer;
  1494. this.ssPaging.rowNum = rowNum;
  1495. this.loadCobjInit();
  1496. }
  1497. },
  1498. mounted() {
  1499. const self = this;
  1500. // 功能说明:修复“点击所有/管理后页面消失”:禁止 form submit,改为回调 switchScope 走接口刷新 by xu 20260115
  1501. try {
  1502. if (Array.isArray(this.searchButtonConfig)) {
  1503. this.searchButtonConfig = this.searchButtonConfig.map((opt) => Object.assign({}, opt, {callback: () => this.switchScope(opt.id)}));
  1504. }
  1505. } catch (e) {
  1506. }
  1507. // 功能说明:暴露 vm + 提供 wdRefresh,弹窗保存后只刷新二级对象列表数据(走 Ajax),避免 form.submit 导致白屏 by xu 20260202
  1508. try {
  1509. window.__cobjListVm = this;
  1510. } catch (e) {
  1511. }
  1512. try {
  1513. const vm = this;
  1514. window.wdRefresh = function () {
  1515. try {
  1516. vm.loadCobjInit();
  1517. } catch (e) {
  1518. console.error("[cobjList] wdRefresh failed", e);
  1519. }
  1520. };
  1521. } catch (e) {
  1522. }
  1523. // 功能说明:mounted 时先调二级对象接口打印返回,便于对齐字段 by xu 20260115
  1524. this.loadCobjInit();
  1525. // 在这里可以使用 Vue 实例
  1526. Object.entries(this.$data).forEach(([key, value]) => {
  1527. // 处理 objPicker
  1528. if (key.includes('ObjPicker')) {
  1529. const originalKey = key.replace('ObjPicker', '');
  1530. if (value) {
  1531. objPickerLoad(value, key).then(result => {
  1532. if (self.formElemConfig[originalKey]) {
  1533. self.formElemConfig[originalKey].name = originalKey;
  1534. self.formElemConfig[originalKey].options = result;
  1535. }
  1536. });
  1537. }
  1538. }
  1539. }
  1540. );
  1541. }
  1542. });
  1543. } catch (e) {
  1544. console.log("cobjList error:", e)
  1545. }
  1546. });
  1547. tokenCleanser("<ss:serv name='clearPageToken'/>", {tokenList: "<%= pageContext.getAttribute(ss.page.PageC.PAGE_tokenList)%>"});
  1548. </script>