MaiXinRong 1 день назад
Родитель
Сommit
703ccd0c60

+ 0 - 1
app/controller/report_controller.js

@@ -1262,7 +1262,6 @@ module.exports = app => {
                 pageShow.closeWatermark = 1;
                 pageShow.showArchive = 1;
                 pageShow.closeShowAllCustomized = 0;
-                pageShow.isPreset = 0;
                 // const tenderId = ctx.params.tid || -1; // 标段级别有
                 const tenderId = ctx.params.tid || -1;
                 const bglObj = {};

+ 47 - 1
app/controller/sub_proj_controller.js

@@ -293,6 +293,31 @@ module.exports = app => {
             }
         }
 
+        async _loadContract(type, contract_type = 1, tid) {
+            if (type === 'project') {
+                const contractTree = await this.ctx.service.contractTree.getAllDataByCondition({
+                    columns: ['id', 'contract_id', 'contract_pid', 'order', 'level', 'is_leaf', 'full_path', 'code', 'name', 'selected'],
+                    where: {spid: this.ctx.subProject.id, contract_type}
+                });
+                const contractData = await this.ctx.service.contract.getAllDataByCondition({
+                    columns: ['id', 'contract_id', 'contract_pid', 'order', 'level', 'is_leaf', 'full_path', 'c_code', 'name', 'selected'],
+                    where:  {spid: this.ctx.subProject.id, contract_type}
+                });
+                return [...contractTree, ...contractData];
+            } else if (type === 'tender') {
+                const contractTree = await this.ctx.service.contractTree.getAllDataByCondition({
+                    columns: ['id', 'contract_id', 'contract_pid', 'order', 'level', 'is_leaf', 'full_path', 'code', 'name', 'selected'],
+                    where: {tid, contract_type}
+                });
+                const contractData = await this.ctx.service.contract.getAllDataByCondition({
+                    columns: ['id', 'contract_id', 'contract_pid', 'order', 'level', 'is_leaf', 'full_path', 'c_code', 'name', 'selected'],
+                    where:  {tid, contract_type}
+                });
+                return [...contractTree, ...contractData];
+            } else {
+                return [];
+            }
+        }
         async load(ctx) {
             try {
                 const data = JSON.parse(ctx.request.body.data);
@@ -312,6 +337,9 @@ module.exports = app => {
                         case 'push_file':
                             result[f] = await ctx.service.subProjFile.getData(ctx.subProject.id, 'push');
                             break;
+                        case 'contract':
+                            result[f] = await this._loadContract(data.type, data.contract_type, data.tid);
+                            break;
                         default:
                             continue;
                     }
@@ -319,7 +347,25 @@ module.exports = app => {
                 ctx.body = { err: 0, msg: '', data: result };
             } catch(err) {
                 ctx.log(err);
-                ctx.ajaxErrorBody(err, '获取阶段进度数据有误');
+                ctx.ajaxErrorBody(err, '获取数据有误');
+            }
+        }
+        async save(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data.updateType || !data.updateData) throw '数据错误';
+                let result = null;
+                switch(data.updateType) {
+                    case 'contract':
+                        await ctx.service.contract.savePresetData(data.updateData);
+                        break;
+                    default:
+                        throw '未知数据类型';
+                }
+                ctx.body = { err: 0, msg: '', data: result };
+            } catch (err) {
+                ctx.log(err);
+                ctx.ajaxErrorBody(err, '保存数据失败');
             }
         }
 

+ 85 - 0
app/public/report/js/rpt_contract.js

