index.jsx 11 KB

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