payment_tender.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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 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` = ? ' +
  25. 'OR pt.`id` in (SELECT pda.`tender_id` FROM ?? as pda LEFT JOIN ?? as pd ON pda.`tender_id` = pd.`tender_id` ' +
  26. 'WHERE pd.`status` != ' + auditConst.status.uncheck + ' AND pda.`aid` = ?)' +
  27. 'OR pt.`id` in (SELECT pra.`tender_id` FROM ?? as pra LEFT JOIN ?? as pd ON pra.`tender_id` = pd.`tender_id` ' +
  28. 'WHERE (pd.`status` != ' + auditConst.status.uncheck + ' OR pd.`status` !=' + auditConst.status.checkNo + ') AND pra.`uid` = ?)';
  29. const params = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.session.sessionProject.id, uid,
  30. this.ctx.service.paymentDetailAudit.tableName, this.ctx.service.paymentDetail.tableName, uid,
  31. this.ctx.service.paymentRptAudit.tableName, this.ctx.service.paymentDetail.tableName, uid];
  32. return await this.db.query(sql, params);
  33. }
  34. async addTender(projectId, uid, folderId, name) {
  35. const transaction = await this.db.beginTransaction();
  36. try {
  37. const folderInfo = await this.ctx.service.paymentFolder.getDataById(folderId);
  38. if (!folderInfo || folderInfo.is_leaf === 0) {
  39. throw '目录不存在或存在子目录不能新建标段';
  40. }
  41. const insertData = {
  42. pid: projectId,
  43. uid,
  44. name,
  45. folder_id: folderId,
  46. in_time: new Date(),
  47. };
  48. const result = await transaction.insert(this.tableName, insertData);
  49. const updateData = [
  50. { id: folderInfo.id, had_tender: 1 },
  51. ];
  52. // 更新父节点had_tender值
  53. if (folderInfo.parent_path) {
  54. const parentFolderIds = folderInfo.parent_path.split('-');
  55. for (const pf of parentFolderIds) {
  56. updateData.push({
  57. id: parseInt(pf),
  58. had_tender: 1,
  59. });
  60. }
  61. }
  62. await transaction.updateRows(this.ctx.service.paymentFolder.tableName, updateData);
  63. // 同时生成固定的报表表单
  64. await this.ctx.service.paymentTenderRpt.setConstRpt(transaction, result.insertId, uid);
  65. await transaction.commit();
  66. } catch (err) {
  67. await transaction.rollback();
  68. throw err;
  69. }
  70. }
  71. async deleteTender(id) {
  72. const transaction = await this.db.beginTransaction();
  73. try {
  74. const tenderInfo = await this.getDataById(id);
  75. if (!tenderInfo) {
  76. throw '标段不存在';
  77. }
  78. const had_detail = await this.ctx.service.paymentDetail.haveDetail2Tender(id);
  79. if (had_detail) {
  80. throw '请先删除所有报表表单详情';
  81. }
  82. const folderInfo = await this.ctx.service.paymentFolder.getDataById(tenderInfo.folder_id);
  83. if (!folderInfo) {
  84. throw '目录不存在';
  85. }
  86. // 判断folderInfo下是否还存在tender,不存在则把had_tender为0,并判断父节点是否需要也为0
  87. const leafTenderCount = await transaction.count(this.tableName, { folder_id: folderInfo.id });
  88. if (leafTenderCount === 1) {
  89. const updateDatas = [{
  90. id: folderInfo.id,
  91. had_tender: 0,
  92. }];
  93. if (folderInfo.parent_path) {
  94. const parentFolderIds = folderInfo.parent_path.split('-').reverse();
  95. for (const pfid of parentFolderIds) {
  96. const parentFolderId = parseInt(pfid);
  97. const leafFolderCount = await transaction.count(this.ctx.service.paymentFolder.tableName, { parent_id: parentFolderId, had_tender: 1 });
  98. if (leafFolderCount === 1) {
  99. updateDatas.push({
  100. id: parentFolderId,
  101. had_tender: 0,
  102. });
  103. } else {
  104. break;
  105. }
  106. }
  107. }
  108. await transaction.updateRows(this.ctx.service.paymentFolder.tableName, updateDatas);
  109. }
  110. await transaction.delete(this.ctx.service.paymentTenderRpt.tableName, { tender_id: id });
  111. await transaction.delete(this.ctx.service.paymentShenpiAudit.tableName, { tid: id });
  112. await transaction.delete(this.tableName, { id });
  113. await transaction.commit();
  114. } catch (err) {
  115. await transaction.rollback();
  116. throw err;
  117. }
  118. }
  119. // async getChildrenByParentId(parentId, transaction = null) {
  120. // const list = await this.getAllDataByCondition({ where: { parent_id: parentId } });
  121. // }
  122. }
  123. return paymentTender;
  124. };