dataAnalysisDialog.vue 15 KB

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