瀏覽代碼

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

TonyKang 4 年之前
父節點
當前提交
a6c91f3d35

+ 10 - 4
app/controller/stage_extra_controller.js

@@ -91,7 +91,8 @@ module.exports = app => {
         async bonus (ctx) {
             try {
                 const renderData = {
-                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.stageExtra.bonus)
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.stageExtra.bonus),
+                    auditConst: auditConst,
                 };
                 await this.layout('stage_extra/bonus.ejs', renderData, 'stage_extra/bonus_modal.ejs');
             } catch (err) {
@@ -151,7 +152,7 @@ module.exports = app => {
             try {
                 const renderData = {
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.stageExtra.other)
-                }
+                };
                 await this.layout('stage_extra/other.ejs', renderData);
             } catch (err) {
                 ctx.helper.log(err);
@@ -205,7 +206,7 @@ module.exports = app => {
                 const create_time = Date.parse(new Date()) / 1000;
                 let stream = await parts();
                 const bonus = await ctx.service.stageBonus.getStageDataById(parts.field.bonus_id);
-                if (!bonus || bonus.sid !== ctx.stage.id) throw '该奖罚金,当前不允许上传附件';
+                //if (!bonus || bonus.sid !== ctx.stage.id) throw '该奖罚金,当前不允许上传附件';
                 while (stream !== undefined) {
                     if (!stream.filename) {
                         throw '未发现上传文件!';
@@ -227,6 +228,7 @@ module.exports = app => {
                         filepath: path.join(dirName, fileName),
                         uid: ctx.session.sessionUser.accountId,
                         in_time: moment(create_time * 1000).format('YYYY-MM-DD'),
+                        renew: bonus.sid === ctx.stage.id ? ctx.stage.status === auditConst.status.checked : true,
                     });
                     ++index;
                     if (Array.isArray(parts.field.size) && index < parts.field.size.length) {
@@ -295,9 +297,13 @@ module.exports = app => {
                 const data = JSON.parse(ctx.request.body.data);
 
                 const bonus = await ctx.service.stageBonus.getStageDataById(data.b_id);
-                if (!bonus || !bonus.proof_file || !bonus.proof_file[data.index]) throw '删除的文件不存在'
+                if (!bonus || !bonus.proof_file || !bonus.proof_file[data.index]) throw '删除的文件不存在';
 
                 const fileInfo = bonus.proof_file[data.index];
+                if (fileInfo.uid !== ctx.session.sessionUser.accountId) throw '您无权删除该文件';
+
+                if (ctx.stage.status === auditConst.status.checked && !fileInfo.renew) throw '不可删除该文件';
+
                 // 先删除文件
                 await fs.unlinkSync(path.join(this.app.baseDir, fileInfo.filepath));
                 // 再删除数据库

+ 6 - 6
app/public/js/se_bonus.js

@@ -155,7 +155,7 @@ $(document).ready(() => {
                     // 下载
                     html.push('<a href="download/file?b_id=' + id + '&index=' + i + '" title="下载"><i class="fa fa-download "></i></a>');
                     // 删除
-                    if (!readOnly && !isPre(data)) {
+                    if (f.uid === userID && ((!isPre(data) && !stageChecked) || f.renew)) {
                         html.push('<a class="delete-att text-danger ml-1" href="javascript:void(0);" data-id ="' + id + '"file-index="' + i + '" title="删除"><i class="fa fa-remove "></i></a>');
                     }
                     html.push('</td>');
@@ -206,11 +206,11 @@ $(document).ready(() => {
             });
         },
         canUpload(data) {
-            if (data.sid === stageId) {
-                $('#upload-file-panel').show();
-            } else {
-                $('#upload-file-panel').hide();
-            }
+            // if (data.sid === stageId) {
+            //     $('#upload-file-panel').show();
+            // } else {
+            //     $('#upload-file-panel').hide();
+            // }
         }
     };
 

+ 87 - 6
app/public/js/shenpi.js

@@ -116,15 +116,21 @@ function recursiveGetTenderNodeHtml (node, arr, pid, this_code, this_status, aid
     // html.push('<td>', sp_status_list[node.shenpiInfo[shenpi_type]].name, '</td>');
     html.push('<td>');
     if (!node.cid) {
+        if(cur_tenderid === node.id) {
+            html.push(sp_status_list[this_status].name);
+        } else {
+            html.push(sp_status_list[node.shenpiInfo[this_code]].name);
+        }
+    }
+    html.push('</td>');
+    html.push('<td>');
+    if (!node.cid) {
         let auditList = [];
         let tender_status = 1;
         if(cur_tenderid === node.id) {
-            html.push(sp_status_list[this_status].name);
             auditList = aidList;
             tender_status = this_status;
         } else {
-            console.log(node);
-            html.push(sp_status_list[node.shenpiInfo[this_code]].name);
             auditList = node.shenpiauditList[this_code];
             tender_status = node.shenpiInfo[this_code];
         }
@@ -136,8 +142,9 @@ function recursiveGetTenderNodeHtml (node, arr, pid, this_code, this_status, aid
                     nameList.push(user.name);
                 }
             }
-            html.push('<i class="fa fa-question-circle text-primary" data-container="body" data-toggle="tooltip" data-placement="bottom" ' +
-                'data-original-title="'+ (nameList.length > 0 ? nameList.join('-') : '') +'"></i>');
+            // html.push('<i class="fa fa-question-circle text-primary" data-container="body" data-toggle="tooltip" data-placement="bottom" ' +
+            //     'data-original-title="'+ (nameList.length > 0 ? nameList.join('-') : '') +'"></i>');
+            html.push(nameList.length > 0 ? nameList.join('-') : '');
         }
     }
     html.push('</td>');
@@ -161,7 +168,8 @@ function getTenderTreeHtml (this_code, this_status, aidList = []) {
         html.push('<table class="table table-hover table-bordered">');
         html.push('<thead>', '<tr>');
         html.push('<th>名称</th>');
-        html.push('<th width="100">审批流程</th>');
+        html.push('<th width="80">流程模式</th>');
+        html.push('<th>详细流程</th>');
         html.push('<th width="40">选择</th>');
         html.push('</tr>', '</thead>');
         parentId = 0;
@@ -510,6 +518,10 @@ $(document).ready(function () {
         $('#shenpi_status').val(this_status);
         $('#shenpi_auditors').val(aidList.join(','));
         $('#tender-list').html(html);
+        $('#search-audit').val('');
+        $('#search-result').text('0/0');
+        $('#up-search').attr('disabled', true);
+        $('#down-search').attr('disabled', true);
         setTimeout(function () { $("#tender-list [data-toggle='tooltip']").tooltip(); },800);
     });
 
@@ -1025,6 +1037,75 @@ $(document).ready(function () {
             autoFlashHeight();
         }
     });
+
+    let timer2 = null;
+    let oldSearchVal2 = null;
+    $('body').on('input propertychange', '#batch input[name="audit-name"]', function(e) {
+        oldSearchVal2 = e.target.value;
+        timer2 && clearTimeout(timer2);
+        timer2 = setTimeout(() => {
+            const newVal = $(this).val();
+
+            const resultLength = $('#tender-list').find('.result').length;
+            if (resultLength > 0) {
+                let content = $('#tender-list').html();
+                const replaceStr = $('#tender-list').find('.result').eq(0).html();
+                const regExp2 = new RegExp('<span class="result" style="background: yellow;">' + replaceStr + '</span>', 'g');
+                content = content.replace(regExp2, replaceStr);
+                const regExp3 = new RegExp('<span class="result" style="background: orange;">' + replaceStr + '</span>', 'g');
+                content = content.replace(regExp3, replaceStr);
+                $('#tender-list').html(content);
+            }
+            $('#search-result').text('0/0');
+            $('#up-search').attr('disabled', true);
+            $('#down-search').attr('disabled', true);
+            if (newVal && newVal === oldSearchVal2) {
+                const regExp = new RegExp(newVal, 'g');
+                for (let i = 0; i < $('#tender-list tr').length; i++) {
+                    if (_.includes($('#tender-list tr').eq(i).children('td').eq(2).html(), newVal)) {
+                        $('#tender-list tr').eq(i).children('td').eq(2).html($('#tender-list tr').eq(i).children('td').eq(2).html().replace(regExp, '<span class="result" style="background: yellow;">' + newVal + '</span>'))
+                    }
+                }
+                const resultLength2 = $('#tender-list').find('.result').length;
+                if (resultLength2 > 0) {
+                    $('#tender-list').find('.result').eq(0).css('background', 'orange');
+                    $('#search-result').text('1/' + resultLength2);
+                    $('#up-search').attr('disabled', false);
+                    $('#down-search').attr('disabled', false);
+                }
+            }
+            if($('#tender-list').find('.result').length > 0) {
+                const X = $('#tender-list').find('.result').eq(0).offset().top;
+                $('#tender-list').scrollTop(X - $('#tender-list').offset().top + $('#tender-list').scrollTop() - 30);
+            }
+        }, 400);
+    });
+
+    $('#up-search').on('click', function () {
+        const cur = parseInt($('#search-result').text().split('/')[0]);
+        const total = parseInt($('#search-result').text().split('/')[1]);
+        const now = cur - 1 !== 0 ? cur - 1: total;
+        $('#tender-list').find('.result').eq(cur-1).css('background', 'yellow');
+        $('#tender-list').find('.result').eq(now-1).css('background', 'orange');
+        // $('#tender-list tr').eq(searchUser[cur-1]).children('td').eq(2).html($('#tender-list tr').eq(searchUser[cur-1]).children('td').eq(2).html().replace('<span class="result" style="background:orange;">', '<span class="result" style="background:yellow;">'))
+        // $('#tender-list tr').eq(searchUser[now-1]).children('td').eq(2).html($('#tender-list tr').eq(searchUser[now-1]).children('td').eq(2).html().replace('<span class="result" style="background:yellow;">', '<span class="result" style="background:orange;">'))
+        $('#search-result').text(now + '/' + total);
+        const X = $('#tender-list').find('.result').eq(now-1).offset().top;
+        $('#tender-list').scrollTop(X - $('#tender-list').offset().top + $('#tender-list').scrollTop() - 30);
+    });
+
+    $('#down-search').on('click', function () {
+        const cur = parseInt($('#search-result').text().split('/')[0]);
+        const total = parseInt($('#search-result').text().split('/')[1]);
+        const now = cur + 1 > total ? 1: cur + 1;
+        $('#tender-list').find('.result').eq(cur-1).css('background', 'yellow');
+        $('#tender-list').find('.result').eq(now-1).css('background', 'orange');
+        // $('#tender-list tr').eq(searchUser[cur-1]).children('td').eq(2).html($('#tender-list tr').eq(searchUser[cur-1]).children('td').eq(2).html().replace('<span class="result" style="background:orange;">', '<span class="result" style="background:yellow;">'))
+        // $('#tender-list tr').eq(searchUser[now-1]).children('td').eq(2).html($('#tender-list tr').eq(searchUser[now-1]).children('td').eq(2).html().replace('<span class="result" style="background:yellow;">', '<span class="result" style="background:orange;">'))
+        $('#search-result').text(now + '/' + total);
+        const X = $('#tender-list').find('.result').eq(now-1).offset().top;
+        $('#tender-list').scrollTop(X - $('#tender-list').offset().top + $('#tender-list').scrollTop() -30);
+    });
 });
 
 function setRightData(datas, coolist) {

+ 2 - 2
app/public/js/stage.js

@@ -1413,9 +1413,9 @@ $(document).ready(() => {
                 const nodes = stageTree.loadPostStageData(result);
                 stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes);
                 if (detail) {
-                    detail.loadStagePosUpdateData(result, nodes);
+                    detail.loadStageLedgerUpdateData(result, nodes);
                 } else {
-                    stageIm.loadUpdatePosData(result, nodes);
+                    stageIm.loadUpdateLedgerData(result, nodes);
                 }
             });
         });

+ 1 - 1
app/service/stage_bonus.js

@@ -122,7 +122,7 @@ module.exports = app => {
 
             const datas = data instanceof Array ? data : [data];
             const orgDatas = await this.getAllDataByCondition({
-                where: { sid: this.ctx.stage.id, id: this.ctx.helper._.map(datas, 'id') }
+                where: { id: this.ctx.helper._.map(datas, 'id') }
             });
 
             const uDatas = [];

+ 9 - 0
app/service/stage_pay.js

@@ -296,6 +296,15 @@ module.exports = app => {
             return await transaction.query(sql, sqlParam);
         }
 
+        async getLastestPayId(id) {
+            const info = await this.getDataById(id);
+            const sql = 'SELECT SP.* FROM ?? As SP WHERE SP.`sid` = ? AND SP.`pid` = ? ORDER BY SP.`stimes` DESC, SP.`sorder` DESC';
+            const sqlParam = [this.tableName, info.sid, info.pid];
+            const lst = await this.db.queryOne(sql, sqlParam);
+            if (!lst || !lst.id) throw '数据错误';
+            return lst.id;
+        }
+
         /**
          * 拷贝上一操作人数据 为 下一操作人数据
          * @param stage - 期数据

+ 14 - 6
app/view/schedule/index.ejs

@@ -185,7 +185,7 @@
                 stack: '计划',
                 data:[<% if (scheduleStage.length > 0) { %>
                     <% for (const ss of scheduleStage) { %>
-                    '<%- ss.plan_tp  %>',
+                    '<%- ss.plan_tp ? ss.plan_tp : 0  %>',
                     <% } %>
                     <% } %>]
             },
@@ -196,7 +196,7 @@
                 stack: '实际',
                 data:[<% if (scheduleStage.length > 0) { %>
                     <% for (const ss of scheduleStage) { %>
-                    '<%- ss.tp  %>',
+                    '<%- ss.tp ? ss.tp : 0  %>',
                     <% } %>
                     <% } %>]
             },
@@ -207,7 +207,7 @@
                 yAxisIndex: 1,
                 data:[<% if (scheduleMonth.length > 0) { %>
                     <% for (const ss of scheduleStage) { %>
-                    '<%- ctx.helper.round(ctx.helper.div(ss.tp, schedule.total_tp)*100, 2)  %>',
+                    '<%- ss.tp ? ctx.helper.round(ctx.helper.div(ss.tp, schedule.total_tp)*100, 2) : 0  %>',
                     <% } %>
                     <% } %>]
             },
@@ -243,7 +243,9 @@
                 splitLine : {show : true},
                 data : [<% if (scheduleMonth.length > 0) { %>
                 <% for (const sm of scheduleMonth) { %>
+                    <% if (sm.stage_gcl_used === 1) { %>
                     '<%- sm.yearmonth.split('-')[0] %>年<%- parseInt(sm.yearmonth.split('-')[1]) %>月',
+                    <% } %>
                 <% } %>
             <% } %>]
             }
@@ -276,7 +278,9 @@
                 stack: '计划',
                 data:[<% if (scheduleMonth.length > 0) { %>
                     <% for (const sm of scheduleMonth) { %>
-                    '<%- sm.plan_tp  %>',
+                    <% if (sm.stage_gcl_used === 1) { %>
+                    '<%- sm.plan_tp ? sm.plan_tp : 0  %>',
+                    <% } %>
                     <% } %>
                     <% } %>]
             },
@@ -287,7 +291,9 @@
                 stack: '实际',
                 data:[<% if (scheduleMonth.length > 0) { %>
                     <% for (const sm of scheduleMonth) { %>
-                    '<%- sm.sj_tp  %>',
+                    <% if (sm.stage_gcl_used === 1) { %>
+                    '<%- sm.sj_tp ? sm.sj_tp : 0  %>',
+                    <% } %>
                     <% } %>
                     <% } %>]
             },
@@ -298,7 +304,9 @@
                 yAxisIndex: 1,
                 data:[<% if (scheduleMonth.length > 0) { %>
                     <% for (const sm of scheduleMonth) { %>
-                    '<%- ctx.helper.round(ctx.helper.div(sm.sj_tp, schedule.total_tp)*100, 2)  %>',
+                    <% if (sm.stage_gcl_used === 1) { %>
+                    '<%- sm.sj_tp ? ctx.helper.round(ctx.helper.div(sm.sj_tp, schedule.total_tp)*100, 2) : 0  %>',
+                    <% } %>
                     <% } %>
                     <% } %>]
             },

+ 21 - 7
app/view/schedule/modal.ejs

@@ -37,7 +37,7 @@
                     <h5>台账正在进行修订,形象进度无法进行任何操作。</h5>
                 </div>
                 <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">好的</button>
+                    <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">好的</button>
                 </div>
             </div>
         </div>
@@ -54,18 +54,20 @@
                 </div>
                 <div class="modal-body">
                     <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>
-                        <h5>台账已完成修订,点击更新进度台账更新进度数据</h5>
+                        <h5>正在更新台帐,请等待...</h5>
+                        <div class="progress">
+                            <div id="schedule-progress" class="progress-bar" role="progressbar" style="width: 0%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0%</div>
+                        </div>
+                        <div style="display: none"><button type="text" class="btn btn-primary" id="update-ledger">更新进度台账</button></div>
                     <% } else { %>
                         <h5>台账已完成修订,进入进度台账并更新最新台账数据。</h5>
                     <% } %>
                 </div>
+                <% if (ctx.url !== '/tender/' + ctx.tender.id + '/schedule/ledger') { %>
                 <div class="modal-footer">
-                    <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>
-                    <button type="button" class="btn btn-primary" id="update-ledger">更新进度台账</button>
-                    <% } else { %>
-                    <a href="/tender/<%- ctx.tender.id %>/schedule/ledger" class="btn btn-primary">进入进度台账</a>
-                    <% } %>
+                    <a href="/tender/<%- ctx.tender.id %>/schedule/ledger" class="btn btn-primary btn-sm">进入进度台账</a>
                 </div>
+                <% } %>
             </div>
         </div>
     </div>
@@ -80,5 +82,17 @@
         if (selectedLedgerList.length === 0 && !revising) {
             $('#first').modal('show');
         }
+        <% if (!revising && schedule && schedule.revising === 1 && ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>
+        let value = 0;
+        setInterval(function(e){
+            if (value < 100) {
+                value = parseInt(value) + 1;
+                $("#schedule-progress").css("width", value + "%").text(value + "%");
+            } else if (value === 100) {
+                value = parseInt(value) + 1;
+                $('#update-ledger').click();
+            }
+        }, 50);
+        <% } %>
     })
 </script>

+ 1 - 0
app/view/stage_extra/bonus.ejs

@@ -45,4 +45,5 @@
     const readOnly = <%- ctx.stage.readOnly %>;
     const whiteList = JSON.parse('<%- JSON.stringify(ctx.app.config.multipart.whitelist) %>');
     const thousandth = <%- ctx.tender.info.display.thousandth %>;
+    const stageChecked = <%- ctx.stage.status === auditConst.status.checked %>;
 </script>

+ 0 - 2
app/view/stage_extra/bonus_modal.ejs

@@ -6,12 +6,10 @@
                 <h5 class="modal-title">附件</h5>
             </div>
             <div class="modal-body">
-                <% if (!ctx.stage.readOnly) { %>
                 <div class="form-group" id="upload-file-panel">
                     <label for="formGroupExampleInput">大小限制:30MB,支持<span data-toggle="tooltip" data-placement="bottom" title="doc,docx,xls,xlsx,ppt,pptx,pdf">office等文档格式</span>、<span data-toggle="tooltip" data-placement="bottom" title="jpg,png,bmp">图片格式</span>、<span data-toggle="tooltip" data-placement="bottom" title="rar,zip">压缩包格式</span></label>
                     <input type="file" class="" id="upload-file" multiple>
                 </div>
-                <% } %>
                 <div class="modal-height-500" style="overflow:auto;">
                     <table class="table table-sm table-bordered" style="word-break:break-all; table-layout: fixed">
                         <thead>

+ 9 - 1
app/view/tender/shenpi_modal.ejs

@@ -1,12 +1,20 @@
 <!--设置其他标段-->
 <div class="modal fade" id="batch" data-backdrop="static">
-    <div class="modal-dialog" role="document">
+    <div class="modal-dialog modal-lg" role="document">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title">设置其他标段</h5>
             </div>
             <div class="modal-body">
                 <div class="alert alert-warning">将「<span id="shenpi-name"></span>」设置至其他标段</div>
+                <div class="input-group input-group-sm mb-2">
+                    <input class="form-control" placeholder="输入审批人名称搜索" type="text" name="audit-name" id="search-audit">
+                    <div class="input-group-append">
+                        <span class="input-group-text" id="search-result">0/0</span>
+                        <button class="btn btn-outline-secondary" id="up-search" disabled><i class="fa fa-arrow-up" aria-hidden="true"></i></button>
+                        <button class="btn btn-outline-secondary" id="down-search" disabled><i class="fa fa-arrow-down" aria-hidden="true"></i></button>
+                    </div>
+                </div>
                 <div class="modal-height-300" id="tender-list">
                 </div>
             </div>

+ 2 - 0
build_min.js

@@ -13,6 +13,7 @@ const Uglyfy = require('uglify-es');
 const fs = require('fs');
 const JsFiles = require('./config/web');
 const version = require('./config/config.default')({ baseDir: __dirname + '/app', root: __dirname, name: 'calc' }).version;
+console.log(version);
 const savePath = __dirname + '/app' + JsFiles.webPath;
 
 if (!fs.existsSync(savePath)) fs.mkdirSync(savePath);
@@ -23,6 +24,7 @@ for (const c in JsFiles.controller) {
         const action = controller[a];
         if (action.mergeFiles && action.mergeFile.length > 0) {
             const minFileName = savePath + action.mergeFile + '.' + version + '.min.js';
+            console.log(minFileName);
             let code = '';
             for (const f of action.mergeFiles) {
                 code = code + fs.readFileSync(__dirname + '/app' + f, 'utf8');

+ 9 - 3
config/config.default.js

@@ -127,9 +127,15 @@ module.exports = appInfo => {
     // 是否压缩替换前端js
     config.min = true;
 
-    const file = appInfo.baseDir + '/config/version';
-
-    config.version = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '1.0.5';
+    const file = path.join(__dirname, 'version');
+    console.log(file);
+
+    if (fs.existsSync(file)) {
+        const versionStr = fs.readFileSync(file, 'utf8');
+        config.version = versionStr.split('\n')[0];
+    } else {
+        config.version = '1.0.5';
+    }
 
     // 压缩设置
     config.gzip = {

+ 90 - 31
sql/update.sql

@@ -1,44 +1,100 @@
-ALTER TABLE `zh_project` ADD `rpt_authority` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '主管部门(报表显示)' AFTER `page_path`;
-ALTER TABLE `zh_project` ADD `rpt_items` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '建设项目类别(报表显示)' AFTER `rpt_authority`;
-ALTER TABLE `zh_project` ADD `rpt_level` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '级别(报表显示)' AFTER `rpt_items`;
-ALTER TABLE `zh_project` ADD `rpt_nature` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '建设性质(报表显示)' AFTER `rpt_level`;
+--
+-- 表的结构 `zh_schedule`
+--
 
-ALTER TABLE `zh_ledger`
-ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+CREATE TABLE `zh_schedule` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL,
+  `total_tp` decimal(30,8) DEFAULT NULL COMMENT '已选台账总金额',
+  `plan_gcl` decimal(30,8) DEFAULT NULL COMMENT '计划总工程量',
+  `sj_gcl` decimal(30,8) DEFAULT NULL COMMENT '实际完成工程量',
+  `plan_tp` decimal(30,8) DEFAULT NULL COMMENT '计划总金额',
+  `sj_tp` decimal(30,8) DEFAULT NULL COMMENT '实际完成金额',
+  `stage_sj_tp` decimal(30,8) DEFAULT NULL COMMENT '计量期实际计量总额',
+  `mode` tinyint(1) DEFAULT '2' COMMENT '计划进度计算方式(默认为工程量)',
+  `revising` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否修订后并未更新数据',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='形象进度表';
 
-ALTER TABLE `zh_pos`
-ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+--
+-- 表的结构 `zh_schedule_audit`
+--
 
-ALTER TABLE `zh_revise_bills`
-ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+CREATE TABLE `zh_schedule_audit` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `audit_id` int(11) NOT NULL COMMENT '用户id',
+  `permission` tinyint(1) NOT NULL DEFAULT '1' COMMENT '权限',
+  `in_time` datetime DEFAULT NULL COMMENT '入库时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='形象进度用户权限表';
 
-ALTER TABLE `zh_revise_pos`
-ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+--
+-- 表的结构 `zh_schedule_ledger`
+--
 
-ALTER TABLE `zh_advance_file`
-ADD COLUMN `extra_upload` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否为审核通过后再次上传的文件,0为否' AFTER `fileext`;
+CREATE TABLE `zh_schedule_ledger` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `ledger_id` int(11) NOT NULL COMMENT '台账id',
+  `gcl` decimal(30,8) DEFAULT NULL COMMENT '只记录已选最底层树工程量',
+  `tp` decimal(30,8) DEFAULT NULL COMMENT '只记录已选最底层树金额',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='进度已选台账';
+
+--
+-- 表的结构 `zh_schedule_ledger_history`
+--
 
-ALTER TABLE `zh_ledger`
-ADD COLUMN `check_calc`  tinyint(1) NULL DEFAULT 1 COMMENT '是否检查计算' AFTER `dagl_url`;
+CREATE TABLE `zh_schedule_ledger_history` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL,
+  `ledger_id` int(11) NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='旧台账(用于修订后对比新旧台账区别然后调整进度台账)';
+
+--
+-- 表的结构 `zh_schedule_ledger_month`
+--
+
+CREATE TABLE `zh_schedule_ledger_month` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `lid` int(11) NOT NULL COMMENT '台账id',
+  `yearmonth` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '计划年月',
+  `plan_gcl` decimal(30,8) DEFAULT NULL COMMENT '计划工程量',
+  `sj_gcl` decimal(30,8) DEFAULT NULL COMMENT '实际工程量',
+  `plan_tp` decimal(30,8) DEFAULT NULL COMMENT '计划金额',
+  `sj_tp` decimal(30,8) DEFAULT NULL COMMENT '实际计量金额',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='台账年月记录进度表';
+
+--
+-- 表的结构 `zh_schedule_month`
+--
+
+CREATE TABLE `zh_schedule_month` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `yearmonth` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '计划年月',
+  `plan_gcl` decimal(30,8) DEFAULT NULL COMMENT '计划工程量',
+  `sj_gcl` decimal(30,8) DEFAULT NULL COMMENT '实际工程量',
+  `plan_tp` decimal(30,8) DEFAULT NULL COMMENT '计划金额',
+  `sj_tp` decimal(30,8) DEFAULT NULL COMMENT '实际计量金额',
+  `stage_gcl_used` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已被工程量计量',
+  `stage_tp_used` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已被金额模式计量',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='进度年月记录汇总台账表';
 
-ALTER TABLE `zh_revise_bills`
-ADD COLUMN `check_calc`  tinyint(1) NULL DEFAULT 1 COMMENT '是否检查计算' AFTER `dagl_url`;
+--
+-- 表的结构 `zh_schedule_stage`
+--
 
-CREATE TABLE `zh_project_log` (
+CREATE TABLE `zh_schedule_stage` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
-  `pid` int(11) NOT NULL COMMENT '操作项目',
-  `tid` int(11) NOT NULL COMMENT '操作标段',
-  `uid` int(11) NOT NULL COMMENT '操作人',
-  `type` tinyint(1) NOT NULL COMMENT '操作模块',
-  `status` tinyint(1) NOT NULL COMMENT '操作状态',
-  `msg` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '操作名称',
-  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
-  `os` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '系统信息',
-  `browser` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '浏览器信息',
-  `ip` varchar(45) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '操作人IP地址',
-  `address` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '操作人地址(接口获取)',
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `yearmonth` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '计划月份',
+  `order` int(11) NOT NULL COMMENT '计量期数',
+  `tp` decimal(30,8) DEFAULT NULL COMMENT '本期计量完成金额',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='项目操作日志';
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='计量进度-计划月份,计量期选中表';

+ 44 - 0
sql/update20210129.sql

@@ -0,0 +1,44 @@
+ALTER TABLE `zh_project` ADD `rpt_authority` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '主管部门(报表显示)' AFTER `page_path`;
+ALTER TABLE `zh_project` ADD `rpt_items` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '建设项目类别(报表显示)' AFTER `rpt_authority`;
+ALTER TABLE `zh_project` ADD `rpt_level` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '级别(报表显示)' AFTER `rpt_items`;
+ALTER TABLE `zh_project` ADD `rpt_nature` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '建设性质(报表显示)' AFTER `rpt_level`;
+
+ALTER TABLE `zh_ledger`
+ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+
+ALTER TABLE `zh_pos`
+ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+
+ALTER TABLE `zh_revise_bills`
+ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+
+ALTER TABLE `zh_revise_pos`
+ADD COLUMN `dagl_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '档案管理-查看链接'AFTER `dagl_status`;
+
+ALTER TABLE `zh_advance_file`
+ADD COLUMN `extra_upload` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否为审核通过后再次上传的文件,0为否' AFTER `fileext`;
+
+ALTER TABLE `zh_ledger`
+ADD COLUMN `check_calc`  tinyint(1) NULL DEFAULT 1 COMMENT '是否检查计算' AFTER `dagl_url`;
+
+ALTER TABLE `zh_revise_bills`
+ADD COLUMN `check_calc`  tinyint(1) NULL DEFAULT 1 COMMENT '是否检查计算' AFTER `dagl_url`;
+
+-- ----------------------------
+-- Table structure for zh_project_log
+-- ----------------------------
+CREATE TABLE `zh_project_log` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `pid` int(11) NOT NULL COMMENT '操作项目',
+  `tid` int(11) NOT NULL COMMENT '操作标段',
+  `uid` int(11) NOT NULL COMMENT '操作人',
+  `type` tinyint(1) NOT NULL COMMENT '操作模块',
+  `status` tinyint(1) NOT NULL COMMENT '操作状态',
+  `msg` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '操作名称',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
+  `os` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '系统信息',
+  `browser` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '浏览器信息',
+  `ip` varchar(45) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '操作人IP地址',
+  `address` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '操作人地址(接口获取)',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='项目操作日志';