Detail.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <div class="detail-wrap">
  3. <!-- <div v-for="(item,index) in datas"> -->
  4. <div v-for="(item,index) in checkDatas.questionMapping">
  5. <p class="quest">{{index + 1 +'.' + (item.description || item.name)}}</p>
  6. <img class="questionImg" :src="item.url.replace('{imageUrlPrefix}',imgUrl)" v-if="item.url">
  7. <Radio v-if="item.controlType==1"
  8. :item="item"
  9. :key="item.id"
  10. @updata="updataData"/>
  11. <CheckBox v-if="item.controlType==2"
  12. :item="item"
  13. :key="item.id"
  14. @updata="updataData"/>
  15. <!-- 文本域 -->
  16. <ComTextArea v-if="item.controlType == 5"
  17. :item="item"
  18. @updata="updataData"/>
  19. <!-- 输入框 -->
  20. <Input v-if="item.controlType==6 || item.controlType==7"
  21. :item="item"
  22. :key="item.id"
  23. @updata="updataData"/>
  24. <template
  25. v-if="item.controlType == 3"
  26. v-for="(part,index) in item.questionDetailList"
  27. >
  28. <MultiLineInput
  29. v-if="item.controlType == 3"
  30. :msg="part.description||part.name"
  31. :part="part"
  32. @updata="updataData($event,item)"
  33. ></MultiLineInput>
  34. </template>
  35. </div>
  36. </div>
  37. </template>
  38. <script type="text/javascript">
  39. import Radio from '../common/Radio.vue';
  40. import CheckBox from '../common/CheckBox.vue';
  41. import Input from '../common/Input.vue';
  42. import ComTextArea from '../common/ComTextArea.vue';
  43. import MultiLineInput from '../common/MultiLineInput.vue';
  44. import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
  45. // 将获取到的数据源转换成私有数据,处理选择事件。点击完成后统一存到store中,便于回读
  46. export default {
  47. name:'Detail',
  48. data(){
  49. return{
  50. checkDatas:{},
  51. finished:false,
  52. imgUrl:imageUrlPrefix,
  53. }
  54. },
  55. props:['datas','type','ppId'],
  56. created(){
  57. this.checkDatas = JSON.parse(JSON.stringify(this.datas));
  58. },
  59. components:{
  60. Radio,
  61. CheckBox,
  62. Input,
  63. ComTextArea,
  64. MultiLineInput
  65. },
  66. methods:{
  67. updataData(data,item){
  68. const origMapping = this.datas.questionMapping;
  69. let mapping = this.checkDatas.questionMapping;
  70. for(let i in origMapping){
  71. if(data.controlType==3){//多列类型多一层
  72. if(mapping[i].id == item.id){
  73. mapping[i].value = '';
  74. mapping[i].valueP = '';
  75. let detList = mapping[i].questionDetailList;
  76. for(let k in detList){//替换
  77. if(detList[k].id==data.id){
  78. detList.splice(k,1,data)
  79. }
  80. }
  81. for(let n in detList){//给父级赋值
  82. if(detList[n].value){
  83. mapping[i].value += detList[n].name.replace(patt,detList[n].value)+',';
  84. mapping[i].valueP += (detList[n].description||detList[n].name).replace(patt,detList[n].value)+',';
  85. }
  86. }
  87. }
  88. }else{
  89. if(origMapping[i].id==data.id){
  90. mapping.splice(i,1,data)
  91. }
  92. }
  93. }
  94. // 实时更新清空样式
  95. if(data.value){
  96. this.$emit('check',true)
  97. }else{
  98. let flag = this.check();
  99. if(flag){
  100. this.$emit('check',true)
  101. }else{
  102. this.$emit('check',false)
  103. }
  104. }
  105. },
  106. saveData(){//存值
  107. this.finished = true;
  108. this.checkDatas = Object.assign({},this.checkDatas,{select:1});
  109. const datas = this.checkDatas.questionMapping;
  110. let text = ""; //医生
  111. let textP = "";//患者
  112. for(let i in datas){
  113. if(datas[i].value){
  114. text += datas[i].value+',';
  115. textP += datas[i].valueP+',';
  116. }
  117. }
  118. let msg = this.checkDatas.name+ ',' + text;
  119. let msgP = (this.checkDatas.description || this.checkDatas.name)+ ',' + textP;
  120. let newMsg = "";
  121. let newMsgP = "";
  122. if(msg[msg.length-1] == ','){
  123. newMsg = msg.substring(0,msg.length-1);
  124. newMsgP = msgP.substring(0,msgP.length-1);
  125. }else{
  126. newMsg = msg;
  127. newMsgP = msgP;
  128. }
  129. this.$store.commit('setDatas',{data:this.checkDatas,pId:this.checkDatas.id,type:this.type,ppId:this.ppId});
  130. // flag是区分点开已选症状 未点完成
  131. this.$store.commit('setText',{text:trimDots(newMsg),textP:trimDots(newMsgP),pId:this.checkDatas.id,type:this.type,flag:true});
  132. },
  133. clearData(){//清空
  134. const datas = this.checkDatas.questionMapping;
  135. for(let i in datas){
  136. datas[i].value = "";
  137. datas[i].valueP = "";
  138. let detaiList = datas[i].questionDetailList;
  139. if(detaiList.length>0){
  140. for(let k in detaiList){
  141. detaiList[k].select = 0;
  142. if(detaiList[k].value){
  143. detaiList[k].value = "";
  144. detaiList[k].valueP = "";
  145. }
  146. }
  147. }
  148. }
  149. this.checkDatas = Object.assign({},this.checkDatas,{questionMapping:datas});
  150. let msg = this.checkDatas.name;
  151. let msgP = (this.checkDatas.description||this.checkDatas.name);
  152. this.$store.commit('setDatas',{data:this.checkDatas,pId:this.checkDatas.id,type:this.type,ppId:this.ppId});
  153. this.$store.commit('setText',{text:msg,textP:msgP,pId:this.checkDatas.id,type:this.type,flag:true});
  154. },
  155. check(){// 校验是否有已填项
  156. const datas = this.checkDatas.questionMapping;
  157. let checkArr = [];
  158. for(let i in datas){
  159. if(datas[i].value){
  160. checkArr.push(datas[i]);
  161. }
  162. let detaiList = datas[i].questionDetailList;
  163. if(detaiList.length>0){
  164. for(let k in detaiList){
  165. if(detaiList[k].select == 1){
  166. checkArr.push(detaiList[k]);
  167. }
  168. }
  169. }
  170. }
  171. if(checkArr.length>0){
  172. return true;
  173. }
  174. return false;
  175. }
  176. },
  177. }
  178. </script>
  179. <style lang="less" scoped>
  180. .detail-wrap{
  181. // padding: .3rem .5rem 1.2rem .6rem;
  182. padding: .3rem .5rem 2rem .6rem;
  183. font-size: .3rem;
  184. .quest{
  185. color:#000;
  186. margin-bottom: .2rem;
  187. }
  188. .questionImg {
  189. width: 100%;
  190. }
  191. }
  192. </style>