measure_controller.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. 'use strict';
  2. /**
  3. * 计量相关控制器
  4. *
  5. * @author olym
  6. * @date 2018/2/11
  7. * @version
  8. */
  9. const spreadConst = require('../const/spread');
  10. const codeRuleConst = require('../const/code_rule');
  11. const auditConst = require('../const/audit').flow;
  12. const moment = require('moment');
  13. module.exports = app => {
  14. class MeasureController extends app.BaseController {
  15. /**
  16. * 构造函数
  17. *
  18. * @param {Object} ctx - egg全局变量
  19. * @return {void}
  20. */
  21. constructor(ctx) {
  22. super(ctx);
  23. ctx.showProject = true;
  24. ctx.showTender = true;
  25. ctx.showTitle = true;
  26. }
  27. async list(ctx) {
  28. try {
  29. const tenderList = ctx.tenderList;
  30. const tenderData = ctx.tenderData;
  31. const codeRule = tenderData.m_rule ? JSON.parse(tenderData.m_rule) : [];
  32. for (const rule of codeRule) {
  33. switch (rule.rule_type) {
  34. case codeRuleConst.measure.ruleType.tenderName:
  35. rule.preview = tenderData.name;
  36. break;
  37. case codeRuleConst.measure.ruleType.inDate:
  38. rule.preview = moment().format('YYYYMM');
  39. break;
  40. case codeRuleConst.measure.ruleType.text:
  41. rule.preview = rule.text;
  42. break;
  43. case codeRuleConst.measure.ruleType.addNo:
  44. const s = '0000000000';
  45. rule.preview = s.substr(s.length - rule.format);
  46. break;
  47. }
  48. }
  49. const works = await ctx.service.measure.measureList({
  50. tender_id: tenderData.id,
  51. user_id: ctx.session.sessionUser.accountId,
  52. valid: true,
  53. });
  54. const renderData = {
  55. tenderData,
  56. tenderList,
  57. ruleType: codeRuleConst.ruleType.measure,
  58. ruleConst: codeRuleConst.measure,
  59. codeRule,
  60. works,
  61. auditConst,
  62. };
  63. await this.layout('measure/wlist.ejs', renderData, 'measure/wlist_modal.ejs');
  64. } catch (err) {
  65. this.log(err);
  66. this.redirect(ctx.menuList.dashboard.url);
  67. }
  68. }
  69. /**
  70. * 中间计量--计量编制 页面 (Get)
  71. *
  72. * @param {Object} ctx - egg全局变量
  73. * @return {void}
  74. */
  75. async work(ctx) {
  76. try {
  77. const tenderList = ctx.tenderList;
  78. const tenderData = ctx.tenderData;
  79. const codeRule = tenderData.m_rule ? JSON.parse(tenderData.m_rule) : [];
  80. for (const rule of codeRule) {
  81. switch (rule.rule_type) {
  82. case codeRuleConst.measure.ruleType.tenderName:
  83. rule.preview = tenderData.name;
  84. break;
  85. case codeRuleConst.measure.ruleType.inDate:
  86. rule.preview = moment().format('YYYYMM');
  87. break;
  88. case codeRuleConst.measure.ruleType.text:
  89. rule.preview = rule.text;
  90. break;
  91. case codeRuleConst.measure.ruleType.addNo:
  92. const s = '0000000000';
  93. rule.preview = s.substr(s.length - rule.format);
  94. break;
  95. }
  96. }
  97. const mid = ctx.params.mid
  98. const measure = await ctx.service.measure.getDataByCondition({mid: mid, valid: true});
  99. if (!measure) {
  100. throw '该数据已被删除'
  101. }
  102. const renderData = {
  103. tenderData,
  104. tenderList,
  105. auditConst,
  106. measure,
  107. measureSpreadSetting: JSON.stringify(spreadConst.measureSpread),
  108. };
  109. await this.layout('measure/work.ejs', renderData, 'measure/work_modal.ejs');
  110. } catch (err) {
  111. this.log(err);
  112. this.redirect(ctx.menuList.dashboard.url);
  113. }
  114. }
  115. /**
  116. * 中间计量 -- 获取新编号 (Ajax)
  117. *
  118. * @param {Object} ctx - egg全局变量
  119. * @returns {Promise<void>}
  120. */
  121. async newCode(ctx) {
  122. const responseData = {
  123. err: 0,
  124. msg: '',
  125. data: '',
  126. };
  127. try {
  128. const tenderId = ctx.session.sessionUser.tenderId;
  129. if (!tenderId) {
  130. throw '当前未打开标段';
  131. }
  132. const tenderData = await ctx.service.tender.getDataById(tenderId);
  133. const mCodeRule = JSON.parse(tenderData.m_rule);
  134. const code = [];
  135. for (const rule of mCodeRule) {
  136. switch (rule.rule_type) {
  137. case codeRuleConst.measure.ruleType.tenderName:
  138. code.push(tenderData.name);
  139. break;
  140. case codeRuleConst.measure.ruleType.text:
  141. code.push(rule.text);
  142. break;
  143. case codeRuleConst.measure.ruleType.inDate:
  144. code.push(moment().format('YYYYMM'));
  145. break;
  146. case codeRuleConst.measure.ruleType.addNo:
  147. let s = '0000000000';
  148. const count = rule.start + await ctx.service.measure.count({tender_id: tenderId});
  149. s = s + count;
  150. code.push(s.substr(s.length - rule.format));
  151. break;
  152. }
  153. }
  154. responseData.data = code.join('');
  155. } catch (err) {
  156. responseData.err = 1;
  157. responseData.msg = err;
  158. }
  159. ctx.body = responseData;
  160. }
  161. /**
  162. * 中间计量 -- 新增中间计量 (Ajax)
  163. *
  164. * @param {Object} ctx - egg全局变量
  165. * @returns {Promise<void>}
  166. */
  167. async addMeasure(ctx) {
  168. const responseData = {
  169. err: 0,
  170. msg: '',
  171. data: '',
  172. };
  173. try {
  174. const tenderId = ctx.session.sessionUser.tenderId;
  175. if (!tenderId) {
  176. throw '当前未打开标段';
  177. }
  178. const tenderData = await ctx.service.tender.getDataById(tenderId);
  179. const data = JSON.parse(ctx.request.body.data);
  180. await ctx.service.measure.add(tenderId, data.code, ctx.session.sessionUser.accountId, data.date, data.stage);
  181. responseData.data = await ctx.service.measure.measureData({
  182. tender_id: tenderId, code: data.code,
  183. });
  184. } catch (err) {
  185. this.log(err);
  186. responseData.err = 1;
  187. responseData.msg = err.toString();
  188. }
  189. ctx.body = responseData;
  190. }
  191. async deleteMeasure(ctx) {
  192. const responseData = {
  193. err: 0,
  194. msg: '',
  195. data: '',
  196. };
  197. try {
  198. const tenderId = ctx.session.sessionUser.tenderId;
  199. if (!tenderId) {
  200. throw '当前未打开标段';
  201. }
  202. const data = JSON.parse(ctx.request.body.data);
  203. responseData.data = await ctx.service.measure.invalid(tenderId, data.code, ctx.session.sessionUser.accountId);
  204. } catch (err) {
  205. this.log(err);
  206. responseData.err = 1;
  207. responseData.msg = err.toString();
  208. }
  209. ctx.body = responseData;
  210. }
  211. /**
  212. * 获取中间计量详细数据(包括部位和清单) (Ajax)
  213. * @param ctx - egg全局变量
  214. * @returns {Promise<void>}
  215. */
  216. async measureDetail(ctx) {
  217. const responseData = {
  218. err: 0,
  219. msg: '',
  220. data: '',
  221. };
  222. try {
  223. const tenderId = ctx.session.sessionUser.tenderId;
  224. if (!tenderId) {
  225. throw '当前未打开标段';
  226. }
  227. const tenderData = await ctx.service.tender.getDataById(tenderId);
  228. const data = JSON.parse(ctx.request.body.data);
  229. if (!data.mid) {
  230. throw '查询数据有误';
  231. }
  232. const measure = await ctx.service.measure.getDataByCondition({
  233. tender_id: tenderId,
  234. mid: data.mid,
  235. });
  236. if (!measure.times) {
  237. measure.times = 1;
  238. }
  239. measure.pos = await ctx.service.measurePos.getPosDetail(tenderId, data.mid);
  240. measure.bills = await ctx.service.measureBills.getBillsDetail(tenderId, data.mid);
  241. measure.billsTree = await ctx.service.measureBills.getBillsDetailWithParent(tenderId, data.mid);
  242. measure.curAuditor = await ctx.service.measureAudit.getCurAuditor(data.mid, measure.times);
  243. if (measure.times > 1 && measure.status === auditConst.status.checkNo) {
  244. measure.auditors = await ctx.service.measureAudit.getAuditors(data.mid, measure.times-1);
  245. } else {
  246. measure.auditors = await ctx.service.measureAudit.getAuditors(data.mid, measure.times);
  247. }
  248. responseData.data = measure;
  249. } catch (err) {
  250. this.log(err);
  251. responseData.err = 1;
  252. responseData.msg = err.toString();
  253. }
  254. ctx.body = responseData;
  255. }
  256. /**
  257. * 查询部位或者清单 (Ajax)
  258. *
  259. * @param ctx - egg全局变量
  260. * @returns {Promise<void>}
  261. */
  262. async search(ctx) {
  263. const responseData = {
  264. err: 0,
  265. msg: '',
  266. data: '',
  267. };
  268. try {
  269. const tenderId = ctx.session.sessionUser.tenderId;
  270. if (!tenderId) {
  271. throw '当前未打开标段';
  272. }
  273. const tenderData = await ctx.service.tender.getDataById(tenderId);
  274. const data = JSON.parse(ctx.request.body.data);
  275. if (!data.mid || !data.searchType) {
  276. throw '查询数据有误';
  277. }
  278. if (data.searchType === 'pos') {
  279. const key = {
  280. value: app.mysql.escape('%' + data.keyword + '%'),
  281. operate: 'Like',
  282. fields: ['code', 'name'],
  283. };
  284. responseData.data = await ctx.service.ledger.search(tenderId, key);
  285. } else if (data.searchType === 'bills') {
  286. const key = {
  287. value: app.mysql.escape('%' + data.keyword + '%'),
  288. operate: 'Like',
  289. fields: ['b_code', 'name'],
  290. };
  291. const range = [];
  292. const pos = await ctx.service.measurePos.getPosDetail(tenderId, data.mid);
  293. const posFullPath = [];
  294. for (const p of pos) {
  295. posFullPath.push(app.mysql.escape(p.full_path + '.%'));
  296. }
  297. responseData.data = await ctx.service.ledger.searchRange(tenderId, key, [{
  298. value: posFullPath,
  299. operate: 'Like',
  300. fields: ['full_path'],
  301. }, {
  302. value: true,
  303. operate: '=',
  304. fields: ['is_leaf'],
  305. }]);
  306. } else {
  307. throw '查询数据有误';
  308. }
  309. } catch (err) {
  310. this.log(err);
  311. responseData.err = 1;
  312. responseData.msg = err.toString();
  313. }
  314. ctx.body = responseData;
  315. }
  316. /**
  317. * 操作部位 -- 增删 (Ajax)
  318. *
  319. * @param ctx - egg全局变量
  320. * @returns {Promise<void>}
  321. */
  322. async pos(ctx) {
  323. const responseData = {
  324. err: 0,
  325. msg: '',
  326. data: {},
  327. };
  328. try {
  329. const tenderId = ctx.session.sessionUser.tenderId;
  330. if (!tenderId) {
  331. throw '当前未打开标段';
  332. }
  333. const data = JSON.parse(ctx.request.body.data);
  334. if (!data.mid || !data.operate || !data.pid) {
  335. throw '计量范围数据有误';
  336. }
  337. if (data.operate === 'add') {
  338. responseData.data = await ctx.service.measurePos.addPos(tenderId, data.mid, data.pid);
  339. } else if (data.operate === 'remove') {
  340. await ctx.service.measurePos.removePos(tenderId, data.mid, data.pid);
  341. } else {
  342. throw '未知操作';
  343. }
  344. } catch(err) {
  345. this.log(err);
  346. responseData.err = 1;
  347. responseData.msg = err.toString();
  348. }
  349. ctx.body = responseData;
  350. }
  351. /**
  352. * 操作清单 -- 增删 (Ajax)
  353. * @param ctx
  354. * @returns {Promise<void>}
  355. */
  356. async bills(ctx) {
  357. const responseData = {
  358. err: 0,
  359. msg: '',
  360. data: {},
  361. };
  362. try {
  363. const tenderId = ctx.session.sessionUser.tenderId;
  364. if (!tenderId) {
  365. throw '当前未打开标段';
  366. }
  367. const data = JSON.parse(ctx.request.body.data);
  368. if (!data.mid || !data.operate || !data.bid) {
  369. throw '计量清单数据有误';
  370. }
  371. if (data.operate === 'add') {
  372. await ctx.service.measureBills.addBills(tenderId, data.mid, data.bid);
  373. responseData.data = await ctx.service.measureBills.getBillsDataWithParent(tenderId, data.mid, data.bid);
  374. } else if (data.operate === 'remove') {
  375. responseData.data = await ctx.service.measureBills.getBillsDataWithParent(tenderId, data.mid, data.bid);
  376. await ctx.service.measureBills.removeBills(tenderId, data.mid, data.bid);
  377. } else {
  378. throw '未知操作';
  379. }
  380. } catch(err) {
  381. this.log(err);
  382. responseData.err = 1;
  383. responseData.msg = err.toString();
  384. responseData.data = {};
  385. }
  386. ctx.body = responseData;
  387. }
  388. /**
  389. * 清单 -- 计量 (Ajax)
  390. * @param ctx
  391. * @returns {Promise<void>}
  392. */
  393. async billsUpdate (ctx) {
  394. const responseData = { err: 0, msg: '', data: {} };
  395. try {
  396. const tenderId = ctx.session.sessionUser.tenderId;
  397. if (!tenderId) {
  398. throw '当前未打开标段';
  399. }
  400. const data = JSON.parse(ctx.request.body.data);
  401. if (!data.mid || !data.bid || !data.update) {
  402. throw '计量清单数据有误';
  403. }
  404. responseData.data = await ctx.service.measureBills.updateBills(tenderId, data.mid, data.bid, data.update);
  405. } catch(err) {
  406. this.log(err);
  407. responseData.err = 1;
  408. responseData.msg = err.toString();
  409. responseData.data = {};
  410. }
  411. ctx.body = responseData;
  412. }
  413. }
  414. return MeasureController;
  415. };