Detail.vue.vm 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. #parse("PublicMacro/DetailMarco.vm")
  2. #parse("PublicMacro/ConstantMarco.vm")
  3. ##参数
  4. #ConstantParams()
  5. <script lang="ts" setup>
  6. import { getDetailInfo } from './helper/api';
  7. import { getConfigData } from '#/api/onlineDev/visualDev';
  8. import { reactive, toRefs, nextTick, ref, computed, unref ,toRaw} from 'vue';
  9. #if(${context.popupType}=="fullScreen")
  10. import { BasicPopup, usePopup } from '@jnpf/ui/popup';
  11. #end
  12. import { BasicModal, useModal } from '@jnpf/ui/modal';
  13. #if(${context.popupType}=="drawer")
  14. import { BasicDrawer, useDrawer } from '@jnpf/ui/drawer';
  15. #end
  16. #if($childSummary == true)
  17. import { thousandsFormat } from '@jnpf/utils';
  18. #end
  19. // 有关联表单详情
  20. import RelationDetail from '#/views/common/dynamicModel/list/detail/index.vue';
  21. // 表单权限
  22. import { useMessage,usePermission } from '@jnpf/hooks';
  23. #if(${context.HasPrintBtn})
  24. // 打印模板多条生成PrintSelect
  25. import PrintSelect from '#/components/PrintDesign/printSelect/index.vue';
  26. import PrintBrowse from '#/components/PrintDesign/printBrowse/index.vue';
  27. #end
  28. import { CaretRightOutlined } from '@ant-design/icons-vue';
  29. import { buildUUID } from '@jnpf/utils';
  30. import { $t } from '#/locales';
  31. import { getDataChange } from '#/api/onlineDev/visualDev';
  32. import { getDataInterfaceDataInfoByIds } from '#/api/systemData/dataInterface';
  33. import { JnpfExtraRelationInfo } from '@jnpf/ui';
  34. interface State {
  35. dataForm: any;
  36. title: string;
  37. maskConfig: any;
  38. interfaceRes: any;
  39. locationScope: any;
  40. extraOptions: any;
  41. extraData: any;
  42. ## 活动面板参数
  43. #foreach($fieLdsModel in ${context.form})
  44. #set($jnpfKey = "${fieLdsModel.jnpfKey}")
  45. #set($formModel = ${fieLdsModel.formModel})
  46. #set($outermost = ${formModel.outermost})
  47. #set($isEnd = "${fieLdsModel.isEnd}")
  48. #if(${isEnd}=='0')
  49. #if($jnpfKey=='collapse')
  50. #if(${outermost}=='0')
  51. ${formModel.model}:any;
  52. #end
  53. #end
  54. #if($jnpfKey=='tab')
  55. #if(${outermost}=='0')
  56. ${formModel.model}:any;
  57. #end
  58. #end
  59. #if($jnpfKey=='steps')
  60. #if(${outermost}=='0')
  61. ${formModel.model}:any;
  62. #end
  63. #end
  64. #end
  65. #end
  66. ## 子表平铺活动面板变量
  67. #foreach($children in ${context.children})
  68. #set($aliasname = "${children.aliasLowName}")
  69. #if($!{children.layoutType} == 'list')
  70. ${aliasname}outerActiveKey: any;
  71. ${aliasname}innerActiveKey: any;
  72. #end
  73. #end
  74. }
  75. defineOptions({ name: 'Detail' });
  76. const { createMessage, createConfirm } = useMessage();
  77. #if(${context.popupType}=="fullScreen")
  78. const [registerPopup, { openPopup, setPopupProps, closePopup }] = usePopup();
  79. #end
  80. #if(${context.popupType}=="general")
  81. const [registerModal, { openModal, setModalProps, closeModal }] = useModal();
  82. #end
  83. #if(${context.popupType}=="drawer")
  84. const [registerDrawer, { openDrawer, setDrawerProps, closeDrawer }] = useDrawer();
  85. #end
  86. #if(${context.HasPrintBtn})
  87. const [registerPrintSelect, { openModal: openPrintSelect }] = useModal();
  88. const [registerPrintBrowse, { openModal: openPrintBrowse }] = useModal();
  89. #end
  90. ##子表列表字段-及合计方法
  91. #DetailChildTableColumns()
  92. const relationDetailRef = ref<any>(null);
  93. const state = reactive<State>({
  94. dataForm:{},
  95. title: $t('common.detailText','详情'),
  96. maskConfig:#CreateMaskConfig(),
  97. interfaceRes: ${context.templateJsonAll},
  98. locationScope:#CreateLocationScope(),
  99. extraOptions: #CreateExtraOptions(),
  100. extraData: #CreateExtraData(),
  101. ## 活动面板参数
  102. #foreach($fieLdsModel in ${context.form})
  103. #set($jnpfKey = "${fieLdsModel.jnpfKey}")
  104. #set($formModel = ${fieLdsModel.formModel})
  105. #set($outermost = ${formModel.outermost})
  106. #set($isEnd = "${fieLdsModel.isEnd}")
  107. #if(${isEnd}=='0')
  108. #if($jnpfKey=='collapse')
  109. #if(${outermost}=='0')
  110. ${formModel.model}:'$!{formModel.active}',
  111. #end
  112. #end
  113. #if($jnpfKey=='tab')
  114. #if(${outermost}=='0')
  115. ${formModel.model}:'$!{formModel.active}',
  116. #end
  117. #end
  118. #if($jnpfKey=='steps')
  119. #if(${outermost}=='0')
  120. ${formModel.model}:'$!{formModel.active}',
  121. #end
  122. #end
  123. #end
  124. #end
  125. ## 子表平铺活动面板变量
  126. #foreach($children in ${context.children})
  127. #set($aliasname = "${children.aliasLowName}")
  128. #if($!{children.layoutType} == 'list')
  129. ${aliasname}outerActiveKey: [0],
  130. ${aliasname}innerActiveKey: [],
  131. #end
  132. #end
  133. });
  134. const { title, dataForm, maskConfig } = toRefs(state);
  135. // 表单权限
  136. const { hasFormP } = usePermission();
  137. defineExpose({ init });
  138. function init(data) {
  139. state.dataForm.id = data.id;
  140. #if(${context.popupType}=="fullScreen")
  141. openPopup();
  142. #end
  143. #if(${context.popupType}=="general")
  144. openModal();
  145. #end
  146. #if(${context.popupType}=="drawer")
  147. openDrawer();
  148. #end
  149. nextTick(() => {
  150. setTimeout(initData, 0);
  151. });
  152. }
  153. function initData() {
  154. changeLoading(true);
  155. #InitActiveValue()
  156. if (state.dataForm.id) {
  157. getData(state.dataForm.id);
  158. } else {
  159. #if(${context.popupType}=="fullScreen")
  160. closePopup();
  161. #end
  162. #if(${context.popupType}=="general")
  163. closeModal();
  164. #end
  165. #if(${context.popupType}=="drawer")
  166. closeDrawer();
  167. #end
  168. }
  169. }
  170. function getData(id) {
  171. getDetailInfo(id).then((res) => {
  172. state.dataForm = res.data || {};
  173. nextTick(() => {
  174. ## 子表平铺,默认展开
  175. #foreach($itemModel in ${context.children})
  176. #set($aliasname =$itemModel.aliasLowName)
  177. #if($!{itemModel.layoutType} == 'list')
  178. if (state.dataForm.${aliasname}List) {
  179. for (let i = 0; i < state.dataForm.${aliasname}List.length; i++) {
  180. state.dataForm.${aliasname}List[i].jnpfId = buildUUID();
  181. }
  182. }
  183. set${aliasname}ActiveKey();
  184. #end
  185. #end
  186. #runAllExtraFun()
  187. changeLoading(false);
  188. });
  189. });
  190. }
  191. ## 平铺布局时设置默认展开
  192. #foreach($itemModel in ${context.children})
  193. #if(${itemModel.layoutType} == 'list')
  194. #set($aliasname =$itemModel.aliasLowName)
  195. // 平铺布局时设置默认展开
  196. function set${aliasname}ActiveKey() {
  197. state.${aliasname}outerActiveKey = [0];
  198. state.${aliasname}innerActiveKey = [];
  199. #if(${itemModel.defaultExpandAll})
  200. state.${aliasname}innerActiveKey = ['summary'];
  201. if (!state.dataForm.${aliasname}List.length) return;
  202. for (let i = 0; i < state.dataForm.${aliasname}List.length; i++) {
  203. state.${aliasname}innerActiveKey.push(state.dataForm.${aliasname}List[i].jnpfId);
  204. }
  205. #end
  206. }
  207. #end
  208. #end
  209. function toDetail(modelId, id, propsValue) {
  210. if (!id) return;
  211. getConfigData(modelId).then((res) => {
  212. if (!res.data || !res.data.formData) return;
  213. const formConf = JSON.parse(res.data.formData);
  214. formConf.popupType = 'general';
  215. formConf.hasPrintBtn = false;
  216. formConf.customBtns = [];
  217. const data = { id, formConf, modelId, propsValue};
  218. relationDetailRef.value?.init(data);
  219. });
  220. }
  221. #if($context.HasPrintBtn)
  222. function handlePrint() {
  223. let printId=#if(${context.PrintId})${context.PrintId}#else [] #end
  224. if (!printId?.length) return createMessage.error('未配置打印模板');
  225. if (printId?.length === 1) return handleShowBrowse(printId[0]);
  226. openPrintSelect(true, printId);
  227. }
  228. function handleShowBrowse(id) {
  229. openPrintBrowse(true, { id, formInfo: [{ formId: state.dataForm.id }] });
  230. }
  231. #end
  232. function setFormProps(data) {
  233. #if(${context.popupType}=="fullScreen")
  234. setPopupProps(data);
  235. #end
  236. #if(${context.popupType}=="general")
  237. setModalProps(data);
  238. #end
  239. #if(${context.popupType}=="drawer")
  240. setDrawerProps(data);
  241. #end
  242. }
  243. function changeLoading(loading) {
  244. setFormProps({ loading });
  245. }
  246. ##合计方法
  247. #if($childSummary==true)
  248. //子表合计方法
  249. function getCmpValOfRow(row, key, summaryField) {
  250. if (!summaryField.length) return '';
  251. const isSummary = key => summaryField.includes(key);
  252. const target = row[key];
  253. if (!target) return '';
  254. let data = isNaN(target) ? 0 : Number(target);
  255. if (isSummary(key)) return data || 0;
  256. return '';
  257. }
  258. #end
  259. function getParamList(key) {
  260. let templateJson: any[] = state.interfaceRes[key];
  261. if (!templateJson || !templateJson.length || !state.dataForm) return templateJson;
  262. for (let i = 0; i < templateJson.length; i++) {
  263. if (templateJson[i].relationField && templateJson[i].sourceType == 1) {
  264. templateJson[i].defaultValue = state.dataForm[templateJson[i].relationField + '_id'] || '';
  265. }
  266. }
  267. return templateJson;
  268. }
  269. ## 生成关联表单弹窗初始化数据方法
  270. #ExtraInfoFun()
  271. </script>
  272. <template>
  273. ## 全屏弹窗
  274. #if(${context.popupType}=="fullScreen")
  275. <BasicPopup v-bind="$attrs" @register="registerPopup" :title="title" destroyOnClose>
  276. <template #insertToolbar>
  277. #if(${context.HasPrintBtn})
  278. <a-button type="primary" @click="handlePrint">#if(${context.printButtonTextI18nCode}){{$t('${context.printButtonTextI18nCode}','${context.printButtonText}')}}#else${context.printButtonText}#end</a-button>
  279. #end
  280. </template>
  281. <a-row class="p-[10px] dynamic-form ${context.formStyle}" :style="{ margin: '0 auto', width: '${context.fullScreenWidth}' }">
  282. <!-- 表单 -->
  283. <a-form :colon="false" size="${context.size}" layout=#if(${context.labelPosition}=="top") "vertical" #else "horizontal" #end
  284. labelAlign=#if(${context.labelPosition}=="right") "right" #else "left" #end
  285. #if(${context.labelPosition}!="top") :labelCol="{ style: { width: '${context.labelWidth}px' } }" #end
  286. :model="dataForm" ref="formRef" >
  287. <a-row :gutter="#if(${context.formStyle}=='word-form')0#else${context.gutter}#end">
  288. <!-- 具体表单 -->
  289. #DetailFormRendering()
  290. <!-- 表单结束 -->
  291. </a-row>
  292. </a-form>
  293. </a-row>
  294. </BasicPopup>
  295. #end
  296. ## 普通弹窗
  297. #if(${context.popupType}=="general")
  298. <BasicModal v-bind="$attrs" @register="registerModal" :title="title" width="${context.generalWidth}"
  299. :minHeight="100" :showOkBtn="false">
  300. <template #insertFooter>
  301. #if(${context.HasPrintBtn})
  302. <a-button type="primary" @click="handlePrint">#if(${context.printButtonTextI18nCode}){{$t('${context.printButtonTextI18nCode}','${context.printButtonText}')}}#else${context.printButtonText}#end</a-button>
  303. #end
  304. </template>
  305. <!-- 表单 -->
  306. <a-row class="dynamic-form ${context.formStyle}">
  307. <a-form :colon="false" size="${context.size}" layout=#if(${context.labelPosition}=="top") "vertical" #else "horizontal" #end
  308. labelAlign=#if(${context.labelPosition}=="right") "right" #else "left" #end
  309. #if(${context.labelPosition}!="top") :labelCol="{ style: { width: '${context.labelWidth}px' } }" #end
  310. :model="dataForm" ref="formRef">
  311. <a-row :gutter="#if(${context.formStyle}=='word-form')0#else${context.gutter}#end">
  312. <!-- 具体表单 -->
  313. #DetailFormRendering()
  314. <!-- 表单结束 -->
  315. </a-row>
  316. </a-form>
  317. </a-row>
  318. </BasicModal>
  319. #end
  320. ## 右侧弹窗
  321. #if(${context.popupType}=="drawer")
  322. <BasicDrawer v-bind="$attrs" @register="registerDrawer" :title="title" width="${context.drawerWidth}" showFooter
  323. :showOkBtn="false">
  324. <template #insertFooter>
  325. #if(${context.HasPrintBtn})
  326. <a-button type="primary" @click="handlePrint">#if(${context.printButtonTextI18nCode}){{$t('${context.printButtonTextI18nCode}','${context.printButtonText}')}}#else${context.printButtonText}#end</a-button>
  327. #end
  328. </template>
  329. <a-row class="p-[10px] dynamic-form ${context.formStyle}">
  330. <!-- 表单 -->
  331. <a-form :colon="false" size="${context.size}" layout=#if(${context.labelPosition}=="top") "vertical" #else "horizontal" #end
  332. labelAlign=#if(${context.labelPosition}=="right") "right" #else "left" #end
  333. #if(${context.labelPosition}!="top") :labelCol="{ style: { width: '${context.labelWidth}px' } }" #end
  334. :model="dataForm" ref="formRef" >
  335. <a-row :gutter="#if(${context.formStyle}=='word-form')0#else${context.gutter}#end">
  336. <!-- 具体表单 -->
  337. #DetailFormRendering()
  338. <!-- 表单结束 -->
  339. </a-row>
  340. </a-form>
  341. </a-row>
  342. </BasicDrawer>
  343. #end
  344. <!-- 有关联表单详情:开始 -->
  345. <RelationDetail ref="relationDetailRef" />
  346. <!-- 有关联表单详情:结束 -->
  347. #if(${context.HasPrintBtn})
  348. <PrintSelect @register="registerPrintSelect" @change="handleShowBrowse" />
  349. <PrintBrowse @register="registerPrintBrowse" />
  350. #end
  351. </template>