index.jsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import React from 'react';
  2. import style from './index.less';
  3. import mocks from '../../mock/chronicTable.js'
  4. import { Radio,CheckBtn } from '@commonComp';
  5. import Information from '../Information'
  6. /**
  7. *量表 具体信息页面
  8. *title:量表标题/scaleName
  9. *data:量表内容:scaleName量表标题,calculate量表计算结果,group分组,
  10. *
  11. *
  12. **/
  13. class ScaleTable extends React.Component{
  14. constructor(props){
  15. super(props);
  16. this.state={
  17. // originData:props.data && data[1].content|| [],
  18. originData:{},
  19. selecteds:{}
  20. }
  21. }
  22. handleRadio(name,value){
  23. const {selecteds,originData} = this.state;
  24. const content = originData && originData[1].content;//表格内容
  25. const datas = content && JSON.parse(content);//console.log(1111,originData,datas);
  26. this.setState({
  27. selecteds:Object.assign({},selecteds,{[name]:value})
  28. })
  29. }
  30. handleCheckbox(name,value){
  31. let {selecteds} = this.state;
  32. selecteds[name]?selecteds[name]:selecteds[name]=[];
  33. const index = selecteds[name].findIndex((i)=>i==value);
  34. if(index!=-1){
  35. selecteds[name].splice(index,1);
  36. }else{
  37. selecteds[name].push(value);
  38. }
  39. this.setState({
  40. selecteds:selecteds
  41. });
  42. }
  43. handleFormula(data){
  44. const {tableId,getResult,parentId} = this.props;
  45. const params = {
  46. type:1,
  47. content:data, //选择后的数据--字符串形式
  48. id:parentId,
  49. scaleId:tableId,
  50. }
  51. // console.log("调计算接口");
  52. // getResult&&getResult(params);
  53. }
  54. componentWillReceiveProps(nextProps){
  55. const {tableId} = this.props;
  56. if(JSON.stringify(nextProps.scaleInfo) !== '{}'){
  57. this.setState({
  58. originData:nextProps.scaleInfo[tableId]
  59. })
  60. }
  61. }
  62. getContent(){
  63. const datas = mocks.newData;
  64. let {selecteds} = this.state;
  65. let content = datas&&datas.group.map((v,i)=>{
  66. return <div className={style['group']}>
  67. <p className={style['groupName']}>{v.groupName}</p>
  68. {v.rows&&v.rows.map((it,ind)=>{
  69. return <div>
  70. {it.row.map((item,index)=>{
  71. if(item.controltype==0){
  72. return <div className={style['block']}>
  73. <p className={style['miniName']}>{item.name}</p>
  74. {item.details&&item.details.map((vv,ii)=>{
  75. return <div className={style['item']}>
  76. <Radio label={vv.detailName}
  77. isSelect={selecteds[item.name]==vv.detailName}
  78. handleClick={this.handleRadio.bind(this,item.name,vv.detailName)}>
  79. </Radio>
  80. {vv.state==1?<span style={{color:'#3B9ED0'}}>(智能推荐)</span>:''}
  81. </div>
  82. })}
  83. </div>
  84. }else{
  85. return <div className={style['block']}>
  86. <p className={style['miniName']}>{item.name}</p>
  87. {item.details&&item.details.map((vv,ii)=>{
  88. return <CheckBtn value={vv.detailName}
  89. label={vv.detailName}
  90. isSelect={selecteds[v.name]&&selecteds[item.name].includes(vv.detailName)}
  91. handleClick={this.handleCheckbox.bind(this,item.name,vv.detailName)}>
  92. </CheckBtn>
  93. {vv.state==1?<span style={{color:'#3B9ED0'}}>(智能推荐)</span>:''}
  94. })}
  95. </div>
  96. }
  97. })}
  98. </div>
  99. })}
  100. {v.groupCalculate.isShow=='1(1-显示计算结果,0-不显示计算结果)'?<p className={style['subTotal']}>
  101. <span>计分</span>
  102. <span>{v.groupCalculate.result.value}</span>
  103. </p>:''}
  104. </div>
  105. })
  106. return content;
  107. }
  108. render(){
  109. const {title,scaleInfo,tableId} = this.props;
  110. const data = scaleInfo[tableId];
  111. let {selecteds} = this.state;
  112. const content = data && data[1].content;//表格内容
  113. const preContent = data && data[0].content;//表前文字
  114. const footContent = data && data[2].content; //表后文字
  115. // const datas = content && JSON.parse(content);
  116. const datas = mocks.newData;
  117. return <div className={style['tableBox']} id="printcontent">
  118. <div className={style['printShow']}>
  119. <Information></Information>
  120. </div>
  121. {/*<h1>{title}</h1>*/}
  122. <h1>{datas.scaleName}</h1>
  123. <div dangerouslySetInnerHTML={{__html:preContent}} className={style['textlh']}></div>
  124. {/*<table className={style['table']}>
  125. <thead>
  126. <tr>
  127. {datas&&datas.title.map((v,i)=>{
  128. return <td>{v.name}</td>
  129. })}
  130. </tr>
  131. </thead>
  132. <tbody>
  133. {datas&&datas.rows.map((v,i)=>{
  134. return <tr>
  135. <td>{v.name}</td>
  136. <td>
  137. {v.controltype==0?v.details.map((it,index)=>{
  138. return <td className={style['block']}>
  139. <Radio label={it.detailName}
  140. id={it.id}
  141. isSelect={selecteds[v.name]==it.detailName}
  142. handleClick={this.handleRadio.bind(this,v.name,it.detailName)}>
  143. </Radio>
  144. {it.state==1?<span style={{color:'#3B9ED0'}}>(智能推荐)</span>:''}
  145. </td>
  146. }):v.details.map((it,index)=>{
  147. return <td className={style['block']}>
  148. <CheckBtn id={it.detailName}
  149. value={it.detailName}
  150. label={it.detailName}
  151. isSelect={selecteds[v.name]&&selecteds[v.name].includes(it.detailName)}
  152. handleClick={this.handleCheckbox.bind(this,v.name,it.detailName)}>
  153. </CheckBtn>
  154. </td>
  155. })
  156. }
  157. </td>
  158. <td>
  159. {v.details.map((it,index)=>{
  160. return <td className={style['block']}>{it.score}</td>
  161. })}
  162. </td>
  163. <td></td>
  164. </tr>
  165. })}
  166. </tbody>
  167. <tfoot>
  168. <tr>
  169. <td colspan="4" className={style['sum']}>
  170. 总计:<i>95</i>
  171. <span className={style['formulaBtn']} onClick={this.handleFormula.bind(this,datas)}>计算</span>
  172. </td>
  173. </tr>
  174. </tfoot>
  175. </table>*/}
  176. <div className={style['textContent']}>
  177. {this.getContent()}
  178. <div className={style['total']}>
  179. <span>总分:</span>
  180. <span>{datas.calculate.result.value||'54' +'分'}</span>
  181. <span className={style['totalBtn']}>得分</span>
  182. </div>
  183. </div>
  184. <div dangerouslySetInnerHTML={{__html:footContent}} className={style['textlh']}></div>
  185. </div>
  186. }
  187. }
  188. export default ScaleTable;