|
@@ -21,6 +21,8 @@ const shenpiConst = require('../const/shenpi');
|
|
|
const LzString = require('lz-string');
|
|
|
const stdConst = require('../const/standard');
|
|
|
const spreadSetting = require('../lib/spread_setting');
|
|
|
+const path = require('path');
|
|
|
+const sendToWormhole = require('stream-wormhole');
|
|
|
|
|
|
module.exports = app => {
|
|
|
class ReviseController extends app.BaseController {
|
|
@@ -459,7 +461,8 @@ module.exports = app => {
|
|
|
]);
|
|
|
const ledgerTags = await this.ctx.service.ledgerTag.getDatas(ctx.tender.id);
|
|
|
const price = !revise.readOnly ? await this.ctx.service.revisePrice.getAllDataByCondition({ where: { rid: revise.id } }) : [];
|
|
|
- ctx.body = { err: 0, msg: '', data: { bills: reviseBills, pos: revisePos, tags: ledgerTags, price } };
|
|
|
+ const att = await this.ctx.service.ledgerAtt.getReviseViewData(ctx.tender.id, ctx.revise.id);
|
|
|
+ ctx.body = { err: 0, msg: '', data: { bills: reviseBills, pos: revisePos, tags: ledgerTags, price, att } };
|
|
|
} catch (err) {
|
|
|
ctx.helper.log(err);
|
|
|
this.ajaxErrorBody(err, '加载台账修订数据错误');
|
|
@@ -1014,6 +1017,8 @@ module.exports = app => {
|
|
|
return await this.ctx.service.revisePrice.getAllDataByCondition({ where: { rid: ctx.revise.id } });
|
|
|
case 'change':
|
|
|
return await this._loadChange(ctx);
|
|
|
+ case 'att':
|
|
|
+ return await this.ctx.service.ledgerAtt.getReviseViewData(ctx.tender.id, ctx.revise.id);
|
|
|
default: throw '请求的数据不存在';
|
|
|
}
|
|
|
}
|
|
@@ -1074,6 +1079,113 @@ module.exports = app => {
|
|
|
ctx.ajaxErrorBody(err, '保存数据失败');
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ async uploadFile(ctx) {
|
|
|
+ let stream;
|
|
|
+ try {
|
|
|
+ const parts = ctx.multipart({ autoFields: true });
|
|
|
+ const files = [];
|
|
|
+ let index = 0;
|
|
|
+ const extra_upload = ctx.revise.audit_status === audit.revise.status.checked;
|
|
|
+ stream = await parts();
|
|
|
+ while (stream) {
|
|
|
+ // 判断用户是否选择上传文件
|
|
|
+ if (!stream.filename) {
|
|
|
+ throw '请选择上传的文件!';
|
|
|
+ }
|
|
|
+ const fileInfo = path.parse(stream.filename);
|
|
|
+ const create_time = Date.parse(new Date()) / 1000;
|
|
|
+ const filepath = `${ctx.session.sessionProject.id}/${ctx.tender.id}/revise/att_${create_time + index.toString() + fileInfo.ext}`;
|
|
|
+
|
|
|
+ await ctx.app.fujianOss.put(ctx.app.config.fujianOssFolder + filepath, stream);
|
|
|
+
|
|
|
+ if (stream) await sendToWormhole(stream);
|
|
|
+
|
|
|
+ // 保存数据到att表
|
|
|
+ const fileData = {
|
|
|
+ tid: ctx.tender.id,
|
|
|
+ revise_id: ctx.revise.id,
|
|
|
+ revising: !extra_upload,
|
|
|
+ in_time: create_time,
|
|
|
+ filename: fileInfo.name,
|
|
|
+ fileext: fileInfo.ext,
|
|
|
+ filesize: Array.isArray(parts.field.size) ? parts.field.size[index] : parts.field.size,
|
|
|
+ filepath,
|
|
|
+ extra_upload,
|
|
|
+ };
|
|
|
+ const result = await ctx.service.ledgerAtt.save(parts.field, fileData, ctx.session.sessionUser.accountId);
|
|
|
+ if (!result) throw '保存数据失败';
|
|
|
+ const attData = await ctx.service.ledgerAtt.getViewDataByFid(result.insertId);
|
|
|
+ files.length !== 0 ? files.unshift(attData) : files.push(attData);
|
|
|
+ ++index;
|
|
|
+ if (Array.isArray(parts.field.size) && index < parts.field.size.length) {
|
|
|
+ stream = await parts();
|
|
|
+ } else {
|
|
|
+ stream = undefined;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ctx.body = { err: 0, msg: '', data: files };
|
|
|
+ } catch (err) {
|
|
|
+ ctx.log(err);
|
|
|
+ // 失败需要消耗掉stream 以防卡死
|
|
|
+ if (stream) await sendToWormhole(stream);
|
|
|
+ ctx.ajaxErrorBody(err, '上传文件失败');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ async deleteFile(ctx) {
|
|
|
+ try {
|
|
|
+ const data = JSON.parse(ctx.request.body.data);
|
|
|
+ const fileInfo = await ctx.service.ledgerAtt.getDataById(data.id);
|
|
|
+ if (!fileInfo || !Object.keys(fileInfo).length) throw '该文件不存在';
|
|
|
+ if (!fileInfo.extra_upload && ctx.revise.status === audit.revise.status.checked) throw '无权限删除';
|
|
|
+
|
|
|
+ if (fileInfo !== undefined && fileInfo !== '') {
|
|
|
+ // 先删除文件
|
|
|
+ await ctx.app.fujianOss.delete(ctx.app.config.fujianOssFolder + fileInfo.filepath);
|
|
|
+ // 再删除数据库
|
|
|
+ await ctx.service.ledgerAtt.deleteById(data.id);
|
|
|
+ } else {
|
|
|
+ throw '不存在该文件';
|
|
|
+ }
|
|
|
+ ctx.body = { err: 0, msg: '', data: null}
|
|
|
+ } catch (err) {
|
|
|
+ ctx.log(err);
|
|
|
+ ctx.ajaxErrorBody(err, '删除文件失败');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ async saveFile(ctx) {
|
|
|
+ let stream;
|
|
|
+ try {
|
|
|
+ stream = await ctx.getFileStream({ requireFile: false });
|
|
|
+ let fileData = {};
|
|
|
+ if (stream.filename !== undefined) {
|
|
|
+ const create_time = Date.parse(new Date()) / 1000;
|
|
|
+ const fileInfo = path.parse(stream.filename);
|
|
|
+ const filepath = `${ctx.session.sessionProject.id}/${ctx.tender.id}/revise/att_${create_time + fileInfo.ext}`;
|
|
|
+
|
|
|
+ // 保存文件
|
|
|
+ await ctx.oss.put(ctx.app.config.fujianOssFolder + filepath, stream);
|
|
|
+ // 保存数据到att表
|
|
|
+ fileData = {
|
|
|
+ filesize: stream.fields.size,
|
|
|
+ filepath,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ const org = await ctx.service.ledgerAtt.getDataById(stream.fields.id);
|
|
|
+ const result = await ctx.service.ledgerAtt.updateByID(stream.fields, fileData);
|
|
|
+ if (!result) throw '保存数据失败';
|
|
|
+ // 删除原附件
|
|
|
+ await ctx.app.fujianOss.delete(ctx.app.config.fujianOssFolder + org.filepath);
|
|
|
+ const attData = await ctx.service.ledgerAtt.getViewDataByFid(stream.fields.id);
|
|
|
+ ctx.body = { err: 0, msg: '', data: attData };
|
|
|
+ responseData.data = attData;
|
|
|
+ } catch (err) {
|
|
|
+ ctx.log(err);
|
|
|
+ // 失败需要消耗掉stream 以防卡死
|
|
|
+ if (stream) await sendToWormhole(stream);
|
|
|
+ ctx.ajaxErrorBody(err, '保存数据失败');
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return ReviseController;
|