index.jsx 12 KB

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