dataAnalysisDialog.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <template>
  2. <el-dialog ref="dialog" :visible.sync="dialogVisible" :close-on-click-modal="false" class="form-renderer-dialog" :width="width" :top="top" :title="this.dynamicParams.editFromType" :custom-class="customClass" append-to-body @close="closeDialog">
  3. <div class="maintenanceCycle">
  4. <div class="maintenanceFont">指标名称:</div>
  5. <div style="width:50%;">
  6. <el-select v-model="cycleValue" clearable placeholder="请选择">
  7. <el-option
  8. v-for="item in cycleOptions"
  9. :key="item.val"
  10. :label="item.label"
  11. :value="item.val">
  12. <span style="float: left">{{ item.label }}</span>
  13. <span style="float: right; color: #8492a6; font-size: 13px">{{ item.leixing }}</span>
  14. </el-option>
  15. </el-select>
  16. </div>
  17. </div>
  18. <div class="maintenanceCycle" style="align-items: normal;">
  19. <div class="maintenanceFont">类型:</div>
  20. <el-radio-group v-model="tyepRadio">
  21. <el-radio v-for="(item,i) in tyepRadioOptions" :key="i" :label="item.val">{{item.label}}</el-radio>
  22. </el-radio-group>
  23. </div>
  24. <div class="maintenanceCycle" style="align-items: normal;">
  25. <div class="maintenanceFont">验证方法:</div>
  26. <el-input
  27. style="width:50%;"
  28. type="textarea"
  29. placeholder="请输入内容"
  30. v-model="verificationMethodTextarea"
  31. maxlength="500"
  32. show-word-limit
  33. >
  34. </el-input>
  35. </div>
  36. <div class="maintenanceCycle" style="align-items: normal;">
  37. <div class="maintenanceFont">判断标准:</div>
  38. <el-input
  39. style="width:50%;"
  40. type="textarea"
  41. placeholder="请输入内容"
  42. v-model="criteriaTextarea"
  43. maxlength="500"
  44. show-word-limit
  45. >
  46. </el-input>
  47. </div>
  48. <div class="maintenanceCycle" style="align-items: normal;">
  49. <div class="maintenanceFont">评价结果:</div>
  50. <el-input
  51. style="width:50%;"
  52. type="textarea"
  53. placeholder="请输入内容"
  54. v-model="maintenanceTextarea"
  55. maxlength="500"
  56. show-word-limit
  57. >
  58. </el-input>
  59. </div>
  60. <div class="maintenanceCycle" style="align-items: normal;">
  61. <div class="maintenanceFont">数据存储:</div>
  62. <el-input
  63. style="width:50%;"
  64. type="textarea"
  65. placeholder="请输入内容"
  66. v-model="dataStoreTextarea"
  67. maxlength="500"
  68. show-word-limit
  69. >
  70. </el-input>
  71. </div>
  72. <div slot="footer" class="el-dialog--center">
  73. <ibps-toolbar :actions="editFromType != 'consult' ? toolbars : toolbarsConsult" @action-event="handleActionEvent" />
  74. </div>
  75. </el-dialog>
  76. </template>
  77. <script>
  78. import ActionUtils from '@/utils/action'
  79. import { queryDataTable } from '@/api/platform/data/dataTemplate'
  80. import { getBuildDataById } from '@/api/platform/data/dataTemplate'
  81. import { defaultsDeep } from 'lodash'
  82. import Vue from 'vue'
  83. // Vue.component('ibps-formrender', () => import('@/business/platform/form/formrender/index.vue'))
  84. export default {
  85. props: {
  86. visible: {
  87. type: Boolean,
  88. default: false
  89. },
  90. title: {
  91. type: String
  92. },
  93. customClass: {
  94. type: String
  95. },
  96. width: {
  97. type: String,
  98. default: '80%'
  99. },
  100. top: {
  101. type: String,
  102. default: '10%'
  103. },
  104. editFromType: {
  105. type: String,
  106. default: 'add'
  107. },
  108. dynamicParams:{
  109. type: Object
  110. },
  111. templateKey:{
  112. type: String,
  113. default: ''
  114. }
  115. },
  116. data() {
  117. const subtableConfiguration = ()=> {
  118. let zbTable = this.dynamicParams.formObj.formDefData.fields.find(i => i.field_name == "t_sjfxzb").field_options.columns
  119. let zblbTable = zbTable.find(i => i.field_name == "zhiBiaoId").field_options.options
  120. return zblbTable;
  121. }
  122. const subtableTypeConfiguration = ()=> {
  123. let zbTable = this.dynamicParams.formObj.formDefData.fields.find(i => i.field_name == "t_sjfxzb").field_options.columns
  124. let zblbTable = zbTable.find(i => i.field_name == "leiXing").field_options.options
  125. // console.log(zblbTable)
  126. return zblbTable;
  127. }
  128. return {
  129. qrCode: '',
  130. dialogVisible: this.visible,
  131. cycleOptions: [],
  132. // cycleOptions: subtableConfiguration(),
  133. cycleValue: '',
  134. tyepRadio: '',
  135. tyepRadioOptions: subtableTypeConfiguration(),
  136. maintenanceTextarea:'',
  137. verificationMethodTextarea:'',
  138. criteriaTextarea:'',
  139. dataStoreTextarea:'',
  140. toolbars: [
  141. { key: 'confirm', label: '确定'},
  142. { key: 'cancel'}
  143. ],
  144. bringOut:[],
  145. toolbarsConsult: [{ key: 'cancel' }],
  146. dataTemplate:[],
  147. nameCycle:''
  148. }
  149. },
  150. watch: {
  151. visible: {
  152. handler: function (val, oldVal) {
  153. this.dialogVisible = this.visible
  154. },
  155. immediate: true
  156. },
  157. cycleValue: {
  158. handler: function (val, oldVal) {
  159. // console.log(val)
  160. //sql版
  161. // let text = this.bringOut.find(i=>i.id_ == val)
  162. // if (typeof text != 'undefined') {
  163. // this.verificationMethodTextarea = text.yan_zheng_fang_fa
  164. // this.criteriaTextarea = text.pan_duan_biao_zhu
  165. // }
  166. //值来源
  167. let text = this.bringOut.find(i=>i.id_ == val)
  168. if (typeof text != 'undefined') {
  169. this.tyepRadio = text.lei_xing_
  170. this.nameCycle = text.zhi_biao_ming_che
  171. this.verificationMethodTextarea = text.yan_zheng_fang_fa
  172. this.criteriaTextarea = text.pan_duan_biao_zhu
  173. this.maintenanceTextarea = text.jie_guo_ping_jia_
  174. }
  175. },
  176. // immediate: true
  177. }
  178. },
  179. created(){
  180. this.loadFormData()
  181. this.bringOutData()
  182. },
  183. methods: {
  184. bringOutData(){
  185. //sql版
  186. // let bm = this.dynamicParams.formObj.getData("bianZhiBuMen")
  187. // let sql = "select * from t_zbmbpzzb where parent_id_ = (select id_ from t_zbmbpz where bian_zhi_bu_men_ = '"+bm+"' ORDER BY create_time_ DESC limit 1)"
  188. // this.$common.request('sql', sql).then(res => {
  189. // this.bringOut = res.variables.data.length>0?res.variables.data:[]
  190. // })
  191. //值来源
  192. getBuildDataById({
  193. dataTemplateId: "1214166960749674496"
  194. }).then(response => {
  195. const data = response.data
  196. // 从后台获取数据
  197. this.dataTemplate = JSON.parse(data).templates
  198. queryDataTable(this.getFormatParams()).then(response => {
  199. const data = response.data
  200. // this.dataResult = data.dataResult || []
  201. // console.log(data.dataResult,'111111111111')
  202. this.bringOut = data.dataResult
  203. data.dataResult.forEach(element => {
  204. let newVal = {val:element.id_ || '',label:element.zhi_biao_ming_che || '',yanzheng:element.yan_zheng_fang_fa || '',panduan:element.pan_duan_biao_zhu || '',leixing:element.lei_xing_ || ''}
  205. this.cycleOptions.push(newVal)
  206. });
  207. }).catch(() => {
  208. })
  209. }).catch(() => {
  210. this.dialogLoading = false
  211. })
  212. },
  213. handleActionEvent({ key }) {
  214. switch (key) {
  215. case 'confirm':
  216. this.handleConfirm(key)
  217. break
  218. case 'cancel':
  219. this.closeDialog()
  220. break
  221. default:
  222. break
  223. }
  224. },
  225. handleConfirm(key) {
  226. let a=this.dynamicParams.formObj.getData(this.templateKey)
  227. this.afterSubButton(this.verificationMethodTextarea,this.criteriaTextarea)
  228. if(this.cycleValue!=''&&this.verificationMethodTextarea!=''&&this.criteriaTextarea!=''&&this.maintenanceTextarea!=''&&this.dataStoreTextarea!=''){
  229. if(this.dynamicParams.position == 'manage'){
  230. this.$set(a,this.dynamicParams.params.index,{zhiBiaoMingCheng:this.nameCycle,zhiBiaoId:this.cycleValue,leiXing:this.tyepRadio,yanZhengFangFa:this.verificationMethodTextarea,panDuanBiaoZhun:this.criteriaTextarea,pingJiaJieGuo:this.maintenanceTextarea,shuJuCunChu:this.dataStoreTextarea})
  231. }else{
  232. a.push({zhiBiaoMingCheng:this.nameCycle,zhiBiaoId:this.cycleValue,leiXing:this.tyepRadio,yanZhengFangFa:this.verificationMethodTextarea,panDuanBiaoZhun:this.criteriaTextarea,pingJiaJieGuo:this.maintenanceTextarea,shuJuCunChu:this.dataStoreTextarea})
  233. }
  234. // this.$nextTick(function(){
  235. this.dynamicParams.formObj.setData(this.templateKey,a)
  236. // })
  237. // this.closeDialog()
  238. }else if(this.cycleValue!=''&&this.verificationMethodTextarea!=''&&this.criteriaTextarea!=''&&this.maintenanceTextarea!=''){
  239. }else{
  240. this.dynamicParams.formObj.$message.warning("请保证所有信息都已填写")
  241. }
  242. },
  243. // 关闭当前窗口
  244. closeDialog() {
  245. this.$emit('close', false)
  246. },
  247. loadFormData() {
  248. if(this.dynamicParams.position == 'manage'){
  249. let a=this.dynamicParams.formObj.getData(this.templateKey)[this.dynamicParams.params.index]
  250. this.cycleValue = a.zhiBiaoId
  251. this.nameCycle = a.zhiBiaoMingCheng
  252. this.tyepRadio = a.leiXing
  253. this.verificationMethodTextarea = a.yanZhengFangFa
  254. this.criteriaTextarea = a.panDuanBiaoZhun
  255. this.maintenanceTextarea = a.pingJiaJieGuo
  256. this.dataStoreTextarea = a.shuJuCunChu
  257. }
  258. },
  259. afterSubButton (val1,val2) {
  260. let arr = val1
  261. let arrr = val2
  262. if(arr.length>0||arrr.length>0){
  263. const regex = /{[^}]*}/g
  264. const result = arr.match(regex) // 验证方法 数组结构的字段对象
  265. const resultt = arrr.match(regex) // 判断标准 数组结构的字段对象
  266. if(!result || !resultt){
  267. this.dynamicParams.formObj.$message.error('数据中的验证方法或判断标准没有填写正确的格式,请确认后在重试')
  268. return
  269. }
  270. let resuArr = result.concat(resultt) //合并数组
  271. //判断json格式数据是否正确
  272. const ypName = resuArr.some(item => item.includes('样品名称'))
  273. const numrep = resuArr.some(item => item.includes('重复次数'))
  274. const exday = resuArr.some(item => item.includes('实验天数'))
  275. const parameter = resuArr.some(item => item.includes('判断参数'))
  276. const juvalue = resuArr.some(item => item.includes('判断值'))
  277. if(!ypName){
  278. this.dynamicParams.formObj.$message.error('验证方法的{样品名称}未填写')
  279. return
  280. }
  281. if(!numrep){
  282. this.dynamicParams.formObj.$message.error('验证方法的{重复次数}未填写')
  283. return
  284. }
  285. if(!exday){
  286. this.dynamicParams.formObj.$message.error('验证方法的{实验天数}未填写')
  287. return
  288. }
  289. if(!parameter){
  290. this.dynamicParams.formObj.$message.error('判断标准的{判断参数}未填写')
  291. return
  292. }
  293. if(!juvalue){
  294. this.dynamicParams.formObj.$message.error('判断标准的{判断值}未填写')
  295. return
  296. }
  297. let ojb = this.getJson(resuArr)
  298. this.dataStoreTextarea = JSON.stringify(ojb)
  299. this.closeDialog()
  300. }
  301. },
  302. //自定义方法处理数据转为json格式
  303. getJson(arr){
  304. let jsonObj = {}
  305. arr.forEach(item => {
  306. let parts = item.replace(/[{}]/g, '').split(':');
  307. if (parts.length === 2) {
  308. let key = parts[0].trim(); // 去除空格
  309. let value = parts[1].trim(); // 去除空格
  310. // 将属性名和属性值添加到 JSON 对象中
  311. jsonObj[key] = value;
  312. } else {
  313. // console.log("格式错误:" + item);
  314. }
  315. })
  316. return jsonObj
  317. },
  318. /**
  319. * 获取格式化参数
  320. */
  321. getFormatParams() {
  322. let formParams = {}
  323. if (this.$refs['searchForm']) {
  324. formParams = this.$refs['searchForm'].getSearcFormData() || {}
  325. }
  326. const responseData = this.dataTemplate[0]
  327. responseData.datasetKey = 'dlzbpzb'
  328. responseData.unique = 'id_'
  329. responseData['dynamic_params'] = ''
  330. formParams['response_data'] = JSON.stringify(responseData)
  331. formParams['filter_condition_key'] = ''
  332. return ActionUtils.formatParams(formParams, {limit: 200,page: 1,totalCount: 0})
  333. }
  334. }
  335. }
  336. </script>
  337. <style lang="scss" >
  338. .form-renderer-dialog {
  339. .el-dialog__body {
  340. padding: 10px 0 5px 0;
  341. }
  342. .el-dialog__headerbtn {
  343. z-index: 99999;
  344. }
  345. @media print {
  346. .el-dialog__headerbtn {
  347. display: none !important;
  348. }
  349. .hidden-print {
  350. padding: 0;
  351. margin: 0;
  352. }
  353. }
  354. }
  355. .maintenanceCycle{
  356. display: flex;
  357. align-items: center;
  358. margin: 2%;
  359. }
  360. .maintenanceFont{
  361. width: 10%;
  362. }
  363. .marginNone{
  364. margin: 0;
  365. }
  366. .rightMargin{
  367. margin-right: 2.5vh !important;
  368. }
  369. .describe{
  370. margin-top: 2%;
  371. font-size: 12px;
  372. color: #808080;
  373. }
  374. .fontColor{
  375. color: #409EFF;
  376. }
  377. </style>