Просмотр исходного кода

部分关联标段代码,及合同移动权限调整

ellisran 1 день назад
Родитель
Сommit
1b75a9d632

+ 20 - 1
app/controller/contract_controller.js

@@ -282,7 +282,7 @@ module.exports = app => {
                 const contractOptions = ctx.helper._.cloneDeep(ctx.contractOptions);
                 contractOptions.contract_type = ctx.contract_type;
                 const contractTreeAudits = await ctx.service.contractTreeAudit.getAllDataByCondition({ where: contractOptions });
-                const [stdBills, stdChapters] = ctx.contract.tender ? await this.ctx.service.valuation.getValuationStdList(
+                const [stdBills, stdChapters] = ctx.contract_tender ? await this.ctx.service.valuation.getValuationStdList(
                     ctx.contract.valuation, ctx.contract.measure_type) : await ctx.service.budgetStd.getStdList(ctx.subProject.std_id, 'yu');
                 const commonJson = ctx.subProject.common_json ? JSON.parse(ctx.subProject.common_json) : null;
                 const types = commonJson && commonJson[(ctx.contract_tender ? 'tender_' : '') + 'contract_type'] ? commonJson[(ctx.contract_tender ? 'tender_' : '') + 'contract_type'] : [];
@@ -634,6 +634,25 @@ module.exports = app => {
                     case 'del-contract-supplement':
                         responseData.data = await ctx.service.contractSupplement.del(options, data.postData.select, data.postData.supplement);
                         break;
+                    case 'get-tenders':
+                        // 获取用户新建标段权利
+                        const accountInfo = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
+                        const userPermission = accountInfo !== undefined && accountInfo.permission !== ''
+                            ? JSON.parse(accountInfo.permission) : null;
+                        const tenderList = await ctx.service.tender.getBuildList('', userPermission, ctx.session.sessionUser.is_admin);
+                        responseData.data.categoryData = await this.ctx.service.category.getAllCategory(ctx.subProject);
+                        responseData.data.tenders = tenderList;
+                        break;
+                    case 'get-tender-pays':
+                        // 判断项目开没开启独立支付合同
+                        if (ctx.subProject.page_show.phasePay) {
+                            // 直接读phasePay表数据并展示
+                            responseData.data.stages = await ctx.service.phasePay.getDatasForContract(data.postData.tid);
+                        } else {
+                            // 读取期支付数据
+                            responseData.data.stages = await ctx.service.stagePay.getDatasForContract(data.postData.tid);
+                        }
+                        break;
                     default:
                         throw '未知操作';
                 }

Разница между файлами не показана из-за своего большого размера
+ 756 - 330
app/public/js/contract_detail.js


+ 1 - 1
app/service/contract.js

@@ -71,7 +71,7 @@ module.exports = app => {
                         insertData[key] = data[key] ? parseFloat(data[key]) : 0;
                         insertData.total_price = data[key] ? parseFloat(data[key]) : 0;
                         continue;
-                    } else if (key === 'tax') {
+                    } else if (key === 'tax' || key === 'rela_tender') {
                         insertData[key] = data[key] ? parseFloat(data[key]) : null;
                         continue;
                     } else if (key === 'sign_date') {

+ 4 - 3
app/service/pay.js

@@ -8,6 +8,7 @@
  * @version
  */
 const payConst = require('../const/deal_pay.js');
+const auditConst = require('../const/audit.js').stage;
 const writableFields = ['name', 'minus', 'sprice', 'sexpr', 'rprice', 'rexpr', 'is_yf', 'dl_type', 'dl_count', 'dl_tp_type', 'dl_tp'];
 
 module.exports = app => {
@@ -34,10 +35,10 @@ module.exports = app => {
 
             try {
                 const projectData = await this.ctx.service.project.getDataById(this.ctx.session.sessionProject.id);
-                const pays = projectData.dealpay_json 
+                const pays = projectData.dealpay_json
                     ? JSON.parse(projectData.dealpay_json)
                     : JSON.parse(JSON.stringify(payConst.payTemplate));
-    
+
                 for (const p of pays) {
                     p.tid = tid;
                     p.csid = 0;
@@ -212,4 +213,4 @@ module.exports = app => {
     }
 
     return Pay;
-};
+};

+ 21 - 2
app/service/phase_pay.js

@@ -553,7 +553,26 @@ module.exports = app => {
             const fp = this.ctx.helper._.orderBy(allPhase.filter(x => { return x.maxRelaStageOrder > 0; }), ['maxRelaStageOrder'], ['desc']);
             this.ctx.stageRelaPhasePay = fp.length > 0 ? fp[0] : null;
         }
-    }
 
+        async getDatasForContract(tid) {
+            const pays = await this.getAllDataByCondition({ where: { tid, audit_status: audit.status.checked }, orders: [['phase_order', 'asc']] });
+            const stages = [];
+            for (const p of pays) {
+                const oneStage = {
+                    id: p.id,
+                    pay_time: p.phase_date ? p.phase_date + '-01' : '',
+                    used: '合同',
+                    order: p.phase_order,
+                    pay_price: p.pay_tp,
+                    debit_price: p.cut_tp,
+                    yf_price: p.yf_tp,
+                    sf_price: p.sf_tp,
+                    pay_type: '网上转账',
+                };
+                stages.push(oneStage);
+            }
+            return stages;
+        }
+    }
     return PhasePay;
-};
+};

+ 31 - 0
app/service/stage_pay.js

@@ -559,6 +559,37 @@ module.exports = app => {
             }
             if (updateData.length > 0) await transaction.updateRows(this.tableName, updateData);
         }
