TargetDictConfig.vue 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044
  1. <template>
  2. <div class="layout_container">
  3. <div class="layout_main layout_container layout-horizontal">
  4. <aside style="width: 600px;">
  5. <TargetTree v-if="isShowTree" :targetTreeData="targetTreeData" @treeNodeClick="treeNodeClick"/>
  6. </aside>
  7. <div class="layout_container layout_overflow_auto">
  8. <header>
  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. </header>
  18. <div class="layout_main layout_card">
  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="100px" :model="sqlForm" class="demo-ruleForm" :size="formSize">
  139. <el-row>
  140. <el-col :span="7">
  141. <el-form-item label="年度周期" prop="cycle">
  142. <el-select v-model="cycle" placeholder="请选择年度周期" clearable style="width: 100%" @change="cycleFormat">
  143. <el-option v-for="item in reportCycleList" :key="item.reportCycle"
  144. :label="item.yearRange" :value="item.reportCycle" selected>
  145. <span style="float: left">{{ item.yearRange }}</span>
  146. <span
  147. style="float: right; padding-left: 4px; color: var(--el-text-color-secondary); font-size: 13px;">{{
  148. item.remark }}</span>
  149. </el-option>
  150. </el-select>
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="6">
  154. <el-form-item label="开始年份">
  155. <el-form-item prop="startTime">
  156. <el-input v-model="sqlForm.startTime" disabled />
  157. </el-form-item>
  158. </el-form-item>
  159. </el-col>
  160. <el-col :span="6">
  161. <el-form-item label="结束年份">
  162. <el-form-item prop="endTime">
  163. <el-input v-model="sqlForm.endTime" disabled />
  164. </el-form-item>
  165. </el-form-item>
  166. </el-col>
  167. <el-col :span="5">
  168. <el-form-item label="得分填写">
  169. <el-form-item prop="zbScore">
  170. <el-input v-model="zbScore" show-word-limit />
  171. </el-form-item>
  172. </el-form-item>
  173. </el-col>
  174. </el-row>
  175. <el-row>
  176. <!-- <el-col :span="4">-->
  177. <!-- <el-form-item>-->
  178. <!-- <el-button type="primary" @click="sqlEdit(ruleFormRef)"> 指标sql编辑</el-button>-->
  179. <!-- </el-form-item>-->
  180. <!-- </el-col>-->
  181. <el-col :span="4">
  182. <el-form-item>
  183. <el-button type="primary" @click="sqlExecute(ruleFormRef)"> 指标运行结果</el-button>
  184. </el-form-item>
  185. </el-col>
  186. <el-col :span="4">
  187. <el-form-item>
  188. <el-button type="primary" @click="handWrite()"> 结果手动填写</el-button>
  189. </el-form-item>
  190. </el-col>
  191. <el-col :span="4">
  192. <el-form-item>
  193. <el-button type="primary" @click="saveTargetDictResult()"> 指标结果保存</el-button>
  194. </el-form-item>
  195. </el-col>
  196. <el-col :span="4">
  197. <el-form-item>
  198. <el-button type="primary" @click="queryTargetReportResult()"> 指标结果查询</el-button>
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="4">
  202. <el-form-item>
  203. <el-button type="primary" @click="saveTargetReportScore()"> 指标得分保存</el-button>
  204. </el-form-item>
  205. </el-col>
  206. </el-row>
  207. </el-form>
  208. <el-form ref="upFormRef" label-width="180px" :model="sqlForm" class="demo-ruleForm" :size="formSize"
  209. :disabled="isShowTargetResult" v-show="isShowTargetResult">
  210. <el-row v-for="item in resultList">
  211. <el-col :span="8">
  212. <el-form-item :label="item.childLabel" :prop="item.childLabel + item.index">
  213. <el-input v-model="item.childResult" />
  214. </el-form-item>
  215. </el-col>
  216. <el-col :span="8">
  217. <el-form-item :label="item.momLabel" :prop="item.momLabel + item.index">
  218. <el-input v-model="item.momResult" />
  219. </el-form-item>
  220. </el-col>
  221. <el-col :span="8">
  222. <el-form-item :label="item.calcLabel" :prop="item.calcLabel + item.index">
  223. <el-input v-model="item.calcResult" />
  224. </el-form-item>
  225. </el-col>
  226. </el-row>
  227. </el-form>
  228. <el-form ref="upFormRef" label-width="120px" :model="sqlForm" class="demo-ruleForm" :size="formSize"
  229. v-show="isShowHandWrite">
  230. <el-row v-for="e in 4">
  231. <el-col :span="6">
  232. <el-form-item :label="'年份' + e" :prop="'year' + e" :rules="[{ type: 'number', message: '年份必须是数字' },]">
  233. <el-input v-model.number="sqlForm['year' + e]" minlength="4" maxlength="4" show-word-limit />
  234. </el-form-item>
  235. </el-col>
  236. <el-col :span="6">
  237. <el-form-item :label="'分子结果' + e" :prop="'childResult' + e">
  238. <el-input v-model="sqlForm['childResult' + e]" minlength="1" maxlength="12" show-word-limit />
  239. </el-form-item>
  240. </el-col>
  241. <el-col :span="6">
  242. <el-form-item :label="'分母结果' + e" :prop="'momResult' + e">
  243. <el-input v-model="sqlForm['momResult' + e]" minlength="1" maxlength="12" show-word-limit />
  244. </el-form-item>
  245. </el-col>
  246. <el-col :span="6">
  247. <el-form-item :label="'分子/分母-结果' + e" :prop="'calcResult' + e">
  248. <el-input v-model="sqlForm['calcResult' + e]" minlength="1" maxlength="12" show-word-limit />
  249. </el-form-item>
  250. </el-col>
  251. </el-row>
  252. </el-form>
  253. <el-row v-show="isShowQtResult">
  254. <el-table :data="QtResultData" stripe border highlight-current-row row-key="childKey" height="200"
  255. style="width: 100%">
  256. <el-table-column prop="year" label="年份" header-align="center" />
  257. <el-table-column prop="dataType" label="数据方式" header-align="center">
  258. <template #default="scope">
  259. {{ scope.row.dataType == '1' ? 'sql统计' : '手动输入' }}
  260. </template>
  261. </el-table-column>
  262. <el-table-column prop="childResult" label="分子结果" header-align="center" />
  263. <el-table-column prop="momResult" label="分母结果" header-align="center" />
  264. <el-table-column prop="calcResult" label="计算结果" header-align="center" />
  265. <el-table-column prop="op" label="统计人员" header-align="center" />
  266. <el-table-column prop="opTime" label="统计时间" header-align="center" width="200" />
  267. </el-table>
  268. </el-row>
  269. </el-form>
  270. </div>
  271. </div>
  272. </div>
  273. </div>
  274. <el-drawer :title="'Sql编辑'" v-model="isSqlEdit" size="80%" destroy-on-close>
  275. <SqlEditPage :sqlEditData="sqlEditData" />
  276. </el-drawer>
  277. </template>
  278. <script setup name="TargetDictConfig" lang="ts">
  279. import { ref, reactive, onMounted, nextTick } from 'vue'
  280. import TargetTree from '../target-comm/targetTree.vue'
  281. import SqlEditPage from '../target-comm/SqlEditPage.vue'
  282. import { ElMessage, ElMessageBox } from 'element-plus'
  283. import type { FormInstance, FormRules } from 'element-plus'
  284. import { clone } from '@/utils/clone'
  285. import { formatDate } from '@/utils/date'
  286. import { queryDept } from '@/api/public-api'
  287. import {
  288. selectTargetDictById,
  289. selectTargetDictTree,
  290. saveTargetDict,
  291. selectScoreCycle,
  292. updateTargetReportScore,
  293. selectTargetReportScore,
  294. selectScoreCyclePermissions
  295. } from '@/api/target-management/target-dict'
  296. import { selectTargetZbReportId } from '@/api/target-management/report-dict'
  297. import { employeeList } from "@/api/zhu-yuan-yi-sheng/pat-info-query"
  298. import {
  299. targetSqlExecuteById,
  300. saveTargetReportResult,
  301. selectTargetReportResult
  302. } from '@/api/target-management/target-sql'
  303. const targetTreeData = ref({
  304. data: [{}],
  305. height: 940,
  306. })
  307. const isShowTree = ref(false)
  308. const isShowForm = ref(false)
  309. // 是否显示指标sql运行结果
  310. const isShowTargetResult = ref(false)
  311. // 是否显示指标手动输入结果
  312. const isShowHandWrite = ref(false)
  313. // 是否显示指标查询结果
  314. const isShowQtResult = ref(false)
  315. const nowDay = new Date()
  316. const ds = formatDate(nowDay)
  317. const deptWardList = ref([])
  318. const empList = ref([])
  319. const deptInfoRef = ref()
  320. const opInfoRef = ref()
  321. const reportIdOptions = ref([{ code: '', name: '' }])
  322. // 年度周期
  323. const cycle = ref('')
  324. // 得分
  325. const zbScore = ref('')
  326. const isSqlEdit = ref(false)
  327. let sqlEditData = ref({
  328. id: '', // 指标编码
  329. name: '', // 指标名称
  330. pid: '', // 父级编码
  331. sort: '', // 指标序号
  332. calcChild: '', // 计算分子sql
  333. calcMom: '', // 计算分母sql
  334. childId: '', // 分子sql的报表id
  335. momId: '', // 分母sql的报表id
  336. })
  337. const queryParam = reactive({
  338. id: '', // 指标编码
  339. name: '', // 指标名称
  340. pid: '', // 父级编码
  341. sort: '', // 指标序号
  342. type: '', // 对接类型
  343. state: '', // 状态
  344. openTime: '', // 启用时间
  345. deptId: '', // 责任科室id
  346. source: '', // 数据来源
  347. calcChild: '', // 计算分子sql
  348. calcMom: '', // 计算分母sql
  349. isLeaf: '', //是否叶子节点(0:否, 1:是)
  350. })
  351. onMounted(() => {
  352. nextTick(() => {
  353. queryTargetDictTree()
  354. queryTargetZbReportId()
  355. deptMethod('')
  356. empMethod('')
  357. // 查询得分年度
  358. queryScoreCycle()
  359. })
  360. })
  361. const deptMethod = (val: string) => {
  362. queryDept(val).then((res: any) => {
  363. deptWardList.value = res
  364. })
  365. }
  366. const empMethod = (val: string) => {
  367. employeeList(val).then((res: any) => {
  368. empList.value = res
  369. })
  370. }
  371. const queryTargetZbReportId = () => {
  372. selectTargetZbReportId('zb').then((res: any) => {
  373. reportIdOptions.value = res
  374. })
  375. }
  376. // 查询指标字典树
  377. const queryTargetDictTree = () => {
  378. isShowTree.value == true ? false : true
  379. queryParam.id = '';
  380. queryParam.pid = '';
  381. selectTargetDictTree(queryParam)
  382. .then((res: any) => {
  383. targetTreeData.value.data = res
  384. isShowTree.value = true
  385. });
  386. }
  387. // ------ 指标字典新增,修改保存表单开始 ------
  388. let ruleForm = ref({
  389. id: '', // 指标编码
  390. name: '', // 指标名称
  391. pid: '', // 父级编码
  392. sort: '', // 指标序号
  393. score: '', // 总分
  394. ratio: '', // 所占比率
  395. type: '0', // 对接类型
  396. state: 'Y', // 状态
  397. openTime: ds, // 启用时间
  398. dept: '', // 责任科室
  399. deptCode: '', // 责任科室id
  400. op: '', // 责任人
  401. opId: '', // 责任人id
  402. definition: '', // 指标定义
  403. method: '', // 评审方法
  404. scoreRule: '', // 计分细则
  405. source: '', // 数据来源
  406. isLeaf: '1', // 是否叶子节点(0:否, 1:是)
  407. calcChild: '', // 计算-分子
  408. calcMom: '', // 计算-分母
  409. childId: '',
  410. momId: '',
  411. })
  412. let sqlForm = reactive({
  413. id: '', // 指标编码
  414. pid: '', // 父级编码
  415. calcChild: '', // 计算分子sql
  416. calcMom: '', // 计算分母sql
  417. startTime: '', // 计算开始时间
  418. endTime: '', // 计算结束时间
  419. year1: '', // 计算年份1
  420. childResult1: '', // 计算分子结果1
  421. momResult1: '', // 计算分母结果1
  422. calcResult1: '', // 计算结果1
  423. year2: '', // 计算年份2
  424. childResult2: '', // 计算分子结果2
  425. momResult2: '', // 计算分母结果2
  426. calcResult2: '', // 计算结果2
  427. year3: '', // 计算年份3
  428. childResult3: '', // 计算分子结果3
  429. momResult3: '', // 计算分母结果3
  430. calcResult3: '', // 计算结果3
  431. year4: '', // 计算年份4
  432. childResult4: '', // 计算分子结果4
  433. momResult4: '', // 计算分母结果4
  434. calcResult4: '', // 计算结果4
  435. childResult: '',
  436. momResult: '',
  437. calcResult: '',
  438. childId: '',
  439. momId: '',
  440. })
  441. const formSize = ref('default')
  442. const ruleFormRef = ref<FormInstance>()
  443. const upFormRef = ref<FormInstance>()
  444. const rulesForm = ref<FormRules>({
  445. name: [
  446. { required: true, message: '请填写指标名称', trigger: 'blur' },
  447. { min: 1, max: 256, message: '指标名称长度范围1-256个字符', trigger: 'blur' },
  448. ],
  449. id: [
  450. { required: true, message: '请填写指标id', trigger: 'blur' },
  451. { min: 1, max: 12, message: '指标id长度范围1-12个字符', trigger: 'blur' },
  452. ],
  453. pid: [
  454. { required: true, message: '请填写指标父id', trigger: 'blur' },
  455. { min: 1, max: 12, message: '指标父id长度范围1-12个字符', trigger: 'blur' },
  456. ],
  457. sort: [
  458. { min: 0, max: 12, message: '指标序号长度范围0-12个字符', trigger: 'blur' },
  459. ],
  460. score: [
  461. { required: true, message: '请填写指标总分', trigger: 'blur' },
  462. {
  463. validator: (rule: any, value: any, callback: any) => {
  464. if (/^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/.test(value) == false) {
  465. callback(new Error("请输入正整数或两位小数"));
  466. } else {
  467. callback();
  468. }
  469. },
  470. trigger: "blur",
  471. }
  472. ],
  473. ratio: [
  474. { min: 0, max: 48, message: '指标所占比例长度范围0-48个字符', trigger: 'blur' },
  475. ],
  476. definition: [
  477. { required: true, message: '请填写指标定义', trigger: 'blur' },
  478. ],
  479. method: [
  480. { required: true, message: '请填写评审方法', trigger: 'blur' },
  481. ],
  482. scoreRule: [
  483. { required: true, message: '请填写计分细则', trigger: 'blur' },
  484. ]
  485. })
  486. // 需要添加的叶子节点的校验
  487. const leafRuleFields = ['definition', 'method', 'scoreRule']
  488. const submitForm = async (formEl: FormInstance | undefined) => {
  489. if (!formEl) return
  490. // 处理叶子节点验证
  491. await leafRulesChange(formEl)
  492. await formEl.validate((valid, fields) => {
  493. if (valid) {
  494. ruleForm.value.dept = deptInfoRef.value.states.selectedLabel
  495. ruleForm.value.op = opInfoRef.value.states.selectedLabel
  496. saveTargetDict(ruleForm.value).then((res: any) => {
  497. if (res) {
  498. nextTick(() => {
  499. queryTargetDictTree()
  500. if (!isShowForm.value) {
  501. isShowForm.value = true
  502. }
  503. })
  504. } else {
  505. queryTargetDictTree()
  506. return
  507. }
  508. });
  509. } else {
  510. return
  511. }
  512. })
  513. }
  514. const addForm = (formEl: FormInstance | undefined) => {
  515. if (!formEl) return
  516. if (queryParam.id === '') {
  517. ElMessage({
  518. type: "info",
  519. message: "请选择一个指标!",
  520. duration: 2500,
  521. showClose: true,
  522. });
  523. return
  524. }
  525. if (queryParam.isLeaf === '1') {
  526. ElMessage({
  527. type: "info",
  528. message: "请选择一个父节点指标!",
  529. duration: 2500,
  530. showClose: true,
  531. });
  532. return
  533. }
  534. if (isShowForm.value) {
  535. isShowForm.value = false
  536. }
  537. formEl.resetFields()
  538. // 新增自动映射父指标id作为子指标的父id
  539. ruleForm.value.pid = queryParam.id
  540. sqlForm.startTime = ''
  541. sqlForm.endTime = ''
  542. sqlForm.childResult = ''
  543. sqlForm.momResult = ''
  544. sqlForm.calcResult = ''
  545. cycle.value = ''
  546. zbScore.value = ''
  547. }
  548. const resetForm = (formEl: FormInstance | undefined) => {
  549. if (!formEl) return
  550. if (isShowForm.value) {
  551. isShowForm.value = false
  552. }
  553. if (isShowTargetResult.value) {
  554. isShowTargetResult.value = false
  555. }
  556. if (isShowHandWrite.value) {
  557. isShowHandWrite.value = false
  558. }
  559. if (isShowQtResult.value) {
  560. isShowQtResult.value = false
  561. }
  562. sqlForm.startTime = ''
  563. sqlForm.endTime = ''
  564. resultList.value = []
  565. formEl.resetFields()
  566. upFormRef.value?.resetFields()
  567. cycle.value = ''
  568. zbScore.value = ''
  569. }
  570. const changeNode = async (formEl: FormInstance | undefined) => {
  571. if (!formEl) return
  572. await leafRulesChange(formEl)
  573. }
  574. // 叶子节点校验
  575. const leafRulesChange = async (formEl: FormInstance | undefined) => {
  576. if (!formEl) return
  577. // 父节点
  578. if (ruleForm.value.isLeaf === '0') {
  579. // 取消叶子节点的字典值校验
  580. leafRuleFields.forEach(e => {
  581. if (rulesForm.value[e]) {
  582. let dfas = rulesForm.value[e] as any
  583. dfas[0].required = true
  584. }
  585. })
  586. formEl.clearValidate(leafRuleFields)
  587. } else { // 叶子节点
  588. // 增加叶子节点的字典值校验
  589. leafRuleFields.forEach(e => {
  590. if (rulesForm.value[e]) {
  591. let dfas = rulesForm.value[e] as any
  592. dfas[0].required = true
  593. }
  594. })
  595. }
  596. }
  597. const editForm = (formEl: FormInstance | undefined) => {
  598. if (!formEl) return
  599. if (isShowForm.value) {
  600. isShowForm.value = false
  601. if ('1' === ruleForm.value.isLeaf) {
  602. changeNode(formEl)
  603. }
  604. }
  605. }
  606. // ------ 指标字典新增,修改保存表单结束 ------
  607. // ------ 接收树页面传来的数据 -------
  608. const treeNodeClick = (data: any, node: any, obj: any) => {
  609. if (node.data) {
  610. sqlForm.startTime = '2021'
  611. sqlForm.endTime = '2024'
  612. cycle.value = 'Y1'
  613. let params = {
  614. id: node.data.id,
  615. reportCycle: cycle.value
  616. }
  617. // 查询指标得分情况
  618. queryTargetReportScore(params)
  619. resultList.value = []
  620. if (isShowTargetResult.value === false) {
  621. isShowTargetResult.value = true
  622. }
  623. queryParam.id = node.data.id
  624. queryParam.pid = node.data.pid
  625. selectTargetDictById(queryParam)
  626. .then((res: any) => {
  627. if (res) {
  628. nextTick(() => {
  629. isShowForm.value = true
  630. ruleForm.value = res
  631. // 获取点击树的是否叶子节点数据
  632. queryParam.isLeaf = ruleForm.value.isLeaf
  633. ruleFormRef.value?.resetFields()
  634. ruleFormRef.value?.clearValidate()
  635. leafRulesChange(ruleFormRef.value)
  636. upFormRef.value?.resetFields()
  637. // 获取指标报表结果
  638. queryTargetReportResult()
  639. })
  640. }
  641. });
  642. }
  643. }
  644. // ------------------------- sql编辑 -----------------------
  645. const sqlEdit = (formEl: FormInstance | undefined) => {
  646. if (!formEl) return
  647. if (ruleForm.value.id === '') {
  648. ElMessage({
  649. type: "info",
  650. message: "指标信息不全,请确认!",
  651. duration: 2500,
  652. showClose: true,
  653. });
  654. return
  655. }
  656. if (ruleForm.value.isLeaf === '0') {
  657. ElMessage({
  658. type: "info",
  659. message: "不是基础指标,不需要编写sql,请确认!",
  660. duration: 2500,
  661. showClose: true,
  662. });
  663. return
  664. }
  665. isSqlEdit.value = true
  666. sqlEditData.value.id = ruleForm.value.id
  667. sqlEditData.value.pid = ruleForm.value.pid
  668. sqlEditData.value.name = ruleForm.value.name
  669. sqlEditData.value.calcChild = ruleForm.value.calcChild
  670. sqlEditData.value.calcMom = ruleForm.value.calcMom
  671. sqlEditData.value.childId = ruleForm.value.childId
  672. sqlEditData.value.momId = ruleForm.value.momId
  673. sqlEditData.value.sort = ruleForm.value.sort
  674. }
  675. // --------------- sql编写结束 ------------
  676. // --------------- sql运行 ----------------
  677. interface DataType {
  678. id: string,
  679. pid: string,
  680. childLabel: string,
  681. childResult: string,
  682. momLabel: string,
  683. momResult: string,
  684. calcLabel: string,
  685. calcResult: string,
  686. index: number,
  687. year: number,
  688. dataType: string, // 数据统计类型:1 sql计算获得; 2 手动输入填写获得
  689. }
  690. const resultList = ref([{
  691. id: '',
  692. pid: '',
  693. childLabel: '',
  694. childResult: '',
  695. momLabel: '',
  696. momResult: '',
  697. calcLabel: '',
  698. calcResult: '',
  699. index: 0,
  700. year: 0,
  701. dataType: '',
  702. }])
  703. const sqlExecute = (formEl: FormInstance | undefined) => {
  704. if (!formEl) return
  705. // 验证是否填写完整
  706. if (ruleForm.value.id === '') {
  707. ElMessage({
  708. type: "info",
  709. message: "指标信息不全,请确认!",
  710. duration: 2500,
  711. showClose: true,
  712. });
  713. return
  714. }
  715. if (ruleForm.value.isLeaf === '0') {
  716. ElMessage({
  717. type: "info",
  718. message: "不是基础指标,不需要执行sql,请确认!",
  719. duration: 2500,
  720. showClose: true,
  721. });
  722. return
  723. }
  724. if (ruleForm.value.calcChild === '') {
  725. ElMessage({
  726. type: "info",
  727. message: "未编写sql,请联系管理员编写!",
  728. duration: 2500,
  729. showClose: true,
  730. });
  731. return
  732. }
  733. if (sqlForm.startTime === '' || sqlForm.endTime === '') {
  734. ElMessage({
  735. type: "info",
  736. message: "时间条件未选择,请确认!",
  737. duration: 2500,
  738. showClose: true,
  739. });
  740. return
  741. }
  742. if (isShowHandWrite.value) {
  743. isShowHandWrite.value = false
  744. }
  745. if (isShowTargetResult.value === false) {
  746. isShowTargetResult.value = true
  747. }
  748. sqlForm.id = ruleForm.value.id
  749. sqlForm.pid = ruleForm.value.pid
  750. sqlForm.childId = ruleForm.value.childId
  751. sqlForm.momId = ruleForm.value.momId
  752. targetSqlExecuteById(sqlForm)
  753. .then((res: any) => {
  754. resultList.value = res
  755. });
  756. }
  757. // ------------ 手动填值 ---------
  758. const handWrite = () => {
  759. upFormRef.value?.resetFields()
  760. if (isShowTargetResult.value) {
  761. isShowTargetResult.value = false
  762. }
  763. resultList.value = [] as any
  764. isShowHandWrite.value = true
  765. }
  766. // ------------ 统计结果保存 --------------
  767. const saveTargetDictResult = () => {
  768. if (ruleForm.value.id === '') {
  769. ElMessage({
  770. type: "info",
  771. message: "指标信息不全,请确认!",
  772. duration: 2500,
  773. showClose: true,
  774. });
  775. return
  776. }
  777. if (QtResultData) {
  778. ElMessageBox.confirm('已存在统计结果,请确认是否继续保存统计结果?', {
  779. cancelButtonText: '取消',
  780. confirmButtonText: '确定',
  781. })
  782. .then(() => {
  783. let targetResultList = [] as any
  784. if (resultList.value.length > 0) {
  785. targetResultList = clone(resultList.value)
  786. } else {
  787. for (let i = 1; i <= 4; i++) {
  788. if (sqlForm['year' + i] && sqlForm['calcResult' + i]) {
  789. let handWriteData = {} as DataType
  790. handWriteData.id = ruleForm.value.id
  791. handWriteData.pid = ruleForm.value.pid
  792. handWriteData.dataType = '2'
  793. handWriteData.year = sqlForm['year' + i]
  794. handWriteData.childResult = sqlForm['childResult' + i]
  795. handWriteData.momResult = sqlForm['momResult' + i]
  796. handWriteData.calcResult = sqlForm['calcResult' + i]
  797. targetResultList.push(handWriteData)
  798. }
  799. }
  800. }
  801. if (targetResultList.length > 0) {
  802. saveTargetReportResult(targetResultList)
  803. .then((res: any) => {
  804. if (res) {
  805. ElMessage({
  806. type: "success",
  807. message: "保存统计结果成功!",
  808. duration: 2500,
  809. showClose: true,
  810. });
  811. // 查询结果
  812. queryTargetReportResult()
  813. return
  814. }
  815. });
  816. } else {
  817. ElMessage({
  818. type: "info",
  819. message: "保存统计结果为空,请确认!",
  820. duration: 2500,
  821. showClose: true,
  822. });
  823. return
  824. }
  825. }).catch(() => {
  826. })
  827. }
  828. }
  829. // -------------------- 指标统计结果查询 --------------------
  830. let QtResultData = ref([])
  831. const queryTargetReportResult = () => {
  832. if (ruleForm.value.id === '') {
  833. ElMessage({
  834. type: "info",
  835. message: "指标信息不全,请确认!",
  836. duration: 2500,
  837. showClose: true,
  838. });
  839. return
  840. }
  841. if (isShowHandWrite.value) {
  842. isShowHandWrite.value = false
  843. }
  844. if (isShowTargetResult.value) {
  845. isShowTargetResult.value = false
  846. }
  847. let queryData = {
  848. id: '',
  849. pid: '',
  850. startTime: '',
  851. endTime: '',
  852. }
  853. queryData.id = ruleForm.value.id
  854. queryData.pid = ruleForm.value.pid
  855. selectTargetReportResult(queryData)
  856. .then((res: any) => {
  857. if (isShowQtResult.value === false) {
  858. isShowQtResult.value = true
  859. }
  860. QtResultData.value = res
  861. });
  862. }
  863. //------------------------------得分设置-------------------
  864. // 得分年份
  865. const reportCycleList = ref([])
  866. const queryScoreCycle = () => {
  867. selectScoreCycle()
  868. .then((res: any) => {
  869. reportCycleList.value = res
  870. });
  871. }
  872. // 计算得分data
  873. const scoreData = ref({
  874. id: '', // 指标编码
  875. pid: '', // 父级编码
  876. reportCycle: '',
  877. reportScore: '',
  878. criterionScore: '',
  879. authorId: '',
  880. authorName: '',
  881. })
  882. // 年度周期变化
  883. const cycleFormat = () => {
  884. let reportCycle = reportCycleList.value.filter((item) => {
  885. return item.reportCycle === cycle.value
  886. })
  887. if(reportCycle){
  888. sqlForm.startTime = reportCycle[0].startYear
  889. sqlForm.endTime = reportCycle[0].endYear
  890. let params = {
  891. id: ruleForm.value.id,
  892. reportCycle: cycle.value
  893. }
  894. queryTargetReportScore(params)
  895. }
  896. }
  897. const saveTargetReportScore = () => {
  898. selectScoreCyclePermissions()
  899. .then((res: any) => {
  900. let permissions = res.permissions
  901. if(permissions === 2){
  902. ElMessage({
  903. type: "warning",
  904. message: "没有权限保存指标周期得分,请确认!",
  905. duration: 2500,
  906. showClose: true,
  907. });
  908. return
  909. } else if(permissions === 0){
  910. callSaveTargetReportScore()
  911. } else {
  912. callSaveTargetReportScore()
  913. }
  914. });
  915. }
  916. const callSaveTargetReportScore = () => {
  917. if (sqlForm.startTime === '' || sqlForm.endTime === '') {
  918. ElMessage({
  919. type: "info",
  920. message: "时间选择不全,请确认!",
  921. duration: 2500,
  922. showClose: true,
  923. });
  924. return
  925. }
  926. if (zbScore.value === '') {
  927. ElMessage({
  928. type: "info",
  929. message: "指标得分为空,请确认!",
  930. duration: 2500,
  931. showClose: true,
  932. });
  933. return
  934. }
  935. if (zbScore.value > ruleForm.value.score) {
  936. ElMessage({
  937. type: "info",
  938. message: "指标得分不能大于指标总分(" + ruleForm.value.score + "),请确认!",
  939. duration: 2500,
  940. showClose: true,
  941. });
  942. return
  943. }
  944. // 指标编码id
  945. scoreData.value.id = ruleForm.value.id;
  946. scoreData.value.pid = ruleForm.value.pid;
  947. // 年度周期
  948. scoreData.value.reportCycle = cycle.value
  949. // 指标年度周期得分
  950. scoreData.value.reportScore = zbScore.value
  951. // 指标标准(得)分
  952. scoreData.value.criterionScore = ruleForm.value.score
  953. updateTargetReportScore(scoreData.value)
  954. .then((res: any) => {
  955. ElMessage({
  956. type: "success",
  957. message: res.cg,
  958. duration: 2500,
  959. showClose: true,
  960. });
  961. });
  962. }
  963. const queryTargetReportScore = (params) => {
  964. zbScore.value = ''
  965. selectTargetReportScore(params)
  966. .then((res: any) => {
  967. if(res){
  968. zbScore.value = res.reportScore
  969. } else {
  970. zbScore.value = ''
  971. }
  972. });
  973. }
  974. </script>
  975. <style lang="scss" scoped>
  976. :deep(.hd-cl) {
  977. margin-bottom: 1px !important;
  978. }
  979. </style>