Detail.vue.vm 14 KB

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