فهرست منبع

1. 支付审批,标段属性
2. 报表,安全生产指标源,提供标段属性
3. 奉建报表,读取期历史单价

MaiXinRong 1 سال پیش
والد
کامیت
ddc645faeb

+ 9 - 0
app/const/tender_info.js

@@ -196,6 +196,14 @@ const tzDefaultInfo = (function () {
     const result = JSON.parse(JSON.stringify(defaultInfo));
     return result;
 })(defaultInfo);
+const paymentDefaultInfo = (function () {
+    const result = {};
+    result.deal_info = JSON.parse(JSON.stringify(defaultInfo.deal_info));
+    result.construction_unit = JSON.parse(JSON.stringify(defaultInfo.construction_unit));
+    result.tech_param = JSON.parse(JSON.stringify(defaultInfo.tech_param));
+
+    return result;
+})(defaultInfo);
 
 module.exports = {
     parseInfo,
@@ -203,4 +211,5 @@ module.exports = {
     defaultInfo,
     gclDefaultInfo,
     tzDefaultInfo,
+    paymentDefaultInfo,
 };

+ 7 - 0
app/controller/payment_controller.js

@@ -237,6 +237,9 @@ module.exports = app => {
                         }
                         await ctx.service.project.defaultUpdate({ id: ctx.session.sessionProject.id, payment_setting: JSON.stringify(modes) });
                         break;
+                    case 'info':
+                        await ctx.service.paymentTenderInfo.saveTenderInfo(data.postData.id, data.postData.info);
+                        break;
                     default: throw '参数有误';
                 }
                 // 先获取你创建的标段及参与的标段
@@ -764,6 +767,8 @@ module.exports = app => {
                     }
                     trDetailList[0].emptySign = await ctx.service.paymentRptAudit.haveEmptySign(trDetailList[0].id);
                 }
+                const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
+                const tenderInfo = await this.ctx.service.paymentTenderInfo.getTenderInfo(ctx.paymentTender.id);
                 const renderData = {
                     tender: ctx.paymentTender,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.payment.list),
@@ -776,6 +781,8 @@ module.exports = app => {
                     accountList: [],
                     paymentConst,
                     preUrl: '/payment/' + ctx.paymentTender.id + '/list/' + trInfo.id,
+                    categoryData,
+                    tenderInfo,
                 };
                 // 获取报表信息,新增时及设置报表角色时使用
                 if (trInfo.uid === ctx.session.sessionUser.accountId && trInfo.is_del === 0 && trInfo.rpt_id) {

+ 6 - 1
app/controller/tender_controller.js

@@ -1319,7 +1319,9 @@ module.exports = app => {
                         t.lastStage = await this.ctx.service.stage.getLastestStage(t.id, false);
                     }
                 }