+
+        async getDatasForContract(tid) {
+            const stages = await this.ctx.service.stage.getAllDataByCondition({ where: { tid, status: auditConst.stage.status.checked }, orders: [['order', 'asc']] });
+            const stagePays = [];
+            for (const s of stages) {
+                const pay = await this.getStageLastestPays(s);
+                const pay_price_pays = this._.filter(pay, function(p) {
+                    return p.ptype === 4 || (p.ptype === 1 && p.minus === 0);
+                });
+                const pay_price = pay_price_pays.length > 0 ? this.ctx.helper.sum(this._.map(pay_price_pays, 'tp')) : 0;
+                const debit_price_pays = this._.filter(pay, { ptype: 1, minus: 1 });
+                const debit_price = debit_price_pays.length > 0 ? this.ctx.helper.sum(this._.map(debit_price_pays, 'tp')) : 0;
+                const yf_price_pays = this._.filter(pay, { ptype: 2 });
+                const yf_price = yf_price_pays.length > 0 ? this.ctx.helper.sum(this._.map(yf_price_pays, 'tp')) : 0;
+                const sf_price_pays = this._.filter(pay, { ptype: 3 });
+                const sf_price = sf_price_pays.length > 0 ? this.ctx.helper.sum(this._.map(sf_price_pays, 'tp')) : 0;
+                const oneStage = {
+                    id: s.id,
+                    pay_time: s.period ? (s.period.split('~')[1] ? s.period.split('~')[1] : s.period) : '',
+                    used: '合同',
+                    order: s.order,
+                    pay_price,
+                    debit_price,
+                    yf_price,
+                    sf_price,
+                    pay_type: '网上转账',
+                };
+                stagePays.push(oneStage);
+            }
+            return stagePays;
+        }
     }
 
     return StagePay;

+ 1 - 1
app/view/contract/detail.ejs

@@ -91,6 +91,7 @@
                                 <!-- 合同支付的按钮 -->
                                 <!--                                <a href="#cons-addpay2" data-toggle="modal" data-target="#cons-addpay2" class="btn btn-primary btn-sm pull-right mr-2">添加回款2</a>-->
                                 <a href="javascript:void(0);" id="add_contract_pay_btn" style="display: none;" class="btn btn-primary btn-sm pull-right mr-2">添加<% if (ctx.contract_type === contractConst.type.expenses) { %>支付<% } else if (ctx.contract_type === contractConst.type.income) { %>回款<% } %></a>
+                                <% if (ctx.contract_type === contractConst.type.expenses) { %><a href="javascript:void(0);" id="add_tender_contract_pay_btn" style="display: none;" class="btn btn-primary btn-sm pull-right mr-2">添加标段支付记录</a><% } %>
                                 <!-- 合同详情的按钮,点击编辑出现确定和取消按钮 -->
                                 <a href="javascript:void(0);" id="cancel_contract_btn" style="display: none" class="btn btn-secondary btn-sm pull-right mr-2">取消</a>
                                 <a href="javascript:void(0);" id="save_contract_btn" style="display: none" class="btn btn-primary btn-sm pull-right mr-2">确定</a>
@@ -333,5 +334,4 @@
     types.push('');
     let contractPays = [];
     let contractSupplements = [];
-</script>)
 </script>

+ 65 - 2
app/view/contract/detail_modal.ejs

@@ -53,10 +53,18 @@
                         </div>
                     </div>
                     <div class="col-md-6">
