dataAnalysisDialog.vue 17 KB

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