瀏覽代碼

决策大屏标段管理控制

laiguoran 3 年之前
父節點
當前提交
194b6f8ed5

+ 1 - 0
app/const/page_show.js

@@ -35,6 +35,7 @@ const defaultSetting = {
     openNetCaSign: 0,
     openChangeRevise: 0,
     openMaterialTax: 0,
+    addDataCollect: 1,
 };
 
 

+ 6 - 1
app/controller/datacollect_controller.js

@@ -94,7 +94,12 @@ module.exports = app => {
                 const responseData = { err: 0, msg: '', data: {} };
                 // const tenderidList = [];
                 // const noticeList = await ctx.service.noticePush.getNoticeByDataCollect(ctx.session.sessionProject.id, tenderidList);
-                const tenderList = await ctx.service.tender.getList('', null, 1);
+                const dcTenders = await ctx.service.datacollectTender.getList(ctx.session.sessionProject.id);
+                const noTids = ctx.app._.map(dcTenders, 'tid');
+                let tenderList = await ctx.service.tender.getList('', null, 1);
+                tenderList = ctx.app._.filter(tenderList, function(item) {
+                    return ctx.app._.indexOf(noTids, item.id) === -1;
+                });
                 const thisMonth = new Date();
                 const [startMonth, endMonth] = ctx.helper.getStartEndMonth(thisMonth);
                 for (const t of tenderList) {

+ 18 - 1
app/controller/setting_controller.js

@@ -763,7 +763,9 @@ module.exports = app => {
 
                 const result = await ctx.service.project.updateFunRela(projectId, ctx.request.body);
                 if (!result) throw '保存数据失败';
-                const result2 = await ctx.service.project.updatePageshow(projectId, ctx.request.body);
+                this.ctx.session.sessionProject.page_show.openChangeRevise = data.openChangeRevise ? 1 : 0;
+                this.ctx.session.sessionProject.page_show.openMaterialTax = data.openMaterialTax ? 1 : 0;
+                const result2 = await ctx.service.project.updatePageshow(projectId);
                 if (!result2) throw '保存数据失败';
 
                 ctx.body = { err: 0, msg: '', data: null };
@@ -869,12 +871,16 @@ module.exports = app => {
                     return { groupName: item, groupList };
                 });
                 const categoryData = await ctx.service.category.getAllCategory(ctx.session.sessionProject.id);
+                const tenders = await ctx.service.tender.getList('', null, 1);
+                const dcTenders = await ctx.service.datacollectTender.getList(projectId);
                 await this.layout('setting/datacollect.ejs', {
                     projectData,
                     dataCollectAudits,
                     accountList,
                     accountGroup: accountGroupList,
                     categoryData,
+                    tenders,
+                    dcTenders,
                 }, 'setting/datacollect_modal.ejs');
             } catch (error) {
                 ctx.helper.log(error);
@@ -938,6 +944,17 @@ module.exports = app => {
                         await ctx.service.datacollectAudit.delAudit(data.id);
                         responseData.data = await ctx.service.datacollectAudit.getList(projectId);
                         break;
+                    case 'tender':
+                        if (ctx.session.sessionProject.page_show.addDataCollect !== parseInt(data.add_datacollect)) {
+                            ctx.session.sessionProject.page_show.addDataCollect = parseInt(data.add_datacollect);
+                            await ctx.service.project.updatePageshow(projectId);
+                        }
+                        await ctx.service.datacollectTender.updateList(projectId, data.tids);
+                        responseData.data = {
+                            dcTenders: await ctx.service.datacollectTender.getList(projectId),
+                            addDatacollect: ctx.session.sessionProject.page_show.addDataCollect,
+                        };
+                        break;
                     default: throw '参数有误';
                 }
                 ctx.body = responseData;

+ 29 - 48
app/public/js/setting_datacollect_tender.js

@@ -65,20 +65,8 @@ function initTenderTree () {
         }
         return tenderCategory;
     }
-    function calculateTender(tender) {
-        if (tender.lastStage) {
-            tender.gather_tp = ZhCalc.add(tender.lastStage.contract_tp, tender.lastStage.qc_tp);
-            tender.end_contract_tp = ZhCalc.add(tender.lastStage.pre_contract_tp, tender.lastStage.contract_tp);
-            tender.end_qc_tp = ZhCalc.add(tender.lastStage.pre_qc_tp, tender.lastStage.qc_tp);
-            tender.end_gather_tp = ZhCalc.add(tender.end_contract_tp, tender.end_qc_tp);
-            tender.pre_gather_tp = ZhCalc.add(tender.lastStage.pre_contract_tp, tender.lastStage.pre_qc_tp);
-            tender.yf_tp = ZhCalc.add(tender.lastStage.yf_tp);
-            tender.end_yf_tp = ZhCalc.add(tender.lastStage.pre_yf_tp, tender.yf_tp);
-        }
-    }
     tenderTree.splice(0, tenderTree.length);
     for (const t of tenders) {
-        calculateTender(t);
         t.valid = true;
         delete t.level;
         if (t.category && levelCategory.length > 0) {
@@ -96,8 +84,6 @@ function initTenderTree () {
 }
 function recursiveGetTenderNodeHtml (node, arr, pid) {
     // console.log(node, tender)
-    if (node.id === tender.id) return ''
-    if (node.user_id && parseInt(node.user_id) !== cur_uid) return ''
     const html = [];
     html.push('<tr pid="' + pid + '">');
     // 名称
@@ -116,7 +102,7 @@ function recursiveGetTenderNodeHtml (node, arr, pid) {
     html.push('<td>');
     if (!node.cid) {
         // html.push('<input data-tid="'+ node.id +'" type="radio"> '+ (node.copy_id === tender.copy_id ? 'checked' : '') + '/>');
-        html.push(`<input data-tid=${node.id} type="radio" ${node.id === tender.copy_id ? 'checked' : ''}>`);
+        html.push(`<input data-tid=${node.id} type="checkbox" ${_.findIndex(dcTenders, { tid: node.id }) === -1 ? 'checked' : ''}>`);
     }
     html.push('</td>');
     html.push('</tr>');
@@ -148,38 +134,33 @@ function getTenderTreeHtml () {
 }
 $(document).ready(function () {
     initTenderTree();
+    console.log(tenderTree);
     const html = getTenderTreeHtml();
     $('#copyModalContent').html(html);
-    // $('#copyBtn').click(() => {
-    //     const html = getTenderTreeHtml();
-    //     $('#copyModalContent').html(html);
-    //     $('#bd-set-8').modal('show');
-    // });
-    //
-    // $('#copyModalContent').on('click', 'input[type="radio"]', function() {
-    //     $('#copyModalContent tbody').children().each(function () {
-    //         $(this).find('input:radio').prop("checked", false);
-    //     })
-    //     $(this).prop("checked", true);
-    // });
-    //
-    // $('#setting-custom').on('click', '.custom-checkbox', function () {
-    //     const isChecked = $(this).find('input').prop("checked");
-    //     $(this).find('input').prop("checked", !isChecked);
-    // })
-    // $('#copy_comfirm_btn').click(function() {
-    //     const type = []
-    //     $('#setting-custom').find('input:checked').each(function() {
-    //         type.push($(this).data('type'))
-    //     })
-    //     if (!type.length) {
-    //         return toastr.error('请勾选需要拷贝的属性')
-    //     }
-    //     const id = $('#copyModalContent').find('input:checked').data('tid');
-    //     if (id) {
-    //         postData(window.location.pathname + '/copy-setting', { id, type }, function() {
-    //             window.location.reload()
-    //         })
-    //     }
-    // });
-})
+
+    $('#tender_dataCollect_btn').click(function () {
+        // 获取是否新增展示到决策大屏
+        const add_datacollect = $('input[name="add_datacollect"]:checked').val();
+        const noTidList = [];
+        $("#copyModalContent input[type='checkbox']:not(:checked)").each(function () {
+           noTidList.push($(this).data('tid'));
+        });
+        const dcTidList = _.map(dcTenders, 'tid');
+        let is_list_update = true;
+        let is_collect_update = true;
+        if (_.isEqual(_.sortBy(dcTidList), _.sortBy(noTidList))) {
+            is_list_update = false;
+        }
+        if (parseInt(add_datacollect) === addDataCollect) {
+            is_collect_update = false;
+        }
+        if (is_list_update || is_collect_update) {
+            postData('/setting/datacollect/save', { type: 'tender', add_datacollect: parseInt(add_datacollect), tids: noTidList }, function (result) {
+                addDataCollect = result.addDataCollect;
+                dcTenders = result.dcTenders;
+                toastr.success('修改成功');
+            })
+        }
+        $('#sort').modal('hide');
+    });
+});

+ 100 - 0
app/service/datacollect_tender.js

@@ -0,0 +1,100 @@
+'use strict';
+
+/**
+ * 决策大屏标段管理-数据模型
+ *
+ * @author ellisran
+ * @date 2021/09/23
+ * @version
+ */
+// const accountGroup = require('../const/account_group').group;
+module.exports = app => {
+    class datacollectTender extends app.BaseService {
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'datacollect_tender';
+        }
+
+        // async getGroupInfo(pid, groupid) {
+        //     const sql = 'SELECT * FROM ?? WHERE pid = ? AND groupid = ? AND uid is NULL';
+        //     const sqlParam = [this.tableName, pid, groupid];
+        //     return await this.db.queryOne(sql, sqlParam);
+        // }
+        //
+        // async saveAudit(pid, groupid, uid) {
+        //     const data = {
+        //         pid,
+        //         groupid,
+        //         uid,
+        //         create_time: new Date(),
+        //     };
+        //     return await this.db.insert(this.tableName, data);
+        // }
+        //
+        // async saveGroup(pid, groupid) {
+        //     const transaction = await this.db.beginTransaction();
+        //     try {
+        //         // 删除所在组的用户
+        //         await transaction.delete(this.tableName, { pid, groupid });
+        //         const data = {
+        //             pid,
+        //             groupid,
+        //             create_time: new Date(),
+        //         };
+        //         await transaction.insert(this.tableName, data);
+        //         await transaction.commit();
+        //         return true;
+        //     } catch (err) {
+        //         await transaction.rollback();
+        //         throw err;
+        //     }
+        // }
+        //
+        // async delAudit(id) {
+        //     return await this.db.delete(this.tableName, { id });
+        // }
+
+        async getList(pid) {
+            return await this.db.select(this.tableName, { pid });
+        }
+
+        async updateList(pid, tids) {
+            // 初始化事务
+            const transaction = await this.db.beginTransaction();
+            try {
+                const oldList = await this.getList(pid);
+                const oldIds = this._.map(oldList, 'tid');
+                const insertTids = this._.difference(tids, oldIds);
+                const delTids = this._.difference(oldIds, tids);
+                if (insertTids.length > 0) {
+                    const insertDatas = [];
+                    for (const i of insertTids) {
+                        insertDatas.push({
+                            pid,
+                            tid: i,
+                        });
+                    }
+                    await transaction.insert(this.tableName, insertDatas);
+                }
+                if (delTids.length > 0) {
+                    for (const d of delTids) {
+                        await transaction.delete(this.tableName, { pid, tid: d });
+                    }
+                }
+                transaction.commit();
+            } catch (e) {
+                console.log(e);
+                transaction.rollback();
+            }
+        }
+
+        async add(pid, tid) {
+            const data = {
+                pid,
+                tid,
+            };
+            return await this.db.insert(this.tableName, data);
+        }
+    }
+    return datacollectTender;
+};

+ 1 - 3
app/service/project.js

@@ -185,9 +185,7 @@ module.exports = app => {
             return sjsField;
         }
 
-        async updatePageshow(id, data) {
-            this.ctx.session.sessionProject.page_show.openChangeRevise = data.openChangeRevise ? 1 : 0;
-            this.ctx.session.sessionProject.page_show.openMaterialTax = data.openMaterialTax ? 1 : 0;
+        async updatePageshow(id) {
             const result = await this.db.update(this.tableName, {
                 id, page_show: JSON.stringify(this.ctx.session.sessionProject.page_show),
             });

+ 5 - 0
app/service/tender.js

@@ -253,6 +253,11 @@ module.exports = app => {
                 if (tender) {
                     tender.category = tender.category && tender.category !== '' ? JSON.parse(tender.category) : null;
                 }
+
+                // 是否加入到决策大屏中
+                if (sessionProject.addDataCollect === 0) {
+                    await this.ctx.service.datacollectTender.add(sessionProject.id, operate.insertId);
+                }
                 return tender;
             } catch (error) {
                 await this.transaction.rollback();

+ 0 - 2
app/view/datacollect/index.ejs

@@ -1278,8 +1278,6 @@
             } else {
                 option1_is_tender = true;
             }
-            console.log(tenderList);
-            console.log(_.differenceWith(tenders, tenderList, _.isEqual));
             const chart_option4_data = [];
             for(const t of tenderList) {
                 total_price = ZhCalc.add(total_price, t.total_price);

+ 4 - 52
app/view/setting/datacollect.ejs

@@ -4,7 +4,7 @@
         <div class="title-main">
             <h2>决策大屏
                 <a href="#power" data-toggle="modal" data-target="#power" class="btn btn-primary btn-sm pull-right">权限管理</a>
-                <a href="#sort" data-toggle="modal" data-target="#sort" class="btn btn-primary btn-sm pull-right mr-1">分类管理</a>
+                <a href="#sort" data-toggle="modal" data-target="#sort" class="btn btn-primary btn-sm pull-right mr-1">标段管理</a>
             </h2>
         </div>
     </div>
@@ -33,12 +33,12 @@
         </div>
     </div>
 </div>
-<script src="/public/js/ztree/jquery.ztree.core.js"></script>
-<script src="/public/js/ztree/jquery.ztree.excheck.js"></script>
 <script src="/public/js/setting_datacollect_tender.js"></script>
 <script>
+    const tenders = JSON.parse(unescape('<%- escape(JSON.stringify(tenders)) %>'));
     const category = JSON.parse(unescape('<%- escape(JSON.stringify(categoryData)) %>'));
-    console.log(category);
+    let dcTenders = JSON.parse(unescape('<%- escape(JSON.stringify(dcTenders)) %>'));
+    let addDataCollect = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.session.sessionProject.page_show.addDataCollect)) %>'));
     $(function () {
         autoFlashHeight();
         $('#show-datacollect').click(function () {
@@ -58,53 +58,5 @@
                 })
             }
         });
-
-        const setting = {
-            check: {
-                enable: true
-            },
-            data: {
-                simpleData: {
-                    enable: true
-                }
-            }
-        };
-        const zNodes = [];
-        const newCategory = _.filter(_.orderBy(category, ['level'], ['asc']), function (item) {
-            return item.level !== 0;
-        });
-        let insertid = 1;
-        const level1Array = [];
-        const level2Array = [];
-        for (const c of newCategory) {
-            if (c.level === 1) {
-                for (const v of c.value) {
-                    level1Array.push({id: insertid});
-                    zNodes.push({id: insertid, pId: 0, name: v.value, open: true, checked:true});
-                    insertid++;
-                }
-            } else if (c.level === 2) {
-                for (const l1 of level1Array) {
-                    zNodes.push({id: insertid, pId: l1.id, name: '', checked:true});
-                    insertid++;
-                    for (const v of c.value) {
-                        level2Array.push({id: insertid});
-                        zNodes.push({id: insertid, pId: l1.id, name: v.value, open: true, checked:true});
-                        insertid++;
-                    }
-                }
-            }
-            else if (c.level === 3) {
-                for (const l2 of level2Array) {
-                    zNodes.push({id: insertid, pId: l2.id, name: '', checked:true});
-                    insertid++;
-                    for (const v of c.value) {
-                        zNodes.push({id: insertid, pId: l2.id, name: v.value, checked:true});
-                        insertid++;
-                    }
-                }
-            }
-        }
-        $.fn.zTree.init($("#treeDemo"), setting, zNodes);
     })
 </script>

