index.jsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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 style={{borderBottom:'1px solid #EBEBEB'}}>
  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. <p className={style['miniName']}>
  243. <i>{index==0?it.indexId + '.':''}</i>
  244. {item.name}
  245. </p>
  246. {item.details&&item.details.map((vv,ii)=>{
  247. return <div className={style['item']}>
  248. <Radio label={vv.detailName+'('+vv.score+')'}
  249. isSelect={vv.select==1||selecteds[item.name]==vv.detailName}
  250. handleClick={this.handleRadio.bind(this,v.groupName,item.name,vv,it.indexId)}>
  251. </Radio>
  252. {vv.state==1?<span className={style['recomand']}>(智能推荐)</span>:''}
  253. </div>
  254. })}
  255. </div>
  256. }else{
  257. return <div className={style['block']}>
  258. <p className={style['miniName']}>{item.name}</p>
  259. {item.details&&item.details.map((vv,ii)=>{
  260. return <div className={style['item']}>
  261. <CheckBtn value={vv.detailName}
  262. label={vv.detailName}
  263. isSelect={vv.select==1||selecteds[item.name]&&selecteds[item.name].includes(vv.detailName)}
  264. handleClick={this.handleCheckbox.bind(this,v.groupName,item.name,vv)}>
  265. </CheckBtn>
  266. {vv.state==1?<span className={style['recomand']}>(智能推荐)</span>:''}
  267. </div>
  268. })}
  269. </div>
  270. }
  271. })}
  272. </div>
  273. })}
  274. {v.groupCalculate.isShow==1?<p className={style['subTotal']}>
  275. <span>计分:</span>
  276. {/*<span>{v.groupCalculate.result.value}</span>*/}
  277. <span>{scaleResult&&scaleResult.group.map((m,ii)=>{
  278. if(m.groupName==v.groupName){
  279. return m.groupCalculate.result.value;
  280. }
  281. })}</span>
  282. </p>:''}
  283. </div>
  284. })
  285. return content;
  286. }
  287. render(){
  288. const {title,scaleInfo,tableId,formulaResult} = this.props;
  289. const data = scaleInfo[tableId];
  290. let {selecteds,scaleResult1} = this.state;
  291. const scale = data && this.filterScale(data);
  292. const datas = scale && scale.content && JSON.parse(scale.content);
  293. const scaleResult = scaleResult1 || formulaResult&&formulaResult[tableId]; //量表计算结果
  294. return <div className={style['tableBox']} id="printcontent">
  295. <div className={style['printShow']}>
  296. <Information></Information>
  297. </div>
  298. <h1>{datas?datas.scaleName:''}</h1>
  299. {data && data.map((v,i)=>{
  300. if(v.type==0){
  301. return <div dangerouslySetInnerHTML={{__html:v.content}} className={style['textlh']}></div>
  302. }else{
  303. return <div className={style['textContent']}>
  304. {this.getContent()}
  305. {datas&&datas.Calc==1?<div className={style['total']}>
  306. <span>总分:</span>
  307. <span>{scaleResult&&scaleResult.calcalculate&&scaleResult.calcalculate.result&&scaleResult.calcalculate.result.value +' '+ (scaleResult.calcalculate.result.text?scaleResult.calcalculate.result.text:'')}</span>
  308. <span className={style['totalBtn']} onClick={this.handleFormula}>得分</span>
  309. </div>:''}
  310. </div>
  311. }
  312. })}
  313. </div>
  314. }
  315. }
  316. export default ScaleTable;