瀏覽代碼

调差清单对应关系更新

laiguoran 4 年之前
父節點
當前提交
195e438dea
共有 5 個文件被更改,包括 473 次插入90 次删除
  1. 20 0
      app/controller/material_controller.js
  2. 249 70
      app/public/js/material_list.js
  3. 178 0
      app/service/material_list.js
  4. 25 20
      app/view/material/list.ejs
  5. 1 0
      config/web.js

+ 20 - 0
app/controller/material_controller.js

@@ -508,6 +508,26 @@ module.exports = app => {
                         // 取所有工料表
                         responseData.data = await ctx.service.materialList.getMaterialData(ctx.tender.id, ctx.material.id);
                         break;
+                    case 'adds':
+                        responseData.data = await ctx.service.materialList.adds(data.postData);
+                        break;
+                    case 'dels':
+                        responseData.data = await ctx.service.materialList.dels(data.postData);
+                        break;
+                    case 'updates':
+                        if (data.updateData.quantity === '' || data.updateData.quantity === null) {
+                            throw '请输入数量';
+                        }
+                        // 判断数量是否为数字
+                        if (isNaN(data.updateData.quantity)) {
+                            throw '不能输入其它非数字类型字符';
+                        }
+                        responseData.data = await ctx.service.materialList.saves(data.updateData);
+                        break;
+                    case 'pastes':
+                        responseData.data = await ctx.service.materialList.savePastes(data.updateData);
+                        // 取所有工料表
+                        break;
                     default: throw '参数有误';
                 }
 

+ 249 - 70
app/public/js/material_list.js

@@ -156,6 +156,26 @@ $(document).ready(() => {
         return item.qc_qty || item.contract_qty
     });
     calculateJiaCha(gclGatherData);
