index.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. const mongoose = require('mongoose');
  2. const uuidV1 = require('uuid/v1');
  3. const priceInfoClassModel = mongoose.model('infoPriceClass');
  4. // 旧数据没有ID,初次加载需要给数据加上ID
  5. const setIDForData = async () => {
  6. const item = await priceInfoClassModel.findOne({}).lean();
  7. if (!item || item.ID) {
  8. return;
  9. }
  10. const bulks = [];
  11. const items = await priceInfoClassModel.find({}, '-_id class ID').lean();
  12. items.forEach(item => {
  13. if (!item.ID) {
  14. bulks.push({
  15. updateOne: {
  16. filter: { class: item.class },
  17. update: { $set: { ID: uuidV1() } }
  18. }
  19. });
  20. }
  21. });
  22. if (bulks.length) {
  23. await priceInfoClassModel.bulkWrite(bulks);
  24. }
  25. }
  26. // 获取分页数据
  27. const getPagingData = async (page, pageSize, searchStr) => {
  28. let query = {};
  29. if (searchStr) {
  30. const nameReg = new RegExp(searchStr);
  31. query = {
  32. $or: [{ classCode: searchStr }, { name: { $regex: nameReg } }]
  33. }
  34. }
  35. const totalCount = await priceInfoClassModel.count(query);
  36. const items = await priceInfoClassModel.find(query).lean().sort({ class: -1 }).skip(page * pageSize).limit(pageSize);
  37. return { items, totalCount };
  38. }
  39. const UpdateType = {
  40. UPDATE: 'update',
  41. DELETE: 'delete',
  42. CREATE: 'create',
  43. };
  44. // 编辑表格
  45. async function editClassData(postData) {
  46. const classList = [];
  47. const bulks = [];
  48. postData.forEach(data => {
  49. if (data.data && data.data.class) {
  50. classList.push(data.data.class);
  51. }
  52. if (data.type === UpdateType.UPDATE) {
  53. bulks.push({
  54. updateOne: {
  55. filter: { ID: data.ID },
  56. update: { ...data.data }
  57. }
  58. });
  59. } else if (data.type === UpdateType.DELETE) {
  60. bulks.push({
  61. deleteOne: {
  62. filter: { ID: data.ID }
  63. }
  64. });
  65. } else {
  66. bulks.push({
  67. insertOne: {
  68. document: data.data
  69. }
  70. });
  71. }
  72. });
  73. if (classList.length) {
  74. const classItems = await priceInfoClassModel.find({ class: { $in: classList } }, '-_id class').lean();
  75. if (classItems) {
  76. const existClassList = [];
  77. const classMap = {};
  78. classItems.forEach(item => {
  79. classMap[item.class] = 1;
  80. });
  81. classList.forEach(classVal => {
  82. if (classMap[classVal]) {
  83. existClassList.push(classVal);
  84. }
  85. });
  86. if (existClassList.length) {
  87. throw new Error(`类别${existClassList.join(',')},已存在。`)
  88. }
  89. }
  90. }
  91. if (bulks.length) {
  92. await priceInfoClassModel.bulkWrite(bulks);
  93. }
  94. }
  95. // 导出excel数据
  96. async function exportExcelData() {
  97. const items = await priceInfoClassModel.find({}).sort({ class: 1 }).lean();
  98. // 整理数据
  99. let classData = [];
  100. for (const tmp of items) {
  101. const item = [tmp.class || '', tmp.classCode || '', tmp.code || '', tmp.name || '', tmp.specs || '', tmp.unit || ''];
  102. classData.push(item);
  103. }
  104. const excelData = [['class', '别名编码', '编码', '材料名称', '规格型号', '单位']];
  105. excelData.push.apply(excelData, classData);
  106. return excelData;
  107. }
  108. async function importExcelData(sheetData) {
  109. const newClassData = [];
  110. for (let row = 1; row < sheetData.length; row++) {
  111. const classItem = {
  112. ID: uuidV1(),
  113. classCode: sheetData[row][1] || '',
  114. code: sheetData[row][2] || '',
  115. name: sheetData[row][3] || '',
  116. specs: sheetData[row][4] || '',
  117. unit: sheetData[row][5] || '',
  118. }
  119. const classVal = sheetData[row][0];
  120. if (classVal !== undefined && !isNaN(classVal)) {
  121. classItem.class = +classVal;
  122. }
  123. newClassData.push(classItem);
  124. }
  125. if (newClassData.length) {
  126. await priceInfoClassModel.remove({});
  127. await priceInfoClassModel.insertMany(newClassData);
  128. } else {
  129. throw 'excel没有有效数据。'
  130. }
  131. }
  132. module.exports = {
  133. setIDForData,
  134. getPagingData,
  135. editClassData,
  136. exportExcelData,
  137. importExcelData
  138. }