TargetDictConfig.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. <template>
  2. <el-row :gutter="5">
  3. <el-col :span="8">
  4. <TargetTree v-if="isShowTree" :targetTreeData="targetTreeData" @treeNodeClick="treeNodeClick" />
  5. </el-col>
  6. <el-col :span="16">
  7. <PageLayer>
  8. <template #header class="hd-cl">
  9. <el-button type="primary" icon="Plus" @click="addForm(ruleFormRef)" style="margin-left: 10px">新增
  10. </el-button>
  11. <el-button type="primary" icon="Edit" @click="editForm(ruleFormRef)" style="margin-left: 10px">编辑
  12. </el-button>
  13. <el-button type="primary" icon="Check" @click="submitForm(ruleFormRef)" style="margin-left: 10px">保存
  14. </el-button>
  15. <el-button type="primary" icon="Refresh" @click="resetForm(ruleFormRef)" style="margin-left: 10px">重置
  16. </el-button>
  17. </template>
  18. <template #main>
  19. <el-form ref="ruleFormRef" :model="ruleForm" :rules="rulesForm" label-width="120px" class="demo-ruleForm"
  20. :size="formSize" status-icon :disabled="isShowForm">
  21. <el-row>
  22. <el-col :span="12">
  23. <el-form-item label="指标名称" prop="name">
  24. <el-input v-model="ruleForm.name" minlength="1" maxlength="256" show-word-limit />
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="6">
  28. <el-form-item label="指标编码" prop="id">
  29. <el-input v-model="ruleForm.id" minlength="1" maxlength="12" show-word-limit />
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="6">
  33. <el-form-item label="父级编码" prop="pid">
  34. <el-input v-model="ruleForm.pid" minlength="1" maxlength="12" show-word-limit />
  35. </el-form-item>
  36. </el-col>
  37. </el-row>
  38. <el-row>
  39. <el-col :span="6">
  40. <el-form-item label="指标序号" prop="sort">
  41. <el-input v-model="ruleForm.sort" maxlength="12" show-word-limit />
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="6">
  45. <el-form-item label="总分" prop="score">
  46. <el-input v-model="ruleForm.score" placeholder="请输入正整数或两位小数" />
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="6">
  50. <el-form-item label="所占比率" prop="ratio" :disabled="true">
  51. <el-input v-model="ruleForm.ratio" minlength="0" maxlength="48" show-word-limit />
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="6">
  55. <el-form-item label="对接类型">
  56. <el-select v-model="ruleForm.type" placeholder="请选择类型">
  57. <el-option label="V1" value="0" />
  58. <el-option label="V2" value="1" />
  59. </el-select>
  60. </el-form-item>
  61. </el-col>
  62. </el-row>
  63. <el-row>
  64. <el-col :span="6">
  65. <el-form-item label="状态" prop="state">
  66. <el-select v-model="ruleForm.state" placeholder="请选择状态">
  67. <el-option label="开启" value="Y" />
  68. <el-option label="关闭" value="N" />
  69. </el-select>
  70. </el-form-item>
  71. </el-col>
  72. <el-col :span="6">
  73. <el-form-item label="启用时间">
  74. <el-form-item prop="openTime">
  75. <el-date-picker v-model="ruleForm.openTime" type="date" aria-label="选择时间" placeholder="选择时间"
  76. style="width: 100%" />
  77. </el-form-item>
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="6">
  81. <el-form-item label="责任科室" prop="deptCode">
  82. <el-select-v2 ref="deptInfoRef" v-model="ruleForm.deptCode" clearable remote filterable
  83. :remote-method="deptMethod" :options="deptWardList" />
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="6">
  87. <el-form-item label="责任人" prop="opId">
  88. <el-select-v2 ref="opInfoRef" v-model="ruleForm.opId" clearable remote filterable
  89. :remote-method="empMethod" :options="empList" />
  90. </el-form-item>
  91. </el-col>
  92. </el-row>
  93. <el-row>
  94. <el-col :span="4">
  95. <el-form-item label="是否叶子节点" prop="isLeaf">
  96. <el-switch v-model="ruleForm.isLeaf" active-value="1" inactive-value="0" active-color="#13ce66"
  97. inactive-color="#ff4949" @change='changeNode(ruleFormRef)' />
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="10" v-show="ruleForm.isLeaf === '1'">
  101. <el-form-item label="分子" prop="childId">
  102. <el-select v-model="ruleForm.childId" placeholder="请选择报表分子" filterable clearable>
  103. <el-option v-for="item in reportIdOptions" :key="item.code" :label="item.name" :value="item.code">
  104. <span style="float: left">{{ item.code }}</span>
  105. <span style="float: right; color: var(--el-text-color-secondary); font-size: 13px; ">
  106. {{ item.name }}
  107. </span>
  108. </el-option>
  109. </el-select>
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="10" v-show="ruleForm.isLeaf === '1'">
  113. <el-form-item label="分母" prop="momId">
  114. <el-select v-model="ruleForm.momId" placeholder="请选择报表分母" filterable clearable>
  115. <el-option v-for="item in reportIdOptions" :key="item.code" :label="item.name" :value="item.code">
  116. <span style="float: left">{{ item.code }}</span>
  117. <span style="float: right; color: var(--el-text-color-secondary); font-size: 13px; ">
  118. {{ item.name }}
  119. </span>
  120. </el-option>
  121. </el-select>
  122. </el-form-item>
  123. </el-col>
  124. </el-row>
  125. <el-form-item label="指标定义" prop="definition">
  126. <el-input v-model="ruleForm.definition" type="textarea" />
  127. </el-form-item>
  128. <el-form-item label="评审方法" prop="method">
  129. <el-input v-model="ruleForm.method" type="textarea" :rows="4" />
  130. </el-form-item>
  131. <el-form-item label="计分细则" prop="scoreRule">
  132. <el-input v-model="ruleForm.scoreRule" type="textarea" />
  133. </el-form-item>
  134. <el-form-item label="数据来源条件" prop="source">
  135. <el-input v-model="ruleForm.source" type="textarea" placeholder="请描述指标数据来源条件,比如:诊断包含xxx, 诊断编码是xxx等等" />
  136. </el-form-item>
  137. <el-divider />
  138. <el-form ref="upFormRef" label-width="180px" :model="sqlForm" class="demo-ruleForm" :size="formSize">
  139. <el-row>
  140. <el-col :span="8">
  141. <el-form-item label="开始年份">
  142. <el-form-item prop="startTime">
  143. <el-date-picker v-model="sqlForm.startTime" type="year" aria-label="选择年份" placeholder="选择年份"
  144. format="YYYY" value-format="YYYY" :disabled="false" />
  145. </el-form-item>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="8">
  149. <el-form-item label="结束年份">
  150. <el-form-item prop="endTime">
  151. <el-date-picker v-model="sqlForm.endTime" type="year" aria-label="选择年份" placeholder="选择年份"
  152. format="YYYY" value-format="YYYY" :disabled="false" />
  153. </el-form-item>
  154. </el-form-item>
  155. </el-col>
  156. </el-row>
  157. <el-row>
  158. <el-col :span="4">
  159. <el-form-item>
  160. <el-button type="primary" @click="sqlEdit(ruleFormRef)"> 指标sql编辑</el-button>
  161. </el-form-item>
  162. </el-col>
  163. <el-col :span="4">
  164. <el-form-item>
  165. <el-button type="primary" @click="sqlExecute(ruleFormRef)"> 指标运行结果</el-button>
  166. </el-form-item>
  167. </el-col>
  168. <el-col :span="4">
  169. <el-form-item>
  170. <el-button type="primary" @click="handWrite()"> 结果手动填写</el-button>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="4">
  174. <el-form-item>
  175. <el-button type="primary" @click="saveTargetDictResult()"> 指标结果保存</el-button>
  176. </el-form-item>
  177. </el-col>
  178. <el-col :span="4">
  179. <el-form-item>
  180. <el-button type="primary" @click="queryTargetReportResult()"> 指标结果查询</el-button>
  181. </el-form-item>
  182. </el-col>
  183. </el-row>
  184. </el-form>
  185. <el-form ref="upFormRef" label-width="180px" :model="sqlForm" class="demo-ruleForm" :size="formSize"
  186. :disabled="isShowTargetResult" v-show="isShowTargetResult">
  187. <el-row v-for="item in resultList">
  188. <el-col :span="8">
  189. <el-form-item :label="item.childLabel" :prop="item.childLabel + item.index">
  190. <el-input v-model="item.childResult" />
  191. </el-form-item>
  192. </el-col>
  193. <el-col :span="8">
  194. <el-form-item :label="item.momLabel" :prop="item.momLabel + item.index">
  195. <el-input v-model="item.momResult" />
  196. </el-form-item>
  197. </el-col>
  198. <el-col :span="8">
  199. <el-form-item :label="item.calcLabel" :prop="item.calcLabel + item.index">
  200. <el-input v-model="item.calcResult" />
  201. </el-form-item>
  202. </el-col>
  203. </el-row>
  204. </el-form>
  205. <el-form ref="upFormRef" label-width="120px" :model="sqlForm" class="demo-ruleForm" :size="formSize"
  206. v-show="isShowHandWrite">
  207. <el-row v-for="e in 4">
  208. <el-col :span="6">
  209. <el-form-item :label="'年份' + e" :prop="'year' + e" :rules="[{ type: 'number', message: '年份必须是数字' },]">
  210. <el-input v-model.number="sqlForm['year' + e]" minlength="4" maxlength="4" show-word-limit />
  211. </el-form-item>
  212. </el-col>
  213. <el-col :span="6">
  214. <el-form-item :label="'分子结果' + e" :prop="'childResult' + e">
  215. <el-input v-model="sqlForm['childResult' + e]" minlength="1" maxlength="12" show-word-limit />
  216. </el-form-item>
  217. </el-col>
  218. <el-col :span="6">
  219. <el-form-item :label="'分母结果' + e" :prop="'momResult' + e">
  220. <el-input v-model="sqlForm['momResult' + e]" minlength="1" maxlength="12" show-word-limit />
  221. </el-form-item>
  222. </el-col>
  223. <el-col :span="6">
  224. <el-form-item :label="'分子/分母-结果' + e" :prop="'calcResult' + e">
  225. <el-input v-model="sqlForm['calcResult' + e]" minlength="1" maxlength="12" show-word-limit />
  226. </el-form-item>
  227. </el-col>
  228. </el-row>
  229. </el-form>
  230. <el-row v-show="isShowQtResult">
  231. <el-table :data="QtResultData" stripe border highlight-current-row row-key="childKey" height="200"
  232. style="width: 100%">
  233. <el-table-column prop="year" label="年份" header-align="center" />
  234. <el-table-column prop="dataType" label="数据方式" header-align="center">
  235. <template #default="scope">
  236. {{ scope.row.dataType == '1' ? 'sql统计' : '手动输入' }}
  237. </template>
  238. </el-table-column>
  239. <el-table-column prop="childResult" label="分子结果" header-align="center" />
  240. <el-table-column prop="momResult" label="分母结果" header-align="center" />
  241. <el-table-column prop="calcResult" label="计算结果" header-align="center" />
  242. <el-table-column prop="op" label="统计人员" header-align="center" />
  243. <el-table-column prop="opTime" label="统计时间" header-align="center" width="200" />
  244. </el-table>
  245. </el-row>
  246. </el-form>
  247. </template>
  248. </PageLayer>
  249. </el-col>
  250. </el-row>
  251. <el-drawer :title="'Sql编辑'" v-model="isSqlEdit" size="80%" destroy-on-close>
  252. <SqlEditPage :sqlEditData="sqlEditData" />
  253. </el-drawer>
  254. </template>
  255. <script setup name="TargetDictConfig" lang="ts">
  256. import { ref, reactive, onMounted, nextTick } from 'vue'
  257. import TargetTree from '../target-comm/targetTree.vue'
  258. import SqlEditPage from '../target-comm/SqlEditPage.vue'
  259. import { ElMessage, ElMessageBox } from 'element-plus'
  260. import type { FormInstance, FormRules } from 'element-plus'
  261. import { clone } from '@/utils/clone'
  262. import { formatDate } from '@/utils/date'
  263. import PageLayer from '../../../layout/PageLayer.vue'
  264. import { queryDept } from '@/api/public-api'
  265. import { selectTargetDictById, selectTargetDictTree, saveTargetDict } from '@/api/target-management/target-dict'
  266. import { selectTargetZbReportId } from '@/api/target-management/report-dict'
  267. import { employeeList } from "@/api/zhu-yuan-yi-sheng/pat-info-query"
  268. import {
  269. targetSqlExecuteById,
  270. saveTargetReportResult,
  271. selectTargetReportResult
  272. } from '@/api/target-management/target-sql'
  273. const targetTreeData = ref({
  274. data: [{}],
  275. height: 900,
  276. })
  277. const isShowTree = ref(false)
  278. const isShowForm = ref(false)
  279. // 是否显示指标sql运行结果
  280. const isShowTargetResult = ref(false)
  281. // 是否显示指标手动输入结果
  282. const isShowHandWrite = ref(false)
  283. // 是否显示指标查询结果
  284. const isShowQtResult = ref(false)
  285. const nowDay = new Date()
  286. const ds = formatDate(nowDay)
  287. const deptWardList = ref([])
  288. const empList = ref([])
  289. const deptInfoRef = ref()
  290. const opInfoRef = ref()
  291. const reportIdOptions = ref([{ code: '', name: '' }])
  292. const isSqlEdit = ref(false)
  293. let sqlEditData = ref({
  294. id: '', // 指标编码
  295. name: '', // 指标名称
  296. pid: '', // 父级编码
  297. sort: '', // 指标序号
  298. calcChild: '', // 计算分子sql
  299. calcMom: '', // 计算分母sql
  300. childId: '', // 分子sql的报表id
  301. momId: '', // 分母sql的报表id
  302. })
  303. const queryParam = reactive({
  304. id: '', // 指标编码
  305. name: '', // 指标名称
  306. pid: '', // 父级编码
  307. sort: '', // 指标序号
  308. type: '', // 对接类型
  309. state: '', // 状态
  310. openTime: '', // 启用时间
  311. deptId: '', // 责任科室id
  312. source: '', // 数据来源
  313. calcChild: '', // 计算分子sql
  314. calcMom: '', // 计算分母sql
  315. isLeaf: '', //是否叶子节点(0:否, 1:是)
  316. })
  317. onMounted(() => {
  318. nextTick(() => {
  319. qeryTargetDictTree()
  320. queryTargetZbReportId()
  321. deptMethod('')
  322. empMethod('')
  323. })
  324. })
  325. const deptMethod = (val: string) => {
  326. queryDept(val).then((res: any) => {
  327. deptWardList.value = res
  328. })
  329. }
  330. const empMethod = (val: string) => {
  331. employeeList(val).then((res: any) => {
  332. empList.value = res
  333. })
  334. }
  335. const queryTargetZbReportId = () => {
  336. selectTargetZbReportId('zb').then((res: any) => {
  337. reportIdOptions.value = res
  338. })
  339. }
  340. // 查询指标字典树
  341. const qeryTargetDictTree = () => {
  342. isShowTree.value == true ? false : true
  343. queryParam.id = '';
  344. queryParam.pid = '';
  345. selectTargetDictTree(queryParam)
  346. .then((res: any) => {
  347. targetTreeData.value.data = res
  348. isShowTree.value = true
  349. });
  350. }
  351. // ------ 指标字典新增,修改保存表单开始 ------
  352. // ruleForm.value.name = '123'
  353. // ruleForm.name = '21312'
  354. let ruleForm = ref({
  355. id: '', // 指标编码
  356. name: '', // 指标名称
  357. pid: '', // 父级编码
  358. sort: '', // 指标序号
  359. score: '', // 总分
  360. ratio: '', // 所占比率
  361. type: '0', // 对接类型
  362. state: 'Y', // 状态
  363. openTime: ds, // 启用时间
  364. dept: '', // 责任科室
  365. deptCode: '', // 责任科室id
  366. op: '', // 责任人
  367. opId: '', // 责任人id
  368. definition: '', // 指标定义
  369. method: '', // 评审方法
  370. scoreRule: '', // 计分细则
  371. source: '', // 数据来源
  372. isLeaf: '1', // 是否叶子节点(0:否, 1:是)
  373. calcChild: '', // 计算-分子
  374. calcMom: '', // 计算-分母
  375. childId: '',
  376. momId: '',
  377. })
  378. let sqlForm = reactive({
  379. id: '', // 指标编码
  380. pid: '', // 父级编码
  381. calcChild: '', // 计算分子sql
  382. calcMom: '', // 计算分母sql
  383. startTime: '', // 计算开始时间
  384. endTime: '', // 计算结束时间
  385. year1: '', // 计算年份1
  386. childResult1: '', // 计算分子结果1
  387. momResult1: '', // 计算分母结果1
  388. calcResult1: '', // 计算结果1
  389. year2: '', // 计算年份2
  390. childResult2: '', // 计算分子结果2
  391. momResult2: '', // 计算分母结果2
  392. calcResult2: '', // 计算结果2
  393. year3: '', // 计算年份3
  394. childResult3: '', // 计算分子结果3
  395. momResult3: '', // 计算分母结果3
  396. calcResult3: '', // 计算结果3
  397. year4: '', // 计算年份4
  398. childResult4: '', // 计算分子结果4
  399. momResult4: '', // 计算分母结果4
  400. calcResult4: '', // 计算结果4
  401. childResult: '',
  402. momResult: '',
  403. calcResult: '',
  404. childId: '',
  405. momId: '',
  406. })
  407. const formSize = ref('default')
  408. const ruleFormRef = ref<FormInstance>()
  409. const upFormRef = ref<FormInstance>()
  410. const rulesForm = ref<FormRules>({
  411. name: [
  412. { required: true, message: '请填写指标名称', trigger: 'blur' },
  413. { min: 1, max: 256, message: '指标名称长度范围1-256个字符', trigger: 'blur' },
  414. ],
  415. id: [
  416. { required: true, message: '请填写指标id', trigger: 'blur' },
  417. { min: 1, max: 12, message: '指标id长度范围1-12个字符', trigger: 'blur' },
  418. ],
  419. pid: [
  420. { required: true, message: '请填写指标父id', trigger: 'blur' },
  421. { min: 1, max: 12, message: '指标父id长度范围1-12个字符', trigger: 'blur' },
  422. ],
  423. sort: [
  424. { min: 0, max: 12, message: '指标序号长度范围0-12个字符', trigger: 'blur' },
  425. ],
  426. score: [
  427. { required: true, message: '请填写指标总分', trigger: 'blur' },
  428. {
  429. validator: (rule: any, value: any, callback: any) => {
  430. if (/^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/.test(value) == false) {
  431. callback(new Error("请输入正整数或两位小数"));
  432. } else {
  433. callback();
  434. }
  435. },
  436. trigger: "blur",
  437. }
  438. ],
  439. ratio: [
  440. { min: 0, max: 48, message: '指标所占比例长度范围0-48个字符', trigger: 'blur' },
  441. ],
  442. definition: [
  443. { required: true, message: '请填写指标定义', trigger: 'blur' },
  444. ],
  445. method: [
  446. { required: true, message: '请填写评审方法', trigger: 'blur' },
  447. ],
  448. scoreRule: [
  449. { required: true, message: '请填写计分细则', trigger: 'blur' },
  450. ]
  451. })
  452. // 需要添加的叶子节点的校验
  453. const leafRuleFields = ['definition', 'method', 'scoreRule']
  454. const submitForm = async (formEl: FormInstance | undefined) => {
  455. if (!formEl) return
  456. // 处理叶子节点验证
  457. await leafRulesChange(formEl)
  458. await formEl.validate((valid, fields) => {
  459. if (valid) {
  460. ruleForm.value.dept = deptInfoRef.value.states.selectedLabel
  461. ruleForm.value.op = opInfoRef.value.states.selectedLabel
  462. saveTargetDict(ruleForm.value).then((res: any) => {
  463. if (res) {
  464. nextTick(() => {
  465. qeryTargetDictTree()
  466. if (!isShowForm.value) {
  467. isShowForm.value = true
  468. }
  469. })
  470. } else {
  471. qeryTargetDictTree()
  472. return
  473. }
  474. });
  475. } else {
  476. return
  477. }
  478. })
  479. }
  480. const addForm = (formEl: FormInstance | undefined) => {
  481. if (!formEl) return
  482. if (queryParam.id === '') {
  483. ElMessage({
  484. type: "info",
  485. message: "请选择一个指标!",
  486. duration: 2500,
  487. showClose: true,
  488. });
  489. return
  490. }
  491. if (queryParam.isLeaf === '1') {
  492. ElMessage({
  493. type: "info",
  494. message: "请选择一个父节点指标!",
  495. duration: 2500,
  496. showClose: true,
  497. });
  498. return
  499. }
  500. if (isShowForm.value) {
  501. isShowForm.value = false
  502. }
  503. formEl.resetFields()
  504. // 新增自动映射父指标id作为子指标的父id
  505. ruleForm.value.pid = queryParam.id
  506. sqlForm.startTime = ''
  507. sqlForm.endTime = ''
  508. sqlForm.childResult = ''
  509. sqlForm.momResult = ''
  510. sqlForm.calcResult = ''
  511. }
  512. const resetForm = (formEl: FormInstance | undefined) => {
  513. if (!formEl) return
  514. if (isShowForm.value) {
  515. isShowForm.value = false
  516. }
  517. if (isShowTargetResult.value) {
  518. isShowTargetResult.value = false
  519. }
  520. if (isShowHandWrite.value) {
  521. isShowHandWrite.value = false
  522. }
  523. if (isShowQtResult.value) {
  524. isShowQtResult.value = false
  525. }
  526. sqlForm.startTime = ''
  527. sqlForm.endTime = ''
  528. resultList.value = []
  529. formEl.resetFields()
  530. upFormRef.value?.resetFields()
  531. }
  532. const changeNode = async (formEl: FormInstance | undefined) => {
  533. if (!formEl) return
  534. await leafRulesChange(formEl)
  535. }
  536. // 叶子节点校验
  537. const leafRulesChange = async (formEl: FormInstance | undefined) => {
  538. if (!formEl) return
  539. // 父节点
  540. if (ruleForm.value.isLeaf === '0') {
  541. // 取消叶子节点的字典值校验
  542. leafRuleFields.forEach(e => {
  543. if (rulesForm.value[e]) {
  544. let dfas = rulesForm.value[e] as any
  545. dfas[0].required = true
  546. }
  547. })
  548. formEl.clearValidate(leafRuleFields)
  549. } else { // 叶子节点
  550. // 增加叶子节点的字典值校验
  551. leafRuleFields.forEach(e => {
  552. if (rulesForm.value[e]) {
  553. let dfas = rulesForm.value[e] as any
  554. dfas[0].required = true
  555. }
  556. })
  557. }
  558. }
  559. const editForm = (formEl: FormInstance | undefined) => {
  560. if (!formEl) return
  561. if (isShowForm.value) {
  562. isShowForm.value = false
  563. if ('1' === ruleForm.value.isLeaf) {
  564. changeNode(formEl)
  565. }
  566. }
  567. }
  568. // ------ 指标字典新增,修改保存表单结束 ------
  569. // ------ 接收树页面传来的数据 -------
  570. const treeNodeClick = (data: any, node: any, obj: any) => {
  571. if (node.data) {
  572. sqlForm.startTime = ''
  573. sqlForm.endTime = ''
  574. resultList.value = []
  575. if (isShowTargetResult.value === false) {
  576. isShowTargetResult.value = true
  577. }
  578. queryParam.id = node.data.id
  579. queryParam.pid = node.data.pid
  580. selectTargetDictById(queryParam)
  581. .then((res: any) => {
  582. if (res) {
  583. nextTick(() => {
  584. isShowForm.value = true
  585. ruleForm.value = res
  586. // 获取点击树的是否叶子节点数据
  587. queryParam.isLeaf = ruleForm.value.isLeaf
  588. ruleFormRef.value?.resetFields()
  589. ruleFormRef.value?.clearValidate()
  590. leafRulesChange(ruleFormRef.value)
  591. upFormRef.value?.resetFields()
  592. // 获取指标报表结果
  593. queryTargetReportResult()
  594. })
  595. }
  596. });
  597. }
  598. }
  599. // ------------------------- sql编辑 -----------------------
  600. const sqlEdit = (formEl: FormInstance | undefined) => {
  601. if (!formEl) return
  602. if (ruleForm.value.id === '') {
  603. ElMessage({
  604. type: "info",
  605. message: "指标信息不全,请确认!",
  606. duration: 2500,
  607. showClose: true,
  608. });
  609. return
  610. }
  611. if (ruleForm.value.isLeaf === '0') {
  612. ElMessage({
  613. type: "info",
  614. message: "不是基础指标,不需要编写sql,请确认!",
  615. duration: 2500,
  616. showClose: true,
  617. });
  618. return
  619. }
  620. isSqlEdit.value = true
  621. sqlEditData.value.id = ruleForm.value.id
  622. sqlEditData.value.pid = ruleForm.value.pid
  623. sqlEditData.value.name = ruleForm.value.name
  624. sqlEditData.value.calcChild = ruleForm.value.calcChild
  625. sqlEditData.value.calcMom = ruleForm.value.calcMom
  626. sqlEditData.value.childId = ruleForm.value.childId
  627. sqlEditData.value.momId = ruleForm.value.momId
  628. sqlEditData.value.sort = ruleForm.value.sort
  629. }
  630. // --------------- sql编写结束 ------------
  631. // --------------- sql运行 ----------------
  632. interface DataType {
  633. id: string,
  634. pid: string,
  635. childLabel: string,
  636. childResult: string,
  637. momLabel: string,
  638. momResult: string,
  639. calcLabel: string,
  640. calcResult: string,
  641. index: number,
  642. year: number,
  643. dataType: string, // 数据统计类型:1 sql计算获得; 2 手动输入填写获得
  644. }
  645. const resultList = ref([{
  646. id: '',
  647. pid: '',
  648. childLabel: '',
  649. childResult: '',
  650. momLabel: '',
  651. momResult: '',
  652. calcLabel: '',
  653. calcResult: '',
  654. index: 0,
  655. year: 0,
  656. dataType: '',
  657. }])
  658. const sqlExecute = (formEl: FormInstance | undefined) => {
  659. if (!formEl) return
  660. // 验证是否填写完整
  661. if (ruleForm.value.id === '') {
  662. ElMessage({
  663. type: "info",
  664. message: "指标信息不全,请确认!",
  665. duration: 2500,
  666. showClose: true,
  667. });
  668. return
  669. }
  670. if (ruleForm.value.isLeaf === '0') {
  671. ElMessage({
  672. type: "info",
  673. message: "不是基础指标,不需要执行sql,请确认!",
  674. duration: 2500,
  675. showClose: true,
  676. });
  677. return
  678. }
  679. if (ruleForm.value.calcChild === '') {
  680. ElMessage({
  681. type: "info",
  682. message: "未编写sql,请联系管理员编写!",
  683. duration: 2500,
  684. showClose: true,
  685. });
  686. return
  687. }
  688. if (sqlForm.startTime === '' || sqlForm.endTime === '') {
  689. ElMessage({
  690. type: "info",
  691. message: "时间条件未选择,请确认!",
  692. duration: 2500,
  693. showClose: true,
  694. });
  695. return
  696. }
  697. if (isShowHandWrite.value) {
  698. isShowHandWrite.value = false
  699. }
  700. if (isShowTargetResult.value === false) {
  701. isShowTargetResult.value = true
  702. }
  703. sqlForm.id = ruleForm.value.id
  704. sqlForm.pid = ruleForm.value.pid
  705. sqlForm.childId = ruleForm.value.childId
  706. sqlForm.momId = ruleForm.value.momId
  707. targetSqlExecuteById(sqlForm)
  708. .then((res: any) => {
  709. resultList.value = res
  710. });
  711. }
  712. // ------------ 手动填值 ---------
  713. const handWrite = () => {
  714. upFormRef.value?.resetFields()
  715. if (isShowTargetResult.value) {
  716. isShowTargetResult.value = false
  717. }
  718. resultList.value = [] as any
  719. isShowHandWrite.value = true
  720. }
  721. // ------------ 统计结果保存 --------------
  722. const saveTargetDictResult = () => {
  723. if (ruleForm.value.id === '') {
  724. ElMessage({
  725. type: "info",
  726. message: "指标信息不全,请确认!",
  727. duration: 2500,
  728. showClose: true,
  729. });
  730. return
  731. }
  732. if (QtResultData) {
  733. ElMessageBox.confirm('已存在统计结果,请确认是否继续保存统计结果?', {
  734. cancelButtonText: '取消',
  735. confirmButtonText: '确定',
  736. })
  737. .then(() => {
  738. let targetResultList = [] as any
  739. if (resultList.value.length > 0) {
  740. targetResultList = clone(resultList.value)
  741. } else {
  742. for (let i = 1; i <= 4; i++) {
  743. if (sqlForm['year' + i] && sqlForm['calcResult' + i]) {
  744. let handWriteData = {} as DataType
  745. handWriteData.id = ruleForm.value.id
  746. handWriteData.pid = ruleForm.value.pid
  747. handWriteData.dataType = '2'
  748. handWriteData.year = sqlForm['year' + i]
  749. handWriteData.childResult = sqlForm['childResult' + i]
  750. handWriteData.momResult = sqlForm['momResult' + i]
  751. handWriteData.calcResult = sqlForm['calcResult' + i]
  752. targetResultList.push(handWriteData)
  753. }
  754. }
  755. }
  756. if (targetResultList.length > 0) {
  757. saveTargetReportResult(targetResultList)
  758. .then((res: any) => {
  759. if (res) {
  760. ElMessage({
  761. type: "success",
  762. message: "保存统计结果成功!",
  763. duration: 2500,
  764. showClose: true,
  765. });
  766. return
  767. }
  768. });
  769. } else {
  770. ElMessage({
  771. type: "info",
  772. message: "保存统计结果为空,请确认!",
  773. duration: 2500,
  774. showClose: true,
  775. });
  776. return
  777. }
  778. }).catch(() => {
  779. })
  780. }
  781. }
  782. // -------------------- 指标统计结果查询 --------------------
  783. let QtResultData = ref([])
  784. const queryTargetReportResult = () => {
  785. if (ruleForm.value.id === '') {
  786. ElMessage({
  787. type: "info",
  788. message: "指标信息不全,请确认!",
  789. duration: 2500,
  790. showClose: true,
  791. });
  792. return
  793. }
  794. if (isShowHandWrite.value) {
  795. isShowHandWrite.value = false
  796. }
  797. if (isShowTargetResult.value) {
  798. isShowTargetResult.value = false
  799. }
  800. let queryData = {
  801. id: '',
  802. pid: '',
  803. startTime: '',
  804. endTime: '',
  805. }
  806. queryData.id = ruleForm.value.id
  807. queryData.pid = ruleForm.value.pid
  808. selectTargetReportResult(queryData)
  809. .then((res: any) => {
  810. if (isShowQtResult.value === false) {
  811. isShowQtResult.value = true
  812. }
  813. QtResultData.value = res
  814. });
  815. }
  816. </script>
  817. <style lang="scss" scoped deep>
  818. .hd-cl {
  819. margin-bottom: 1px !important;
  820. }
  821. </style>