info.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. 'use strict';
  2. const Service = require('egg').Service;
  3. class InfoService extends Service {
  4. async fournums(query) {
  5. const { ctx } = this;
  6. query.status = '3';
  7. const resultList = await ctx.model.InfoModel.aggregate([
  8. { $match: ctx.alterDeptId(query) },
  9. { $project: {
  10. _id: 1, dept1: { $toString: '$dept1' },
  11. age: {
  12. $subtract: [{ $year: new Date() }, { $toDouble: { $substr: [ '$birthday', 0, 4 ] } }],
  13. },
  14. } },
  15. {
  16. $group: {
  17. _id: {
  18. $concat: [
  19. { $cond: [{ $lt: [ '$age', 60 ] }, '60以下', '' ] },
  20. { $cond: [{ $and: [{ $gte: [ '$age', 60 ] }, { $lt: [ '$age', 70 ] }] }, '60-70岁', '' ] },
  21. { $cond: [{ $and: [{ $gte: [ '$age', 70 ] }, { $lt: [ '$age', 80 ] }] }, '70-80岁', '' ] },
  22. { $cond: [{ $and: [{ $gte: [ '$age', 80 ] }, { $lt: [ '$age', 85 ] }] }, '80-85岁', '' ] },
  23. { $cond: [{ $gte: [ '$age', 85 ] }, '85岁以上', '' ] },
  24. ],
  25. },
  26. count: { $sum: 1 },
  27. },
  28. },
  29. { $sort: { _id: 1 } },
  30. ]);
  31. let allCount = 0;
  32. for (const index in resultList) {
  33. for (const i in resultList[index]) {
  34. if (i === 'count') {
  35. allCount += resultList[index][i];
  36. }
  37. }
  38. }
  39. const resultArr = [];
  40. const result = [];
  41. try {
  42. resultList.forEach(item => {
  43. switch (item._id) {
  44. case '60-70岁':
  45. resultArr.push({ label: item._id, value: item.count, percent: Math.round(item.count / allCount * 10000) / 100 + '%' });
  46. break;
  47. case '70-80岁':
  48. resultArr.push({ label: item._id, value: item.count, percent: Math.round(item.count / allCount * 10000) / 100 + '%' });
  49. break;
  50. case '80-85岁':
  51. resultArr.push({ label: item._id, value: item.count, percent: Math.round(item.count / allCount * 10000) / 100 + '%' });
  52. break;
  53. case '85岁以上':
  54. resultArr.push({ label: item._id, value: item.count, percent: Math.round(item.count / allCount * 10000) / 100 + '%' });
  55. break;
  56. default:
  57. console.log('老年信息统计--年龄分布查询失败!');
  58. }
  59. });
  60. const fournums = ctx.fournums();
  61. fournums.forEach(item => {
  62. result.push({ label: item, value: 0, percent: 0 + '%' });
  63. });
  64. result.forEach(itemA => {
  65. resultArr.forEach(item => {
  66. if (item.label == itemA.label) {
  67. itemA.value = item.value;
  68. itemA.percent = item.percent;
  69. }
  70. });
  71. });
  72. } catch (e) {
  73. ctx.logger.error('catch--------error', e);
  74. ctx.error(e);
  75. } finally {
  76. return result;
  77. }
  78. }
  79. async sex(query) {
  80. const { ctx } = this;
  81. query.status = '3';
  82. const resultList = await ctx.model.InfoModel.aggregate([
  83. { $match: ctx.alterDeptId(query) },
  84. {
  85. $group: {
  86. _id: '$sex',
  87. count: { $sum: 1 },
  88. },
  89. },
  90. { $sort: { _id: -1 } },
  91. ]);
  92. let allCount = 0;
  93. for (const index in resultList) {
  94. for (const i in resultList[index]) {
  95. if (i === 'count') {
  96. allCount += resultList[index][i];
  97. }
  98. }
  99. }
  100. const resultArr = [];
  101. const result = [];
  102. try {
  103. resultList.forEach(item => {
  104. switch (item._id) {
  105. case '男':
  106. resultArr.push({ label: '老年人男性人数', value: item.count, percent: Math.round(item.count / allCount * 10000) / 100 + '%' });
  107. break;
  108. case '女':
  109. resultArr.push({ label: '老年人女性人数', value: item.count, percent: Math.round(item.count / allCount * 10000) / 100 + '%' });
  110. break;
  111. default:
  112. console.log('老年信息统计--性别分布查询失败!');
  113. }
  114. });
  115. const infoSex = ctx.infoSex();
  116. infoSex.forEach(item => {
  117. result.push({ label: item, value: 0, percent: 0 + '%' });
  118. });
  119. result.forEach(itemA => {
  120. resultArr.forEach(item => {
  121. if (item.label == itemA.label) {
  122. itemA.value = item.value;
  123. itemA.percent = item.percent;
  124. }
  125. });
  126. });
  127. } catch (e) {
  128. ctx.logger.error('catch--------error', e);
  129. ctx.error(e);
  130. } finally {
  131. return result;
  132. }
  133. }
  134. async ability(query) {
  135. const { ctx } = this;
  136. query.status = '3';
  137. const resultList = await ctx.model.InfoModel.aggregate([
  138. { $match: ctx.alterDeptId(query) },
  139. { $project: {
  140. _id: 1, ability: 1,
  141. } },
  142. {
  143. $group: {
  144. _id: '$ability',
  145. count: { $sum: 1 },
  146. },
  147. },
  148. ]);
  149. let allCount = 0;
  150. let halfDisability = 0;
  151. for (const index in resultList) {
  152. for (const i in resultList[index]) {
  153. if (i === 'count') {
  154. allCount += resultList[index][i];
  155. }
  156. if (resultList[index][i] === '半失能(部分自理)' || resultList[index][i] === '半失能(部分自理)') {
  157. halfDisability += resultList[index].count;
  158. }
  159. }
  160. }
  161. const resultArr = [];
  162. const result = [];
  163. try {
  164. resultList.forEach(item => {
  165. switch (item._id) {
  166. case '完全自理':
  167. resultArr.push({ label: '完全自理', value: Math.round(item.count / allCount * 10000) / 100 + '%' });
  168. break;
  169. case '失能':
  170. resultArr.push({ label: '失能', value: Math.round(item.count / allCount * 10000) / 100 + '%' });
  171. break;
  172. }
  173. });
  174. if (halfDisability > 0) {
  175. resultArr.push({ label: '半失能', value: Math.round(halfDisability / allCount * 10000) / 100 + '%' });
  176. }
  177. // 保持能力评估类别完整性
  178. const ability = ctx.ability();
  179. ability.forEach(item => {
  180. result.push({ label: item, value: 0 + '%' });
  181. });
  182. result.forEach(itemA => {
  183. resultArr.forEach(item => {
  184. if (item.label == itemA.label) {
  185. itemA.value = item.value;
  186. }
  187. });
  188. });
  189. } catch (e) {
  190. ctx.logger.error('catch--------error', e);
  191. ctx.error(e);
  192. } finally {
  193. return result;
  194. }
  195. }
  196. async oldHealth(query) {
  197. const { ctx } = this;
  198. query.status = '3';
  199. const resultList = await ctx.model.InfoModel.aggregate([
  200. { $match: ctx.alterDeptId(query) },
  201. { $unwind: { path: '$health', preserveNullAndEmptyArrays: true } },
  202. { $project: {
  203. _id: 1, health: 1,
  204. } },
  205. {
  206. $group: {
  207. _id: '$health',
  208. count: { $sum: 1 },
  209. },
  210. },
  211. ]);
  212. const resultArr = [];
  213. const result = [];
  214. try {
  215. resultList.forEach(item => {
  216. switch (item._id) {
  217. case '健康':
  218. resultArr.push({ label: item._id, value: item.count });
  219. break;
  220. case '残疾':
  221. resultArr.push({ label: item._id, value: item.count });
  222. break;
  223. case '老年人慢性病':
  224. resultArr.push({ label: item._id, value: item.count });
  225. break;
  226. case '患重特大疾病':
  227. resultArr.push({ label: item._id, value: item.count });
  228. break;
  229. }
  230. });
  231. // 保持能力评估类别完整性
  232. const oldHealth = ctx.oldHealth();
  233. oldHealth.forEach(item => {
  234. result.push({ label: item, value: 0 });
  235. });
  236. result.forEach(itemA => {
  237. resultArr.forEach(item => {
  238. if (item.label == itemA.label) {
  239. itemA.value = item.value;
  240. }
  241. });
  242. });
  243. } catch (e) {
  244. ctx.logger.error('catch--------error', e);
  245. ctx.error(e);
  246. } finally {
  247. return result;
  248. }
  249. }
  250. async oldType(query) {
  251. const { ctx } = this;
  252. query.status = '3';
  253. const resultList = await ctx.model.InfoModel.aggregate([
  254. { $match: ctx.alterDeptId(query) },
  255. { $unwind: { path: '$oldType', preserveNullAndEmptyArrays: true } },
  256. { $project: {
  257. dept1: 1, _id: 1, oldType: 1,
  258. } },
  259. {
  260. $group: {
  261. _id: '$oldType',
  262. count: { $sum: 1 },
  263. },
  264. },
  265. ]);
  266. const resultArr = [];
  267. const result = [];
  268. try {
  269. resultList.forEach(item => {
  270. switch (item._id) {
  271. case '失能老人':
  272. resultArr.push({ label: '失能', value: item.count });
  273. break;
  274. case '居家老年人':
  275. resultArr.push({ label: '居家', value: item.count });
  276. break;
  277. case '重残老人':
  278. resultArr.push({ label: '重残', value: item.count });
  279. break;
  280. case '独居老年人':
  281. resultArr.push({ label: '独居', value: item.count });
  282. break;
  283. case '计划生育特殊家庭老人':
  284. resultArr.push({ label: '失独', value: item.count });
  285. break;
  286. case '分散供养特困老年人':
  287. resultArr.push({ label: '特困', value: item.count });
  288. break;
  289. case '空巢老年人':
  290. resultArr.push({ label: '空巢', value: item.count });
  291. break;
  292. case '高龄老人':
  293. resultArr.push({ label: '高龄', value: item.count });
  294. break;
  295. case '农村留守老年人':
  296. resultArr.push({ label: '留守', value: item.count });
  297. break;
  298. }
  299. });
  300. const oldType = ctx.oldType();
  301. oldType.forEach(item => {
  302. result.push({ label: item, value: 0 });
  303. });
  304. result.forEach(itemA => {
  305. resultArr.forEach(item => {
  306. if (item.label == itemA.label) {
  307. itemA.value = item.value;
  308. }
  309. });
  310. });
  311. } catch (e) {
  312. ctx.logger.error('catch--------error', e);
  313. ctx.error(e);
  314. } finally {
  315. return result;
  316. }
  317. }
  318. async visitFrequency(query) {
  319. const { ctx } = this;
  320. query.status = '3';
  321. const resultList = await ctx.model.InfoModel.aggregate([
  322. { $match: ctx.alterDeptId(query) },
  323. { $project: {
  324. dept1: 1, _id: 1, regularsInfo: 1,
  325. visitCountType1: { $sum: { $cond: [{ $gt: [{ $indexOfCP: [ '$regularsInfo', '"visitCount":"每天"' ] }, 0 ] }, 1, 0 ] } },
  326. visitCountType2: { $sum: { $cond: [{ $gt: [{ $indexOfCP: [ '$regularsInfo', '"visitCount":"每周"' ] }, 0 ] }, 1, 0 ] } },
  327. visitCountType3: { $sum: { $cond: [{ $gt: [{ $indexOfCP: [ '$regularsInfo', '"visitCount":"每月"' ] }, 0 ] }, 1, 0 ] } },
  328. visitCountType4: { $sum: { $cond: [{ $gt: [{ $indexOfCP: [ '$regularsInfo', '"visitCount":"每季"' ] }, 0 ] }, 1, 0 ] } },
  329. visitCountType5: { $sum: { $cond: [{ $gt: [{ $indexOfCP: [ '$regularsInfo', '"visitCount":"其它"' ] }, 0 ] }, 1, 0 ] } },
  330. } },
  331. {
  332. $group: {
  333. _id: null,
  334. visitCountType1: { $sum: '$visitCountType1' },
  335. visitCountType2: { $sum: '$visitCountType2' },
  336. visitCountType3: { $sum: '$visitCountType3' },
  337. visitCountType4: { $sum: '$visitCountType4' },
  338. visitCountType5: { $sum: '$visitCountType5' },
  339. },
  340. },
  341. {
  342. $project: {
  343. _id: 0, visitCountType1: 1, visitCountType2: 1, visitCountType3: 1, visitCountType4: 1, visitCountType5: 1,
  344. },
  345. },
  346. ]);
  347. let allCount = 0;
  348. for (const i in resultList[0]) {
  349. allCount += resultList[0][i];
  350. }
  351. const resultArr = [];
  352. const result = [];
  353. try {
  354. // 遍历集合
  355. for (const key in resultList[0]) {
  356. if (key === 'visitCountType1') {
  357. resultArr.push({ label: '每天', value: resultList[0][key] });
  358. }
  359. if (key === 'visitCountType2') {
  360. resultArr.push({ label: '每周', value: resultList[0][key] });
  361. }
  362. if (key === 'visitCountType3') {
  363. resultArr.push({ label: '每月', value: resultList[0][key] });
  364. }
  365. if (key === 'visitCountType4') {
  366. resultArr.push({ label: '每季', value: resultList[0][key] });
  367. }
  368. if (key === 'visitCountType5') {
  369. resultArr.push({ label: '其他', value: resultList[0][key] });
  370. }
  371. }
  372. const visitFrequency = ctx.visitFrequency();
  373. visitFrequency.forEach(item => {
  374. result.push({ label: item, value: 0 });
  375. });
  376. result.forEach(itemA => {
  377. resultArr.forEach(item => {
  378. if (item.label == itemA.label) {
  379. itemA.value = item.value;
  380. }
  381. });
  382. });
  383. } catch (e) {
  384. ctx.logger.error('catch--------error', e);
  385. ctx.error(e);
  386. } finally {
  387. return result;
  388. }
  389. }
  390. async oldIncome(query) {
  391. const { ctx } = this;
  392. query.status = '3';
  393. const resultList = await ctx.model.InfoModel.aggregate([
  394. { $match: ctx.alterDeptId(query) },
  395. { $unwind: { path: '$sourceOfIncome', preserveNullAndEmptyArrays: true } },
  396. { $project: {
  397. dept1: 1, _id: 1, sourceOfIncome: 1,
  398. } },
  399. {
  400. $group: {
  401. _id: '$sourceOfIncome',
  402. count: { $sum: 1 },
  403. },
  404. },
  405. ]);
  406. const resultArr = [];
  407. const result = [];
  408. try {
  409. resultList.forEach(item => {
  410. switch (item._id) {
  411. case '财产性收入':
  412. resultArr.push({ label: item._id, value: item.count });
  413. break;
  414. case '转移性收入':
  415. resultArr.push({ label: item._id, value: item.count });
  416. break;
  417. case '家庭经营性收入':
  418. resultArr.push({ label: item._id, value: item.count });
  419. break;
  420. case '工资性收入':
  421. resultArr.push({ label: item._id, value: item.count });
  422. break;
  423. case '其它':
  424. resultArr.push({ label: item._id, value: item.count });
  425. break;
  426. default:
  427. console.log('老年人收入来源统计查询出现脏数据!');
  428. }
  429. });
  430. const oldIncome = ctx.oldIncome();
  431. oldIncome.forEach(item => {
  432. result.push({ label: item, value: 0 });
  433. });
  434. result.forEach(itemA => {
  435. resultArr.forEach(item => {
  436. if (item.label == itemA.label) {
  437. itemA.value = item.value;
  438. }
  439. });
  440. });
  441. } catch (e) {
  442. ctx.logger.error('catch--------error', e);
  443. ctx.error(e);
  444. } finally {
  445. return result;
  446. }
  447. }
  448. async income(query) {
  449. const { ctx } = this;
  450. query.status = '3';
  451. const resultList = await ctx.model.InfoModel.aggregate([
  452. { $match: ctx.alterDeptId(query) },
  453. { $project: {
  454. dept1: 1, _id: 1, income: 1,
  455. } },
  456. {
  457. $group: {
  458. _id: '$income',
  459. count: { $sum: 1 },
  460. },
  461. },
  462. ]);
  463. let allCount = 0;
  464. let disposableIncome = 0;
  465. for (const index in resultList) {
  466. for (const i in resultList[index]) {
  467. if (i === 'count') {
  468. allCount += resultList[index][i];
  469. }
  470. if (resultList[index][i] === '5000元-10000元' || resultList[index][i] === '5000元~10000元') {
  471. console.log();
  472. disposableIncome += resultList[index].count;
  473. }
  474. }
  475. }
  476. const resultArr = [];
  477. const result = [];
  478. try {
  479. resultList.forEach(item => {
  480. switch (item._id) {
  481. case '5000元以下':
  482. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 + '%' });
  483. break;
  484. case '10000元以上':
  485. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 + '%' });
  486. break;
  487. }
  488. });
  489. if (disposableIncome > 0) {
  490. resultArr.push({ label: '5000~10000元', value: Math.round(disposableIncome / allCount * 10000) / 100 + '%' });
  491. }
  492. const income = ctx.income();
  493. income.forEach(item => {
  494. result.push({ label: item, value: 0 });
  495. });
  496. result.forEach(itemA => {
  497. resultArr.forEach(item => {
  498. if (item.label == itemA.label) {
  499. itemA.value = item.value;
  500. }
  501. });
  502. });
  503. } catch (e) {
  504. ctx.logger.error('catch--------error', e);
  505. ctx.error(e);
  506. } finally {
  507. return result;
  508. }
  509. }
  510. async livingCondition(query) {
  511. const { ctx } = this;
  512. query.status = '3';
  513. const resultList = await ctx.model.InfoModel.aggregate([
  514. { $match: ctx.alterDeptId(query) },
  515. { $project: {
  516. _id: 1, livingCondition: 1,
  517. } },
  518. {
  519. $group: {
  520. _id: '$livingCondition',
  521. count: { $sum: 1 },
  522. },
  523. },
  524. ]);
  525. const resultArr = [];
  526. const result = [];
  527. try {
  528. resultList.forEach(item => {
  529. switch (item._id) {
  530. case '特困供养人员':
  531. resultArr.push({ label: item._id, value: item.count });
  532. break;
  533. case '一般家庭':
  534. resultArr.push({ label: item._id, value: item.count });
  535. break;
  536. case '建档立卡贫困户':
  537. resultArr.push({ label: item._id, value: item.count });
  538. break;
  539. case '低保':
  540. resultArr.push({ label: item._id, value: item.count });
  541. break;
  542. default:
  543. console.log('老年人生活经济状况统计查询出现脏数据(livingCondition字段)!');
  544. }
  545. });
  546. const livingCondition = ctx.livingCondition();
  547. livingCondition.forEach(item => {
  548. result.push({ label: item, value: 0 });
  549. });
  550. result.forEach(itemA => {
  551. resultArr.forEach(item => {
  552. if (item.label == itemA.label) {
  553. itemA.value = item.value;
  554. }
  555. });
  556. });
  557. } catch (e) {
  558. ctx.logger.error('catch--------error', e);
  559. ctx.error(e);
  560. } finally {
  561. return result;
  562. }
  563. }
  564. async oldDemand(query) {
  565. const { ctx } = this;
  566. query.status = '3';
  567. const resultList = await ctx.model.InfoModel.aggregate([
  568. { $match: ctx.alterDeptId(query) },
  569. { $unwind: { path: '$demand', preserveNullAndEmptyArrays: true } },
  570. { $project: {
  571. dept1: 1, _id: 1, demand: 1,
  572. } },
  573. {
  574. $group: {
  575. _id: '$demand',
  576. count: { $sum: 1 },
  577. },
  578. },
  579. ]);
  580. let allCount = 0;
  581. let spiritualConsolation = 0; // 精神慰藉
  582. let safetyMonitoring = 0; // 安全监护
  583. for (const index in resultList) {
  584. for (const i in resultList[index]) {
  585. if (i === 'count') {
  586. allCount += resultList[index][i];
  587. }
  588. if (resultList[index][i] === '精神慰籍' || resultList[index][i] === '精神慰藉') {
  589. spiritualConsolation += resultList[index].count;
  590. }
  591. if (resultList[index][i] === '安全服务' || resultList[index][i] === '安全监护') {
  592. safetyMonitoring += resultList[index].count;
  593. }
  594. }
  595. }
  596. const resultArr = [];
  597. const result = [];
  598. try {
  599. resultList.forEach(item => {
  600. switch (item._id) {
  601. case '权益维护':
  602. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 });
  603. break;
  604. case '文化娱乐':
  605. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 });
  606. break;
  607. case '生产帮助':
  608. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 });
  609. break;
  610. case '生活照料':
  611. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 });
  612. break;
  613. case '紧急救助':
  614. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 });
  615. break;
  616. case '医疗保健':
  617. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 });
  618. break;
  619. case '其它':
  620. resultArr.push({ label: item._id, value: Math.round(item.count / allCount * 10000) / 100 });
  621. break;
  622. }
  623. });
  624. resultArr.push({ label: '精神慰藉', value: Math.round(spiritualConsolation / allCount * 10000) / 100 });
  625. resultArr.push({ label: '安全监护', value: Math.round(safetyMonitoring / allCount * 10000) / 100 });
  626. const oldDemand = ctx.oldDemand();
  627. oldDemand.forEach(item => {
  628. result.push({ label: item, value: 0 });
  629. });
  630. result.forEach(itemA => {
  631. resultArr.forEach(item => {
  632. if (item.label == itemA.label) {
  633. itemA.value = item.value;
  634. }
  635. });
  636. });
  637. } catch (e) {
  638. ctx.logger.error('catch--------error', e);
  639. ctx.error(e);
  640. } finally {
  641. return result;
  642. }
  643. }
  644. async oldnum(query) {
  645. const { ctx } = this;
  646. query.status = '3';
  647. const resultList = await ctx.model.InfoModel.find(ctx.alterDeptId(query)).countDocuments();
  648. const resultArr = { oldnum: resultList };
  649. return resultArr;
  650. }
  651. }
  652. module.exports = InfoService;