bills_permissionController.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /**标准清单操作相关
  2. * Created by Zhong on 2017/8/2.
  3. */
  4. let billsController = require("./bills_lib_controllers");
  5. let billsLibDao = require("./../models/bills_lib_interfaces");
  6. import baseController from "../../common/base/base_controller";
  7. import fs from 'fs';
  8. import path from 'path';
  9. import multiparty from 'multiparty';
  10. const excel = require("node-xlsx");
  11. const uuidV1 = require('uuid/v1');
  12. const shareDir = 'public/share/images';
  13. const imgTriggers = ['billsRecharge', 'rationExplanation', 'rationRuleText'];
  14. class billsPermContr extends baseController{
  15. getCurrentUniqId(req, res){
  16. billsController.getCurrentUniqId(req, res);
  17. }
  18. getBills(req, res){
  19. billsController.getBills(req, res);
  20. }
  21. createBills(req, res){
  22. billsController.createBills(req, res);
  23. }
  24. updatePNId(req, res){
  25. billsController.updatePNId(req, res);
  26. }
  27. upMove(req, res){
  28. billsController.upMove(req, res);
  29. }
  30. downMove(req, res){
  31. billsController.downMove(req, res);
  32. }
  33. upLevel(req, res){
  34. billsController.upLevel(req, res);
  35. }
  36. downLevel(req, res){
  37. billsController.downLevel(req, res);
  38. }
  39. updateBills(req, res){
  40. billsController.updateBills(req, res);
  41. }
  42. updateSectionInfo(req, res){
  43. billsController.updateSectionInfo(req, res);
  44. }
  45. updateBillsArr(req, res){
  46. billsController.updateBillsArr(req, res);
  47. }
  48. removeTotal(req, res){
  49. billsController.removeTotal(req, res);
  50. }
  51. updateSerialNo(req, res){
  52. billsController.updateSerialNo(req, res);
  53. }
  54. pasteBills(req, res){
  55. billsController.pasteBills(req, res);
  56. }
  57. updateRecharge(req, res){
  58. billsController.updateRecharge(req, res);
  59. }
  60. pasteRel(req, res){
  61. billsController.pasteRel(req, res);
  62. }
  63. deleteBills(req, res){
  64. billsController.deleteBills(req, res);
  65. }
  66. isUsed(req, res){
  67. billsController.isUsed(req, res);
  68. }
  69. /*
  70. * 导入标准清单(确定节点结构:深度数组)
  71. * */
  72. importBills(req, res){
  73. let form = new multiparty.Form({uploadDir: './public'});
  74. const allowHeader = ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
  75. let uploadFullName;
  76. form.parse(req, async function (err, fields, files) {
  77. try {
  78. const file = typeof files.file !== 'undefined' ? files.file[0] : null;
  79. if (err || !file) {
  80. throw '上传失败。';
  81. }
  82. if (file.headers['content-type'] === undefined || allowHeader.indexOf(file.headers['content-type']) < 0) {
  83. throw '不支持该类型';
  84. }
  85. const billsLibId = typeof fields.billsLibId !== 'undefined' && fields.billsLibId.length > 0 ? fields.billsLibId[0] : null;
  86. if (!billsLibId) {
  87. throw '请选择一个清单库。';
  88. }
  89. let hasData = await billsLibDao.hasData(billsLibId);
  90. if (hasData) {
  91. throw '请新建一个新的清单库,或删除库中的清单后再导入。';
  92. }
  93. // 重命名文件名
  94. uploadFullName = './public/' + file.originalFilename;
  95. fs.renameSync(file.path, uploadFullName);
  96. const sheet = excel.parse(uploadFullName);
  97. if (sheet[0] === undefined || sheet[0].data === undefined || sheet[0].data.length <= 0) {
  98. throw 'excel没有对应数据';
  99. }
  100. //插入清单
  101. await billsLibDao.importBills(billsLibId, sheet[0].data);
  102. // 删除文件
  103. if(uploadFullName && fs.existsSync(uploadFullName)){
  104. fs.unlinkSync(uploadFullName);
  105. }
  106. res.json({error: 0, data: null, msg: ''});
  107. } catch (err) {
  108. console.log(err);
  109. // 删除文件
  110. if(uploadFullName && fs.existsSync(uploadFullName)){
  111. fs.unlinkSync(uploadFullName);
  112. }
  113. res.json({error: 1, data: null, msg: err});
  114. }
  115. });
  116. }
  117. /*
  118. *上传图片
  119. * */
  120. uploadImg(req, res){
  121. let uploadDir = path.join(req.app.locals.rootDir, shareDir);
  122. let form = new multiparty.Form({uploadDir: uploadDir});
  123. form.parse(req, async function(err, fields, files){
  124. try {
  125. const file = typeof files.file !== 'undefined' ? files.file[0] : null;
  126. if(err || !file) {
  127. throw '上传失败';
  128. }
  129. //触发上传图片的地方
  130. const trigger = typeof fields.trigger !== 'undefined' && fields.trigger.length > 0 ? fields.trigger[0] : null;
  131. if (!trigger || !imgTriggers.includes(trigger)) {
  132. throw '该操作没有上传权限'
  133. }
  134. if (!fs.existsSync(uploadDir)) {
  135. fs.mkdirSync(uploadDir);
  136. }
  137. //根据触发源放置文件到相关文件夹
  138. let triggerPath = path.join(uploadDir, trigger);
  139. if (!fs.existsSync(triggerPath)) {
  140. fs.mkdirSync(triggerPath);
  141. }
  142. //文件后缀
  143. let px = file.originalFilename.split('.').pop();
  144. //时间戳重命名图片并移动文件
  145. let newFileName = Date.now() + '.' + px;
  146. if (fs.existsSync(newPath)) {
  147. newFileName += uuidV1();
  148. }
  149. let newPath = path.join(triggerPath, newFileName);
  150. fs.renameSync(file.path, newPath);
  151. //返回图片域名后的url
  152. res.json({error: 0, data: `${shareDir}/${trigger}/${newFileName}`, message: 'success'});
  153. } catch (err) {
  154. console.log(err);
  155. res.json({error: 1, data: null, message: err});
  156. }
  157. });
  158. }
  159. /*
  160. * 删除图片
  161. * */
  162. delImg(req, res){
  163. try {
  164. let data = JSON.parse(req.body.data),
  165. trigger = data.trigger,
  166. url = data.url;
  167. if (!imgTriggers.includes(trigger)) {
  168. throw '该操作没有权限';
  169. }
  170. //拼接完整的删除路径
  171. let delUrl = path.join(req.app.locals.rootDir, url);
  172. fs.unlinkSync(delUrl);
  173. res.json({error: 0, data: null, message: 'success'});
  174. } catch(err) {
  175. res.json({error: 1, data: null, message: err});
  176. }
  177. }
  178. /*
  179. * 根据页码加载图片
  180. * 返回总页码和当前页码的图片信息
  181. * */
  182. loadImgs(req, res){
  183. try {
  184. let data = JSON.parse(req.body.data),
  185. trigger = data.trigger,
  186. page = data.page;
  187. if (!imgTriggers.includes(trigger)) {
  188. throw '该操作没有权限';
  189. }
  190. //每页显示的图片数
  191. const perImgs = 3;
  192. //总的图片信息
  193. let triggerPath = path.join(req.app.locals.rootDir, shareDir, trigger);
  194. if (!fs.existsSync(triggerPath)) {
  195. fs.mkdirSync(triggerPath);
  196. }
  197. let allImgs = fs.readdirSync(triggerPath);
  198. //将图片按照时间排序,降序
  199. allImgs.sort(function (a, b) {
  200. let aV = a.split('.')[0],
  201. bV = b.split('.')[0];
  202. if(aV > bV) {
  203. return -1;
  204. } else if(aV < bV) {
  205. return 1;
  206. }
  207. return 0;
  208. });
  209. let pageCount = Math.ceil(allImgs.length / perImgs) || 1;
  210. //当前页图片信息
  211. let startIdx = (page - 1) * perImgs,
  212. endIdx = startIdx + 3,
  213. currentPageArr = allImgs.slice(startIdx, endIdx),
  214. currentImgsUrl = [];
  215. for (let img of currentPageArr){
  216. currentImgsUrl.push(`${shareDir}/${trigger}/${img}`);
  217. }
  218. res.json({error: 0, data: {pageCount: pageCount, currentImgsUrl: currentImgsUrl}, message: 'success'});
  219. } catch (err) {
  220. console.log(err);
  221. res.json({error: 1, data: {pageCount: 1, currentImgsUrl: []}, message: err});
  222. }
  223. }
  224. }
  225. export default billsPermContr;