index.jsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  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,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. }else{
  153. Notify.error(res.data.msg||'计算没有结果返回');
  154. }
  155. })
  156. }
  157. filterScale(data){//type=1为表格内容
  158. let scale = {};
  159. for(let i=0; i<data.length; i++){
  160. if(data[i].type==1){
  161. scale = data[i];
  162. }
  163. }
  164. return scale;
  165. }
  166. componentWillReceiveProps(nextProps){
  167. const {tableId} = this.props;
  168. const data = nextProps.scaleInfo;
  169. if(JSON.stringify(data) !== '{}' && data[tableId]){
  170. let scale = this.filterScale(data[tableId]);
  171. this.setState({
  172. // valueData:JSON.parse(nextProps.scaleInfo[tableId][1].content),
  173. valueData:scale.content?JSON.parse(scale.content):{}
  174. })
  175. }
  176. }
  177. componentDidMount(){
  178. const {tableId,scaleInfo} = this.props;
  179. if(scaleInfo&&scaleInfo[tableId]){
  180. let scale = this.filterScale(scaleInfo[tableId]);
  181. this.setState({
  182. // valueData:JSON.parse(scaleInfo[tableId][1].content)
  183. valueData:scale.content?JSON.parse(scale.content):{}
  184. })
  185. }
  186. }
  187. componentWillUnmount(){
  188. // 储存计算结果和选择后的data
  189. const {tableId,getResult,parentId,parentIndex,scaleInfo,saveScaleData} = this.props;
  190. const {valueData,scaleResult1} = this.state;
  191. // 替换表格内容
  192. let allDatas = scaleInfo[tableId]?JSON.parse(JSON.stringify(scaleInfo[tableId])):'' ;
  193. if(allDatas){
  194. // allDatas[1].content = JSON.stringify(valueData);
  195. for(let i=0; i<allDatas.length; i++){
  196. if(allDatas[i].type==1){
  197. allDatas[i].content = JSON.stringify(valueData);
  198. }
  199. }
  200. // 需求:未点计算,直接点确定、关闭也保存选中数据 4-30
  201. saveScaleData&&saveScaleData({id:tableId,data:allDatas});
  202. }
  203. if(scaleResult1){
  204. const params = {
  205. type:1,
  206. data:scaleResult1,
  207. id:tableId,
  208. pIndex:parentIndex
  209. }
  210. getResult&&getResult(params);
  211. }
  212. }
  213. getContent(){
  214. let {selecteds,valueData,start,scaleResult1} = this.state;
  215. const {tableId,formulaResult} = this.props;
  216. const scaleResult = scaleResult1 || formulaResult&&formulaResult[tableId]; //量表计算结果
  217. // const datas = valueData&&valueData.group?valueData:mocks.newData;
  218. const datas = valueData&&valueData.group?valueData:'';
  219. let content = datas&&datas.group&&datas.group.map((v,i)=>{
  220. return <div className={style['group']}>
  221. <p className={style['groupName']}>{v.groupName}</p>
  222. {v.rows&&v.rows.map((it,ind)=>{
  223. return <div>
  224. {it.row.map((item,index)=>{
  225. if(item.controlType==0){
  226. return <div className={style['block']} style={{border:it.required==1&&!item.isSelect&&start?'1px solid #f00':'none'}}>
  227. <p className={style['miniName']}>{item.name}</p>
  228. {item.details&&item.details.map((vv,ii)=>{
  229. return <div className={style['item']}>
  230. <Radio label={vv.detailName+'('+vv.score+')'}
  231. isSelect={vv.select==1||selecteds[item.name]==vv.detailName}
  232. handleClick={this.handleRadio.bind(this,v.groupName,item.name,vv)}>
  233. </Radio>
  234. {vv.state==1?<span className={style['recomand']}>(智能推荐)</span>:''}
  235. </div>
  236. })}
  237. </div>
  238. }else{
  239. return <div className={style['block']}>
  240. <p className={style['miniName']}>{item.name}</p>
  241. {item.details&&item.details.map((vv,ii)=>{
  242. return <div className={style['item']}>
  243. <CheckBtn value={vv.detailName}
  244. label={vv.detailName}
  245. isSelect={vv.select==1||selecteds[item.name]&&selecteds[item.name].includes(vv.detailName)}
  246. handleClick={this.handleCheckbox.bind(this,v.groupName,item.name,vv)}>
  247. </CheckBtn>
  248. {vv.state==1?<span className={style['recomand']}>(智能推荐)</span>:''}
  249. </div>
  250. })}
  251. </div>
  252. }
  253. })}
  254. </div>
  255. })}
  256. {v.groupCalculate.isShow==1?<p className={style['subTotal']}>
  257. <span>计分:</span>
  258. {/*<span>{v.groupCalculate.result.value}</span>*/}
  259. <span>{scaleResult&&scaleResult.group.map((m,ii)=>{
  260. if(m.groupName==v.groupName){
  261. return m.groupCalculate.result.value;
  262. }
  263. })}</span>
  264. </p>:''}
  265. </div>
  266. })
  267. return content;
  268. }
  269. render(){
  270. const {title,scaleInfo,tableId,formulaResult} = this.props;
  271. const data = scaleInfo[tableId];
  272. let {selecteds,scaleResult1} = this.state;
  273. const scale = data && this.filterScale(data);
  274. const datas = scale && scale.content && JSON.parse(scale.content);
  275. const scaleResult = scaleResult1 || formulaResult&&formulaResult[tableId]; //量表计算结果
  276. return <div className={style['tableBox']} id="printcontent">
  277. <div className={style['printShow']}>
  278. <Information></Information>
  279. </div>
  280. <h1>{datas?datas.scaleName:''}</h1>
  281. {data && data.map((v,i)=>{
  282. if(v.type==0){
  283. return <div dangerouslySetInnerHTML={{__html:v.content}} className={style['textlh']}></div>
  284. }else{
  285. return <div className={style['textContent']}>
  286. {this.getContent()}
  287. {datas&&datas.noCalc==0?<div className={style['total']}>
  288. <span>总分:</span>
  289. <span>{scaleResult&&scaleResult.calcalculate&&scaleResult.calcalculate.result&&scaleResult.calcalculate.result.value +' '+ scaleResult.calcalculate.result.text||''}</span>
  290. <span className={style['totalBtn']} onClick={this.handleFormula}>得分</span>
  291. </div>:''}
  292. </div>
  293. }
  294. })}
  295. </div>
  296. }
  297. }
  298. export default ScaleTable;