payment_tender.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. 'use strict';
  2. /**
  3. * 决策大屏用户查看权限-数据模型
  4. *
  5. * @author ellisran
  6. * @date 2021/09/23
  7. * @version
  8. */
  9. const accountGroup = require('../const/account_group').group;
  10. const paymentConst = require('../const/payment');
  11. const auditConst = require('../const/audit').stage;
  12. module.exports = app => {
  13. class paymentTender extends app.BaseService {
  14. constructor(ctx) {
  15. super(ctx);
  16. this.tableName = 'payment_tender';
  17. }
  18. async getList(uid, auditPermission) {
  19. if (auditPermission.view_all) {
  20. const sql1 = 'SELECT pt.*, pa.name as user_name FROM ?? as pt LEFT JOIN ?? as pa ON pt.`uid` = pa.`id` WHERE pid = ?';
  21. const params1 = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.session.sessionProject.id];
  22. return await this.db.query(sql1, params1);
  23. }
  24. const typeValues = [];
  25. const projectInfo = await this.ctx.service.project.getDataById(this.ctx.session.sessionProject.id);
  26. const modes = projectInfo.payment_setting ? JSON.parse(projectInfo.payment_setting) : this._.cloneDeep(paymentConst.setting_modes);
  27. for (const m in paymentConst.setting_modes) {
  28. if (!modes[m]) modes[m] = this._.cloneDeep(paymentConst.setting_modes[m]);
  29. if (modes[m].checked) {
  30. typeValues.push(modes[m].value);
  31. }
  32. }
  33. if (typeValues.length === 0) {
  34. return -1;
  35. }
  36. const sql = 'SELECT pt.*, pa.name as user_name FROM ?? as pt LEFT JOIN ?? as pa ON pt.`uid` = pa.`id` WHERE pid = ? AND (pt.`uid` = ? ' +
  37. 'OR pt.`id` in (SELECT pr.`tender_id` FROM ?? as pr WHERE pr.`uid` = ? AND pr.`type` IN (' + this.ctx.helper.getInArrStrSqlFilter(typeValues) + '))' +
  38. 'OR pt.`id` in (SELECT pd.`tender_id` FROM ?? as pd WHERE pd.`uid` = ?)' +
  39. 'OR pt.`id` in (SELECT pda.`tender_id` FROM ?? as pda LEFT JOIN ?? as pd ON pda.`tender_id` = pd.`tender_id` ' +
  40. 'WHERE pd.`status` != ' + auditConst.status.uncheck + ' AND pda.`aid` = ?)' +
  41. 'OR pt.`id` in (SELECT pra.`tender_id` FROM ?? as pra LEFT JOIN ?? as pd ON pra.`tender_id` = pd.`tender_id` ' +
  42. 'WHERE pd.`status` != ' + auditConst.status.uncheck + ' AND pd.`status` !=' + auditConst.status.checkNo + ' AND pra.`uid` = ?))';
  43. const params = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.session.sessionProject.id, uid,
  44. this.ctx.service.paymentTenderRpt.tableName, uid,
  45. this.ctx.service.paymentDetail.tableName, uid,
  46. this.ctx.service.paymentDetailAudit.tableName, this.ctx.service.paymentDetail.tableName, uid,
  47. this.ctx.service.paymentRptAudit.tableName, this.ctx.service.paymentDetail.tableName, uid];
  48. return await this.db.query(sql, params);
  49. }
  50. async addTender(projectId, uid, folderId, name) {
  51. const transaction = await this.db.beginTransaction();
  52. try {
  53. const folderInfo = await this.ctx.service.paymentFolder.getDataById(folderId);
  54. if (!folderInfo || folderInfo.is_leaf === 0) {
  55. throw '文件夹不存在或存在子目录不能新建标段';
  56. }
  57. const insertData = {
  58. pid: projectId,
  59. uid,
  60. name,
  61. folder_id: folderId,
  62. in_time: new Date(),
  63. };
  64. const result = await transaction.insert(this.tableName, insertData);
  65. const updateData = [
  66. { id: folderInfo.id, had_tender: 1 },
  67. ];
  68. // 更新父节点had_tender值
  69. if (folderInfo.parent_path) {
  70. const parentFolderIds = folderInfo.parent_path.split('-');
  71. for (const pf of parentFolderIds) {
  72. updateData.push({
  73. id: parseInt(pf),
  74. had_tender: 1,
  75. });
  76. }
  77. }
  78. await transaction.updateRows(this.ctx.service.paymentFolder.tableName, updateData);
  79. // 同时生成固定的报表表单
  80. await this.ctx.service.paymentTenderRpt.setConstRpt(transaction, result.insertId, uid);
  81. await transaction.commit();
  82. } catch (err) {
  83. await transaction.rollback();
  84. throw err;
  85. }
  86. }
  87. async deleteTender(id) {
  88. const transaction = await this.db.beginTransaction();
  89. try {
  90. const tenderInfo = await this.getDataById(id);
  91. if (!tenderInfo) {
  92. throw '标段不存在';
  93. }
  94. if (tenderInfo.uid !== this.ctx.session.sessionUser.accountId && !this.ctx.session.sessionUser.is_admin) {
  95. throw '您没有权限删除此标段';
  96. }
  97. const had_detail = await this.ctx.service.paymentDetail.haveDetail2Tender(id);
  98. if (had_detail) {
  99. throw '请先删除所有报表表单详情';
  100. }
  101. const folderInfo = await this.ctx.service.paymentFolder.getDataById(tenderInfo.folder_id);
  102. if (!folderInfo) {
  103. throw '文件夹不存在';
  104. }
  105. // 判断folderInfo下是否还存在tender,不存在则把had_tender为0,并判断父节点是否需要也为0
  106. const leafTenderCount = await transaction.count(this.tableName, { folder_id: folderInfo.id });
  107. if (leafTenderCount === 1) {
  108. const updateDatas = [{
  109. id: folderInfo.id,
  110. had_tender: 0,
  111. }];
  112. if (folderInfo.parent_path) {
  113. const parentFolderIds = folderInfo.parent_path.split('-').reverse();
  114. for (const pfid of parentFolderIds) {
  115. const parentFolderId = parseInt(pfid);
  116. const leafFolderCount = await transaction.count(this.ctx.service.paymentFolder.tableName, { parent_id: parentFolderId, had_tender: 1 });
  117. if (leafFolderCount === 1) {
  118. updateDatas.push({
  119. id: parentFolderId,
  120. had_tender: 0,
  121. });
  122. } else {
  123. break;
  124. }
  125. }
  126. }
  127. await transaction.updateRows(this.ctx.service.paymentFolder.tableName, updateDatas);
  128. }
  129. await transaction.delete(this.ctx.service.paymentTenderRpt.tableName, { tender_id: id });
  130. await transaction.delete(this.ctx.service.paymentShenpiAudit.tableName, { tid: id });
  131. await transaction.delete(this.tableName, { id });
  132. await transaction.commit();
  133. } catch (err) {
  134. await transaction.rollback();
  135. throw err;
  136. }
  137. }
  138. // async getChildrenByParentId(parentId, transaction = null) {
  139. // const list = await this.getAllDataByCondition({ where: { parent_id: parentId } });
  140. // }
  141. }
  142. return paymentTender;
  143. };