-                if (data.type === 'ledger') {
+                if (data.type === 'all') {
+                    responseData.data.tenders = tenderList;
+                } else if (data.type === 'ledger') {
                     responseData.data.tenders = tenderList.filter(x => {
                         return x.ledger_status === auditConst.ledger.status.checked;
                     });
@@ -1633,6 +1635,9 @@ module.exports = app => {
                         case 'show_level':
                             responseData.data[f] = ctx.tender.data.rpt_show_level;
                             break;
+                        case 'tender_info':
+                            responseData.data[f] = ctx.tender.info;
+                            break;
                         default:
                             throw '未知数据类型';
                     }

+ 2 - 0
app/lib/rm/payment_safe.js

@@ -111,6 +111,8 @@ class rptMemPaymentSafe extends RptMemBase {
         switch (tableName) {
             case 'mem_payment_tender':
                 return this.ctx.paymentTender;
+            case 'mem_payment_tender':
+                return this.ctx.service.paymentTenderInfo.getTenderInfo(params.tender_id);
             case 'mem_payment_detail':
                 return this.ctx.detail;
             case 'mem_payment_safe_bills':

+ 3 - 3
app/lib/rptCustomData.js

@@ -522,9 +522,9 @@ class fjHelper {
     }
     async _getStageBillsData(tid, sid) {
         const helper = this.ctx.helper;
-        const billsData = await this.ctx.app.mysql.select(this.ctx.service.ledger.tableName, {
-            where: { tender_id: tid, is_leaf: 1 }
-        });
+        const billsData = this.ctx.stage.ledgerHis
+            ? await this.ctx.helper.loadLedgerDataFromOss(this.ctx.stage.ledgerHis.bills_file)
+            : await this.ctx.service.ledger.getData(this.ctx.tender.id);
 
         const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : [];
         const curStage = this.ctx.stage.readOnly

+ 201 - 0
app/public/js/payment_list.js

@@ -371,4 +371,205 @@ $(function () {
         }
         return `${year}<span>${mon}-${day}</span><span>${hour}:${minute}:${scond}</span>`;
     };
+
+    class srObject {
+        constructor() {
+            const self = this;
+            this.selectTree = null;
+            const srSpreadSetting = {
+                cols: [
+                    {title: '选择', field: 'selected', hAlign: 1, width: 40, formatter: '@', cellType: 'checkbox'},
+                    {title: '名称', field: 'name', hAlign: 0, width: 300, formatter: '@', cellType: 'tree'},
+                ],
+                emptyRows: 0,
+                headRows: 1,
+                headRowHeight: [32],
+                defaultRowHeight: 21,
+                headerFont: '12px 微软雅黑',
+                font: '12px 微软雅黑',
+                headColWidth: [30],
+                selectedBackColor: '#fffacd',
+                readOnly: true,
+            };
+            this.spread = SpreadJsObj.createNewSpread($('#sr-spread')[0]);
+            this.sheet = this.spread.getActiveSheet();
+            SpreadJsObj.initSheet(this.sheet, srSpreadSetting);
+
+            this.spread.bind(spreadNS.Events.ButtonClicked, function (e, info) {
+                if (!info.sheet.zh_setting) return;
+
+                const col = info.sheet.zh_setting.cols[info.col];
+                if (col.field !== 'selected') return;
+
+                const node = SpreadJsObj.getSelectObject(info.sheet);
+                self.selectNode(node, !node[col.field]);
+                SpreadJsObj.reloadColData(info.sheet, 0);
+            });
+
+            $('#sync-attr-ok').click(() => {
+                const select = self.getSelects();
+                if (select.length === 0) return;
+                console.log(select[0]);
+                if (!select[0].measure_type) {
+                    toastr.warning(`标段[${select[0].name}]未填写任何内容,请选择其他标段`);
+                    return;
+                }
+
+                postData(`/tender/${select[0].tid}/load`, { filter: 'tender_info' }, function (result) {
+                    property.deal_info = result.tender_info.deal_info;
+                    property.construction_unit = result.tender_info.construction_unit;
+                    property.tech_param = result.tender_info.tech_param;
+                    loadCommonProperty(property);
+                    $('#sync-attr').modal('hide');
+                });
+            });
+        }
+        selectNode(node, select) {
+            if (node.children && node.children.length > 0) return;
+            if (select) {
+                this.selectTree.nodes.forEach(x => { x.selected = false });
+            }
+            node.selected = select;
+        }
+        getSelects() {
+            const select = [];
+            for (const n of this.selectTree.nodes) {
+                if ((!n.children || n.children.length === 0) && n.selected) select.push(n);
+            }
+            return select;
+        }
+        init() {
+            const self = this;
+            postData(`/list/load2`, { type: 'all'}, result => {
+                self.selectTree = Tender2Tree.convert(category, result.tenders);
+                SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Tree, this.selectTree);
+            });
+        }
+    }
+    let srSelect;
+    $('#sync-attr').on('shown.bs.modal', () => {
+        if (!srSelect) srSelect = new srObject();
+        srSelect.init();
+    });
+
+    $('#bd-attr').on('show.bs.modal', function () {
+        loadCommonProperty();
+    });
 });
+
+// 标段属性相关
+function loadCommonProperty () {
+    // 合同信息
+    $('#build-name').val(property.deal_info.buildName);
+    $('#deal-code').val(property.deal_info.dealCode);
+    $('#deal-name').val(property.deal_info.dealName);
+    $('#project-type').val(property.deal_info.projectType);
+    $('#deal-type').val(property.deal_info.dealType);
+    $('#final-code').val(property.deal_info.finalCode);
+
+    // 参建单位
+    // 建设单位
+    $('#build-company').val(property.construction_unit.build.company);
+    $('#build-corporation').val(property.construction_unit.build.corporation);
+    $('#build-date').val(property.construction_unit.build.date);
+    // 承包单位1
+    $('#contract1-company').val(property.construction_unit.contract1.company);
+    $('#contract1-corporation').val(property.construction_unit.contract1.corporation);
+    $('#contract1-date').val(property.construction_unit.contract1.date);
+    $('#contract1-management').val(property.construction_unit.contract1.management);
+    // 承包单位2
+    $('#contract2-company').val(property.construction_unit.contract2.company);
+    $('#contract2-corporation').val(property.construction_unit.contract2.corporation);
+    $('#contract2-date').val(property.construction_unit.contract2.date);
+    // 监理单位1
+    $('#supervision1-company').val(property.construction_unit.supervision1.company);
+    $('#supervision1-corporation').val(property.construction_unit.supervision1.corporation);
+    $('#supervision1-date').val(property.construction_unit.supervision1.date);
+    // 监理单位2
+    $('#supervision2-company').val(property.construction_unit.supervision2.company);
+    $('#supervision2-corporation').val(property.construction_unit.supervision2.corporation);
+    $('#supervision2-date').val(property.construction_unit.supervision2.date);
+    // 检测单位
+    $('#detect-company').val(property.construction_unit.detect.company);
+    $('#detect-corporation').val(property.construction_unit.detect.corporation);
+    $('#detect-date').val(property.construction_unit.detect.date);
+
+    // 技术参数
+    $('#load-level').find("option:contains('" + property.tech_param.loadLevel + "')").attr("selected",true);
+    $('#length').val(property.tech_param.loadLength);
+    $('#start-peg').val(property.tech_param.startPeg);
+    $('#end-peg').val(property.tech_param.endPeg);
+    $('#lane-count').val(property.tech_param.laneCount);
+    $('#deal-period').val(property.tech_param.dealPeriod);
+    $('#start-date').val(property.tech_param.startDate);
+    $('#plan-end-date').val(property.tech_param.planEndDate);
+    $('#real-start-date').val(property.tech_param.realStartDate);
+    $('#real-end-date').val(property.tech_param.realEndDate);
+    $('#structure-scale').val(property.tech_param.structureScale);
+}
+
+function postAttr () {
+    const info = {
+        deal_info: {
+            buildName: $('#build-name').val(),
+            dealCode: $('#deal-code').val(),
+            dealName: $('#deal-name').val(),
+            projectType: $('#project-type').val(),
+            dealType: $('#deal-type').val(),
+            finalCode: $('#final-code').val(),
+        },
+        construction_unit: {
+            build: {
+                company: $('#build-company').val(),
+                corporation: $('#build-corporation').val(),
+                date: $('#build-date').val(),
+            },
+            contract1: {
+                company: $('#contract1-company').val(),
+                corporation: $('#contract1-corporation').val(),
+                date: $('#contract1-date').val(),
+                management: $('#contract1-management').val(),
+            },
+            contract2: {
+                company: $('#contract2-company').val(),
+                corporation: $('#contract2-corporation').val(),
+                date: $('#contract2-date').val(),
+            },
+            supervision1: {
+                company: $('#supervision1-company').val(),
+                corporation: $('#supervision1-corporation').val(),
+                date: $('#supervision1-date').val(),
+            },
+            supervision2: {
+                company: $('#supervision2-company').val(),
+                corporation: $('#supervision2-corporation').val(),
+                date: $('#supervision2-date').val(),
+            },
+            detect: {
+                company: $('#detect-company').val(),
+                corporation: $('#detect-corporation').val(),
+                date: $('#detect-date').val(),
+            },
+        },
+        tech_param: {
+            loadLevel: $('#load-level').find("option:selected").text(),
+            loadLength: _.toNumber($('#length').val()),
+            startPeg: $('#start-peg').val(),
+            endPeg: $('#end-peg').val(),
+            laneCount: _.toNumber($('#lane-count').val()),
+            dealPeriod: $('#deal-period').val(),
+            startDate: $('#start-date').val(),
+            planEndDate: $('#plan-end-date').val(),
+            realStartDate: $('#real-start-date').val(),
+            realEndDate: $('#real-end-date').val(),
+            structureScale: $('#structure-scale').val(),
+        },
+    };
+    const tenderId = window.location.pathname.split('/')[2];
+    postData('/payment/save', { type: 'info', postData: { id: tenderId, info} }, function (data) {
+        property.deal_info = info.deal_info;
+        property.construction_unit = info.construction_unit;
+        property.tech_param = info.tech_param;
+        $('#bd-attr').modal('hide');
+    });
+}

+ 1 - 0
app/public/js/shares/tenders2tree.js

@@ -87,6 +87,7 @@ const Tender2Tree = (function () {
                 name: t.name,
                 phase: t.lastStage ? '第' + t.lastStage.order + '期' : '台账',
                 stageCount: t.lastStage ? t.lastStage.order : 0,
+                measure_type: t.measure_type,
             };
             if (ledgerAuditConst && stageAuditConst) {
                 node.status = t.lastStage ? stageAuditConst.statusString[t.lastStage.status] : ledgerAuditConst.statusString[t.ledger_status];

+ 118 - 0
app/service/payment_tender_info.js

@@ -0,0 +1,118 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date 2018/10/30
+ * @version
+ */
+
+const infoConst = require('../const/tender_info');
+const parseInfo = infoConst.parseInfo;
+const arrayInfo = infoConst.arrayInfo;
+
+module.exports = app => {
+
+    class PaymentTenderInfo extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'payment_tender_info';
+        }
+
+        get DefaultInfo () {
+            return infoConst.paymentDefaultInfo;
+        }
+
+        /**
+         * 新增 标段相关信息
+         *
+         * @param tenderId - 标段Id
+         * @param projectId - 项目Id
+         * @param transaction - 事务
+         * @return {Promise<void>}
+         */
+        async addTenderInfo(tenderId, projectId, transaction) {
+            const defaultInfo = this.DefaultInfo;
+            const info = JSON.parse(JSON.stringify(defaultInfo));
+            info.id = tenderId;
+            info.pid = projectId;
+            for (const pi of parseInfo) {
+                if (info[pi] === undefined) continue;
+                info[pi] = JSON.stringify(info[pi]);
+            }
+            for (const pi of arrayInfo) {
+                if (info[pi] === undefined) continue;
+                info[pi] = JSON.stringify(info[pi]);
+            }
+
+            if (transaction) {
+                await transaction.insert(this.tableName, info);
+            } else {
+                await this.db.insert(this.tableName, info);
+            }
+            return info;
+        }
+
+        /**
+         * 获取标段相关信息
+         * @param tenderId
+         * @return {Promise<void>}
+         */
+        async getTenderInfo(tenderId, projectId) {
+            const defaultInfo = this.DefaultInfo;
+            let info = await this.getDataByCondition({ id: tenderId });
+            // 兼容不存在info的情况
+            if (!info) info = await this.addTenderInfo(tenderId, projectId || this.ctx.session.sessionProject.id);
+            for (const pi of parseInfo) {
+                if (info[pi] === undefined) continue;
+
+                info[pi] = !info[pi] || info[pi] === '' ? defaultInfo[pi] : JSON.parse(info[pi]);
+                this.ctx.helper._.defaultsDeep(info[pi], defaultInfo[pi]);
+            }
+            for (const ai of arrayInfo) {
+                if (info[ai] === undefined) continue;
+
+                info[ai] = !info[ai] || info[ai] === '' ? defaultInfo[ai] : JSON.parse(info[ai]);
+            }
+            return info;
+        }
+
+        /**
+         * 保存标段相关信息
+         *
+         * @param data
+         * @return {Promise<void>}
+         */
+        async saveTenderInfo(tenderId, data) {
+            for (const di in data) {
+                if (parseInfo.indexOf(di) >= 0 || arrayInfo.indexOf(di) >= 0) {
+                    data[di] = JSON.stringify(data[di]);
+                }
+            }
+            await this.db.update(this.tableName, data, { where: { id: tenderId } });
+        }
+
+        /**
+         * 拷贝标段数据至当前标段
+         * @param {number} id - 当前标段id
+         * @param {number} copy_id - 被拷贝的标段id
+         */
+        async copyTenderHandler(id, copy_id) {
+            const [data] = await this.ctx.service.tenderInfo.getDataByCondition({
+                where: { id: copy_id },
+                columns: ['deal_info', 'construction_unit', 'tech_param'],
+            });
+            await this.defaultUpdate(data, { id });
+        }
+    }
+
+    return PaymentTenderInfo;
+};

+ 6 - 1
app/view/payment/list.ejs

@@ -1,7 +1,12 @@
 <div class="panel-content">
     <div class="panel-title fluid">
         <div class="title-main  d-flex justify-content-between">
-            <div><a class="mr-2" href="/payment"><i class="fa fa-chevron-left"></i> 返回</a><%- ctx.paymentTender.name %></div>
+            <div>
+                <a class="mr-2" href="/payment"><i class="fa fa-chevron-left"></i> 返回</a><%- ctx.paymentTender.name %>
+            </div>
+            <div>
+                <a href="#bd-attr" data-toggle="modal" data-target="#bd-attr" class="btn btn-sm btn-outline-primary pull-right ml-2">标段属性</a>
+            </div>
             <div>
                 <% if (ctx.session.sessionUser.accountId === trInfo.uid && trInfo.is_del === 0 && (rptMsg || trInfo.type === paymentConst.modes_value_object.safe)) { %>
                 <% if (trDetailList.length === 0 || (trDetailList.length !== 0 && trDetailList[0].status === auditConst.status.checked)) { %>

+ 442 - 0
app/view/payment/list_modal.ejs

@@ -208,3 +208,445 @@
         </div>
     </div>
 </div>
+
+// 标段属性
+<div class="modal fade" id="bd-attr" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">标段属性</h5>
+            </div>
+            <div class="modal-height-500" style="overflow-y: auto">
+                <div class="modal-body">
+                    <ul class="nav nav-tabs nav-justified mb-2">
+                        <li class="nav-item">
+                            <a class="nav-link active" data-toggle="tab" href="#htxx" role="tab" aria-selected="true">合同信息</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" data-toggle="tab" href="#cjdw" role="tab" aria-selected="false">参建单位</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" data-toggle="tab" href="#jscs" role="tab">技术参数</a>
+                        </li>
+                    </ul>
+                    <div class="tab-content">
+                        <div class="tab-pane active" id="htxx">
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">建设项目名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="项目A" id="build-name" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">合同编号</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="deal-code" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">合同名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="deal-name" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">工程类别</span>
+                                            </div>
+                                            <select class="form-control" id="project-type">
+                                                <option value="">请选择</option>
+                                                <option value="设计">设计</option>
+                                                <option value="监理">监理</option>
+                                                <option value="施工">施工</option>
+                                                <option value="检测">检测</option>
+                                                <option value="其他">其他</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">合同类别</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="deal-type">
+                                        </div>
+                                    </div>
+                                    <div class="col-12">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">结算书编号</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="final-code">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="tab-pane" id="cjdw">
+                            <div class="form-group mb-4">
+                                <label>建设单位:</label>
+                                <div class="row">
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">单位名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="build-company" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">法人代表</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="build-corporation" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">签订日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="build-date">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group mb-4">
+                                <label>承包单位1:</label>
+                                <div class="row">
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">单位名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="contract1-company" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">法人代表</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="contract1-corporation" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">签订日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="contract1-date">
+                                        </div>
+                                    </div>
+                                    <div class="col-12 mt-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">项目经理部</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="contract1-management" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group mb-4">
+                                <label>承包单位2:</label>
+                                <div class="row">
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">单位名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="contract2-company" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">法人代表</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="contract2-corporation" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">签订日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="contract2-date">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group mb-4">
+                                <label>监理单位1:</label>
+                                <div class="row">
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">单位名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="supervision1-company" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">法人代表</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="supervision1-corporation" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">签订日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="supervision1-date">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label>监理单位2:</label>
+                                <div class="row">
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">单位名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="supervision2-company" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">法人代表</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="supervision2-corporation" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">签订日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="supervision2-date">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label>检测单位:</label>
+                                <div class="row">
+                                    <div class="col-12 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">单位名称</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="detect-company" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">法人代表</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="detect-corporation" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">签订日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="detect-date">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="tab-pane" id="jscs">
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-6 pr-0 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">公路等级</span>
+                                            </div>
+                                            <select class="form-control" id="load-level">
+                                                <option>高速公路</option>
+                                                <option>一级公路</option>
+                                                <option>二级公路</option>
+                                                <option>三级公路</option>
+                                                <option>四级公路</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">长度(KM)</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="length" min="0" max="10000"
+                                                   oninput="limitDealParamLength(this);limitReturn(this);" onchange="checkNumberValid(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">起始桩号</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="start-peg" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">终止桩号</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="end-peg" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:66px">车道数</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="lane-count" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text" style="width:90px">合同工期</span>
+                                            </div>
+                                            <input type="text" class="form-control" value="" id="deal-period" maxlength="100" oninput="limitReturn(this)">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">开工日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="start-date">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">计划完工日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="plan-end-date">
+                                        </div>
+                                    </div>
+                                    <div class="col-6 pr-0 mb-2">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">实际开工日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="real-start-date">
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">实际完工日期</span>
+                                            </div>
+                                            <input type="date" class="form-control" value="" id="real-end-date">
+                                        </div>
+                                    </div>
+                                    <div class="col-12">
+                                        <div class="input-group input-group-sm">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">构造物规模</span>
+                                            </div>
+                                            <textarea class="form-control" id="structure-scale"></textarea>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button class="btn btn-sm btn-primary mr-auto" data-toggle="modal" data-target="#sync-attr">从计量标段同步</button>
+
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-sm btn-primary" onclick="postAttr();">确认修改</button>
+            </div>
+        </div>
+    </div>
+</div>
+<div class="modal fade" id="sync-attr" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">选择标段</h5>
+            </div>
+            <div class="modal-body">
+                <h5>可选标段</h5>
+                <div id="sr-spread" style="height: 300px"></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="sync-attr-ok">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    let property = JSON.parse(unescape('<%- escape(JSON.stringify(tenderInfo)) %>'));
+    const category = JSON.parse('<%- JSON.stringify(categoryData) %>');
+    // 根据Min Max限制Input输入
+    function limitInputMinMax (obj) {
+        if (_.toNumber(obj.value) > _.toNumber(obj.max)) {
+            obj.value = obj.max;
+        }
+        if(_.toNumber(obj.value) < _.toNumber(obj.min)) {
+            obj.value = obj.min;
+        }
+    }
+    // 根据Maxlength限制input输入
+    function limitMaxLength (obj) {
+        if (obj.value.length > obj.maxLength) {
+            obj.value = obj.value.substr(0, obj.maxLength);
+        }
+    }
+    // 根据正则限制输入
+    function limitReg(obj, reg) {
+        obj.value = obj.value.replace(reg, '');
+    }
+    // 小数位数 input 输入限制
+    function limitDecimal(obj) {
+        limitReg(obj, /[^\d]/g);
+        limitMaxLength(obj);
+        limitInputMinMax(obj);
+    }
+
+    function limitDealParamLength(obj) {
+        limitReg(obj, /[^\d\.]/g); // 过滤数字和.
+        limitReg(obj, /\.{2,}/g); // 过滤第二个.
+        limitInputMinMax(obj);
+    }
+
+    function limitReturn(obj) {
+        limitReg(obj, /\s/g);
+    }
+
+    function checkNumberValid(obj) {
+        const value = _.toNumber(obj.value);
+        obj.value = value ? value : '';
+    }
+</script>
+

+ 5 - 1
config/web.js

@@ -1157,8 +1157,12 @@ const JsFiles = {
                 mergeFile: 'payment_process',
             },
             list: {
-                files: ['/public/js/moment/moment.min.js'],
+                files: ['/public/js/moment/moment.min.js',
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',],
                 mergeFiles: [
+                    '/public/js/spreadjs_rela/spreadjs_zh.js',
+                    '/public/js/path_tree.js',
+                    '/public/js/shares/tenders2tree.js',
                     '/public/js/payment_list.js',
                 ],
                 mergeFile: 'payment_list',