index.jsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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,indexId){
  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. let required = rows[j].required;
  46. let rowsId = rows[j].indexId;
  47. // 必填项处理
  48. if(required==1&&rowsId==indexId){
  49. for(let k=0;k < row.length; k++){
  50. row[k].isSelect = true;
  51. if(row[k].name==name){
  52. details = row[k].details;
  53. // break;
  54. }
  55. }
  56. }else{
  57. for(let k=0;k < row.length; k++){
  58. if(row[k].name==name){
  59. details = row[k].details;
  60. row[k].isSelect = true;
  61. break;
  62. }
  63. }
  64. }
  65. }
  66. }
  67. if(details){
  68. for(let n=0; n<details.length; n++){
  69. details[n].select = 0;
  70. if(details[n].detailName==value){
  71. details[n].select = 1;
  72. }
  73. }
  74. }
  75. this.setState({
  76. valueData:datas
  77. })
  78. }
  79. handleCheckbox(groupName,name,item){
  80. let {selecteds,valueData} = this.state;
  81. const value = item.detailName;
  82. selecteds[name]?selecteds[name]:selecteds[name]=[];
  83. const index = selecteds[name].findIndex((i)=>i==value);
  84. if(index!=-1){
  85. selecteds[name].splice(index,1);
  86. }else{
  87. selecteds[name].push(value);
  88. }
  89. this.setState({
  90. selecteds:selecteds
  91. });
  92. const datas = JSON.parse(JSON.stringify(valueData));
  93. const group = datas.group;
  94. let rows;
  95. let details;
  96. for(let i=0; i<group.length; i++){
  97. if(group[i].groupName==groupName){
  98. rows = group[i].rows;
  99. break;
  100. }
  101. }
  102. if(rows){
  103. for(let j=0; j<rows.length; j++){
  104. let row = rows[j].row;
  105. for(let k=0;k < row.length; k++){
  106. if(row[k].name==name){
  107. details = row[k].details;
  108. row[k].isSelect = true;
  109. break;
  110. }
  111. }
  112. }
  113. }
  114. if(details){
  115. for(let n=0; n<details.length; n++){
  116. if(details[n].detailName==value){
  117. if(!details[n].select || details[n].select==0){
  118. details[n].select = 1;
  119. }else{
  120. details[n].select = 0;
  121. }
  122. }
  123. }
  124. }
  125. this.setState({
  126. valueData:datas
  127. })
  128. }
  129. handleFormula(data){//得分计算
  130. const {tableId,parentId,scaleInfo,parentIndex} = this.props;
  131. const {valueData} = this.state;
  132. this.setState({
  133. start:true
  134. })
  135. // 遍历是否有必填项未填的情况 filter:required==1 && !isSelect
  136. const group = valueData.group;
  137. let unfinish;
  138. for(let i=0; i<group.length; i++){
  139. let rows = group[i].rows;
  140. for(let j=0; j<rows.length; j++){
  141. // if(rows[j].required==1&& (rows[j].row.filter((it,i)=>{return !it.isSelect})).length>0){
  142. // 必填项下有一项选中既可
  143. if(rows[j].required==1&& (rows[j].row.filter((it,i)=>{return it.isSelect})).length==0){
  144. unfinish = true;
  145. break;
  146. }
  147. }
  148. }
  149. if(unfinish){
  150. Notify.info("请先将量表内容选择完整");
  151. return
  152. }
  153. // 将计算结果存在state,防止页面跳动问题
  154. const params = {
  155. type:1,
  156. data:valueData,
  157. pId:parentId,
  158. id:tableId,
  159. pIndex:parentIndex
  160. }
  161. const that = this;
  162. getFormulaResult(params).then((res)=>{
  163. if(+res.data.code==0){
  164. that.setState({
  165. scaleResult1:res.data.data
  166. })
  167. }else{
  168. Notify.error(res.data.msg||'计算没有结果返回');
  169. }
  170. })
  171. }
  172. filterScale(data){//type=1为表格内容
  173. let scale = {};
  174. for(let i=0; i<data.length; i++){
  175. if(data[i].type==1){
  176. scale = data[i];
  177. }
  178. }
  179. return scale;
  180. }
  181. componentWillReceiveProps(nextProps){
  182. const {tableId} = this.props;
  183. const data = nextProps.scaleInfo;
  184. if(JSON.stringify(data) !== '{}' && data[tableId]){
  185. let scale = this.filterScale(data[tableId]);
  186. this.setState({
  187. // valueData:JSON.parse(nextProps.scaleInfo[tableId][1].content),
  188. valueData:scale.content?JSON.parse(scale.content):{}
  189. })
  190. }
  191. }
  192. componentDidMount(){
  193. const {tableId,scaleInfo} = this.props;
  194. if(scaleInfo&&scaleInfo[tableId]){
  195. let scale = this.filterScale(scaleInfo[tableId]);
  196. this.setState({
  197. // valueData:JSON.parse(scaleInfo[tableId][1].content)
  198. valueData:scale.content?JSON.parse(scale.content):{}
  199. })
  200. }
  201. }
  202. componentWillUnmount(){
  203. // 储存计算结果和选择后的data
  204. const {tableId,getResult,parentId,parentIndex,scaleInfo,saveScaleData} = this.props;
  205. const {valueData,scaleResult1} = this.state;
  206. // 替换表格内容
  207. let allDatas = scaleInfo[tableId]?JSON.parse(JSON.stringify(scaleInfo[tableId])):'' ;
  208. if(allDatas){
  209. // allDatas[1].content = JSON.stringify(valueData);
  210. for(let i=0; i<allDatas.length; i++){
  211. if(allDatas[i].type==1){
  212. allDatas[i].content = JSON.stringify(valueData);
  213. }
  214. }
  215. // 需求:未点计算,直接点确定、关闭也保存选中数据 4-30
  216. saveScaleData&&saveScaleData({id:tableId,data:allDatas});
  217. }
  218. if(scaleResult1){
  219. const params = {
  220. type:1,
  221. data:scaleResult1,
  222. id:tableId,
  223. pIndex:parentIndex
  224. }
  225. getResult&&getResult(params);
  226. }
  227. }
  228. getContent(){
  229. let {selecteds,valueData,start,scaleResult1} = this.state;
  230. const {tableId,formulaResult} = this.props;
  231. const scaleResult = scaleResult1 || formulaResult&&formulaResult[tableId]; //量表计算结果
  232. const datas = valueData&&valueData.group?valueData:'';//console.log(666,datas);
  233. let content = datas&&datas.group&&datas.group.map((v,i)=>{
  234. return <div className={style['group']}>
  235. <p className={style['groupName']}>{v.groupName}</p>
  236. {v.rows&&v.rows.map((it,ind)=>{
  237. return <div>
  238. {it.row.map((item,index)=>{
  239. if(item.controlType==0){
  240. return <div className={style['block']} style={{border:it.required==1&&!item.isSelect&&start?'1px solid #f00':'none'}}>
  241. <p className={style['miniName']}>{item.name}</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 {title,scaleInfo,tableId,formulaResult} = 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>{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;