+                        <% if (ctx.contract_type === contractConst.type.expenses) { %>
+                        <div class="form-group">
+                            <label>关联标段</label>
+                            <select class="form-control form-control-sm" name="rela_tender">
+                            </select>
+                        </div>
+                        <% } else { %>
                         <div class="form-group">
                             <label>签订日期</label>
                             <input class="datepicker-here form-control form-control-sm" name="sign_date" placeholder="点击选择时间" data-date-format="yyyy-MM-dd" data-language="zh" type="text" autocomplete="off">
                         </div>
+                        <% } %>
                     </div>
                 </div>
 
@@ -97,6 +105,14 @@
                             <input class="form-control form-control-sm" placeholder="" type="text" name="address">
                         </div>
                     </div>
+                    <% if (ctx.contract_type === contractConst.type.expenses) { %>
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label>签订日期</label>
+                            <input class="datepicker-here form-control form-control-sm" name="sign_date" placeholder="点击选择时间" data-date-format="yyyy-MM-dd" data-language="zh" type="text" autocomplete="off">
+                        </div>
+                    </div>
+                    <% } %>
                 </div>
 
                 <div class="payee-fields-group">
@@ -488,6 +504,37 @@
         </div>
     </div>
 </div>
+<% if (ctx.contract_type === contractConst.type.expenses) { %>
+<!--添加支付,非关联合同显示-->
+<div class="modal fade" id="cons-tender-addpay" data-backdrop="static">
+    <div class="modal-dialog modal-xl" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加标段<% if (ctx.contract_type === contractConst.type.expenses) { %>支付<% } else if (ctx.contract_type === contractConst.type.income) { %>回款<% } %>记录</h5>
+            </div>
+            <div class="modal-body">
+                <div class="modal-height-500" style="overflow:auto;">
+                    <table class="table table-sm table-bordered text-center" style="word-break:break-all; table-layout: fixed">
+                        <thead>
+                        <% if (ctx.contract_type === contractConst.type.income) { %>
+                            <th width="3%"></th><th>期数</th><th>回款日期</th><th>回款金额</th><th>扣款金额</th><th>应回金额</th><th>实回金额</th><th>回款方式</th>
+                        <% } else if (ctx.contract_type === contractConst.type.expenses) { %>
+                            <th width="3%"></th><th>期数</th><th>支付日期</th><th>付款金额</th><th>扣款金额</th><th>应付金额</th><th>实付金额</th><th>支付方式</th>
+                        <% } %>
+                        </thead>
+                        <tbody id="stages-pay">
+                        </tbody>
+                    </table>
+                </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="add-tender-contract-pay">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+<% } %>
 <!--附件-->
 <div class="modal fade" id="cons-pay-file" data-backdrop="static" style="z-index: 1049">
     <input type="hidden" name="cpid">
@@ -640,7 +687,6 @@
         </div>
     </div>
 </div>
-<% if (ctx.session.sessionUser.is_admin || audit_permission.permission_edit) { %>
 <div class="modal fade" id="cons-move" data-backdrop="static">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
@@ -698,7 +744,24 @@
         </div>
     </div>
 </div>
-<% } %>
+<div class="modal fade" id="rela-tender" 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">
+                <div class="mb-2">合同编号: <b class="mr-3" id="rela-contract"></b> 原关联标段: <b class="mr-3 old-rela-tender"></b> 新关联标段: <b class="new-rela-tender"></b></div>
+                <div class="modal-height-500 scroll-y" id="tender-list">
+                </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="rela-tender-ok">确认</button>
+            </div>
+        </div>
+    </div>
+</div>
 <% if (shenpi_status || pay_shenpi_status) { %>
 <!--上报审批-->
 <div class="modal fade" id="sub-sp" data-backdrop="static">

+ 6 - 1
sql/update.sql

@@ -15,7 +15,12 @@ ALTER TABLE `zh_tender`
 ADD COLUMN `share_token` varchar(20) NOT NULL DEFAULT '' COMMENT '标段分享token' AFTER `filter_fund`,
 ADD COLUMN `share_expiration` datetime NULL COMMENT '分享token到期时间' AFTER `share_token`;
 
+ALTER TABLE `zh_contract`
+ADD COLUMN `rela_tender` int NULL DEFAULT NULL COMMENT '关联标段id' AFTER `exist_supplement`;
+
+ALTER TABLE `zh_contract_pay`
+ADD COLUMN `rela_stage` int NULL DEFAULT NULL COMMENT '关联的标段期id' AFTER `remark`;
 
 ------------------------------------
 -- 表数据
-------------------------------------
+------------------------------------