sub_proj_setting_controller.js 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const tenderConst = require('../const/tender');
  10. const auditConst = require('../const/audit');
  11. const officeList = require('../const/cld_office').list;
  12. const settingConst = require('../const/setting.js');
  13. const scheduleConst = require('../const/schedule');
  14. const settingMenu = require('../../config/menu').projectSettingMenu;
  15. const projectLog = require('../const/project_log');
  16. const imType = require('../const/tender').imType;
  17. const path = require('path');
  18. const funSet = require('../const/fun_set');
  19. const projectSettingConst = require('../const/project_setting');
  20. const shenpiConst = require('../const/shenpi');
  21. const TenderApprovalSetting = require('../lib/tender_approval_setting');
  22. module.exports = app => {
  23. class SettingController extends app.BaseController {
  24. /**
  25. * 构造函数
  26. *
  27. * @param {Object} ctx - egg全局context
  28. * @return {void}
  29. */
  30. constructor(ctx) {
  31. super(ctx);
  32. ctx.subMenu = JSON.parse(JSON.stringify(settingMenu));
  33. for (const index in ctx.subMenu) {
  34. const menu = ctx.subMenu[index];
  35. menu.url = `/sp/${ctx.subProject.id}` + menu.url;
  36. }
  37. }
  38. async defaultCheck(ctx) {
  39. if (!ctx.subProject) throw '没有对应的项目数据';
  40. if (ctx.session.sessionUser.is_admin === 0) throw '没有访问权限';
  41. }
  42. /**
  43. * 项目设置 -- 自定义标段分类(Get)
  44. *
  45. * @param ctx
  46. * @return {Promise<void>}
  47. */
  48. async category(ctx) {
  49. try {
  50. this.defaultCheck(ctx);
  51. // 获取项目数据
  52. const categoryData = await ctx.service.category.getAllCategory(ctx.subProject);
  53. const tenderData = await ctx.service.tender.getList('', null, 1);
  54. const renderData = {
  55. categoryType: settingConst.cType,
  56. categoryData,
  57. tenderData,
  58. };
  59. await this.layout('sp_setting/category.ejs', renderData, 'sp_setting/category_modal.ejs');
  60. } catch (error) {
  61. ctx.log(error);
  62. ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
  63. }
  64. }
  65. /**
  66. * 新增分类(Ajax)
  67. *
  68. * @param ctx
  69. * @return {Promise<void>}
  70. */
  71. async addCategory(ctx) {
  72. try {
  73. const responseData = {
  74. err: 0, msg: '', data: null,
  75. };
  76. const data = JSON.parse(ctx.request.body.data);
  77. if (!data.name) {
  78. throw '提交数据错误';
  79. }
  80. responseData.data = await ctx.service.category.addCategory(ctx.subProject, data.name, settingConst.cType.key.dropDown);
  81. ctx.body = responseData;
  82. } catch (err) {
  83. ctx.log(err);
  84. ctx.body = { err: 1, msg: err.toString(), data: null };
  85. }
  86. }
  87. /**
  88. * 编辑分类(Ajax)
  89. *
  90. * @param ctx
  91. * @return {Promise<void>}
  92. */
  93. async updateCategory(ctx) {
  94. try {
  95. const responseData = { err: 0, msg: '', data: null };
  96. const data = JSON.parse(ctx.request.body.data);
  97. if (!data.id) {
  98. throw '提交数据错误';
  99. }
  100. if (data.name) {
  101. const count = await ctx.service.category.count({ spid: ctx.subProject.id, name: data.name });
  102. if (count >= 1) {
  103. throw '存在同名类别';
  104. }
  105. }
  106. const result = await ctx.service.category.update(data, { id: data.id });
  107. if (!result) {
  108. throw '提交数据失败';
  109. }
  110. responseData.data = await ctx.service.category.getCategory(data.id);
  111. ctx.body = responseData;
  112. } catch (err) {
  113. ctx.log(err);
  114. ctx.body = { err: 1, msg: err.toString(), data: null };
  115. }
  116. }
  117. async setCategoryValue(ctx) {
  118. try {
  119. const responseData = { err: 0, msg: '', data: {} };
  120. const data = JSON.parse(ctx.request.body.data);
  121. if (!data.id) {
  122. throw '提交数据错误';
  123. }
  124. await ctx.service.categoryValue.setCategoryValue(ctx.subProject, data.id, data.updateValue);
  125. responseData.data.category = await ctx.service.category.getCategory(data.id);
  126. // todo 查询标段
  127. responseData.data.tenders = await ctx.service.tender.getList('', null, 1);
  128. ctx.body = responseData;
  129. } catch (err) {
  130. ctx.log(err);
  131. ctx.body = { err: 1, msg: err instanceof String ? err : '提交数据失败', data: null };
  132. }
  133. }
  134. /**
  135. * 删除分类(Ajax)
  136. *
  137. * @param ctx
  138. * @return {Promise<void>}
  139. */
  140. async deleteCategory(ctx) {
  141. try {
  142. const responseData = {
  143. err: 0, msg: '', data: null,
  144. };
  145. const data = JSON.parse(ctx.request.body.data);
  146. if (!data.id) {
  147. throw '提交数据错误';
  148. }
  149. await ctx.service.category.deleteCategory(ctx.subProject, data.id);
  150. ctx.body = responseData;
  151. } catch (err) {
  152. ctx.log(err);
  153. ctx.body = { err: 1, msg: err.toString(), data: null };
  154. }
  155. }
  156. /**
  157. * 调整分类层次排序(Ajax)
  158. *
  159. * @param ctx
  160. * @return {Promise<void>}
  161. */
  162. async resetCategoryLevel(ctx) {
  163. try {
  164. const responseData = {
  165. err: 0, msg: '', data: null,
  166. };
  167. const data = JSON.parse(ctx.request.body.data);
  168. await ctx.service.category.resetCategoryLevel(data);
  169. responseData.data = await ctx.service.category.getAllCategory(ctx.subProject);
  170. ctx.body = responseData;
  171. } catch (err) {
  172. ctx.log(err);
  173. ctx.body = { err: 1, msg: err.toString(), data: null };
  174. }
  175. }
  176. async selfCategoryLevel(ctx) {
  177. try {
  178. const data = JSON.parse(ctx.request.body.data);
  179. await ctx.service.subProjPermission.defaultUpdate({
  180. self_category_level: data.self_category_level || '',
  181. }, { where: { spid: ctx.subProject.id, uid: ctx.session.sessionUser.accountId } });
  182. ctx.body = {
  183. err: 0, msg: '', data: null,
  184. };
  185. } catch (err) {
  186. ctx.log(err);
  187. ctx.ajaxErrorBody(err, '保存自定义分类失败');
  188. }
  189. }
  190. async user(ctx) {
  191. try {
  192. this.defaultCheck(ctx);
  193. const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
  194. const filter = {
  195. company: ctx.query.company || '',
  196. keyword: ctx.query.keyword || '',
  197. };
  198. const total = await ctx.service.projectAccount.getSubProjectAccountCount(ctx.subProject, filter);
  199. const subProjectAccountList = await ctx.service.projectAccount.getSubProjectAccountListWithPermission(ctx.subProject, filter);
  200. const subProjectAllAccountList = await ctx.service.projectAccount.getSubProjecAllAccountListWithPermission(ctx.subProject);
  201. const subProjectUnitList = unitList.map(item => {
  202. const users = subProjectAllAccountList.filter(item1 => item1.company === item.name);
  203. return { name: item.name, users };
  204. }).filter(x => { return x.users.length > 0; });
  205. const pageInfo = {
  206. page: ctx.page,
  207. pageSizeSelect: 1,
  208. pageSize: ctx.pageSize,
  209. total_num: total,
  210. total: Math.ceil(total / ctx.pageSize),
  211. queryData: JSON.stringify(ctx.urlInfo.query),
  212. };
  213. const accountList = await ctx.service.projectAccount.getAllDataByCondition({
  214. columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group', 'mobile', 'company_id'],
  215. where: { project_id: ctx.subProject.project_id },
  216. });
  217. accountList.forEach(x => {
  218. x.sp_exist = subProjectAllAccountList.findIndex(y => { return y.id === x.id; }) >= 0;
  219. });
  220. const accountGroup = unitList.map(item => {
  221. const groupList = accountList.filter(item1 => item1.company === item.name);
  222. return { id: item.id, name: item.name, groupList };
  223. }).filter(x => { return x.groupList.length > 0; });
  224. // const subProjects = await this.ctx.service.subProject.getAllDataByCondition({ where: { project_id: this.ctx.session.sessionProject.id, is_delete: 0 }});
  225. const subProjects = await this.ctx.service.subProject.getSubProjectTreeNodes(this.ctx.session.sessionProject.id,
  226. this.ctx.session.sessionUser.accountId, this.ctx.session.sessionUser.is_admin);
  227. const renderData = {
  228. pageInfo,
  229. accountGroup,
  230. subProjectAccountList,
  231. subProjectUnitList,
  232. subProjectAllAccountList,
  233. keyword: filter.keyword,
  234. company: filter.company,
  235. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.sp_permission),
  236. permissionBlock: ctx.service.subProjPermission.PermissionBlock,
  237. accountList,
  238. subProjects,
  239. };
  240. await this.layout('sp_setting/user.ejs', renderData, 'sp_setting/user_modal.ejs');
  241. } catch (error) {
  242. ctx.log(error);
  243. ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
  244. }
  245. }
  246. /*
  247. view 查看 1 file_permission
  248. upload 上传/引用 2 file_permission
  249. editfile 编辑文件 4 file_permission
  250. filing 文件类别编辑 3 file_permission
  251. */
  252. async permission(ctx) {
  253. try {
  254. this.defaultCheck(ctx);
  255. const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
  256. const filter = {
  257. keyword: ctx.query.keyword || '',
  258. };
  259. const permissionConst = this.service.subProjPermission.PermissionConst;
  260. const subProjectAccountList = await ctx.service.projectAccount.getSubProjecAllAccountListWithPermission(ctx.subProject, filter);
  261. const subProjectAllAccountList = await ctx.service.projectAccount.getSubProjecAllAccountListWithPermission(ctx.subProject);
  262. const subProjectUnitList = unitList.map(item => {
  263. const users = subProjectAccountList.filter(item1 => item1.company === item.name);
  264. return { name: item.name, users };
  265. }).filter(x => { return x.users.length > 0; });
  266. const accountList = await ctx.service.projectAccount.getAllDataByCondition({
  267. columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group', 'mobile', 'company_id'],
  268. where: { project_id: ctx.subProject.project_id },
  269. });
  270. accountList.forEach(x => {
  271. x.sp_exist = subProjectAllAccountList.findIndex(y => { return y.id === x.id; }) >= 0;
  272. });
  273. const accountGroup = unitList.map(item => {
  274. const groupList = accountList.filter(item1 => item1.company === item.name);
  275. return { id: item.id, name: item.name, groupList };
  276. }).filter(x => { return x.groupList.length > 0; });
  277. const relaBlock = ctx.service.subProjPermission.getRelaPermissionBlock(ctx.query.ptype);
  278. const subProjects = await this.ctx.service.subProject.getAllDataByCondition({ where: { project_id: this.ctx.session.sessionProject.id, is_folder: 0, is_delete: 0 } });
  279. const renderData = {
  280. ptype: ctx.query.ptype,
  281. ptypeStr: relaBlock ? relaBlock.name : '',
  282. ptypeHint: relaBlock && relaBlock.hint ? relaBlock.hint : '',
  283. accountGroup,
  284. subProjectAccountList,
  285. subProjectAllAccountList,
  286. subProjectUnitList,
  287. keyword: filter.keyword,
  288. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.sp_permission),
  289. permissionBlock: ctx.service.subProjPermission.PermissionBlock,
  290. permissionConst: permissionConst[ctx.query.ptype],
  291. accountList,
  292. subProjects,
  293. };
  294. await this.layout('sp_setting/permission.ejs', renderData, 'sp_setting/user_modal.ejs');
  295. } catch (error) {
  296. ctx.log(error);
  297. ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
  298. }
  299. }
  300. async permissionUpdate(ctx) {
  301. try {
  302. this.defaultCheck(ctx);
  303. const data = JSON.parse(ctx.request.body.data);
  304. const result = await ctx.service.subProjPermission.updatePermission(ctx.subProject, data);
  305. ctx.body = { err: 0, msg: '', data: result };
  306. } catch (err) {
  307. ctx.log(err);
  308. ctx.ajaxErrorBody(err, '更新账号权限失败');
  309. }
  310. }
  311. async dataRange(ctx) {
  312. try {
  313. this.defaultCheck(ctx);
  314. const moduleKey = ctx.query.module || 'file';
  315. const moduleInfo = ctx.service.subProjDataRange.getModule(moduleKey);
  316. const result = await Promise.all([
  317. ctx.service.subProjDataRange.getRangeTree(ctx.subProject),
  318. ctx.service.subProjDataRange.getRangeConfig(ctx.subProject.id, moduleKey),
  319. ]);
  320. const renderData = {
  321. moduleKey,
  322. moduleInfo,
  323. moduleList: ctx.service.subProjDataRange.getModuleList(),
  324. rangeTree: result[0].tree,
  325. unassignedUsers: result[0].unassignedUsers,
  326. rangeConfig: result[1],
  327. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.sp_data_range),
  328. };
  329. await this.layout('sp_setting/data_range.ejs', renderData, 'sp_setting/data_range_modal.ejs');
  330. } catch (error) {
  331. ctx.log(error);
  332. ctx.session.postError = error.toString();
  333. ctx.redirect(`/sp/${ctx.subProject.id}/setting/user`);
  334. }
  335. }
  336. async dataRangeUpdate(ctx) {
  337. try {
  338. this.defaultCheck(ctx);
  339. const data = JSON.parse(ctx.request.body.data);
  340. const moduleKey = data.module_key || 'file';
  341. const result = await ctx.service.subProjDataRange.saveRange(
  342. ctx.subProject,
  343. moduleKey,
  344. data.ranges,
  345. ctx.session.sessionUser.accountId
  346. );
  347. ctx.body = { err: 0, msg: '', data: result };
  348. } catch (err) {
  349. ctx.log(err);
  350. ctx.ajaxErrorBody(err, '保存数据范围失败');
  351. }
  352. }
  353. async logs(ctx) {
  354. try {
  355. this.defaultCheck(ctx);
  356. // 获取项目数据
  357. const settingType = ctx.params.type ? parseInt(ctx.params.type) : 0;
  358. const logs = await ctx.service.projectLog.getLogs(ctx.subProject.id, settingType);
  359. const renderData = {
  360. officeList,
  361. projectLog,
  362. settingType,
  363. logs,
  364. };
  365. await this.layout('sp_setting/logs.ejs', renderData);
  366. } catch (error) {
  367. ctx.log(error);
  368. ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
  369. }
  370. }
  371. async fun(ctx) {
  372. try {
  373. await this.defaultCheck(ctx);
  374. const funRela = this.ctx.subProject.fun_rela;
  375. const fun_set = this.ctx.subProject.fun_set;
  376. const renderData = {
  377. funRela,
  378. imType,
  379. endMonth: funSet.endMonth,
  380. funSet: fun_set,
  381. };
  382. await this.layout('sp_setting/fun.ejs', renderData, 'sp_setting/fun_modal.ejs');
  383. } catch (error) {
  384. ctx.log(error);
  385. ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
  386. }
  387. }
  388. /**
  389. * 保存功能设置相关
  390. * @param ctx
  391. * @return {Promise<void>}
  392. */
  393. async updateFun(ctx) {
  394. try {
  395. await this.defaultCheck(ctx);
  396. const data = JSON.parse(ctx.request.body.data);
  397. if (data) ctx.request.body = data;
  398. const rule = ctx.service.subProject.rule('fun');
  399. ctx.validate(rule);
  400. if (data.addFunSet && Object.prototype.hasOwnProperty.call(data.addFunSet, 'change_plan_name')) {
  401. if (typeof data.addFunSet.change_plan_name !== 'string') throw '变更方案名称格式错误';
  402. data.addFunSet.change_plan_name = data.addFunSet.change_plan_name.trim();
  403. if (data.addFunSet.change_plan_name.length > 5) throw '变更方案名称字符不能超过5个';
  404. }
  405. const result = await ctx.service.subProject.updateFunRela(ctx.subProject.id, ctx.request.body);
  406. if (!result) throw '保存数据失败';
  407. this.ctx.subProject.page_show.openChangeProject = data.openChangeProject ? 1 : 0;
  408. this.ctx.subProject.page_show.openChangeApply = data.openChangeApply ? 1 : 0;
  409. this.ctx.subProject.page_show.openChangePlan = data.openChangePlan ? 1 : 0;
  410. this.ctx.subProject.page_show.openChangeWhiteList = data.openChangeWhiteList ? 1 : 0;
  411. this.ctx.subProject.page_show.openChangeState = data.openChangeState ? 1 : 0;
  412. this.ctx.subProject.page_show.openMaterialTax = data.openMaterialTax ? 1 : 0;
  413. this.ctx.subProject.page_show.openMaterialChecklist = data.openMaterialChecklist ? 1 : 0;
  414. this.ctx.subProject.page_show.openMaterialSelf = data.openMaterialSelf ? 1 : 0;
  415. this.ctx.subProject.page_show.openMaterialEditForAudit = data.openMaterialEditForAudit ? 1 : 0;
  416. this.ctx.subProject.page_show.openStageStart = data.openStageStart ? 1 : 0;
  417. this.ctx.subProject.page_show.openMaterialStageRepeat = data.openMaterialStageRepeat ? 1 : 0;
  418. this.ctx.subProject.page_show.openMaterialListQty = data.openMaterialListQty ? 1 : 0;
  419. this.ctx.subProject.page_show.openContractExpr = data.openContractExpr ? 1 : 0;
  420. this.ctx.subProject.page_show.correctCalcContractTp = data.correctCalcContractTp ? 1 : 0;
  421. this.ctx.subProject.page_show.close1stStageCheckDealParam = data.close1stStageCheckDealParam ? 1 : 0;
  422. this.ctx.subProject.page_show.openMultiStageCalc = data.openMultiStageCalc ? 1 : 0;
  423. this.ctx.subProject.page_show.closeWapYfSf = data.closeWapYfSf ? 1 : 0;
  424. this.ctx.subProject.page_show.openStageAudit = data.openStageAudit ? 1 : 0;
  425. this.ctx.subProject.page_show.stageAuditEarly = data.stageAuditEarly || 0;
  426. this.ctx.subProject.page_show.stageAuditWorry = data.stageAuditWorry || 0;
  427. this.ctx.subProject.page_show.posCalcDetail = data.posCalcDetail ? 1 : 0;
  428. const result2 = await ctx.service.subProject.updatePageshow(ctx.subProject.id);
  429. if (!result2) throw '保存数据失败';
  430. if (data.addFunSet) {
  431. const funSet = ctx.subProject.fun_set;
  432. ctx.helper._.defaultsDeep(data.addFunSet, funSet);
  433. const result3 = await ctx.service.subProject.updateFunSet(ctx.subProject.id, data.addFunSet);
  434. if (!result3) throw '保存数据失败';
  435. }
  436. ctx.body = { err: 0, msg: '', data: null };
  437. } catch (error) {
  438. ctx.log(error);
  439. this.ajaxErrorBody(error, '保存数据失败');
  440. }
  441. }
  442. async dataCollect(ctx) {
  443. try {
  444. this.defaultCheck(ctx);
  445. if (!ctx.subProject.page_show.openDataCollect) {
  446. throw '该功能已关闭或无法查看';
  447. }
  448. ctx.subProject.data_collect_pages = ctx.subProject.data_collect_pages ? ctx.subProject.data_collect_pages.split(',') : [];
  449. if (ctx.session.sessionUser.is_admin === 0) throw '没有访问权限';
  450. const dataCollectAudits = await ctx.service.subProjPermission.getDatacollectAuditList(ctx.subProject.id);
  451. // 获取所有项目参与者
  452. const accountList = await ctx.service.projectAccount.getAllSubProjectAccount(ctx.subProject);
  453. const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
  454. const accountGroupList = unitList.map(item => {
  455. const groupList = accountList.filter(item1 => item1.company === item.name);
  456. return { groupName: item.name, companyId: item.id, groupList };
  457. }).filter(x => { return x.groupList.length > 0; });
  458. const categoryData = await ctx.service.category.getAllCategory(ctx.subProject);
  459. const tenders = await ctx.service.tender.getList('', null, 1);
  460. const dcTenders = await ctx.service.datacollectTender.getList(ctx.subProject.project_id, ctx.subProject.id);
  461. const is_dz2 = ['P0505', 'P0506', 'P1201', 'P1202', 'GY18Y', 'GYJJ1', 'P1103', 'KLG25', 'I2U5B', 'SEN48'].indexOf(ctx.session.sessionProject.code) !== -1 ? 6 : false;
  462. const is_dzcb = ['P0505', 'P0506', 'P1201', 'P1202', 'GY18Y', 'Y3T2Q'].indexOf(ctx.session.sessionProject.code) !== -1 ? 7 : false;// 成本管理定制大屏
  463. const is_dztz = ['P0505', 'P0506', 'P1201', 'P1202', 'GY18Y', 'Y3T2Q'].indexOf(ctx.session.sessionProject.code) !== -1 ? 8 : false;// 投资总控定制大屏
  464. const renderData = {
  465. dataCollectAudits,
  466. accountList,
  467. accountGroup: accountGroupList,
  468. categoryData,
  469. tenders,
  470. dcTenders,
  471. is_dz1: ['P0505', 'MI22U', 'YY215'].indexOf(ctx.session.sessionProject.code) !== -1 ? 5 : false,
  472. is_dz2,
  473. is_dzcb,
  474. is_dztz,
  475. selfCategoryLevel: await ctx.service.projectAccount.getSelfCategoryLevel(this.ctx.session.sessionUser.accountId),
  476. };
  477. if (is_dz2) {
  478. const projectData = await this.ctx.service.project.getDataById(ctx.subProject.project_id);
  479. // 获取分类及对应值
  480. if (!ctx.subProject.common_json) {
  481. ctx.subProject.common_json = await ctx.service.subProject.updateCommonJsonDaping06(ctx.subProject, projectData);
  482. }
  483. const commonJson = ctx.subProject.common_json ? JSON.parse(ctx.subProject.common_json) : null;
  484. renderData.daPing06Set = commonJson && commonJson.daPing06_set ? commonJson.daPing06_set : ctx.helper._.cloneDeep(projectSettingConst.daPing06Set);
  485. }
  486. if (is_dztz) {
  487. const commonJson = ctx.subProject.common_json ? JSON.parse(ctx.subProject.common_json) : null;
  488. renderData.daPing08Set = commonJson && commonJson.daPing08_set ? commonJson.daPing08_set : ctx.helper._.cloneDeep(projectSettingConst.daPing08Set);
  489. }
  490. await this.layout('sp_setting/datacollect.ejs', renderData, 'sp_setting/datacollect_modal.ejs');
  491. } catch (error) {
  492. ctx.log(error);
  493. ctx.session.postError = error.toString();
  494. ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
  495. }
  496. }
  497. async dataCollectSave(ctx) {
  498. try {
  499. this.defaultCheck(ctx);
  500. const responseData = {
  501. err: 0, msg: '', data: null,
  502. };
  503. const data = JSON.parse(ctx.request.body.data);
  504. if (!data.type) {
  505. throw '提交数据错误';
  506. }
  507. let uids;
  508. let auditList = [];
  509. switch (data.type) {
  510. case 'show':
  511. responseData.data = await ctx.service.subProject.update({
  512. data_collect: data.data_collect,
  513. data_collect_pages: data.data_collect_pages.join(','),
  514. }, { id: ctx.subProject.id });
  515. ctx.subProject.data_collect = data.data_collect;
  516. ctx.subProject.showDataCollect = data.data_collect ? 1 : 0;
  517. break;
  518. case 'add-audit':
  519. uids = data.id instanceof Array ? data.id : [data.id];
  520. // 判断该用户是否已加入到表中,已加入则提示无需添加
  521. auditList = await ctx.service.subProjPermission.getDatacollectAuditList(ctx.subProject.id, uids);
  522. const addAidList = ctx.helper._.difference(uids, ctx.helper._.map(auditList, 'uid'));
  523. if (addAidList.length === 0) {
  524. throw '用户已存在权限中,无需重复添加';
  525. }
  526. // await ctx.service.datacollectAudit.saveAudit(ctx.subProject.project_id, data.id);
  527. await ctx.service.subProjPermission.saveDatacollectPermissionAudits(ctx.subProject.id, addAidList, 'add');
  528. responseData.data = await ctx.service.subProjPermission.getDatacollectAuditList(ctx.subProject.id);
  529. break;
  530. case 'del-audit':
  531. uids = data.id instanceof Array ? data.id : [data.id];
  532. auditList = await ctx.service.subProjPermission.getDatacollectAuditList(ctx.subProject.id, uids);
  533. if (auditList.length !== uids.length) {
  534. throw '该用户已不存在权限中,移除失败';
  535. }
  536. await ctx.service.subProjPermission.saveDatacollectPermissionAudits(ctx.subProject.id, uids, 'del');
  537. responseData.data = await ctx.service.subProjPermission.getDatacollectAuditList(ctx.subProject.id);
  538. break;
  539. case 'tender':
  540. if (ctx.subProject.page_show.addDataCollect !== parseInt(data.add_datacollect)) {
  541. ctx.subProject.page_show.addDataCollect = parseInt(data.add_datacollect);
  542. await ctx.service.subProject.updatePageshow(ctx.subProject.id);
  543. }
  544. await ctx.service.datacollectTender.updateList(ctx.subProject.project_id, data.tids);
  545. responseData.data = {
  546. dcTenders: await ctx.service.datacollectTender.getList(ctx.subProject.project_id, ctx.subProject.id),
  547. addDatacollect: ctx.subProject.page_show.addDataCollect,
  548. };
  549. break;
  550. case 'save-dp06':
  551. responseData.data = await ctx.service.subProject.saveCommonJson(ctx.subProject.id, 'daPing06_set', data.daPing06Set);
  552. break;
  553. case 'save-dp08':
  554. responseData.data = await ctx.service.subProject.saveCommonJson(ctx.subProject.id, 'daPing08_set', data.daPing08Set);
  555. break;
  556. default:
  557. throw '参数有误';
  558. }
  559. ctx.body = responseData;
  560. } catch (err) {
  561. ctx.log(err);
  562. ctx.body = { err: 1, msg: err.toString(), data: null };
  563. }
  564. }
  565. async manage(ctx, approvalOnly = false) {
  566. try {
  567. await this.defaultCheck(ctx);
  568. const projectId = ctx.session.sessionProject.id;
  569. const projectData = await ctx.service.project.getDataById(projectId);
  570. if (projectData === null) throw '没有对应的项目数据';
  571. if (ctx.session.sessionUser.is_admin === 0) throw '没有访问权限';
  572. // 默认过滤完工的标段即显示build的标段
  573. const done = approvalOnly ? '1' : (ctx.query.done || '1');
  574. const buildStatusFilter = ctx.service.tender.db.format(' AND build_status = ?', [tenderConst.buildStatus.status.build]);
  575. const tenderList = await ctx.service.tender.getList('', null, 1, done === '1' ? buildStatusFilter : '');
  576. const removeTenders = await ctx.service.shenpiAudit.getRemoveTenders(tenderList);
  577. if (removeTenders.length > 0) {
  578. ctx.helper._.remove(tenderList, function(n) {
  579. return removeTenders.indexOf(n.id) !== -1;
  580. });
  581. }
  582. // for (const t of tenderList) {
  583. // t.visitor = (await this.ctx.service.tenderTourist.getTourists(t.id)).map(x => { return x.user_name; });
  584. // await this.ctx.service.tenderCache.loadTenderCache(t, this.ctx.session.sessionUser.accountId);
  585. // }
  586. // todo 自定义分类移动到子项目内部后,在整个项目上没有分类了
  587. const categoryData = await ctx.service.category.getAllCategory(ctx.subProject);
  588. // const categoryData = []; // await this.ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
  589. // 获取所有项目参与者
  590. const accountList = await ctx.service.projectAccount.getAllSubProjectAccount(ctx.subProject);
  591. const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
  592. const accountGroupList = unitList.map(item => {
  593. const groupList = accountList.filter(item1 => item1.company === item.name);
  594. return { groupName: item.name, groupList };
  595. }).filter(x => { return x.groupList.length > 0; });
  596. // console.log(accountGroupList);
  597. // 获取项目列表
  598. // const subProjects = await ctx.service.subProject.getAllDataByCondition({ where: { project_id: projectId, is_folder: 0, is_delete: 0 } });
  599. const subProjects = approvalOnly ? [] : await ctx.service.subProject.getSubProject(projectId, ctx.session.sessionUser.accountId, ctx.session.sessionUser.is_admin);
  600. const renderData = {
  601. approvalOnly,
  602. projectData,
  603. tenderList,
  604. auditConst,
  605. auditType: auditConst.auditType,
  606. accountList,
  607. accountGroup: accountGroupList,
  608. categoryData,
  609. settingConst,
  610. measureType: tenderConst.measureType,
  611. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.setting.sp_manage),
  612. uid: this.ctx.session.sessionUser.accountId,
  613. pid: this.ctx.session.sessionProject.id,
  614. spid: ctx.subProject.id,
  615. scPermission: scheduleConst.permission,
  616. change_type_list: shenpiConst.change_type_list,
  617. contract_type_list: shenpiConst.contract_type_list,
  618. subProjects,
  619. };
  620. const permissionKey = ['quality', 'inspection', 'safe_inspection', 'safe_payment', 'schedule'];
  621. renderData.selfCategoryLevel = await this.ctx.service.projectAccount.getSelfCategoryLevel(this.ctx.session.sessionUser.accountId);
  622. renderData.permissionConst = approvalOnly ? {} : ctx.service.tenderPermission.partPermissionConst(permissionKey);
  623. renderData.permissionBlock = approvalOnly ? [] : ctx.service.tenderPermission.partPermissionBlock(permissionKey);
  624. const page = approvalOnly ? 'approval' : 'manage';
  625. await this.layout(`sp_setting/${page}.ejs`, renderData, `sp_setting/${page}_modal.ejs`);
  626. } catch (error) {
  627. ctx.log(error);
  628. ctx.redirect(`/sp/${ctx.subProject.id}/dashboard`);
  629. }
  630. }
  631. async manageTenderSave(ctx) {
  632. try {
  633. await this.defaultCheck(ctx);
  634. if (ctx.session.sessionUser.is_admin === 0) throw '没有设置权限';
  635. const projectId = ctx.session.sessionProject.id;
  636. const responseData = {
  637. err: 0, msg: '', data: {},
  638. };
  639. const data = JSON.parse(ctx.request.body.data);
  640. if (!data.type) {
  641. throw '提交数据错误';
  642. }
  643. // 单个tenderPermission字段用这个
  644. // const permissionKey = ['quality', 'inspection', 'safe_inspection', 'safe_payment'];
  645. const permissionKey = ['schedule'];
  646. // 多个tenderPermission字段融合处理用这个
  647. const tPsKeys = {
  648. quality: ['quality', 'inspection'],
  649. safe: ['safe_inspection', 'safe_payment'],
  650. };
  651. switch (data.type) {
  652. case 'approval-draft':
  653. responseData.data = await new TenderApprovalSetting(ctx).loadDraft(data.tid, data.code);
  654. break;
  655. case 'approval-save':
  656. responseData.data = await new TenderApprovalSetting(ctx).saveDraft(data.tid, data.code, data.version, data.operations);
  657. break;
  658. case 'approval-msg':
  659. responseData.data = await new TenderApprovalSetting(ctx).load(data.tid);
  660. break;
  661. case 'msg':
  662. if (!data.tid) {
  663. throw '参数有误';
  664. }
  665. const tender = await ctx.service.tender.getDataById(data.tid);
  666. if (!tender) {
  667. throw '标段不存在';
  668. }
  669. const tenderInfo = await ctx.service.tenderInfo.getTenderInfo(tender.id);
  670. const lastRevise = await ctx.service.ledgerRevise.getLastestRevise(tender.id);
  671. const revising = (lastRevise && lastRevise.status !== auditConst.revise.status.checked) || false;
  672. // 获取审批流,游客账号,及投资进度账号信息
  673. responseData.data.tender = tender;
  674. responseData.data.revising = revising;
  675. responseData.data.shenpi = await ctx.service.shenpiAudit.getShenpi(tender.id, tenderInfo);
  676. const tourists = await ctx.service.tenderTourist.getTourists(tender.id);
  677. for (const t of tourists) {
  678. t.permission = await ctx.service.tenderTourist.getTouristPermission(t);
  679. }
  680. responseData.data.tourists = tourists;
  681. // responseData.data.scheduleAuditList = await ctx.service.scheduleAudit.getAllDataByCondition({ where: { tid: tender.id } });
  682. responseData.data.contractAuditList = await ctx.service.contractAudit.getList({ tid: tender.id });
  683. responseData.data.constructionAuditList = await ctx.service.constructionAudit.getList(tender.id);
  684. for (const key of permissionKey) {
  685. responseData.data[`${key}AuditList`] = await ctx.service.tenderPermission.getPartsPermission(tender.id, [key]);
  686. }
  687. for (const tpsKey in tPsKeys) {
  688. responseData.data[`${tpsKey}AuditList`] = await ctx.service.tenderPermission.getPartsPermission(tender.id, tPsKeys[tpsKey]);
  689. }
  690. break;
  691. case 'copy2otu':
  692. if (data.userType === 'tourist') {
  693. await ctx.service.tenderTourist.setOtherTender(data.tidList, data.auditList);
  694. // } else if (data.userType === 'schedule') {
  695. // await ctx.service.scheduleAudit.setOtherTender(data.tidList, data.auditList);
  696. } else if (data.userType === 'contract') {
  697. await ctx.service.contractAudit.setOtherTender(data.tidList, data.auditList);
  698. } else if (data.userType === 'construction') {
  699. await ctx.service.constructionAudit.setOtherTender(data.tidList, data.auditList);
  700. } else if (permissionKey.includes(data.userType)) {
  701. await ctx.service.tenderPermission.setOtherTender(data.tidList, data.auditList, [data.userType]);
  702. } else if (Object.keys(tPsKeys).includes(data.userType)) {
  703. await ctx.service.tenderPermission.setOtherTender(data.tidList, data.auditList, tPsKeys[data.userType]);
  704. } else {
  705. throw '参数有误';
  706. }
  707. break;
  708. case 'noSp-tenders':
  709. responseData.data = await ctx.service.tender.getNoSpTenders(projectId);
  710. break;
  711. case 'bind-sp':
  712. if (!data.spid || !data.tidList) {
  713. throw '参数有误';
  714. }
  715. if (data.tidList.split(',').length === 0) {
  716. throw '参数有误';
  717. }
  718. responseData.data = await ctx.service.tender.bindSp(projectId, data.spid, data.tidList.split(','));
  719. break;
  720. case 'get-category':
  721. responseData.data = await ctx.service.category.getAllCategory({ id: data.spid });
  722. break;
  723. default:
  724. throw '参数有误';
  725. }
  726. ctx.body = responseData;
  727. } catch (err) {
  728. ctx.log(err);
  729. ctx.body = { err: 1, msg: err.toString(), data: null };
  730. }
  731. }
  732. async approval(ctx) {
  733. await this.manage(ctx, true);
  734. }
  735. }
  736. return SettingController;
  737. };