+ 20 - 4
app/view/setting/datacollect_modal.ejs

@@ -3,16 +3,32 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">决策大屏分类管理</h5>
+                <h5 class="modal-title">决策大屏标段管理</h5>
             </div>
             <div class="modal-body">
-                <div class="zTreeDemoBackground left modal-height-500" style="overflow: auto">
-                    <ul id="treeDemo" class="ztree"></ul>
+                <div class="mb-2">
+                    <span>新增的标段是否默认展示到决策大屏:</span>
+                    <a class="btn btn-sm btn-light">
+                        <div class="custom-control custom-checkbox">
+                            <input type="radio" name="add_datacollect" class="custom-control-input" value="1" <% if (ctx.session.sessionProject.page_show.addDataCollect === 1) { %>checked<% } %> id="yes_datacollect">
+                            <label class="custom-control-label text-primary" for="yes_datacollect">是</label>
+                        </div>
+                    </a>
+                    <a class="btn btn-sm btn-light">
+                        <div class="custom-control custom-checkbox">
+                            <input type="radio" name="add_datacollect" class="custom-control-input" value="0" <% if (ctx.session.sessionProject.page_show.addDataCollect === 0) { %>checked<% } %> id="no_datacollect">
+                            <label class="custom-control-label text-primary" for="no_datacollect">否</label>
+                        </div>
+                    </a>
+                </div>
+                <div class="alert alert-warning mb-1">已勾选的标段将展示到决策大屏中</div>
+                <div class="zTreeDemoBackground left modal-height-500" id="copyModalContent" style="overflow: auto">
+                    <!--<ul id="treeDemo" class="ztree"></ul>-->
                 </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">确定</button>
+                <button type="button" class="btn btn-sm btn-primary" id="tender_dataCollect_btn">确定</button>
             </div>
         </div>
     </div>