TargetReportConfig.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. <template>
  2. <el-row :gutter="5">
  3. <el-col :span="6">
  4. <ReportTree v-if="isShowTree" :reportTreeData="reportTreeData" @treeNodeClick="treeNodeClick" />
  5. </el-col>
  6. <el-col :span="18">
  7. <PageLayer>
  8. <template #header class="hd-cl">
  9. <el-button type="primary" icon="Plus" @click="addForm(ruleFormRef)"
  10. style="margin-left: 10px">新增</el-button>
  11. <el-button type="primary" icon="Edit" @click="editForm(ruleFormRef)"
  12. style="margin-left: 10px">编辑</el-button>
  13. <el-button type="primary" icon="Check" @click="submitForm(ruleFormRef)"
  14. style="margin-left: 10px">保存</el-button>
  15. <el-button type="primary" icon="Refresh" @click="resetForm(ruleFormRef)"
  16. style="margin-left: 10px">重置</el-button>
  17. <el-button type="primary" style="margin-left: 10px" @click="reportLevel()"> 报表分组类型配置 </el-button>
  18. <el-button type="primary" style="margin-left: 10px" @click="reportDetails()"> 报表页面详情配置 </el-button>
  19. </template>
  20. <template #main>
  21. <el-form ref="ruleFormRef" :model="reportForm" :rules="rules" label-width="120px" class="demo-ruleForm"
  22. :size="formSize" status-icon :disabled="isDisabledForm">
  23. <el-row>
  24. <el-col :span="12">
  25. <el-form-item label="报表名称" prop="reportName">
  26. <el-input v-model="reportForm.reportName" minlength="1" maxlength="256"
  27. show-word-limit />
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="6">
  31. <el-form-item label="报表编码" prop="reportId">
  32. <el-input v-model="reportForm.reportId" minlength="1" maxlength="12" show-word-limit />
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="6">
  36. <el-form-item label="报表类型" prop="reportType">
  37. <!-- <el-input v-model="reportForm.reportType" minlength="1" maxlength="12"
  38. show-word-limit /> -->
  39. <el-select v-model="reportForm.reportType" placeholder="请选择报表类型">
  40. <el-option v-for="item in reportTypeList" :key="item.reportType"
  41. :label="item.reportLabel" :value="item.reportType">
  42. <span style="float: left">{{ item.reportType }}</span>
  43. <span
  44. style="float: right; color: var(--el-text-color-secondary); font-size: 13px; ">
  45. {{ item.reportLabel }}
  46. </span>
  47. </el-option>
  48. </el-select>
  49. </el-form-item>
  50. </el-col>
  51. </el-row>
  52. <el-row>
  53. <el-col :span="12">
  54. <el-form-item label="聚合sql" prop="gatherSql">
  55. <el-input v-model="reportForm.gatherSql" minlength="1" maxlength="256"
  56. show-word-limit />
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="6">
  60. <el-form-item label="单位" prop="unit">
  61. <el-input v-model="reportForm.unit" minlength="0" maxlength="8" show-word-limit />
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="6">
  65. <el-form-item label="报表分组类型" prop="level">
  66. <el-input v-model="reportForm.level" minlength="1" maxlength="12" show-word-limit />
  67. </el-form-item>
  68. </el-col>
  69. </el-row>
  70. <el-form-item label="基础sql" prop="baseSql">
  71. <el-input v-model="reportForm.baseSql" type="textarea" :rows="8" />
  72. </el-form-item>
  73. <el-row>
  74. <el-col :span="6">
  75. <el-form-item label="菜单id" prop="menuId">
  76. <el-input v-model.number="reportForm.menuId" minlength="0" maxlength="12"
  77. show-word-limit />
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="6">
  81. <el-form-item label="面板排序" prop="sort">
  82. <el-input v-model.number="reportForm.sort" minlength="0" maxlength="12"
  83. show-word-limit />
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="12">
  87. <el-form-item label="指标排序" prop="reportSort">
  88. <el-input v-model="reportForm.reportSort" minlength="0" maxlength="256"
  89. show-word-limit />
  90. </el-form-item>
  91. </el-col>
  92. </el-row>
  93. <el-row>
  94. <el-col :span="6">
  95. <el-form-item label="是否财务报表" prop="isCw">
  96. <el-switch v-model="reportForm.isCw" active-value="Y" inactive-value="N"
  97. active-color="#13ce66" inactive-color="#ff4949" />
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="6">
  101. <el-form-item label="是否医技报表" prop="isYj">
  102. <el-switch v-model="reportForm.isYj" active-value="Y" inactive-value="N"
  103. active-color="#13ce66" inactive-color="#ff4949" />
  104. </el-form-item>
  105. </el-col>
  106. <el-col :span="6">
  107. <el-form-item label="是否有效" prop="flag">
  108. <el-switch v-model="reportForm.flag" active-value="Y" inactive-value="N"
  109. active-color="#13ce66" inactive-color="#ff4949" />
  110. </el-form-item>
  111. </el-col>
  112. </el-row>
  113. </el-form>
  114. <el-divider />
  115. <el-form ref="ruleFormRef" label-width="120px" :model="sqlForm" class="demo-ruleForm" :size="formSize">
  116. <el-row>
  117. <el-col :span="12">
  118. <el-form-item label="开始时间">
  119. <el-form-item prop="startTime">
  120. <el-date-picker v-model="sqlForm.startTime" type="date" label="选择时间"
  121. placeholder="选择时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
  122. </el-form-item>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="12">
  126. <el-form-item label="结束时间">
  127. <el-form-item prop="endTime">
  128. <el-date-picker v-model="sqlForm.endTime" type="date" label="选择时间"
  129. placeholder="选择时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
  130. </el-form-item>
  131. </el-form-item>
  132. </el-col>
  133. </el-row>
  134. <el-row>
  135. <el-col :span="12">
  136. <el-form-item label="计算结果测试" prop="childResult">
  137. <el-input v-model="sqlForm.calcResult" type="textarea" />
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="12">
  141. <el-form-item>
  142. <el-button type="primary" @click="sqlExecute(ruleFormRef)"> 指标运行结果 </el-button>
  143. </el-form-item>
  144. </el-col>
  145. </el-row>
  146. </el-form>
  147. <el-dialog v-model="showReportLevel" :close-on-click-modal="false" :close-on-press-escape="false"
  148. :title="reportLevelTitle" width="80%" height="70%">
  149. <ReportLevel :reportLevelDetail="reportLevelDetail" />
  150. </el-dialog>
  151. </template>
  152. </PageLayer>
  153. </el-col>
  154. </el-row>
  155. </template>
  156. <script setup name="TargetDictInfo" lang="ts">
  157. import { ref, reactive, onMounted, nextTick } from 'vue'
  158. import ReportTree from '../target-comm/ReportTree.vue'
  159. import PageLayer from '../../../layout/PageLayer.vue'
  160. import { ElMessage } from 'element-plus'
  161. import { formatDate } from '../../../utils/date'
  162. import type { FormInstance, FormRules } from 'element-plus'
  163. import { selectReportDictTree, selectReportDict, selectReportType, reportSqlExecute, selectReportLevel, saveReportBaseInfo } from '../../../api/target-management/report-dict'
  164. import ReportLevel from '../target-comm/ReportLevel.vue'
  165. import { queryDept } from '../../../api/public-api'
  166. const reportTreeData = ref({
  167. data: [{}],
  168. height: 900,
  169. })
  170. const isShowTree = ref(false)
  171. // 是否开启Form表单编辑
  172. const isDisabledForm = ref(false)
  173. const deptWardList = ref([])
  174. const nowDay = new Date()
  175. const ds = formatDate(nowDay)
  176. const formSize = ref('default')
  177. const ruleFormRef = ref<FormInstance>()
  178. const reportTypeList = ref([
  179. {
  180. reportType: '',
  181. reportLabel: ''
  182. }
  183. ])
  184. const deptMethod = (val: string) => {
  185. queryDept(val).then((res: any) => {
  186. deptWardList.value = res
  187. })
  188. }
  189. const queryParam = reactive({
  190. reportId: '', // 报表id
  191. reportName: '', // 报表名称
  192. reportType: '', // 报表类型
  193. startTime: '', // 开始时间
  194. endTime: '', // 结束时间
  195. })
  196. const sqlForm = $ref({
  197. gatherSql: '', // 聚合sql
  198. baseSql: '', // 基础sql
  199. startTime: ds, // 开始时间
  200. endTime: ds, // 结束时间
  201. calcResult: '', // 计算结果
  202. })
  203. let reportForm = $ref({
  204. reportId: '', // 报表id
  205. reportName: '', // 报表名称
  206. reportType: '', // 报表类型
  207. unit: '', // 单位
  208. level: '', // 报表分组类型
  209. gatherSql: '', // 聚合sql
  210. baseSql: '', // 基础sql
  211. displayType: '', // 展示类型
  212. menuId: '', // 菜单id
  213. sort: '', // 面板排序
  214. reportSort: '', // 报表统计排序
  215. isCw: 'N', // 是否财务报表大屏显示指标(Y: 是)
  216. isYj: 'N', // 是否医技报表大屏显示指标(Y: 是)
  217. flag: 'Y', // 是否有效
  218. })
  219. onMounted(() => {
  220. nextTick(() => {
  221. queryParam.startTime = ds + ' 00:00:00'
  222. queryParam.endTime = ds + ' 23:59:59'
  223. sqlForm.startTime = ds + ' 00:00:00'
  224. sqlForm.endTime = ds + ' 23:59:59'
  225. queryReportDictTree()
  226. deptMethod('')
  227. reportTypeQt()
  228. })
  229. })
  230. const rules = $ref<FormRules>({
  231. reportId: [
  232. { required: true, message: '请填写报表id', trigger: 'blur' },
  233. { min: 1, max: 12, message: '报表id长度范围1-12个字符', trigger: 'blur' },
  234. ],
  235. reportName: [
  236. { required: true, message: '请填写报表名称', trigger: 'blur' },
  237. { min: 1, max: 256, message: '报表名称长度范围1-256个字符', trigger: 'blur' },
  238. ],
  239. reportType: [
  240. { required: true, message: '请填写报表类型', trigger: 'blur' },
  241. ],
  242. gatherSql: [
  243. { required: true, message: '请填写聚合函数sql', trigger: 'blur' },
  244. ],
  245. baseSql: [
  246. { required: true, message: '请填写基础sql', trigger: 'blur' },
  247. ],
  248. })
  249. // 查询指标字典树
  250. const queryReportDictTree = () => {
  251. isShowTree.value == true ? false : true
  252. queryParam.reportId = ''
  253. selectReportDictTree(queryParam)
  254. .then((res: any) => {
  255. reportTreeData.value.data = res
  256. isShowTree.value = true
  257. });
  258. }
  259. // 查询报表类型字典
  260. const reportTypeQt = () => {
  261. selectReportType()
  262. .then((res: any) => {
  263. reportTypeList.value = res
  264. });
  265. }
  266. // ------ 接收树页面传来的数据 -------
  267. const treeNodeClick = async (data: any, node: any, obj: any) => {
  268. if (node.data) {
  269. queryParam.reportId = node.data.id
  270. let pid = data.pid
  271. if (pid === 'zbJc' || queryParam.reportId === 'zbJc') {
  272. ElMessage({
  273. type: "info",
  274. message: "请选择一个正确的指标报表!",
  275. duration: 2500,
  276. showClose: true,
  277. });
  278. return
  279. } else {
  280. if (!isDisabledForm.value) {
  281. isDisabledForm.value = true
  282. }
  283. ruleFormRef.value?.resetFields()
  284. sqlForm.calcResult = ''
  285. // 查询指标字典
  286. let selectReportDictRes = await selectReportDict(queryParam)
  287. reportForm = selectReportDictRes[0]
  288. }
  289. }
  290. }
  291. // ---------- 新增报表 ------------
  292. const addForm = (formEl: FormInstance | undefined) => {
  293. if (!formEl) return
  294. if (isDisabledForm.value) {
  295. isDisabledForm.value = false
  296. }
  297. formEl.resetFields()
  298. reportForm = {}
  299. ruleFormRef.value?.resetFields()
  300. sqlForm.calcResult = ''
  301. }
  302. // ---------- 编辑报表 ------------
  303. const editForm = (formEl: FormInstance | undefined) => {
  304. if (!formEl) return
  305. if (isDisabledForm.value) {
  306. isDisabledForm.value = false
  307. }
  308. }
  309. // ---------- 保存报表 ------------
  310. const submitForm = async (formEl: FormInstance | undefined) => {
  311. if (!formEl) return
  312. if (reportForm.reportId == '') {
  313. ElMessage({
  314. type: "info",
  315. message: '指标报表信息不全,请确认!',
  316. duration: 2500,
  317. showClose: true,
  318. });
  319. return
  320. }
  321. await formEl.validate((valid, fields) => {
  322. if (valid) {
  323. if (reportForm.gatherSql == '' || reportForm.baseSql == '' || reportForm.reportName == '') {
  324. ElMessage({
  325. type: "info",
  326. message: '指标报表信息不全,请确认!',
  327. duration: 2500,
  328. showClose: true,
  329. });
  330. return
  331. }
  332. saveReportBaseInfo(reportForm).then((res: any) => {
  333. ElMessage({
  334. type: "success",
  335. message: res.cg,
  336. duration: 2500,
  337. showClose: true,
  338. });
  339. if (!isDisabledForm.value) {
  340. isDisabledForm.value = true
  341. }
  342. queryReportDictTree()
  343. });
  344. } else {
  345. queryReportDictTree()
  346. return
  347. }
  348. })
  349. }
  350. // ---------- 重置报表 ------------
  351. const resetForm = (formEl: FormInstance | undefined) => {
  352. if (!formEl) return
  353. if (isDisabledForm.value) {
  354. isDisabledForm.value = false
  355. }
  356. formEl.resetFields()
  357. reportForm = {}
  358. ruleFormRef.value?.resetFields()
  359. sqlForm.calcResult = ''
  360. }
  361. // --------------- sql运行 ----------------
  362. const sqlExecute = (formEl: FormInstance | undefined) => {
  363. if (!formEl) return
  364. // 验证是否填写完整
  365. if (reportForm.reportId === '') {
  366. ElMessage({
  367. type: "info",
  368. message: "报表信息不全,请确认!",
  369. duration: 2500,
  370. showClose: true,
  371. });
  372. return
  373. }
  374. if (reportForm.baseSql === '') {
  375. ElMessage({
  376. type: "info",
  377. message: "未编写基础sql,请检查!",
  378. duration: 2500,
  379. showClose: true,
  380. });
  381. return
  382. }
  383. if (sqlForm.startTime === '' || sqlForm.endTime === '') {
  384. ElMessage({
  385. type: "info",
  386. message: "时间条件未选择,请确认!",
  387. duration: 2500,
  388. showClose: true,
  389. });
  390. return
  391. }
  392. // sql测试
  393. sqlForm.gatherSql = reportForm.gatherSql
  394. sqlForm.baseSql = reportForm.baseSql
  395. reportSqlExecute(sqlForm)
  396. .then((res: any) => {
  397. let r = JSON.parse(JSON.stringify(res))
  398. sqlForm.calcResult = r.r1
  399. });
  400. }
  401. // --------------- 报表分组类型配置 -------------------
  402. const showReportLevel = ref(false)
  403. const reportLevelTitle = ref('报表分组类型配置')
  404. const reportLevelDetail = ref({})
  405. const reportLevel = () => {
  406. const param = {
  407. reportId: reportForm.reportId,
  408. level: reportForm.level,
  409. }
  410. selectReportLevel(param).then((res: any) => {
  411. showReportLevel.value = true
  412. reportLevelDetail.value = res
  413. })
  414. }
  415. const reportDetails = () => {
  416. }
  417. </script>
  418. <style lang="scss" scoped deep>
  419. .hd-cl {
  420. margin-bottom: 1px !important;
  421. }
  422. :deep(.el-textarea.is-disabled .el-textarea__inner) {
  423. color: #1146f3;
  424. }
  425. </style>