+    // console.log(gclGatherData, _.uniqBy(materialListData, 'gcl_id'));
+    // const needUpdateList = [];
+    // for (const m of _.uniqBy(materialListData, 'gcl_id')) {
+    //     const gcl = _.find(gclGatherData, function (item) {
+    //         return item.leafXmjs && item.leafXmjs[0].gcl_id === m.gcl_id;
+    //     });
+    //     if (gcl) {
+    //         for (const xmj of gcl.leafXmjs) {
+    //             const needUpdate = {
+    //                 gcl_id: xmj.gcl_id,
+    //                 xmj_id: xmj.id,
+    //                 mx_id: xmj.mx_id,
+    //             };
+    //             needUpdateList.push(needUpdate);
+    //         }
+    //     }
+    // }
+    // console.log(needUpdateList);
+    // console.log(materialListData);
+
     // let gclGatherData = gclGatherModel.gatherGclData()
     // 获取项目节数据
     function loadLeafXmjData(iGclRow) {
@@ -225,10 +245,10 @@ $(document).ready(() => {
     const materialSpread = SpreadJsObj.createNewSpread($('#material-spread')[0]);
     const materialSpreadSetting = {
         cols: [
-            {title: '清单调差工料|编号', colSpan: '4|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@', readOnly: true},
+            {title: '清单工料含量|编号', colSpan: '4|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@', readOnly: true},
             {title: '|名称', colSpan: '|1', rowSpan: '|1', field: 'name', hAlign: 0, width: 100, formatter: '@', readOnly: true},
             {title: '|单位', colSpan: '|1', rowSpan: '|1', field: 'unit', hAlign: 1, width: 60, formatter: '@', readOnly: true},
-            {title: '|数量 �', colSpan: '1', rowSpan: '|1', field: 'quantity', hAlign: 2, width: 80, type: 'Number', readOnly: 'readOnly.isEdit'},
+            {title: '|数量 �', colSpan: '1', rowSpan: '|1', field: 'quantity', hAlign: 2, width: 120, type: 'Number', readOnly: 'readOnly.isEdit'},
         ],
         emptyRows: 0,
         headRows: 2,
@@ -248,10 +268,11 @@ $(document).ready(() => {
     const materialCol = {
         readOnly: {
             isEdit: function (data) {
-                const sheet = leafXmjSpread.getActiveSheet();
-                const select = SpreadJsObj.getSelectObject(sheet);
-                const notx = findNotJoinLeafXmj(select);
-                return !(!readOnly && notx === undefined && materialBase.isEdit(data));
+                // const sheet = leafXmjSpread.getActiveSheet();
+                // const select = SpreadJsObj.getSelectObject(sheet);
+                // const notx = findNotJoinLeafXmj(select);
+                // return !(!readOnly && notx === undefined && materialBase.isEdit(data));
+                return !(!readOnly && materialBase.isEdit(data));
             },
         },
     };
@@ -335,22 +356,50 @@ $(document).ready(() => {
         const leafXmjSheet = leafXmjSpread.getActiveSheet();
         const leafXmjSelect = SpreadJsObj.getSelectObject(leafXmjSheet);
         const gcl = gclGatherData[index].leafXmjs;
-        const leafXmjIndex = gcl.indexOf(leafXmjSelect);
-        const xmj = gcl[leafXmjIndex];
-        const data = {
-            xmj_id: xmj.id,
-            gcl_id: xmj.gcl_id,
-            mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
-            mb_id: mb_id,
-            gather_qty: xmj.gather_qty,
-        };
+        // const leafXmjIndex = gcl.indexOf(leafXmjSelect);
+        // const xmj = gcl[leafXmjIndex];
+        // const data = {
+        //     xmj_id: xmj.id,
+        //     gcl_id: xmj.gcl_id,
+        //     mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+        //     mb_id: mb_id,
+        //     gather_qty: xmj.gather_qty,
+        // };
+        const datas = [];
+        for (const xmj of gcl) {
+            const notx = findNotJoinLeafXmj(xmj);
+            const data = {
+                xmj_id: xmj.id,
+                gcl_id: xmj.gcl_id,
+                mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                gather_qty: xmj.gather_qty,
+                is_join: notx === undefined ? 1 : 0,
+            };
+            datas.push(data);
+        }
+
+
         // 上传到数据库
-        postData(window.location.pathname + '/save', {type: 'add', postData: data}, function (result) {
-            // 添加到materialList里
+        console.log(datas, gcl);
+        postData(window.location.pathname + '/save', {type: 'adds', postData: {xmjs: datas, mbIds: mb_id}}, function (result) {
             materialListData = result;
-            loadMaterialData(index, leafXmjIndex);
+            // toastr.success('已成功应用');
+            calculateJiaCha(gclGatherData);
+            // const index = gclGatherData.indexOf(ledgerSelect);
+            loadLeafXmjData(index);
+            const xmjSheet = leafXmjSpread.getActiveSheet();
+            const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+            const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+            loadMaterialData(index, xmjIndex);
+            SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
             $('#addgl').modal('hide');
         });
+        // postData(window.location.pathname + '/save', {type: 'add', postData: data}, function (result) {
+            // // 添加到materialList里
+            // materialListData = result;
+            // loadMaterialData(index, leafXmjIndex);
+            // $('#addgl').modal('hide');
+        // });
         $('#materialBills').find('input:disabled').prop('checked', true);
     });
     if (!readOnly) {
@@ -444,23 +493,48 @@ $(document).ready(() => {
         // material-spread右键功能
         const materialSpreadObj = {
             del: function () {
-                const sheet = materialSpread.getActiveSheet();
+                const materialSheet = materialSpread.getActiveSheet();
+                const materialSelect = SpreadJsObj.getSelectObject(materialSheet);
+                const sheet = ledgerSpread.getActiveSheet();
                 const select = SpreadJsObj.getSelectObject(sheet);
-                postData(window.location.pathname + '/save', {type: 'del', id: select.id, mb_id: select.mb_id}, function (result) {
-                    const index = materialList.indexOf(select);
-                    materialList.splice(index, 1);
-                    sheet.deleteRows(index, 1);
-                    SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
-                    const sel = sheet.getSelections();
-                    sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
-                    const materialListIndex = materialListData.indexOf(select);
-                    materialListData.splice(materialListIndex, 1);
-                    const [iGclRow, iRow, lsheet, lselect] = leafXmjSpreadObj.getSelect();
-                    gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
-                    calculateJiaCha(gclGatherData, iGclRow)
-                    SpreadJsObj.reLoadRowData(lsheet, iRow);
-                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                const index = gclGatherData.indexOf(select);
+                const gcl = gclGatherData[index].leafXmjs;
+                const datas = [];
+                for (const xmj of gcl) {
+                    const data = {
+                        xmj_id: xmj.id,
+                        gcl_id: xmj.gcl_id,
+                        mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                    };
+                    datas.push(data);
+                }
+                console.log(datas, materialSelect.mb_id);
+                postData(window.location.pathname + '/save', {type: 'dels', postData: { xmjs: datas, mb_id: materialSelect.mb_id }}, function (result) {
+                    materialListData = result;
+                    calculateJiaCha(gclGatherData);
+                    // const index = gclGatherData.indexOf(ledgerSelect);
+                    loadLeafXmjData(index);
+                    const xmjSheet = leafXmjSpread.getActiveSheet();
+                    const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+                    const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+                    loadMaterialData(index, xmjIndex);
+                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
                 });
+                // postData(window.location.pathname + '/save', {type: 'del', id: select.id, mb_id: select.mb_id}, function (result) {
+                    // const index = materialList.indexOf(select);
+                    // materialList.splice(index, 1);
+                    // sheet.deleteRows(index, 1);
+                    // SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
+                    // const sel = sheet.getSelections();
+                    // sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
+                    // const materialListIndex = materialListData.indexOf(select);
+                    // materialListData.splice(materialListIndex, 1);
+                    // const [iGclRow, iRow, lsheet, lselect] = leafXmjSpreadObj.getSelect();
+                    // gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
+                    // calculateJiaCha(gclGatherData, iGclRow);
+                    // SpreadJsObj.reLoadRowData(lsheet, iRow);
+                    // SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                // });
             },
             deletePress: function (sheet) {
                 return;
@@ -491,21 +565,48 @@ $(document).ready(() => {
                         }
                     }
                     // 更新至服务器
-                    postData(window.location.pathname + '/save', { type:'update', updateData: { id:select.id, quantity: validText, mb_id: select.mb_id } }, function (result) {
-                        const materialListIndex = materialListData.indexOf(select);
-                        const index = materialList.indexOf(select);
-                        select[col.field] = validText;
-                        materialListData.splice(materialListIndex, 1, select);
-                        materialList.indexOf(index, 1, select);
-                        SpreadJsObj.reLoadRowData(info.sheet, info.row);
-                        const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
-                        gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
-                        calculateJiaCha(gclGatherData, iGclRow)
-                        SpreadJsObj.reLoadRowData(sheet, iRow);
-                        SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                    const ledgerSheet = ledgerSpread.getActiveSheet();
+                    const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet);
+                    const index = gclGatherData.indexOf(ledgerSelect);
+                    const gcl = gclGatherData[index].leafXmjs;
+                    const datas = [];
+                    for (const xmj of gcl) {
+                        const data = {
+                            xmj_id: xmj.id,
+                            gcl_id: xmj.gcl_id,
+                            mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                        };
+                        datas.push(data);
+                    }
+                    console.log(validText, datas, select.mb_id);
+                    postData(window.location.pathname + '/save', { type:'updates', updateData: { xmjs: datas, quantity: validText, mb_id: select.mb_id } }, function (result) {
+                        materialListData = result;
+                        calculateJiaCha(gclGatherData);
+                        // const index = gclGatherData.indexOf(ledgerSelect);
+                        loadLeafXmjData(index);
+                        const xmjSheet = leafXmjSpread.getActiveSheet();
+                        const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+                        const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+                        loadMaterialData(index, xmjIndex);
+                        SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
                     }, function () {
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
                     });
+                    // postData(window.location.pathname + '/save', { type:'update', updateData: { id:select.id, quantity: validText, mb_id: select.mb_id } }, function (result) {
+                    //     const materialListIndex = materialListData.indexOf(select);
+                    //     const index = materialList.indexOf(select);
+                    //     select[col.field] = validText;
+                    //     materialListData.splice(materialListIndex, 1, select);
+                    //     materialList.indexOf(index, 1, select);
+                    //     SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                    //     const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
+                    //     gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
+                    //     calculateJiaCha(gclGatherData, iGclRow)
+                    //     SpreadJsObj.reLoadRowData(sheet, iRow);
+                    //     SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                    // }, function () {
+                    //     SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                    // });
                 }
             },
             clipboardPasted(e, info) {
@@ -576,17 +677,44 @@ $(document).ready(() => {
                     SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
                     return;
                 }
+                const ledgerSheet = ledgerSpread.getActiveSheet();
+                const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet);
+                const index = gclGatherData.indexOf(ledgerSelect);
+                const gcl = gclGatherData[index].leafXmjs;
+                const datas = [];
+                for (const xmj of gcl) {
+                    const data2 = {
+                        xmj_id: xmj.id,
+                        gcl_id: xmj.gcl_id,
+                        mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                    };
+                    datas.push(data2);
+                }
+                console.log(data, datas);
                 // 更新至服务器
-                postData(window.location.pathname + '/save', { type:'paste', updateData: data }, function (result) {
+                postData(window.location.pathname + '/save', { type:'pastes', updateData: { xmjs: datas, pasteData: data } }, function (result) {
                     materialListData = result;
-                    const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
-                    gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
-                    calculateJiaCha(gclGatherData, iGclRow)
-                    SpreadJsObj.reLoadRowData(sheet, iRow);
-                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                    calculateJiaCha(gclGatherData);
+                    // const index = gclGatherData.indexOf(ledgerSelect);
+                    loadLeafXmjData(index);
+                    const xmjSheet = leafXmjSpread.getActiveSheet();
+                    const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+                    const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+                    loadMaterialData(index, xmjIndex);
+                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
                 }, function () {
-                    SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row);
                 });
+                // postData(window.location.pathname + '/save', { type:'paste', updateData: data }, function (result) {
+                //     materialListData = result;
+                //     const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
+                //     gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
+                //     calculateJiaCha(gclGatherData, iGclRow);
+                //     SpreadJsObj.reLoadRowData(sheet, iRow);
+                //     SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                // }, function () {
+                //     SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
+                // });
             },
         };
         materialSpread.bind(spreadNS.Events.EditEnded, materialSpreadObj.editEnded);
@@ -614,19 +742,20 @@ $(document).ready(() => {
                 toastr.warning('没有需要应用调差工料的其它清单明细');
                 return false;
             }
+            console.log(needAddList, materialList);
             // 更新至服务器
-            postData(window.location.pathname + '/save', { type:'useOther', postData: { addXmj: needAddList, materialBills: materialList } }, function (result) {
-                materialListData = result;
-                toastr.success('已成功应用');
-                calculateJiaCha(gclGatherData);
-                const index = gclGatherData.indexOf(ledgerSelect);
-                loadLeafXmjData(index);
-                const xmjSheet = leafXmjSpread.getActiveSheet();
-                const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
-                const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
-                loadMaterialData(index, xmjIndex);
-                SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
-            });
+            // postData(window.location.pathname + '/save', { type:'useOther', postData: { addXmj: needAddList, materialBills: materialList } }, function (result) {
+            //     materialListData = result;
+            //     toastr.success('已成功应用');
+            //     calculateJiaCha(gclGatherData);
+            //     const index = gclGatherData.indexOf(ledgerSelect);
+            //     loadLeafXmjData(index);
+            //     const xmjSheet = leafXmjSpread.getActiveSheet();
+            //     const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+            //     const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+            //     loadMaterialData(index, xmjIndex);
+            //     SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
+            // });
         });
         $.contextMenu({
             selector: '#material-spread',
@@ -646,15 +775,16 @@ $(document).ready(() => {
                     disabled: function (key, opt) {
                         const sheet = leafXmjSpread.getActiveSheet();
                         const select = SpreadJsObj.getSelectObject(sheet);
-                        const notx = findNotJoinLeafXmj(select);
+                        // const notx = findNotJoinLeafXmj(select);
                         if (!select) {
                             return true;
                         }
-                        if (!readOnly && notx === undefined) {
-                            return false;
-                        } else {
-                            return true;
-                        }
+                        // if (!readOnly && notx === undefined) {
+                        //     return false;
+                        // } else {
+                        //     return true;
+                        // }
+                        return readOnly;
                     }
                 },
                 'delete': {
@@ -763,4 +893,53 @@ $(document).ready(() => {
             materialSpread.refresh();
         }
     });
+
+    $.divResizer({
+        select: '#right-spr',
+        callback: function () {
+            ledgerSpread.refresh();
+            leafXmjSpread.refresh();
+            materialSpread.refresh();
+            const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed();
+            setLocalCache('material_list_' + materialID, width);
+        }
+    });
+
+    // 展开收起月信息价并浏览器记住本期展开收起
+    $('a', '.right-nav').bind('click', function () {
+        //const main = $('#main-view'), tool = $('#tools-view');
+        const tab = $(this), tabPanel = $(tab.attr('content'));
+        if (!tab.hasClass('active')) {
+            $('a', '.side-menu').removeClass('active');
+            $('.tab-content .tab-select-show').removeClass('active');
+            tab.addClass('active');
+            tabPanel.addClass('active');
+            showSideTools(tab.hasClass('active'));
+            if (tab.attr('content') === '#material-tab') {
+                const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed();
+                setLocalCache('material_list_' + materialID, width);
+            }
+        } else {
+            removeLocalCache('material_list_' + materialID);
+            tab.removeClass('active');
+            tabPanel.removeClass('active');
+            showSideTools(tab.hasClass('active'));
+        }
+        ledgerSpread.refresh();
+        leafXmjSpread.refresh();
+        materialSpread.refresh();
+    });
+    // 根据浏览器记录展开收起
+    if (getLocalCache('material_list_' + materialID)) {
+        const tab = $('.right-nav a[content="#material-tab"]'), tabPanel = $(tab.attr('content'));
+        $('a', '.side-menu').removeClass('active');
+        $('.tab-content .tab-select-show').removeClass('active');
+        tab.addClass('active');
+        tabPanel.addClass('active');
+        $('#right-view').width(getLocalCache('material_list_' + materialID) + '%');
+        showSideTools(tab.hasClass('active'));
+        ledgerSpread.refresh();
+        leafXmjSpread.refresh();
+        materialSpread.refresh();
+    }
 });

+ 178 - 0
app/service/material_list.js

@@ -285,6 +285,184 @@ module.exports = app => {
             }
             return copyMLArray.length !== 0 ? await transaction.insert(this.tableName, copyMLArray) : true;
         }
+
+
+        /**
+         * 添加工料清单关联(多清单对应)
+         * @return {void}
+         */
+        async adds(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+            const transaction = await this.db.beginTransaction();
+            try {
+                const list = [];
+                // const delList = [];
+                // const mb_idList = [];
+                for (const xmj of datas.xmjs) {
+                    for (const mb of datas.mbIds) {
+                        // // 旧数据兼容问题,要去删除相同已存在的工料
+                        // const mlInfo = await this.getDataByCondition({
+                        //     mid: this.ctx.material.id,
+                        //     gcl_id: xmj.gcl_id,
+                        //     xmj_id: xmj.xmj_id,
+                        //     mx_id: xmj.mx_id ? xmj.mx_id : [null, ''],
+                        //     mb_id: mb,
+                        // });
+                        // if (mlInfo) {
+                        //     delList.push(mlInfo.id);
+                        //     mb_idList.push(mb);
+                        // }
+                        const newLists = {
+                            tid: this.ctx.tender.id,
+                            order: this.ctx.material.order,
+                            mid: this.ctx.material.id,
+                            mb_id: mb,
+                            gcl_id: xmj.gcl_id,
+                            xmj_id: xmj.xmj_id,
+                            mx_id: xmj.mx_id,
+                            gather_qty: xmj.gather_qty,
+                            in_time: new Date(),
+                            is_join: xmj.is_join,
+                        };
+                        list.push(newLists);
+                    }
+                }
+
+                // 删除工料清单关联
+                // if (delList.length > 0) await transaction.delete(this.tableName, { id: delList });
+                // 新增工料清单关联
+                if (list.length > 0) {
+                    const result = await transaction.insert(this.tableName, list);
+                    if (result.affectedRows === 0) {
+                        throw '新增工料数据失败';
+                    }
+                }
+                // 重算工料和总金额
+                // const calcMBIdList = this._.uniq(mb_idList);
+                // if (calcMBIdList.length > 0) {
+                //     for (const select of calcMBIdList) {
+                //         await this.calcQuantityByML(transaction, select);
+                //     }
+                // }
+                await transaction.commit();
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        /**
+         * 删除工料清单关联(多清单对应)
+         * @param {int} id 工料id
+         * @return {void}
+         */
+        async dels(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+            const transaction = await this.db.beginTransaction();
+            try {
+                // 判断是否可删
+                for (const xmj of datas.xmjs) {
+                    await transaction.delete(this.tableName, { tid: this.ctx.tender.id, mid: this.ctx.material.id, mb_id: datas.mb_id, gcl_id: xmj.gcl_id, xmj_id: xmj.xmj_id, mx_id: xmj.mx_id });
+                }
+                // await transaction.delete(this.tableName, { id });
+                await this.calcQuantityByML(transaction, datas.mb_id);
+                await transaction.commit();
+                // console.log(datas);
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        /**
+         * 修改工料清单关联信息(多清单对应)
+         * @param {Object} data 工料内容
+         * @param {int} order 期数
+         * @return {void}
+         */
+        async saves(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+
+            const transaction = await this.db.beginTransaction();
+            try {
+                const mb_id = datas.mb_id;
+                const updateDatas = [];
+                for (const xmj of datas.xmjs) {
+                    const udata = {
+                        row: {
+                            quantity: datas.quantity,
+                        },
+                        where: {
+                            tid: this.ctx.tender.id,
+                            mid: this.ctx.material.id,
+                            mb_id,
+                            gcl_id: xmj.gcl_id,
+                            xmj_id: xmj.xmj_id,
+                            mx_id: xmj.mx_id,
+                        },
+                    };
+                    updateDatas.push(udata);
+                }
+                if (updateDatas.length > 0) await transaction.updateRows(this.tableName, updateDatas);
+                await this.calcQuantityByML(transaction, mb_id);
+                await transaction.commit();
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        /**
+         * 复制粘贴多工料信息(多清单对应)
+         * @param {Object} data 工料内容
+         * @return {void}
+         */
+        async savePastes(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+            // 判断是否可修改
+            // 判断t_type是否为费用
+            const transaction = await this.db.beginTransaction();
+            try {
+
+                for (const data of datas.pasteData) {
+                    const updateDatas = [];
+                    for (const xmj of datas.xmjs) {
+                        const udata = {
+                            row: {
+                                quantity: data.quantity,
+                            },
+                            where: {
+                                tid: this.ctx.tender.id,
+                                mid: this.ctx.material.id,
+                                mb_id: data.mb_id,
+                                gcl_id: xmj.gcl_id,
+                                xmj_id: xmj.xmj_id,
+                                mx_id: xmj.mx_id,
+                            },
+                        };
+                        updateDatas.push(udata);
+                    }
+                    if (updateDatas.length > 0) await transaction.updateRows(this.tableName, updateDatas);
+                    await this.calcQuantityByML(transaction, data.mb_id);
+                }
+                await transaction.commit();
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
     }
     return MaterialList;
 };

+ 25 - 20
app/view/material/list.ejs

@@ -20,11 +20,11 @@
             </div>
         </div>
     </div>
-    <div class="content-wrap">
+    <div class="content-wrap pr-46">
         <div class="c-header p-0">
         </div>
         <div class="row w-100 sub-content">
-            <div id="main-view" class="c-body" style="width: 100%">
+            <div id="left-view" class="c-body" style="width: 70%">
                 <!--上部分-->
                 <div class="sjs-height-1" id="ledger-spread">
                 </div>
@@ -35,30 +35,34 @@
                             <li class="nav-item">
                                 <a class="nav-link active" data-toggle="tab" href="#xmujie" role="tab">清单明细</a>
                             </li>
-                            <li class="ml-auto">
-                                <% if (!material.readOnly) { %>
-                                <button class="btn btn-sm btn-primary" id="user_all_material">应用调差工料至其他清单明细</button>
-                                <% } %>
-                            </li>
+                            <!--<li class="ml-auto">-->
+                                <!--<% if (!material.readOnly) { %>-->
+                                <!--<button class="btn btn-sm btn-primary" id="user_all_material">应用调差工料至其他清单明细</button>-->
+                                <!--<% } %>-->
+                            <!--</li>-->
                         </ul>
                     </div>
-                    <div class="tab-content">
-                        <div class="tab-pane active" id="xmujie">
-                            <div class="row">
-                                <div class="col-8">
-                                    <div class="sp-wrap" id="leaf-xmj-spread">
-                                    </div>
-                                </div>
-                                <div class="col-4" id="material-spread-div" style="position: relative">
-                                    <div class="sp-wrap" id="material-spread">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
+                    <div class="sp-wrap" id="leaf-xmj-spread">
+                    </div>
+                </div>
+            </div>
+            <div class="c-body" id="right-view" style="width: 30%;">
+                <div class="resize-x" id="right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
+                <div class="tab-content">
+                    <div class="tab-pane active" id="material-spread-div" style="position: relative">
+                        <div class="sjs-height-6" id="material-spread"></div>
                     </div>
                 </div>
             </div>
         </div>
+        <div class="side-menu">
+            <!--右侧菜单-->
+            <ul class="nav flex-column right-nav">
+                <li class="nav-item">
+                    <a class="nav-link active" content="#material-tab" href="javascript: void(0);">清单工料含量</a>
+                </li>
+            </ul>
+        </div>
     </div>
 </div>
 <script>
@@ -72,4 +76,5 @@
     const curPosData = JSON.parse(unescape('<%- escape(JSON.stringify(curPosData)) %>'));
     const readOnly = <%- material.readOnly %>;
     const stage_order = <%- material.order %>;
+    const materialID = <%- material.id %>;
 </script>

+ 1 - 0
config/web.js

@@ -561,6 +561,7 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/gcl_gather.js',
                     '/public/js/material_list.js',
+                    '/public/js/shares/cs_tools.js',
                     '/public/js/material_audit.js',
                 ],
                 mergeFile: 'material_list',