verify-stagnation-data.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /**
  2. * 验证停滞期/改图期数据是否正确保存到数据库
  3. *
  4. * 使用方法:
  5. * 1. 在浏览器控制台(F12)
  6. * 2. 复制并粘贴此脚本执行
  7. */
  8. async function verifyStagnationData() {
  9. console.log('🔍 开始验证停滞期/改图期数据保存情况...\n');
  10. // 检查 Parse SDK
  11. const Parse = window.Parse;
  12. if (!Parse) {
  13. console.error('❌ Parse SDK 未加载!');
  14. console.log('💡 可能原因:');
  15. console.log(' 1. 页面还未完全加载');
  16. console.log(' 2. Parse SDK 导入有问题');
  17. console.log('\n请等待页面完全加载后再试,或刷新页面');
  18. return;
  19. }
  20. console.log('✅ Parse SDK 已加载\n');
  21. try {
  22. // 查询所有项目
  23. const query = new Parse.Query('Project');
  24. query.limit(1000);
  25. const projects = await query.find();
  26. console.log(`📊 数据库中共有 ${projects.length} 个项目\n`);
  27. // 统计停滞期和改图期项目
  28. const stalledProjects = [];
  29. const modificationProjects = [];
  30. projects.forEach(p => {
  31. const data = p.get('data') || {};
  32. if (data.isStalled === true) {
  33. stalledProjects.push({
  34. id: p.id,
  35. title: p.get('title') || '未命名',
  36. currentStage: p.get('currentStage'),
  37. reasonType: data.stagnationReasonType,
  38. customReason: data.stagnationCustomReason,
  39. markedBy: data.markedBy,
  40. markedAt: data.markedAt
  41. });
  42. }
  43. if (data.isModification === true) {
  44. modificationProjects.push({
  45. id: p.id,
  46. title: p.get('title') || '未命名',
  47. currentStage: p.get('currentStage'),
  48. reasonType: data.modificationReasonType,
  49. customReason: data.modificationCustomReason,
  50. markedBy: data.markedBy,
  51. markedAt: data.markedAt
  52. });
  53. }
  54. });
  55. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  56. console.log('📈 统计结果:');
  57. console.log(` ⏸️ 停滞期项目: ${stalledProjects.length} 个`);
  58. console.log(` ✏️ 改图期项目: ${modificationProjects.length} 个`);
  59. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
  60. // 显示停滞期项目详情
  61. if (stalledProjects.length > 0) {
  62. console.log('⏸️ 停滞期项目详情:');
  63. stalledProjects.forEach((p, i) => {
  64. console.log(`\n${i + 1}. 📋 ${p.title}`);
  65. console.log(` ID: ${p.id}`);
  66. console.log(` 当前阶段: ${p.currentStage}`);
  67. console.log(` 原因类型: ${p.reasonType || 'N/A'}`);
  68. if (p.customReason) {
  69. console.log(` 自定义原因: ${p.customReason}`);
  70. }
  71. if (p.markedBy) {
  72. console.log(` 标记人: ${p.markedBy}`);
  73. }
  74. if (p.markedAt) {
  75. const date = new Date(p.markedAt);
  76. console.log(` 标记时间: ${date.toLocaleString('zh-CN')}`);
  77. }
  78. });
  79. console.log('');
  80. } else {
  81. console.log('ℹ️ 数据库中没有停滞期项目\n');
  82. }
  83. // 显示改图期项目详情
  84. if (modificationProjects.length > 0) {
  85. console.log('✏️ 改图期项目详情:');
  86. modificationProjects.forEach((p, i) => {
  87. console.log(`\n${i + 1}. 📋 ${p.title}`);
  88. console.log(` ID: ${p.id}`);
  89. console.log(` 当前阶段: ${p.currentStage}`);
  90. console.log(` 原因类型: ${p.reasonType || 'N/A'}`);
  91. if (p.customReason) {
  92. console.log(` 自定义原因: ${p.customReason}`);
  93. }
  94. if (p.markedBy) {
  95. console.log(` 标记人: ${p.markedBy}`);
  96. }
  97. if (p.markedAt) {
  98. const date = new Date(p.markedAt);
  99. console.log(` 标记时间: ${date.toLocaleString('zh-CN')}`);
  100. }
  101. });
  102. console.log('');
  103. } else {
  104. console.log('ℹ️ 数据库中没有改图期项目\n');
  105. }
  106. // 对比内存中的数据
  107. const dashboard = document.querySelector('app-dashboard');
  108. if (dashboard) {
  109. const component = window.ng?.getComponent?.(dashboard);
  110. if (component && component.projects) {
  111. const memoryStalled = component.projects.filter(p => p.isStalled === true);
  112. const memoryModification = component.projects.filter(p => p.isModification === true);
  113. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  114. console.log('🔄 内存 vs 数据库对比:');
  115. console.log(` 内存中停滞期: ${memoryStalled.length} 个`);
  116. console.log(` 数据库中停滞期: ${stalledProjects.length} 个`);
  117. console.log(` 内存中改图期: ${memoryModification.length} 个`);
  118. console.log(` 数据库中改图期: ${modificationProjects.length} 个`);
  119. if (memoryStalled.length !== stalledProjects.length) {
  120. console.warn('\n⚠️ 警告:内存和数据库中的停滞期项目数量不一致!');
  121. console.log(' 建议:刷新页面重新加载数据');
  122. }
  123. if (memoryModification.length !== modificationProjects.length) {
  124. console.warn('\n⚠️ 警告:内存和数据库中的改图期项目数量不一致!');
  125. console.log(' 建议:刷新页面重新加载数据');
  126. }
  127. if (memoryStalled.length === stalledProjects.length &&
  128. memoryModification.length === modificationProjects.length) {
  129. console.log('\n✅ 内存和数据库数据一致');
  130. }
  131. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
  132. }
  133. }
  134. // 返回结果
  135. return {
  136. success: true,
  137. database: {
  138. stalled: stalledProjects.length,
  139. modification: modificationProjects.length
  140. },
  141. projects: {
  142. stalledProjects,
  143. modificationProjects
  144. }
  145. };
  146. } catch (error) {
  147. console.error('❌ 验证失败:', error);
  148. console.log('\n💡 可能的原因:');
  149. console.log(' 1. 网络连接问题');
  150. console.log(' 2. Parse 服务器无响应');
  151. console.log(' 3. 权限不足');
  152. return { success: false, error };
  153. }
  154. }
  155. // 检查特定项目
  156. async function checkProjectById(projectId) {
  157. if (!projectId) {
  158. console.error('❌ 请提供项目ID');
  159. console.log('用法: checkProjectById("项目ID")');
  160. return;
  161. }
  162. console.log(`🔍 查询项目: ${projectId}\n`);
  163. const Parse = window.Parse;
  164. if (!Parse) {
  165. console.error('❌ Parse SDK 未加载!');
  166. return;
  167. }
  168. try {
  169. const query = new Parse.Query('Project');
  170. const project = await query.get(projectId);
  171. if (!project) {
  172. console.error('❌ 未找到项目');
  173. return;
  174. }
  175. const title = project.get('title') || '未命名';
  176. const currentStage = project.get('currentStage');
  177. const data = project.get('data') || {};
  178. console.log('📋 项目信息:');
  179. console.log(` 名称: ${title}`);
  180. console.log(` 当前阶段: ${currentStage}`);
  181. console.log(` 停滞期: ${data.isStalled === true ? '✅ 是' : '❌ 否'}`);
  182. console.log(` 改图期: ${data.isModification === true ? '✅ 是' : '❌ 否'}\n`);
  183. if (data.isStalled === true) {
  184. console.log('⏸️ 停滞期详情:');
  185. console.log(` 原因类型: ${data.stagnationReasonType || 'N/A'}`);
  186. if (data.stagnationCustomReason) {
  187. console.log(` 自定义原因: ${data.stagnationCustomReason}`);
  188. }
  189. if (data.estimatedResumeDate) {
  190. console.log(` 预计恢复: ${new Date(data.estimatedResumeDate).toLocaleDateString('zh-CN')}`);
  191. }
  192. if (data.reasonNotes) {
  193. console.log(` 备注: ${data.reasonNotes}`);
  194. }
  195. if (data.markedBy) {
  196. console.log(` 标记人: ${data.markedBy}`);
  197. }
  198. if (data.markedAt) {
  199. console.log(` 标记时间: ${new Date(data.markedAt).toLocaleString('zh-CN')}`);
  200. }
  201. console.log('');
  202. }
  203. if (data.isModification === true) {
  204. console.log('✏️ 改图期详情:');
  205. console.log(` 原因类型: ${data.modificationReasonType || 'N/A'}`);
  206. if (data.modificationCustomReason) {
  207. console.log(` 自定义原因: ${data.modificationCustomReason}`);
  208. }
  209. if (data.reasonNotes) {
  210. console.log(` 备注: ${data.reasonNotes}`);
  211. }
  212. if (data.markedBy) {
  213. console.log(` 标记人: ${data.markedBy}`);
  214. }
  215. if (data.markedAt) {
  216. console.log(` 标记时间: ${new Date(data.markedAt).toLocaleString('zh-CN')}`);
  217. }
  218. console.log('');
  219. }
  220. console.log('📦 完整 data 字段:');
  221. console.log(data);
  222. return { title, currentStage, data };
  223. } catch (error) {
  224. console.error('❌ 查询失败:', error);
  225. return null;
  226. }
  227. }
  228. // 使用说明
  229. console.log('📖 验证脚本已加载!');
  230. console.log('');
  231. console.log('可用命令:');
  232. console.log(' verifyStagnationData() - 验证所有停滞期/改图期数据');
  233. console.log(' checkProjectById("项目ID") - 检查特定项目');
  234. console.log('');
  235. console.log('示例:');
  236. console.log(' await verifyStagnationData();');
  237. console.log(' await checkProjectById("abc123def456");');
  238. console.log('');
  239. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  240. console.log('');
  241. // 自动执行验证
  242. console.log('⏳ 自动执行验证...\n');
  243. verifyStagnationData();