objInp.jsp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. <%@ page language="java" pageEncoding="UTF-8" isELIgnored="false" %>
  2. <%@ taglib uri="/ssTag" prefix="ss"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta http-equiv="pragma" content="no-cache">
  7. <meta http-equiv="cache-control" content="no-cache">
  8. <meta http-equiv="expires" content="0">
  9. <script type="text/javascript" src="/ss/jquery/jquery.js"></script>
  10. <script src="/js/load.js"></script> <%-- ="/newUI/ss/js/base.js"。Lin(新UI) --%>
  11. <script type="text/javascript" src="/js/display.js"></script>
  12. <script type="text/javascript" src="/js/form.js"></script>
  13. <%-- <script type="text/javascript" src="/ss/js/display.js"></script>--%>
  14. <%-- <script type="text/javascript" src="/ss/jquery/jquery.js"></script>--%>
  15. <%-- <script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.js"></script>--%>
  16. <%-- <script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.iframehelper.min.js"></script> --%>
  17. <%-- <script type="module" src="/newUI/ss/js/validation-manager.js"></script>
  18. <script type="module" src="/newUI/ss/js/validator-rules.js"></script> --%>
  19. <script>
  20. window.ss.dom.formElemConfig = window.ss.dom.formElemConfig || {};<%-- 放当前页面表单元素配置的变量--%>
  21. window.ss.dom.btnElemConfig = window.ss.dom.btnElemConfig|| {};<%-- 放当前页面按钮元素配置的变量 Ben(20251211) --%>
  22. </script>
  23. <style>
  24. .table-container>tr>th{
  25. width:130px !important;
  26. }
  27. /* 把content-box的高度限制 从公共css 抽到具体有需要的页面 by xu 20251215 */
  28. .form-container .content-box {
  29. height: calc(100% - 80px) !important;
  30. }
  31. </style>
  32. </head>
  33. <body class="env-input-body">
  34. <form method="post" id="app" class="form-container">
  35. <%-- 改为 <data@ss name="inp"/>。Lin
  36. <tab@ss name="include_input"/> --%>
  37. <ss:data name='inp'/>
  38. <div class="content-box fit-height-content">
  39. <jsp:include page="${include_input}" flush="true"/>
  40. <%-- <jsp:include page="/page/2ry_inp.jsp" flush="true"/>--%>
  41. </div>
  42. <div class='bottom-div'>
  43. <ss:equal val='${empty saveDest}' val2='false'>
  44. <%-- 保存按钮 --%>
  45. <ss-bottom-button
  46. text="${saveButtonValue}"
  47. <%-- type="submit"--%>
  48. onclick='ss.form.submit({url:"<ss:serv name='${save}' dest='${saveDest}' parm='${saveParam}'/>",width:${savewidth},height:${saveheight},minHeight:${saveminheight},maxHeight:${savemaxheight}});'
  49. <%-- onclick='wd.display.changeFormAction("<ss:serv name='${save}' dest='${saveDest}' parm='${saveParam}'/>",this,${savewidth},${saveheight},${saveminheight},${savemaxheight});'--%>
  50. icon-class="bottom-div-save"
  51. ></ss-bottom-button>
  52. </ss:equal>
  53. <%-- <div class="bottom-down-div border-top"> --%>
  54. <%-- <ss:equal val='${empty saveDest}' val2='false'>--%>
  55. <!-- 保存按钮 start -->
  56. <%-- <input v-show="false" type="submit" value="${saveButtonValue}" class="bottom-button"
  57. onclick='ss.display.changeFormAction("<ss:serv name='${save}' dest='${saveDest}' parm='${saveParam}'/>",this,${savewidth},${saveheight},${saveminheight},${savemaxheight});'
  58. > --%>
  59. <!-- 保存按钮 end -->
  60. <%-- </ss:equal>--%>
  61. <ss:equal val='${empty saveAndCommitDest}' val2='false'>
  62. <ss-bottom-button
  63. id="saveAndCommit"
  64. text="${saveAndCommitButtonValue}"
  65. onclick='ss.objInp.submitAndCollapseParent({url:"<ss:serv name='${saveAndCommit}' dest='${saveAndCommitDest}' parm='${saveAndCommitParam}'/>",width:${saveAndCommitwidth},height:${saveAndCommitheight},minHeight:${saveAndCommitminheight},maxHeight:${saveAndCommitmaxheight},targetWin:null});'<%-- 最后一个参数原来为targetWin:parent导致刷新了顶层窗口,改为null Ben(20251215) --%>
  66. icon-class="bottom-div-save"
  67. ></ss-bottom-button>
  68. <!-- 保存并提交按钮 start -->
  69. <%-- <input type="button" value="${saveAndCommitButtonValue}" class="bottom-button"
  70. onclick='ss.display.reset("dialog",this,"<ss:serv name='${saveAndCommit}' dest='${saveAndCommitDest}' parm='${saveAndCommitParam}'/>",${saveAndCommitwidth},${saveAndCommitheight},${saveAndCommitminheight},${saveAndCommitmaxheight});'
  71. > --%>
  72. <!-- 保存并提交按钮 end -->
  73. </ss:equal>
  74. <ss:equal val='${empty changeNoFunctions}' val2='false'>
  75. <%--只有一个变动--%>
  76. <!-- 只有一个变动时的 停用按钮 start -->
  77. <ss:equal val='${changeNoSize}' val2='1'>
  78. <ss-bottom-button
  79. text="${changeNoFunctions[0].desc}"
  80. onclick='ss.form.submit({url:"<ss:serv name='${changeNoFunctions[0].servName}' dest='${changeNoFunctions[0].dest}' parm='{ssObjId:"${ssObjId}",ssObjName:"${ssObjName}","${ssObjIdName}":"${ssObjId}",dataType:"${empty dataType?1:dataType}",ssPobjName:"${ssPobjName}"}'/>",width:${changeNoFunctions[0].width},height:${changeNoFunctions[0].height},minHeight:${changeNoFunctions[0].minHeight},maxHeight:${changeNoFunctions[0].maxHeight},targetWin:parent});'
  81. icon-class="bottom-div-close"
  82. ></ss-bottom-button>
  83. <%-- <input type="button" value="${changeNoFunctions[0].name}" class="bottom-button"
  84. onclick='ss.display.reset("dialog",this,"<ss:serv name='${changeNoFunctions[0].servName}' dest='${changeNoFunctions[0].dest}' parm='{ssObjId:"${ssObjId}",ssObjName:"${ssObjName}","${ssObjIdName}":"${ssObjId}",dataType:"${empty dataType?1:dataType}",requestParentViewObject:"${requestParentViewObject}"}'/>",${changeNoFunctions[0].width},${changeNoFunctions[0].height},${changeNoFunctions[0].minHeight},${changeNoFunctions[0].maxHeight});'
  85. > --%>
  86. </ss:equal>
  87. <!-- 只有一个变动 end -->
  88. <%--有多个变动--%>
  89. <!--有多个变动 start -->
  90. <ss:notEqual val='${changeNoSize}' val2='1'>
  91. <%-- 更多变动按钮数据 Ben(20251211) --%>
  92. <script>
  93. window.ss.dom.btnElemConfig.moreChg={desc:"更多变动",dropOptions:[]};
  94. </script>
  95. <ss:rpt id='item' name='changeNoFunctions'>
  96. <script>
  97. window.ss.dom.btnElemConfig.moreChg.dropOptions.push(
  98. {
  99. desc:'${item.desc}',<%-- 按钮名 --%>
  100. callback: function(){
  101. ss.form.submit({url:"<ss:serv name='${item.servName}' dest='${item.dest}' parm='{ssObjId:"${ssObjId}",ssObjName:"${ssObjName}","${ssObjIdName}":"${ssObjId}",dataType:"${empty dataType?1:dataType}",ssPobjName:"${ssPobjName}"}'/>",width:${item.width},height:${item.height},minHeight:${item.minHeight},maxHeight:${item.maxHeight},targetWin:parent});
  102. }
  103. }
  104. );
  105. </script>
  106. <%-- 改成vue写法 Ben(20251211)
  107. <input style="display:none;" class="changebutton" index="${index}" type="button" value="${item.desc}"
  108. onclick='ss.form.submit({url:"<ss:serv name='${item.servName}' dest='${item.dest}' parm='{ssObjId:"${ssObjId}",ssObjName:"${ssObjName}","${ssObjIdName}":"${ssObjId}",dataType:"${empty dataType?1:dataType}",requestParentViewObject:"${requestParentViewObject}"}'/>",width:${item.width},height:${item.height},minHeight:${item.minHeight},maxHeight:${item.maxHeight},targetWin:parent});'
  109. >
  110. --%>
  111. </ss:rpt>
  112. <%-- 修改支持更多按钮 by xu 20251211 --%>
  113. <ss-bottom-button
  114. more="moreChg"
  115. ></ss-bottom-button>
  116. <%-- 改成vue写法 Ben(20251211)
  117. <input id="morebutton" type="button" value="更多变动" class="bottom-button"/>
  118. <script>ss.display.attachButton("morebutton","changebutton");</script>
  119. --%>
  120. </ss:notEqual>
  121. <!--有多个变动 end -->
  122. </ss:equal>
  123. <!-- 删除按钮 start -->
  124. <ss:equal val='${empty deleteDest}' val2='false'>
  125. <%--
  126. <input type="submit" value="删除" onclick="wd.display.changeFormAction(&quot;<wd:token service='${delete}' dest='${deleteDest}' param='${deleteParam}' test='' />&quot;,this);" class="bottom-button" ></wd:equal>
  127. --%>
  128. <ss-bottom-button
  129. text="${deleteButtonValue}"
  130. onclick='ss.form.confirm("删除","是否删除?",function (){ss.form.submit({url:"<ss:serv name='${delete}' dest='${deleteDest}' parm='${deleteParam}'/>",targetWin:parent});},null)'
  131. <%-- onclick='ss.display.confirm("删除","是否删除?",(function(button){return function(){var form=document.querySelector("form");button.form=form;form.setAttribute("vvv","2");--%>
  132. <%-- form.setAttribute("action",--%>
  133. <%-- "<ss:serv name='${delete}' dest='${deleteDest}' parm='${deleteParam}'/>");--%>
  134. <%-- ss.display.submitToTopTab(button);form.submit();}})(this))'--%>
  135. icon-class="bottom-div-close"
  136. ></ss-bottom-button>
  137. <%-- <input id="deleteButton" type="button" value="${deleteButtonValue}"
  138. onclick='wd.display.confirm("删除","是否删除?",(function(button){return function(){var form=document.querySelector("form");button.form=form;form.setAttribute("vvv","2");
  139. form.setAttribute("action",
  140. "<ss:serv name='${delete}' dest='${deleteDest}' parm='${deleteParam}'/>");
  141. wd.display.submitToTopTab(button);form.submit();}})(this))'
  142. class="bottom-button"
  143. > --%>
  144. </ss:equal>
  145. <!-- 删除按钮 end -->
  146. <%-- 再增加 删除二级对象的基本情况变动 功能 -- "删除变动" 按钮。Start。Lin --%>
  147. <!-- 删除二级对象的基本情况变动 功能 -- "删除变动" 按钮。Start -->
  148. <ss:equal val='${empty delChildChgDest}' val2='false'>
  149. <ss-bottom-button
  150. text="${delChildChgButtonValue}"
  151. onclick='ss.form.confirm("删除","是否删除?",function (){ss.form.submit({url:"<ss:serv name='${delChildChg}' dest='${delChildChgDest}' parm='${delChildChgParam}'/>",targetWin:parent});},null)'
  152. <%-- onclick='ss.display.confirm("删除变动","是否删除基本情况变动?",(function(button){return function(){var form=document.querySelector("form");button.form=form;form.setAttribute("vvv","2");--%>
  153. <%-- form.setAttribute("action",--%>
  154. <%-- "<ss:serv name='${delChildChg}' dest='${delChildChgDest}' parm='${delChildChgParam}'/>");--%>
  155. <%-- wd.display.submitToTopTab(button);form.submit();}})(this))'--%>
  156. icon-class="bottom-div-close"
  157. ></ss-bottom-button>
  158. <%-- <input id="delChildChgButton" type="button" value="${delChildChgButtonValue}"
  159. onclick='ss.display.confirm("删除变动","是否删除基本情况变动?",(function(button){return function(){var form=document.querySelector("form");button.form=form;form.setAttribute("vvv","2");
  160. form.setAttribute("action",
  161. "<ss:serv name='${delChildChg}' dest='${delChildChgDest}' parm='${delChildChgParam}'/>");
  162. wd.display.submitToTopTab(button);form.submit();}})(this))'
  163. class="bottom-button"
  164. > --%>
  165. </ss:equal>
  166. <!-- 删除二级对象的基本情况变动 功能 -- "删除变动" 按钮。end -->
  167. <%-- 再增加 删除二级对象的基本情况变动 功能 -- "删除变动" 按钮。End。Lin --%>
  168. <!-- 停用start -->
  169. <ss:equal val='${empty disableSubmitDest}' val2='false'>
  170. <ss-bottom-button
  171. text="${disableSubmitButtonValue}"
  172. onclick='ss.form.submit({url:"<ss:serv name='${disableSubmit}' dest='${disableSubmitDest}' parm='${disableSubmitParam}'/>",width:${disableSubmitwidth},height:${disableSubmitheight},minHeight:${disableSubmitminheight},maxHeight:${disableSubmitmaxheight},targetWin:parent});'
  173. <%-- onclick='ss.display.reset("dialog",this,"<ss:serv name='${disableSubmit}' dest='${disableSubmitDest}' parm='${disableSubmitParam}'/>",${disableSubmitwidth},${disableSubmitheight},${disableSubmitminheight},${disableSubmitmaxheight});'--%>
  174. icon-class="bottom-div-close"
  175. ></ss-bottom-button>
  176. <!-- <input type="submit" value="${disableSubmitButtonValue}" class="bottom-button"
  177. onclick='ss.display.reset("dialog",this,"<ss:serv name='${disableSubmit}' dest='${disableSubmitDest}' parm='${disableSubmitParam}'/>",${disableSubmitwidth},${disableSubmitheight},${disableSubmitminheight},${disableSubmitmaxheight});'
  178. > -->
  179. </ss:equal>
  180. <!-- 停用end -->
  181. <ss-bottom-button
  182. text="关闭"
  183. onclick='ss.display.closeDialog();'
  184. icon-class="bottom-div-close"
  185. ></ss-bottom-button>
  186. <%-- <input type="button" value="关闭" onclick="ss.display.closeDialog();" class="bottom-button"> --%>
  187. <%--
  188. ${param}
  189. --%>
  190. <%-- </div> --%>
  191. </div>
  192. </form>
  193. </body>
  194. </html>
  195. <script type="module">
  196. window.ss.objInp = window.ss.objInp || {};
  197. window.ss.objInp.findParentSubTabContext = function () {
  198. let currentWindow = window.parent;
  199. while (currentWindow && currentWindow !== window) {
  200. try {
  201. const app = currentWindow.SS && currentWindow.SS.dom && currentWindow.SS.dom.currentApp;
  202. if (app && app.$data && Object.prototype.hasOwnProperty.call(app.$data, "leftDisplay")) {
  203. return { app, win: currentWindow };
  204. }
  205. } catch (e) {
  206. return null;
  207. }
  208. if (currentWindow === currentWindow.parent) {
  209. break;
  210. }
  211. currentWindow = currentWindow.parent;
  212. }
  213. return null;
  214. };
  215. window.ss.objInp.collapseParentObjEdit = function () {
  216. try {
  217. const context = window.ss.objInp.findParentSubTabContext();
  218. if (!context || !context.app) {
  219. return false;
  220. }
  221. context.app.$data.leftDisplay = false;
  222. if (context.win && context.win.jQuery) {
  223. context.win.jQuery(".project-edit-container .content-area").css("margin", "0");
  224. }
  225. return true;
  226. } catch (e) {
  227. return false;
  228. }
  229. };
  230. window.ss.objInp.submitAndCollapseParent = function (param) {
  231. const submitResult = ss.form.submit(param);
  232. if (submitResult) {
  233. window.ss.objInp.collapseParentObjEdit();
  234. }
  235. return submitResult;
  236. };
  237. const data = {};
  238. console.log('[objInp] formElemConfig:', window.SS.dom.formElemConfig);
  239. if (window.SS.dom.formElemConfig) {
  240. Object.entries(window.SS.dom.formElemConfig).forEach(([key, config]) => {
  241. // 如果 config 有 val 属性,使用 val;否则如果 config 本身是数组/对象,直接使用 config
  242. // 这支持 zwwjCustomButtons 这样的直接数组配置
  243. if (config && typeof config === 'object' && 'val' in config) {
  244. data[key] = config.val;
  245. } else {
  246. data[key] = config;
  247. }
  248. if (key === 'zwwjCustomButtons') {
  249. console.log('[objInp] zwwjCustomButtons 处理:', config, '->', data[key]);
  250. }
  251. // 处理 objPicker
  252. if (config.type === window.SS.dom.TYPE.OBJPICKER) {
  253. data[key + "ObjPicker"] = true;
  254. data[key + "Option"] = [];
  255. data[key + "Url"] = config.url;
  256. }
  257. // 处理datepicker
  258. if (config.type === window.SS.dom.TYPE.DATE) {
  259. data[key + "Mode"] = config.mode
  260. console.log(data[key + "Mode"]);
  261. }
  262. // 处理富文本编辑器(RICHTEXT 和 HTML 类型)
  263. if (config.type === window.SS.dom.TYPE.RICHTEXT || config.type === window.SS.dom.TYPE.HTML) {
  264. data[key + "Url"] = config.val;
  265. data[key + "editor"] = config.val;
  266. // 处理编辑器自定义按钮配置(同台字段)by xu 20250331
  267. if (config.customButtons && Array.isArray(config.customButtons)) {
  268. data[key + "CustomButtons"] = config.customButtons;
  269. }
  270. }
  271. // 处理onoff
  272. if (config.type === window.SS.dom.TYPE.ONOFFBTN) {
  273. data[key] = config.val.split('|');
  274. }
  275. if (config.type === window.SS.dom.TYPE.IMG) {
  276. data[key + "showUrl"] = config.showUrl;
  277. data[key + "uploadUrl"] = config.uploadUrl;
  278. }
  279. });
  280. }
  281. // console.log("data",data);
  282. SS.ready(function () {
  283. if(ss.dom.formVmConfig)//加判断条件,页面有校验配置时,才运行下面的 Ben(20251206)
  284. for (let i = 0; i < ss.dom.formVmConfig.length; i++) {
  285. const item = ss.dom.formVmConfig[i];
  286. // 处理每个元素
  287. let rule = item.rule;
  288. let fieldArr = item.field;
  289. let param = item.param;
  290. let fieldValMap = [];
  291. for (let i = 0; i < fieldArr.length; i++) {//校验程序增加传入表单元素的值fieldValMap Ben(20260107)
  292. const field = fieldArr[i];
  293. fieldValMap[field] = window.SS.dom.formElemConfig[field].val;
  294. }
  295. window.ssVm.add(rule, fieldArr, param ,fieldValMap);//校验程序增加传入表单元素的值fieldValMap Ben(20260107)
  296. }
  297. // 在这里直接初始化,不需要等待 load 事件
  298. window.SS.dom.initializeFormApp({
  299. el: "#app",
  300. data(){
  301. console.log('[objInp] Vue data() 返回:', data, 'zwwjCustomButtons:', data.zwwjCustomButtons);
  302. return data;
  303. },
  304. methods: {
  305. onChange(value){
  306. // console.log(value)
  307. },
  308. myChange(value){
  309. // alert(value);
  310. // console('@@@myChange:'+value);
  311. },
  312. save(){
  313. $('form').attr('action','<ss:serv name='${save}' dest='${saveDest}' parm='${saveParam}'/>');//name:${save},dest='${saveDest}',parm='${saveParam}'
  314. $('form').submit();
  315. }
  316. },
  317. mounted() {
  318. const self = this;
  319. // 在这里可以使用 Vue 实例
  320. Object.entries(this.$data).forEach(([key, value]) => {
  321. // 处理 CCPSINGLE
  322. if (key.includes('CCPSINGLE')) {
  323. const originalKey = key.replace('CCPSINGLE', '');
  324. const self = this;
  325. // 只有第一个字段需要自动加载
  326. if (this[originalKey + "InitLoad"]) {
  327. ccpsingleFirstLoad(this[originalKey + "Url"], key).then(result =>{
  328. this[originalKey+'Option'] = result;
  329. })
  330. }
  331. // 绑定 change 事件
  332. this[originalKey + 'Change'] = async function(value) {
  333. const objP = self[originalKey + "objP"] || [];
  334. const currentIndex = objP.indexOf(originalKey);
  335. const children = currentIndex < 0 || currentIndex >= objP.length - 1 ? [] : objP.slice(currentIndex + 1);
  336. await doCascade({
  337. children,
  338. value,
  339. vm: self,
  340. loadData: (value) => getCcpsingleValue(children,value),
  341. });
  342. };
  343. }
  344. // 如果是 CCPSINGLE 类型
  345. if (key.includes('CCPMUTIPLE')) {
  346. const originalKey = key.replace('CCPMUTIPLE', '');
  347. const self = this;
  348. // 只有第一个字段需要自动加载
  349. if (this[originalKey + "InitLoad"]) {
  350. ccpsingleFirstLoad(this[originalKey + "Url"], key).then(result =>{
  351. this[originalKey+'Option'] = result;
  352. })
  353. }
  354. // 绑定 change 事件
  355. this[originalKey + 'Change'] = async function(value) {
  356. const objP = self[originalKey + "objP"] || [];
  357. const currentIndex = objP.indexOf(originalKey);
  358. const children = currentIndex < 0 || currentIndex >= objP.length - 1 ? [] : objP.slice(currentIndex + 1);
  359. await doCascade({
  360. children,
  361. value,
  362. vm: self,
  363. loadData: (value) => getCcpsingleValue(children,value),
  364. });
  365. };
  366. }
  367. });
  368. }
  369. });
  370. });
  371. </script>
  372. <%--<script type="text/javascript">--%>
  373. <%-- tokenCleanser("<ss:serv name='clearPageToken'/>", {tokenList:"<%= pageContext.getAttribute(ss.page.PageC.PAGE_tokenList)%>"});--%>
  374. <%--</script>--%>