index.jsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import React from 'react';
  2. import style from './index.less';
  3. import mocks from '../../mock/chronicTable.js'
  4. import { Radio,CheckBtn ,Notify} from '@commonComp';
  5. import Information from '../Information';
  6. import {deepClone} from '@utils/tools.js';
  7. import {getFormulaResult} from '@store/async-actions/fetchModules.js';
  8. /**
  9. *量表 具体信息页面
  10. *title:量表标题/scaleName
  11. *data:量表内容:scaleName量表标题,calculate量表计算结果,group分组,
  12. *
  13. *
  14. **/
  15. class ScaleTable extends React.Component{
  16. constructor(props){
  17. super(props);
  18. this.state={
  19. selecteds:{}, //当前页面的选中标识,保存后使用select标识
  20. valueData:{},
  21. start:false, //点击计算
  22. scaleResult1:null
  23. }
  24. this.handleFormula = this.handleFormula.bind(this);
  25. }
  26. handleRadio(groupName,name,item){
  27. const {selecteds,valueData} = this.state;
  28. const value = item.detailName;
  29. this.setState({
  30. selecteds:Object.assign({},selecteds,{[name]:value})
  31. })
  32. const datas = JSON.parse(JSON.stringify(valueData));
  33. const group = datas.group;
  34. let rows;
  35. let details;
  36. for(let i=0; i<group.length; i++){
  37. if(group[i].groupName==groupName){
  38. rows = group[i].rows;
  39. break;
  40. }
  41. }
  42. if(rows){
  43. for(let j=0; j<rows.length; j++){
  44. let row = rows[j].row;
  45. for(let k=0;k < row.length; k++){
  46. if(row[k].name==name){
  47. details = row[k].details;
  48. row[k].isSelect = true;
  49. break;
  50. }
  51. }
  52. }
  53. }
  54. if(details){
  55. for(let n=0; n<details.length; n++){
  56. details[n].select = 0;
  57. if(details[n].detailName==value){
  58. details[n].select = 1;
  59. }
  60. }
  61. }
  62. this.setState({
  63. valueData:datas
  64. })
  65. }
  66. handleCheckbox(groupName,name,item){
  67. let {selecteds,valueData} = this.state;
  68. const value = item.detailName;
  69. selecteds[name]?selecteds[name]:selecteds[name]=[];
  70. const index = selecteds[name].findIndex((i)=>i==value);
  71. if(index!=-1){
  72. selecteds[name].splice(index,1);
  73. }else{
  74. selecteds[name].push(value);
  75. }
  76. this.setState({
  77. selecteds:selecteds
  78. });
  79. const datas = JSON.parse(JSON.stringify(valueData));
  80. const group = datas.group;
  81. let rows;
  82. let details;
  83. for(let i=0; i<group.length; i++){
  84. if(group[i].groupName==groupName){
  85. rows = group[i].rows;
  86. break;
  87. }
  88. }
  89. if(rows){
  90. for(let j=0; j<rows.length; j++){
  91. let row = rows[j].row;
  92. for(let k=0;k < row.length; k++){
  93. if(row[k].name==name){
  94. details = row[k].details;
  95. row[k].isSelect = true;
  96. break;
  97. }
  98. }
  99. }
  100. }
  101. if(details){
  102. for(let n=0; n<details.length; n++){
  103. if(details[n].detailName==value){
  104. if(!details[n].select || details[n].select==0){
  105. details[n].select = 1;
  106. }else{
  107. details[n].select = 0;
  108. }
  109. }
  110. }
  111. }
  112. this.setState({
  113. valueData:datas
  114. })
  115. }
  116. handleFormula(data){//得分计算
  117. const {tableId,getResult,parentId,scaleInfo,parentIndex} = this.props;
  118. const {valueData} = this.state;
  119. this.setState({
  120. start:true
  121. })
  122. // 遍历是否有必填项未填的情况 filter:required==1 && !isSelect
  123. const group = valueData.group;
  124. let unfinish;
  125. for(let i=0; i<group.length; i++){
  126. let rows = group[i].rows;
  127. for(let j=0; j<rows.length; j++){
  128. if(rows[j].required==1&& (rows[j].row.filter((it,i)=>{return !it.isSelect})).length>0){
  129. unfinish = true;
  130. break;
  131. }
  132. }
  133. }
  134. if(unfinish){
  135. Notify.info("请先将量表内容选择完整");
  136. return
  137. }
  138. // 将计算结果存在state,防止页面跳动问题
  139. const params = {
  140. type:1,
  141. data:valueData,
  142. pId:parentId,
  143. id:tableId,
  144. pIndex:parentIndex
  145. }
  146. const that = this;
  147. getFormulaResult(params).then((res)=>{
  148. if(+res.data.code==0){
  149. that.setState({
  150. scaleResult1:res.data.data
  151. })
  152. }
  153. })
  154. }
  155. componentWillReceiveProps(nextProps){
  156. const {tableId} = this.props;
  157. if(JSON.stringify(nextProps.scaleInfo) !== '{}'){
  158. this.setState({
  159. // valueData:nextProps.scaleInfo[tableId].length?mocks.newData:JSON.parse(nextProps.scaleInfo[tableId].content),
  160. valueData:nextProps.scaleInfo[tableId]?JSON.parse(nextProps.scaleInfo[tableId][1].content):{},
  161. })
  162. }
  163. }
  164. componentDidMount(){
  165. const {tableId,scaleInfo} = this.props;
  166. if(scaleInfo&&scaleInfo[tableId]){
  167. this.setState({
  168. // valueData:scaleInfo[tableId].length?mocks.newData:JSON.parse(scaleInfo[tableId].content)
  169. valueData:JSON.parse(scaleInfo[tableId][1].content)
  170. })
  171. }
  172. }
  173. componentWillUnmount(){
  174. // 储存计算结果和选择后的data
  175. const {tableId,getResult,parentId,parentIndex,scaleInfo} = this.props;
  176. const {valueData,scaleResult1} = this.state;
  177. // 替换表格内容
  178. let allDatas = scaleInfo[tableId]?JSON.parse(JSON.stringify(scaleInfo[tableId])):'' ;
  179. if(allDatas){
  180. allDatas[1].content = JSON.stringify(valueData);
  181. }
  182. if(scaleResult1){
  183. const params = {
  184. type:1,
  185. data:scaleResult1,
  186. id:tableId,
  187. pIndex:parentIndex
  188. }
  189. getResult&&getResult({params,allDatas});
  190. }
  191. }
  192. getContent(){
  193. let {selecteds,valueData,start,scaleResult1} = this.state;
  194. const {tableId,formulaResult} = this.props;
  195. const scaleResult = scaleResult1 || formulaResult&&formulaResult[tableId]; //量表计算结果
  196. // const datas = valueData&&valueData.group?valueData:mocks.newData;
  197. const datas = valueData&&valueData.group?valueData:'';
  198. let content = datas&&datas.group&&datas.group.map((v,i)=>{
  199. return <div className={style['group']}>
  200. <p className={style['groupName']}>{v.groupName}</p>
  201. {v.rows&&v.rows.map((it,ind)=>{
  202. return <div>
  203. {it.row.map((item,index)=>{
  204. if(item.controlType==0){
  205. return <div className={style['block']} style={{border:it.required==1&&!item.isSelect&&start?'1px solid #f00':'none'}}>
  206. <p className={style['miniName']}>{item.name}</p>
  207. {item.details&&item.details.map((vv,ii)=>{
  208. return <div className={style['item']}>
  209. <Radio label={vv.detailName}
  210. isSelect={vv.select==1||selecteds[item.name]==vv.detailName}
  211. handleClick={this.handleRadio.bind(this,v.groupName,item.name,vv)}>
  212. </Radio>
  213. {vv.state==1?<span className={style['recomand']}>(智能推荐)</span>:''}
  214. </div>
  215. })}
  216. </div>
  217. }else{
  218. return <div className={style['block']}>
  219. <p className={style['miniName']}>{item.name}</p>
  220. {item.details&&item.details.map((vv,ii)=>{
  221. return <div className={style['item']}>
  222. <CheckBtn value={vv.detailName}
  223. label={vv.detailName}
  224. isSelect={vv.select==1||selecteds[item.name]&&selecteds[item.name].includes(vv.detailName)}
  225. handleClick={this.handleCheckbox.bind(this,v.groupName,item.name,vv)}>
  226. </CheckBtn>
  227. {vv.state==1?<span className={style['recomand']}>(智能推荐)</span>:''}
  228. </div>
  229. })}
  230. </div>
  231. }
  232. })}
  233. </div>
  234. })}
  235. {v.groupCalculate.isShow==1?<p className={style['subTotal']}>
  236. <span>计分:</span>
  237. {/*<span>{v.groupCalculate.result.value}</span>*/}
  238. <span>{scaleResult&&scaleResult.group.map((m,ii)=>{
  239. if(m.groupName==v.groupName){
  240. return m.groupCalculate.result.value;
  241. }
  242. })}</span>
  243. </p>:''}
  244. </div>
  245. })
  246. return content;
  247. }
  248. render(){
  249. const {title,scaleInfo,tableId,formulaResult} = this.props;
  250. const data = scaleInfo[tableId];
  251. let {selecteds,scaleResult1} = this.state;
  252. const content = data && data[1].content;//表格内容
  253. const preContent = data && data[0].content;//表前文字
  254. const footContent = data && data[2].content; //表后文字
  255. const datas = content && JSON.parse(content);
  256. const scaleResult = scaleResult1 || formulaResult&&formulaResult[tableId]; //量表计算结果
  257. return <div className={style['tableBox']} id="printcontent">
  258. <div className={style['printShow']}>
  259. <Information></Information>
  260. </div>
  261. <h1>{datas?datas.scaleName:''}</h1>
  262. <div dangerouslySetInnerHTML={{__html:preContent}} className={style['textlh']}></div>
  263. <div className={style['textContent']}>
  264. {this.getContent()}
  265. {datas&&datas.noCalc==0?<div className={style['total']}>
  266. <span>总分:</span>
  267. <span>{scaleResult&&scaleResult.calcalculate&&scaleResult.calcalculate.result&&scaleResult.calcalculate.result.value +' '+ scaleResult.calcalculate.result.text||''}</span>
  268. <span className={style['totalBtn']} onClick={this.handleFormula}>得分</span>
  269. </div>:''}
  270. </div>
  271. <div dangerouslySetInnerHTML={{__html:footContent}} className={style['textlh']}></div>
  272. </div>
  273. }
  274. }
  275. export default ScaleTable;