@@ -0,0 +1,85 @@
+const rptContract = (function(){
+
+    let contractSpread, contractSheet, contractTree;
+    const initSpread = function() {
+        if (!contractSpread) {
+            contractSpread = SpreadJsObj.createNewSpread($('#rpt-contract-spread')[0]);
+            contractSheet = contractSpread.getActiveSheet();
+            SpreadJsObj.initSheet(contractSheet, {
+                cols: [
+                    {title: '选择', colSpan: '1', rowSpan: '1', field: 'selected', hAlign: 1, width: 40, formatter: '@', cellType: 'checkbox'},
+                    {title: '编号', colSpan: '1', rowSpan: '1', field: 'code', hAlign: 0, width: 120, formatter: '@', cellType: 'tree'},
+                    {title: '合同编号', colSpan: '1', rowSpan: '1', field: 'c_code', hAlign: 0, width: 120, formatter: '@'},
+                    {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 200, formatter: '@'},
+                ],
+                emptyRows: 0,
+                headRows: 1,
+                headRowHeight: [32],
+                defaultRowHeight: 21,
+                headerFont: '12px 微软雅黑',
+                font: '12px 微软雅黑',
+                readOnly: true,
+            });
+            contractSpread.bind(spreadNS.Events.ButtonClicked, function(e, info) {
+                if (!info.sheet.zh_setting || !info.sheet.zh_tree) return;
+
+                const col = info.sheet.zh_setting.cols[info.col];
+                if (col.field !== 'selected') return;
+
+                const node = SpreadJsObj.getSelectObject(info.sheet);
+                node.selected = !node.selected;
+                if (node.children && node.children.length > 0) {
+                    const posterity = info.sheet.zh_tree.getPosterity(node);
+                    for (const p of posterity) {
+                        p.selected = node.selected;
+                    }
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row, posterity.length + 1);
+                } else {
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row, 1);
+                }
+                if (node.selected) {
+                    const rows = [];
+                    const parents = info.sheet.zh_tree.getAllParents(node);
+                    for (const p of parents) {
+                        p.selected = true;
+                        rows.push(info.sheet.zh_tree.getNodeIndex(p));
+                    }
+                    SpreadJsObj.reLoadRowsData(info.sheet, rows);
+                }
+            });
+            $('#select-contract').on('shown.bs.modal', function() {
+                contractSpread.refresh();
+            });
+        }
+    };
+    const loadContractTree = function(type, contractType, tid) {
+        postData(`/sp/${spid}/load`, { filter: 'contract', type, contractType, tid }, function(result) {
+            contractTree = createNewPathTree('base', { id: 'contract_id', pid: 'contract_pid', order: 'order', level: 'level', fullPath: 'full_path', rootId: -1 });
+            contractTree.loadDatas(result.contract);
+            SpreadJsObj.loadSheetData(contractSheet, SpreadJsObj.DataType.Tree, contractTree);
+        });
+    };
+    const update = function() {
+        const updateData = {
+            contractTree: contractTree.nodes.filter(x => {
+                return x.c_code === undefined;
+            }).map(x => {
+                return {id: x.id, selected: x.selected};
+            }),
+            contract: contractTree.nodes.filter(x => {
+                return x.c_code !== undefined;
+            }).map(x => {
+                return {id: x.id, selected: x.selected};
+            })
+        };
+        postData(`/sp/${spid}/save`, { updateType: 'contract', updateData }, function(result) {
+            $('#select-contract').modal('hide');
+        });
+    };
+    const showContract = function(type, contractType, id) {
+        initSpread();
+        loadContractTree(type, contractType, id);
+        $('#select-contract').modal('show');
+    };
+    return { showContract, update };
+})();

+ 1 - 0
app/router.js

@@ -266,6 +266,7 @@ module.exports = app => {
     app.get('/sp/:id/data', sessionAuth, subProjectCheck, 'subProjController.dataIndex');
     app.post('/sp/:id/info/save', sessionAuth, subProjectCheck, 'subProjController.saveInfo');
     app.post('/sp/:id/load', sessionAuth, subProjectCheck, 'subProjController.load');
+    app.post('/sp/:id/save', sessionAuth, subProjectCheck, 'subProjController.save');
     // 阶段进度
     app.get('/sp/:id/progress', sessionAuth, subProjectCheck, 'subProjController.progress');
     app.post('/sp/:id/progress/update', sessionAuth, subProjectCheck, 'subProjController.progressUpdate');

+ 16 - 0
app/service/contract.js

@@ -267,6 +267,22 @@ module.exports = app => {
         // async getCountByUser(stid, type, user) {
         //
         // }
+
+        async savePresetData(updateData) {
+            const contract = updateData.contract.map(x => { return { id: x.id, selected: x.selected ? 1 : 0 }});
+            const contractTree = updateData.contractTree.map(x => { return { id: x.id, selected: x.selected ? 1 : 0 }});
+            if (contract.length === 0 && contractTree.length === 0) return;
+
+            const conn = await this.db.beginTransaction();
+            try {
+                if (contract.length > 0) await conn.updateRows(this.tableName, contract);
+                if (contractTree.length > 0) await conn.updateRows(this.ctx.service.contractTree.tableName, contractTree);
+                await conn.commit();
+            } catch(err) {
+                this.ctx.log(err);
+                await conn.rollback();
+            }
+        }
     }
     return Contract;
 };

