weapp_material_controller.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. 'use strict';
  2. const auditConst = require('../const/audit').material;
  3. const auditType = require('../const/audit').auditType;
  4. const materialConst = require('../const/material');
  5. module.exports = app => {
  6. class WeappMaterialController extends app.BaseController {
  7. async index(ctx) {
  8. try {
  9. if (!ctx.tender.info.isTourist) {
  10. ctx.tender.info.isTourist = false;
  11. }
  12. const subProject = await ctx.service.subProject.getDataById(ctx.tender.data.spid);
  13. subProject.page_show = ctx.service.subProject.getPageShow(subProject.page_show);
  14. if (!subProject.page_show.openMaterial) {
  15. ctx.body = { code: -1, msg: '该功能已关闭', data: null };
  16. return;
  17. }
  18. const materials = await ctx.service.material.getValidMaterials(ctx.tender.id);
  19. for (const m of materials) {
  20. if (!m.final_auditor_str || m.status !== auditConst.status.checked) {
  21. m.curAuditors = await ctx.service.materialAudit.getAuditorsByStatus(m.id, m.status, m.times);
  22. if (m.status === auditConst.status.checked && m.curAuditors.length > 0) {
  23. const final_auditor_str = (m.curAuditors[0].audit_type === auditType.key.common)
  24. ? `${m.curAuditors[0].name}${(m.curAuditors[0].role ? '-' + m.curAuditors[0].role : '')}`
  25. : ctx.helper.transFormToChinese(m.curAuditors[0].audit_order) + '审';
  26. await ctx.service.material.defaultUpdate({ id: m.id, final_auditor_str });
  27. }
  28. }
  29. m.decimal = m.decimal ? JSON.parse(m.decimal) : materialConst.decimal;
  30. m.exponent_decimal = m.exponent_decimal ? JSON.parse(m.exponent_decimal) : materialConst.exponent_decimal;
  31. }
  32. const lastMaterial = materials.length > 0 ? materials[0] : null;
  33. const openMaterialTax = subProject.page_show.openMaterialTax;
  34. let allMaterialTax = true;
  35. let actualOpenMaterialTax = openMaterialTax;
  36. const materialTotalPrice = {
  37. m_tp: 0,
  38. tax_tp: 0,
  39. ex_tp: 0,
  40. ex_tax_tp: 0,
  41. m_tax_tp: 0,
  42. };
  43. for (const m of materials) {
  44. if (allMaterialTax && m.material_tax === 0) {
  45. allMaterialTax = false;
  46. }
  47. if (!openMaterialTax && m.material_tax === 1) {
  48. actualOpenMaterialTax = 1;
  49. }
  50. materialTotalPrice.m_tp = ctx.helper.add(materialTotalPrice.m_tp, ctx.helper.round(m.m_tp, m.decimal.tp));
  51. materialTotalPrice.tax_tp = !m.material_tax
  52. ? ctx.helper.add(materialTotalPrice.tax_tp, ctx.helper.round(ctx.helper.mul(m.m_tp, 1 + m.rate / 100), m.decimal.tp))
  53. : materialTotalPrice.tax_tp;
  54. materialTotalPrice.ex_tp = ctx.helper.add(materialTotalPrice.ex_tp, ctx.helper.round(m.ex_tp, m.decimal.tp));
  55. materialTotalPrice.ex_tax_tp = ctx.helper.add(materialTotalPrice.ex_tax_tp, ctx.helper.round(m.ex_tax_tp, m.exponent_decimal.tp));
  56. materialTotalPrice.m_tax_tp = m.material_tax
  57. ? ctx.helper.add(materialTotalPrice.m_tax_tp, ctx.helper.round(m.m_tax_tp, m.decimal.tp))
  58. : materialTotalPrice.m_tax_tp;
  59. }
  60. materialTotalPrice.total_tp = ctx.helper.add(materialTotalPrice.m_tp, materialTotalPrice.ex_tp);
  61. materialTotalPrice.total_tax_tp = ctx.helper.add(materialTotalPrice.tax_tp, materialTotalPrice.ex_tax_tp);
  62. const renderData = {
  63. tender: ctx.tender.data,
  64. materials,
  65. lastMaterial,
  66. openMaterialTax: actualOpenMaterialTax,
  67. allMaterialTax,
  68. materialTotalPrice,
  69. };
  70. ctx.body = { code: 0, msg: '', data: renderData };
  71. } catch (err) {
  72. this.log(err);
  73. ctx.body = { code: -1, msg: err.toString(), data: null };
  74. }
  75. }
  76. async detail(ctx) {
  77. try {
  78. const materialId = ctx.params.mid;
  79. const material = await ctx.service.material.getDataById(materialId);
  80. if (!material) {
  81. ctx.body = { code: -1, msg: '材料调差期不存在', data: null };
  82. return;
  83. }
  84. if (!ctx.tender.isTourist) {
  85. ctx.tender.isTourist = false;
  86. }
  87. const subProject = await ctx.service.subProject.getDataById(ctx.tender.data.spid);
  88. subProject.page_show = ctx.service.subProject.getPageShow(subProject.page_show);
  89. const tenderMsg = await ctx.service.tender.getTender(ctx.tender.id, ['material_col_show']);
  90. const materialColShow = tenderMsg.material_col_show
  91. ? JSON.parse(tenderMsg.material_col_show)
  92. : ctx.helper._.cloneDeep(require('../const/tender').materialColShow);
  93. await ctx.service.material.loadMaterialUser(material);
  94. await ctx.service.material.loadMaterialAuditViewData(material);
  95. material.auditHistory = material.auditHistory && material.auditHistory.length && material.auditHistory[material.auditHistory.length - 1].reduce((prev, curr, idx) => {
  96. if (idx === 0) {
  97. const reportor = {
  98. audit_id: material.user.id,
  99. audit_order: 0,
  100. audit_type: 1,
  101. status: material.status === auditConst.status.uncheck ? auditConst.status.uncheck : auditConst.status.checked,
  102. times: material.status === auditConst.status.checkNo ? material.times - 1 : material.times,
  103. begin_time: curr.begin_time,
  104. end_time: curr.begin_time,
  105. name: material.user.name,
  106. company: material.user.company,
  107. role: material.user.role,
  108. mobile: '',
  109. opinion: '',
  110. };
  111. prev.push({
  112. name: '原报',
  113. status: reportor.status,
  114. audit_type: reportor.audit_type,
  115. auditors: [reportor],
  116. });
  117. }
  118. prev.push({
  119. name: curr.is_final ? '终审' : `${curr.audit_order}审`,
  120. audit_type: curr.audit_type,
  121. status: curr.status,
  122. auditors: curr.auditors,
  123. });
  124. return prev;
  125. }, []);
  126. material.decimal = material.decimal ? JSON.parse(material.decimal) : materialConst.decimal;
  127. material.exponent_decimal = material.exponent_decimal ? JSON.parse(material.exponent_decimal) : materialConst.exponent_decimal;
  128. const openMaterialTax = subProject.page_show.openMaterialTax;
  129. let allMaterialTax = true;
  130. let actualOpenMaterialTax = openMaterialTax;
  131. if (allMaterialTax && material.material_tax === 0) {
  132. allMaterialTax = false;
  133. }
  134. if (!openMaterialTax && material.material_tax === 1) {
  135. actualOpenMaterialTax = 1;
  136. }
  137. material.rate_tp = material.material_tax
  138. ? null
  139. : ctx.helper.round(ctx.helper.mul(material.m_tp, 1 + material.rate / 100), material.decimal.tp);
  140. material.openMaterialTax = actualOpenMaterialTax;
  141. material.allMaterialTax = allMaterialTax;
  142. material.materialColShow = materialColShow;
  143. ctx.body = { code: 0, msg: '', data: material };
  144. } catch (err) {
  145. this.log(err);
  146. ctx.body = { code: -1, msg: err.toString(), data: null };
  147. }
  148. }
  149. async checkAudit(ctx) {
  150. try {
  151. const materialId = ctx.params.materialId;
  152. const material = await ctx.service.material.getDataById(materialId);
  153. if (!material) {
  154. ctx.body = { code: -1, msg: '材料调差期不存在', data: null };
  155. return;
  156. }
  157. ctx.material = material;
  158. await ctx.service.material.loadMaterialUser(material);
  159. if (ctx.material.readOnly) {
  160. ctx.body = { code: -1, msg: '该材料调差期当前您无权操作', data: null };
  161. return;
  162. }
  163. if (ctx.material.status !== auditConst.status.checking && ctx.material.status !== auditConst.status.checkNoPre) {
  164. ctx.body = { code: -1, msg: '当前期数据有误', data: null };
  165. return;
  166. }
  167. if (ctx.material.curAuditorIds && ctx.material.curAuditorIds.indexOf(ctx.session.sessionUser.accountId) < 0) {
  168. ctx.body = { code: -1, msg: '您无权进行该操作', data: null };
  169. return;
  170. }
  171. const data = ctx.request.body;
  172. data.checkType = parseInt(data.checkType);
  173. if (!data.checkType || isNaN(data.checkType)) {
  174. ctx.body = { code: -1, msg: '提交数据错误', data: null };
  175. return;
  176. }
  177. await ctx.service.materialAudit.check(ctx.material.id, data, ctx.material.times);
  178. ctx.body = { code: 0, msg: '审批成功', data: null };
  179. } catch (err) {
  180. this.log(err);
  181. ctx.body = { code: -1, msg: err.toString() || '提交失败', data: null };
  182. ctx.session.postError = err.toString();
  183. }
  184. }
  185. }
  186. return WeappMaterialController;
  187. };