sub_project.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. 修改脚本,请现在指定项目测试
  3. 例如: node db_script/sub_project local T201711273363
  4. 没有意外再全部执行
  5. 所有修改均应考虑脚本二次执行时的兼容,应检查是否已执行过,避免在生产环境运行时出现问题后需要二次执行,参见自定义分类脚本
  6. */
  7. const BaseUtil = require('./baseUtils');
  8. const querySql = BaseUtil.querySql;
  9. const uuid = require('node-uuid');
  10. const getInsertSql = function (tableName, data) {
  11. const column = [], query = [], value = [];
  12. for (const prop in data) {
  13. column.push(prop);
  14. query.push('?');
  15. value.push(data[prop]);
  16. }
  17. return [`INSERT INTO ${tableName} (${column.join(',')}) VALUES (${query.join(',')})`, value]
  18. };
  19. const createDefaultSubProject = async function (project) {
  20. console.log('Insert deafult sub_project');
  21. const users = await querySql('SELECT * FROM zh_project_account where project_id = ?', [project.id]);
  22. const manager = users.find(x => { return x.is_admin; });
  23. const subProject = { id: uuid.v4(), project_id: project.id, tree_pid: '-1', tree_order: 1, tree_level: 1, name: project.name, user_id: manager ? manager.id : 0};
  24. const [sql, sqlParam] = getInsertSql('zh_sub_project', subProject);
  25. await querySql(sql, sqlParam);
  26. // 所有标段归属到改项目下
  27. await querySql('UPDATE zh_tender SET spid = ? WHERE project_id = ?', [subProject.id, project.id]);
  28. // 项目下所有用户都在子项目下新增用户权限
  29. console.log('Insert default sub_project user permission');
  30. for (const u of users) {
  31. if (manager && u.id === manager.id) continue;
  32. const sp_permission = { id: uuid.v4(), spid: subProject.id, pid: project.id, uid: u.id, self_category_level: u.self_category_level};
  33. const [spSql, spSqlParam] = getInsertSql('zh_sub_project_permission', sp_permission);
  34. await querySql(spSql, spSqlParam);
  35. }
  36. };
  37. const copyColSet = async function(subProject) {
  38. console.log(`Copy sub_project ${subProject.name}(${subProject.id}) category`);
  39. const exist = await querySql('SELECT * FROM zh_project_col_set where pid = ? and spid = ?', [subProject.project_id, subProject.id]);
  40. if (exist.length > 0) return;
  41. const colSet = await querySql('SELECT * FROM zh_project_col_set where pid = ? and spid = ?', [subProject.project_id, '']);
  42. for (const cs of colSet) {
  43. const newCs = { pid: subProject.project_id, spid: subProject.id, info: cs.info };
  44. const [sql, sqlParam] = getInsertSql('zh_project_col_set', newCs);
  45. const insertResult = await querySql(sql, sqlParam);
  46. }
  47. };
  48. const doComplete = async function(code) {
  49. try {
  50. const filter = code ? ` where code = '${code}'` : '';
  51. const project = await querySql('Select * From zh_project' + filter);
  52. for (const p of project) {
  53. console.log(`Update Project ${p.code}(${p.id}):`);
  54. const existSubProj = await querySql('SELECT * FROM zh_sub_project where project_id = ? and is_folder = 0 and is_delete = 0;', [p.id]);
  55. if (existSubProj.length === 0) {
  56. console.log(`DELETE empty sub_project data`);
  57. // 删除旧数据(即使有数据,数据应该都是文件夹,应清理掉)
  58. await querySql('Update zh_sub_project SET is_delete = 1 where project_id = ?', [p.id]);
  59. // 创建默认数据
  60. await createDefaultSubProject(p);
  61. } else {
  62. console.log('Exist sub_project');
  63. }
  64. // 初始化所有subProject的项目配置 todo
  65. // 拷贝显示设置page_show, 功能设置fun_rela,决策大屏设置data_collect data_collect_pages
  66. // page_show可以后台设置,如果迁移至子项目下,后台已有的功能设置将作废,需要做针对子项目的项目设置
  67. // todo rpt_authority rpt_items rpt_level rpt_nature 是否拷贝?
  68. // 拷贝sql必须放在这里,不能放在update.sql,必须先执行上一步创建默认子项目
  69. console.log('Copy sub_project properties: page_show, fun_rela, data_collect, data_collect_pages, fun_set');
  70. await querySql('Update zh_sub_project sp LEFT JOIN zh_project p ON sp.project_id = p.id SET sp.page_show = p.page_show, sp.fun_rela = p.fun_rela, sp.data_collect = p.data_collect, sp.data_collect_pages = p.data_collect_pages, sp.fun_set = p.fun_set WHERE sp.is_folder = 0 and is_delete = 0; ');
  71. // 拷贝标段自定义类别设置
  72. const subProj = await querySql('SELECT * FROM zh_sub_project where project_id = ? and is_folder = 0 and is_delete = 0;', [p.id]);
  73. // 不使用Insert Into SELECT, 避免死锁
  74. const category = await querySql('SELECT * FROM zh_category where pid = ? and spid = ?', [p.id, '']);
  75. const categoryValue = await querySql('SELECT * FROM zh_category_value where pid = ? and spid = ?', [p.id, '']);
  76. for (const c of category) {
  77. c.value = categoryValue.filter(x => { return x.cid === c.id; });
  78. }
  79. for (const sp of subProj) {
  80. console.log(`Copy sub_project ${sp.name}(${sp.id}) category`);
  81. // 存在分类信息跳过 --- 防止脚本执行问题,需要重复执行
  82. const existCate = await querySql('SELECT * FROM zh_category where pid = ? and spid = ?', [p.id, sp.id]);
  83. if (existCate.length > 0) continue;
  84. const copyCategory = [];
  85. for (const cate of category) {
  86. const copyCate = { pid: cate.pid, spid: sp.id, name: cate.name, type: cate.type, level: cate.level };
  87. const [cateSql, cateSqlParam] = getInsertSql('zh_category', copyCate);
  88. const insertResult = await querySql(cateSql, cateSqlParam);
  89. copyCate.id = insertResult.insertId;
  90. copyCate.orgId = cate.id;
  91. copyCate.value = [];
  92. for (const value of cate.value) {
  93. const copyValue = { pid: value.pid, spid: sp.id, cid: insertResult.insertId, value: value.value, sort: value.sort};
  94. const [cateSql, cateSqlParam] = getInsertSql('zh_category_value', copyValue);
  95. const insertResultValue = await querySql(cateSql, cateSqlParam);
  96. copyValue.id = insertResultValue.insertId;
  97. copyValue.orgId = value.id;
  98. copyCate.value.push(copyValue);
  99. }
  100. copyCategory.push(copyCate);
  101. }
  102. const tenders = await querySql('SELECT * FROM zh_tender WHERE spid = ?', [sp.id]);
  103. for (const t of tenders) {
  104. const tCategory = t.category ? JSON.parse(t.category) : null;
  105. const newTCateGory = [];
  106. if (tCategory) {
  107. for (const tCate of tCategory) {
  108. const cate = copyCategory.find(x => { return x.orgId === tCate.cid; });
  109. if (!cate) continue;
  110. const value = cate.value.find(x => { return x.orgId === tCate.value; });
  111. if (!value) continue;
  112. newTCateGory.push({ cid: cate.id, value: value.id});
  113. }
  114. await querySql('UPDATE zh_tender SET category = ? WHERE id = ?', [JSON.stringify(newTCateGory), t.id]);
  115. }
  116. }
  117. }
  118. for (const sp of subProj) {
  119. await copyColSet(sp);
  120. }
  121. console.log('END Update;');
  122. }
  123. } catch (err) {
  124. console.log(err);
  125. }
  126. BaseUtil.closePool();
  127. };
  128. const projectCode = process.argv[3];
  129. doComplete(projectCode);