index.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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.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. module.exports = {
  109. setIDForData,
  110. getPagingData,
  111. editClassData,
  112. exportExcelData
  113. }