deal_bills.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date 2018/5/8
  7. * @version
  8. */
  9. module.exports = app => {
  10. class DealBills extends app.BaseService {
  11. /**
  12. * 构造函数
  13. * @param ctx
  14. */
  15. constructor(ctx) {
  16. super(ctx);
  17. this.tableName = 'deal_bills';
  18. }
  19. /**
  20. * 导入Excel数据(node-xlsx)
  21. *
  22. * @param {Array} sheet - Excel文件中的全部工作表
  23. * @param {Number} tenderId - 所属标段Id
  24. * @returns {Promise<boolean>}
  25. */
  26. async importData(sheet, tenderId) {
  27. let result = false;
  28. const transaction = await this.db.beginTransaction();
  29. try {
  30. const bills = [];
  31. let iCode = -1, iName = -1, iUnit = -1, iUp = -1, iQty = -1, iTp = -1, bCheckCol = false;
  32. for (let iRow = 0; iRow < sheet.data.length; iRow++) {
  33. const row = sheet.data[iRow];
  34. if (!bCheckCol) {
  35. for (let iCol = 0; iCol < row.length; iCol++) {
  36. const value = row[iCol];
  37. if (typeof value !== "string") { continue }
  38. if (value === '子目号' || value === '清单编号') iCode = iCol;
  39. if (value.indexOf('名称') >= 0) iName = iCol;
  40. if (value.indexOf('单位') >= 0) iUnit = iCol;
  41. if (value.indexOf('单价') >= 0) iUp = iCol;
  42. if (value.indexOf('数量') >= 0) iQty = iCol;
  43. if (value.indexOf('金额') >= 0 || value.indexOf('合价') >= 0) iTp = iCol;
  44. }
  45. bCheckCol = (iCode >= 0 && iName >= 0 && iUnit >= 0 && iUp >= 0 && iQty >= 0);
  46. if (!bCheckCol) {
  47. iCode = -1;
  48. iName = -1;
  49. iUnit = -1;
  50. iUp = -1;
  51. iQty = -1;
  52. }
  53. } else if (this.ctx.helper.validBillsCode(row[iCode])) {
  54. const data = {
  55. deal_id: bills.length + 1,
  56. tender_id: tenderId,
  57. code: row[iCode],
  58. name: row[iName],
  59. unit: row[iUnit],
  60. unit_price: row[iUp],
  61. quantity: row[iQty],
  62. };
  63. if ((data.unit_price && !this._.isNumber(data.unit_price)) || (data.quantity && !this._.isNumber(data.quantity))) {
  64. throw '导入的Excel的数据类型有误,请检查第' + (iRow + 1) + '行';
  65. }
  66. bills.push(data);
  67. }
  68. }
  69. if (!bCheckCol) {
  70. throw '导入的Excel表头定义有误,请下载示例检查';
  71. }
  72. if (bills.length > 0) {
  73. await transaction.delete(this.tableName, {tender_id: tenderId});
  74. const billsResult = await transaction.insert(this.tableName, bills);
  75. if (billsResult.affectedRows !== bills.length) {
  76. throw '导入签约清单数据出错';
  77. }
  78. } else {
  79. throw 'Excel文件中无签约清单数据';
  80. }
  81. await transaction.commit();
  82. result = true;
  83. } catch (err) {
  84. await transaction.rollback();
  85. throw err;
  86. }
  87. return result;
  88. }
  89. /**
  90. * 导入Excel数据(js-xlsx)
  91. *
  92. * @param {Array} sheet - Excel文件中的全部工作表
  93. * @param {Number} tenderId - 所属标段Id
  94. * @returns {Promise<boolean>}
  95. */
  96. async importDataJsXlsx(sheet, tenderId) {
  97. let result = false;
  98. // 整理数据
  99. const bills = [];
  100. let iCode = -1, iName = -1, iUnit = -1, iUp = -1, iQty = -1, iTp = -1, bCheckCol = false;
  101. for (let iRow = 0; iRow < sheet.rows.length; iRow++) {
  102. const row = sheet.rows[iRow];
  103. if (!bCheckCol) {
  104. for (let iCol = 0; iCol < row.length; iCol++) {
  105. const value = row[iCol];
  106. if (typeof value !== "string") { continue }
  107. if (value === '子目号' || value === '清单编号') iCode = iCol;
  108. if (value.indexOf('名称') >= 0) iName = iCol;
  109. if (value.indexOf('单位') >= 0) iUnit = iCol;
  110. if (value.indexOf('单价') >= 0) iUp = iCol;
  111. if (value.indexOf('数量') >= 0) iQty = iCol;
  112. if (value.indexOf('金额') >= 0 || value.indexOf('合价') >= 0) iTp = iCol;
  113. }
  114. bCheckCol = (iCode >= 0 && iName >= 0 && iUnit >= 0 && iUp >= 0 && iQty >= 0 && iTp >= 0);
  115. if (!bCheckCol) {
  116. iCode = -1;
  117. iName = -1;
  118. iUnit = -1;
  119. iUp = -1;
  120. iQty = -1;
  121. iTp = -1;
  122. }
  123. } else if (this.ctx.helper.validBillsCode(row[iCode])) {
  124. const data = {
  125. deal_id: bills.length + 1,
  126. tender_id: tenderId,
  127. code: this.ctx.helper.replaceReturn(row[iCode]),
  128. name: this.ctx.helper.replaceReturn(row[iName]),
  129. unit: this.ctx.helper.replaceReturn(row[iUnit]),
  130. unit_price: (row[iUp] === undefined || row[iUp] === null) ? 0 : this._.toNumber(row[iUp]),
  131. quantity: (row[iQty] === undefined || row[iQty] === null) ? 0 : this._.toNumber(row[iQty]),
  132. total_price: (row[iTp] === undefined || row[iTp] === null) ? 0 : this._.toNumber(row[iTp]),
  133. };
  134. if (this._.isNaN(data.unit_price) || this._.isNaN(data.quantity) || this._.isNaN(data.total_price)) {
  135. throw '导入的Excel的数据类型有误,请检查第' + (iRow + 1) + '行';
  136. }
  137. bills.push(data);
  138. }
  139. }
  140. if (!bCheckCol) {
  141. throw '导入的Excel表头定义有误,请下载示例检查';
  142. }
  143. // 写入数据
  144. const transaction = await this.db.beginTransaction();
  145. try {
  146. if (bills.length > 0) {
  147. await transaction.delete(this.tableName, {tender_id: tenderId});
  148. const billsResult = await transaction.insert(this.tableName, bills);
  149. if (billsResult.affectedRows !== bills.length) {
  150. throw '导入签约清单数据出错';
  151. }
  152. } else {
  153. throw 'Excel文件中无签约清单数据';
  154. }
  155. await transaction.commit();
  156. result = true;
  157. } catch (err) {
  158. await transaction.rollback();
  159. throw err;
  160. }
  161. return result;
  162. }
  163. }
  164. return DealBills;
  165. }