+ 10 - 0
app/view/report/index.ejs

@@ -118,6 +118,15 @@
                     <div class="dropdown" id="divPresets">
                         <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">报表数据预设</button>
                         <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+                            <% if (stg_id === -600) { %>
+                            <% if (tender_id > 0) { %>
+                            <a class="dropdown-item" href="javascript: void(0)" onclick="rptContract.showContract('tender', 1, <%- tender_id %>);">选择标段支出合同</a>
+                            <a class="dropdown-item" href="javascript: void(0)" onclick="rptContract.showContract('tender', 2, <%- tender_id %>);">选择标段收入合同</a>
+                            <% } else { %>
+                            <a class="dropdown-item" href="javascript: void(0)" onclick="rptContract.showContract('project', 1);">选择项目支出合同</a>
+                            <a class="dropdown-item" href="javascript: void(0)" onclick="rptContract.showContract('project', 2);">选择项目收入合同</a>
+                            <% } %>
+                            <% } else { %>
                             <a class="dropdown-item" href="javascript: void(0)" onclick="rptShowLevel.show('show_level');">显示层级</a>
                             <a class="dropdown-item" href="javascript: void(0)" onclick="rptOtherStage.showOtherStage('advance');">预付款</a>
                             <a class="dropdown-item" href="javascript: void(0)" onclick="rptChangeRela.showChangeRela('change_project');">变更立项</a>
@@ -127,6 +136,7 @@
                             <% if (viewPmData) { %>
                             <a class="dropdown-item" href="javascript: void(0)" onclick="rptOtherStage.showOtherStage('pm_deal');">项目管理-合同管理</a>
                             <% } %>
+                            <% } %>
                         </div>
                     </div>
                 </div>

+ 16 - 0
app/view/report/rpt_all_popup.ejs

@@ -738,6 +738,22 @@
         </div>
     </div>
 </div>
+<div class="modal fade" id="select-contract" data-backdrop="static">
+    <div class="modal-dialog" role="document" style="max-width: 600px">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">选择合同</h5>
+            </div>
+            <div class="modal-body">
+                <div class="modal-height-400" id="rpt-contract-spread"></div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-sm btn-primary" id="sc-ok" onclick="rptContract.update();">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
 <!--管理推荐报表-->
 <div class="modal fade" id="man-c" data-backdrop="static">
     <div class="modal-dialog" role="document">

+ 1 - 0
config/web.js

@@ -953,6 +953,7 @@ const JsFiles = {
                     '/public/report/js/rpt_change_rela.js',
                     '/public/report/js/rpt_other_stage.js',
                     '/public/report/js/rpt_show_level.js',
+                    '/public/report/js/rpt_contract.js',
                 ],
                 mergeFile: 'report_main',
             },

+ 6 - 0
sql/update.sql

@@ -29,6 +29,12 @@ ADD COLUMN `rela_stage` varchar(255) NULL DEFAULT NULL COMMENT '关联的标段
 ALTER TABLE `zh_project_col_set`
 ADD COLUMN `list` json NULL COMMENT '列表页列设置(见/const/project_setting)' AFTER `info`;
 
+ALTER TABLE `zh_contract`
+ADD COLUMN `selected` tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '报表用,是否选择' AFTER `create_time`;
+
+ALTER TABLE `zh_contract_tree`
+ADD COLUMN `selected` tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '报表用,是否选择' AFTER `calc2`;
+
 ------------------------------------
 -- 表数据
 ------------------------------------