Переглянути джерело

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

Conflicts:
	app/service/change_audit_list.js
MaiXinRong 3 роки тому
батько
коміт
acad18cbc8

+ 11 - 4
app/controller/change_controller.js

@@ -342,8 +342,8 @@ module.exports = app => {
                     whiteList,
                     auditList,
                     changeList,
-                    tpUnit: change.tp_decimal ? change.tp_decimal : ctx.tender.info.decimal.tp,
-                    upUnit: change.up_decimal ? change.up_decimal : ctx.tender.info.decimal.up,
+                    tpUnit: change.tp_decimal !== null ? change.tp_decimal : ctx.tender.info.decimal.tp,
+                    upUnit: change.up_decimal !== null ? change.up_decimal : ctx.tender.info.decimal.up,
                     authMobile: auth_mobile,
                     shenpiConst,
                 };
@@ -792,7 +792,7 @@ module.exports = app => {
                         responseData.data = await ctx.service.changeAuditList.batchAdd(data);
                         break;
                     case 'del':
-                        await ctx.service.changeAuditList.del(data.id);
+                        await ctx.service.changeAuditList.del(data);
                         break;
                     case 'update':
                         await ctx.service.changeAuditList.save(data.updateData);
@@ -803,7 +803,7 @@ module.exports = app => {
                         responseData.data = await ctx.service.changeAuditList.getList(ctx.change.cid);
                         break;
                     case 'ledger_list':
-                        await ctx.service.changeAuditList.saveLedgerListDatas(data.updateData);
+                        await ctx.service.changeAuditList.saveLedgerListDatas(data.updateData, data.postData);
                         // 取所有工料表
                         responseData.data = { changeList: await ctx.service.changeAuditList.getList(ctx.change.cid),
                             usedList: await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, ctx.change.cid) };
@@ -843,6 +843,13 @@ module.exports = app => {
                     case 'update_tp':
                         await ctx.service.change.saveInfo({ total_price: data.updateData });
                         break;
+                    case 'order_by':
+                        const result = await ctx.service.change.saveOrderBy(data.updateData, data.newLedgerList);
+                        responseData.data = result;
+                        break;
+                    case 'changeOrder':
+                        await ctx.service.changeAuditList.changeOrder(data.postData);
+                        break;
                     default: throw '参数有误';
                 }
 

+ 11 - 2
app/controller/material_controller.js

@@ -496,7 +496,7 @@ module.exports = app => {
                     const materialListData = await ctx.service.materialList.getMaterialData(ctx.tender.id, lastMaterial.id);
                     const hadBillsList = [];
                     for (const ml of materialListData) {
-                        const hb = _.find(hadBillsList, { gcl_id: ml.gcl_id, mb_id: ml.mb_id });
+                        const hb = _.find(hadBillsList, {gcl_id: ml.gcl_id, mb_id: ml.mb_id});
                         if (!hb) {
                             hadBillsList.push({
                                 gcl_id: ml.gcl_id,
@@ -509,9 +509,18 @@ module.exports = app => {
                     }
                     // 批量插入并修改is_new值
                     await ctx.service.materialListGcl.setData(lastMaterial.id, hadBillsList);
+                    // responseData.data.gclList = hadBillsList;
+                }
+                // } else {
+                // 判断是否是最新期,不是则获取的gclList是由materialList拼接而成,
+                if (lastMaterial.id === ctx.material.id) {
+                    const hadBillsList = await ctx.service.materialListGcl.getAllDataByCondition({ where: { tid: ctx.tender.id } });
                     responseData.data.gclList = hadBillsList;
                 } else {
-                    const hadBillsList = await ctx.service.materialListGcl.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+                    const materialList = await this.ctx.service.materialList.getAllDataByCondition({ where: { mid: ctx.material.id, is_self: 0 } });
+                    const hadBillsList = ctx.app._.unionWith(materialList, function(item1, item2) {
+                        return item1.gcl_id === item2.gcl_id && item1.mb_id === item2.mb_id;
+                    });
                     responseData.data.gclList = hadBillsList;
                 }
                 ctx.body = responseData;

+ 1 - 1
app/controller/report_controller.js

@@ -27,7 +27,7 @@ const needCustomTables = [
     'mem_material_sum_gl',
 ];
 
-const STD_COMP_STAMP_SIZE_WIDTH = Math.round(4.2 * 96 / 2.54); // 公章标准尺寸(宽4.2厘米)转成像素
+const STD_COMP_STAMP_SIZE_WIDTH = Math.round(5 * 96 / 2.54); // 公章标准尺寸(宽4.2厘米)转成像素
 const STD_COMP_STAMP_SIZE_HEIGHT = STD_COMP_STAMP_SIZE_WIDTH; // 公章标准尺寸(高4.2厘米)转成像素
 const NORMAL_SIGN_STR = 'normal_sign';
 const COMPANY_SIGN_STR = 'company_stamp';

+ 445 - 33
app/public/js/change_information_set.js

@@ -187,41 +187,185 @@ $(document).ready(() => {
             changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 9, cSum !== 0 ? cSum : null);
         },
         add: function () {
-            postData(window.location.pathname + '/save', {type: 'add'}, function (result) {
+            let select = null;
+            if (changeOrder) {
+                select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+            }
+            postData(window.location.pathname + '/save', {type: 'add', postData: select ? select.order : null}, function (result) {
                 if (result) {
-                    changeList.push(result);
-                    changeSpreadSheet.addRows(changeList.length - 1, 1);
-                    SpreadJsObj.reLoadRowData(changeSpreadSheet, changeList.length - 1);
+                    if (changeOrder === 1 && select) {
+                        // 批量更新changeList的order值
+                        _.forEach(changeList, function (item) {
+                            item.order = item.order > select.order ? item.order + 1 : item.order;
+                        });
+                        changeList.splice(select.order, 0, result);
+                        changeSpreadSheet.addRows(select.order, 1);
+                        SpreadJsObj.reLoadRowData(changeSpreadSheet, select.order);
+                        changeSpreadSheet.setSelection(select.order, 0, 1, 1);
+                        console.log(changeList);
+                    } else {
+                        changeList.push(result);
+                        changeSpreadSheet.addRows(changeList.length - 1, 1);
+                        SpreadJsObj.reLoadRowData(changeSpreadSheet, changeList.length - 1);
+                        changeSpreadSheet.setSelection(changeList.length - 1, 0, 1, 1);
+                    }
                     changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1);
-                    changeSpreadSheet.setSelection(changeList.length - 1, 0, 1, 1);
                     changeSpreadObj.resetXmjSpread();
+                    changeSpreadObj.refreshActn();
                 }
             });
         },
         batchAdd: function(num) {
-            postData(window.location.pathname + '/save', {type: 'batchadd', num}, function (result) {
+            let select = null;
+            if (changeOrder) {
+                select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+            }
+            postData(window.location.pathname + '/save', {type: 'batchadd', num, postData: select ? select.order : null}, function (result) {
                 if (result) {
-                    changeList = _.concat(changeList, result);
+                    changeList = result;
                     SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
                     changeSpreadObj.makeSjsFooter();
                     changeSpreadObj.resetXmjSpread();
+                    changeSpreadObj.refreshActn();
                 }
             });
         },
         del: function () {
-            const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
-            const index = changeList.indexOf(select);
-            if (index > -1 && !_.find(changeUsedData, { cbid: select.id })) {
-                postData(window.location.pathname + '/save', {type: 'del', id: select.id}, function (result) {
-                    changeList.splice(index, 1);
-                    changeSpreadSheet.deleteRows(index, 1);
+            const selection = changeSpreadSheet.getSelections();
+            const sel = selection ? selection[0] : changeSpreadSheet.getSelections()[0];
+            const row = sel && sel.row !== undefined ? sel.row : -1;
+            if (readOnly || row === -1 || sel.row + sel.rowCount > changeList.length) {
+                return false;
+            }
+            const delList = [];
+            let lastSelect = null;
+            let hadTaiZhang = false;
+            for (let r = 0; r < sel.rowCount; r++) {
+                const select = changeList[row + r];
+                if(!select || _.find(changeUsedData, { cbid: select.id })) {
+                    return false;
+                }
+                if (r === sel.rowCount - 1 && changeOrder) {
+                    lastSelect = select;
+                }
+                if (select.lid != 0) {
+                    hadTaiZhang = true;
+                }
+                delList.push(select.id);
+            }
+            console.log(lastSelect, delList);
+            if (delList.length) {
+                postData(window.location.pathname + '/save', {type: 'del', ids: delList, postData: lastSelect ? lastSelect.order : null}, function (result) {
+                    changeList.splice(row, delList.length);
+                    changeSpreadSheet.deleteRows(row, delList.length);
                     const sel = changeSpreadSheet.getSelections();
                     changeSpreadSheet.setSelection(0, 0, 1, 1);
                     changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
-                    if (select.lid != 0) {
+                    if (hadTaiZhang) {
                         tableDataRemake(changeListData);
                     }
                     changeSpreadObj.countSum();
+                    changeSpreadObj.refreshActn();
+                });
+            }
+            // const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+            // const index = changeList.indexOf(select);
+            // if (index > -1 && !_.find(changeUsedData, { cbid: select.id })) {
+                // postData(window.location.pathname + '/save', {type: 'del', id: select.id}, function (result) {
+                //     changeList.splice(index, 1);
+                //     changeSpreadSheet.deleteRows(index, 1);
+                //     const sel = changeSpreadSheet.getSelections();
+                //     changeSpreadSheet.setSelection(0, 0, 1, 1);
+                //     changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
+                //     if (select.lid != 0) {
+                //         tableDataRemake(changeListData);
+                //     }
+                //     changeSpreadObj.countSum();
+                //     changeSpreadObj.refreshActn();
+                // });
+            // }
+        },
+        upMove: function () {
+            const data = {
+                type: 'changeOrder',
+                postData: [],
+            };
+            const selection = changeSpreadSheet.getSelections();
+            const row = selection[0].row, count = selection[0].rowCount;
+            const first = changeSpreadSheet.zh_data[row];
+            if (!first) {
+                changeSpreadObj.refreshActn();
+                return false;
+            }
+            const pre = changeSpreadSheet.zh_data[row - 1], preUpdate = {id: pre.id};
+            for (let iRow = 0; iRow < count; iRow++) {
+                const posData = changeSpreadSheet.zh_data[iRow + row];
+                if (posData) {
+                    data.postData.push({id: posData.id, order: changeSpreadSheet.zh_data[iRow + row - 1].order});
+                    preUpdate.order = posData.order;
+                }
+            }
+            data.postData.push(preUpdate);
+            console.log(data);
+            if (data.postData.length > 0) {
+                postData(window.location.pathname + '/save', data, function () {
+                    _.forEach(data.postData, function (item) {
+                        const cl = _.find(changeList, { id: item.id });
+                        cl.order = item.order;
+                    });
+                    changeList.sort(function (a, b) {
+                        return a.order - b.order
+                    });
+                    SpreadJsObj.reLoadSheetData(changeSpreadSheet);
+                    changeSpreadObj.makeSjsFooter();
+                    const sel = selection[0];
+                    if (sel) {
+                        changeSpreadSheet.setSelection(changeSpreadSheet.zh_data.indexOf(first), sel.col, sel.rowCount, sel.colCount);
+                    }
+                    changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
+                    changeSpreadObj.refreshActn();
+                });
+            }
+        },
+        downMove: function () {
+            const data = {
+                type: 'changeOrder',
+                postData: [],
+            };
+            const selection = changeSpreadSheet.getSelections();
+            const row = selection[0].row, count = selection[0].rowCount;
+            const first = changeSpreadSheet.zh_data[row];
+            if (!first) {
+                changeSpreadObj.refreshActn();
+                return false;
+            }
+            const next = changeSpreadSheet.zh_data[row + count], nextUpdate = {id: next.id};
+            for (let iRow = count - 1; iRow >= 0; iRow--) {
+                const posData = changeSpreadSheet.zh_data[iRow + row];
+                if (posData) {
+                    data.postData.push({id: posData.id, order: changeSpreadSheet.zh_data[iRow + row + 1].order});
+                    nextUpdate.order = posData.order;
+                }
+            }
+            data.postData.push(nextUpdate);
+            console.log(data);
+            if (data.postData.length > 0) {
+                postData(window.location.pathname + '/save', data, function () {
+                    _.forEach(data.postData, function (item) {
+                        const cl = _.find(changeList, { id: item.id });
+                        cl.order = item.order;
+                    });
+                    changeList.sort(function (a, b) {
+                        return a.order - b.order
+                    });
+                    SpreadJsObj.reLoadSheetData(changeSpreadSheet);
+                    changeSpreadObj.makeSjsFooter();
+                    const sel = selection[0];
+                    if (sel) {
+                        changeSpreadSheet.setSelection(changeSpreadSheet.zh_data.indexOf(first), sel.col, sel.rowCount, sel.colCount);
+                    }
+                    changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
+                    changeSpreadObj.refreshActn();
                 });
             }
         },
@@ -244,6 +388,36 @@ $(document).ready(() => {
                 changeSpreadObj.del();
             }
             changeSpreadObj.resetXmjSpread(data);
+            changeSpreadObj.refreshActn();
+        },
+        refreshActn: function (rowCount = 1) {
+            const setObjEnable = function (obj, enable) {
+                if (enable) {
+                    obj.removeClass('disabled');
+                } else {
+                    obj.addClass('disabled');
+                }
+            };
+            // const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+            // 还需判断是否已被调差清单调用
+            const selection = changeSpreadSheet.getSelections();
+            const sel = selection ? selection[0] : changeSpreadSheet.getSelections()[0];
+            const row = sel ? sel.row : -1;
+            const first = changeList[row];
+            let last = first;
+            if (sel.rowCount > 1 && first) {
+                for (let r = 1; r < sel.rowCount; r++) {
+                    const rNode = changeList[sel.row + r];
+                    if (!rNode) break;
+                    last = rNode;
+                }
+            }
+            const preNode = changeList[row - 1];
+
+            setObjEnable($('#up-move'), !readOnly && first && preNode && changeList.indexOf(last) > 0 && sel.row + sel.rowCount <= changeList.length);
+            setObjEnable($('#down-move'), !readOnly && first && changeList.indexOf(last) < changeList.length - 1 && sel.row + sel.rowCount <= changeList.length);
+            // setObjEnable($('#open-list-modal'), !readOnly && select && changeList.indexOf(select) !== -1);
+            // setObjEnable($('#add-white-btn'), !readOnly && select && changeList.indexOf(select) !== -1);
         },
         deletePress: function (sheet) {
             return;
@@ -529,10 +703,13 @@ $(document).ready(() => {
         // filter.sortColumn(0, true);
         changeSpreadObj.makeSjsFooter();
         changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
+        changeSpreadObj.refreshActn();
     });
 
     if (!readOnly) {
         $('#add-white-btn').click(changeSpreadObj.add);
+        $('#up-move').click(changeSpreadObj.upMove);
+        $('#down-move').click(changeSpreadObj.downMove);
         changeSpread.bind(spreadNS.Events.EditEnded, changeSpreadObj.editEnded);
         changeSpread.bind(spreadNS.Events.SelectionChanged, changeSpreadObj.selectionChanged);
         changeSpread.bind(spreadNS.Events.ClipboardPasted, changeSpreadObj.clipboardPasted);
@@ -578,6 +755,9 @@ $(document).ready(() => {
                 'createList': {
                     name: '添加台账清单',
                     icon: 'fa-sign-in',
+                    visible: function () {
+                        return changeOrder === 0;
+                    },
                     callback: function (key, opt) {
                         $('#addlist').modal('show');
                     },
@@ -585,6 +765,9 @@ $(document).ready(() => {
                 'createAdd': {
                     name: '添加空白清单',
                     icon: 'fa-sign-in',
+                    visible: function () {
+                        return changeOrder === 0;
+                    },
                     callback: function (key, opt) {
                         changeSpreadObj.add(changeSpreadSheet);
                     },
@@ -594,6 +777,9 @@ $(document).ready(() => {
                     type: 'batchInsert',
                     value: '2',
                     icon: 'fa-sign-in',
+                    visible: function () {
+                        return changeOrder === 0;
+                    },
                     batchInsert: function (obj, root) {
                         if (_.toNumber(obj.value) > _.toNumber(obj.max)) {
                             obj.value = obj.max;
@@ -608,6 +794,81 @@ $(document).ready(() => {
                         }
                     },
                 },
+                'createList1': {
+                    name: '插入台账清单',
+                    icon: 'fa-sign-in',
+                    visible: function () {
+                        return changeOrder === 1;
+                    },
+                    // disabled: function (key, opt) {
+                    //     const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+                    //     const sel = changeSpreadSheet.getSelections()[0];
+                    //     changeSpreadObj.resetXmjSpread(select);
+                    //     // console.log(select, sel);
+                    //     if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) {
+                    //         return false;
+                    //     } else {
+                    //         return true;
+                    //     }
+                    // },
+                    callback: function (key, opt) {
+                        $('#addlist').modal('show');
+                    },
+                },
+                'createAdd1': {
+                    name: '插入空白清单',
+                    icon: 'fa-sign-in',
+                    visible: function () {
+                        return changeOrder === 1;
+                    },
+                    // disabled: function (key, opt) {
+                    //     const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+                    //     const sel = changeSpreadSheet.getSelections()[0];
+                    //     changeSpreadObj.resetXmjSpread(select);
+                    //     // console.log(select, sel);
+                    //     if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) {
+                    //         return false;
+                    //     } else {
+                    //         return true;
+                    //     }
+                    // },
+                    callback: function (key, opt) {
+                        changeSpreadObj.add(changeSpreadSheet);
+                    },
+                },
+                'batchInsert1': {
+                    name: '批量插入空白清单',
+                    type: 'batchInsert',
+                    value: '2',
+                    icon: 'fa-sign-in',
+                    visible: function () {
+                        return changeOrder === 1;
+                    },
+                    // disabled: function (key, opt) {
+                    //     const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+                    //     const sel = changeSpreadSheet.getSelections()[0];
+                    //     changeSpreadObj.resetXmjSpread(select);
+                    //     // console.log(select, sel);
+                    //     if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) {
+                    //         return false;
+                    //     } else {
+                    //         return true;
+                    //     }
+                    // },
+                    batchInsert: function (obj, root) {
+                        if (_.toNumber(obj.value) > _.toNumber(obj.max)) {
+                            obj.value = obj.max;
+                            toastr.warning('批量插入不可多于' + obj.max);
+                        } else if(_.toNumber(obj.value) < _.toNumber(obj.min)) {
+                            obj.value = obj.min;
+                            toastr.warning('批量插入不可少于' + obj.min);
+                        } else {
+                            // treeOperationObj.addNode(ledgerSpread.getActiveSheet(), parseInt(obj.value));
+                            changeSpreadObj.batchAdd(obj.value);
+                            root.$menu.trigger('contextmenu:hide');
+                        }
+                    },
+                },
                 'delete': {
                     name: '删除',
                     icon: 'fa-remove',
@@ -615,15 +876,29 @@ $(document).ready(() => {
                         changeSpreadObj.del(changeSpreadSheet);
                     },
                     disabled: function (key, opt) {
-                        const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
-                        const sel = changeSpreadSheet.getSelections()[0];
-                        changeSpreadObj.resetXmjSpread(select);
-                        // console.log(select, sel);
-                        if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1 && !_.find(changeUsedData, { cbid: select.id })) {
-                            return false;
-                        } else {
+                        // const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+                        // const sel = changeSpreadSheet.getSelections()[0];
+                        // changeSpreadObj.resetXmjSpread(select);
+                        // // console.log(select, sel);
+                        // if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1 && !_.find(changeUsedData, { cbid: select.id })) {
+                        //     return false;
+                        // } else {
+                        //     return true;
+                        // }
+                        const selection = changeSpreadSheet.getSelections();
+                        const sel = selection ? selection[0] : changeSpreadSheet.getSelections()[0];
+                        const row = sel && sel.row !== undefined ? sel.row : -1;
+                        if (readOnly || row === -1 || sel.row + sel.rowCount > changeList.length) {
                             return true;
                         }
+                        let isUsed = false;
+                        for (let r = 0; r < sel.rowCount; r++) {
+                            const select = changeList[row + r];
+                            if(!select || _.find(changeUsedData, { cbid: select.id })) {
+                                isUsed = true;
+                            }
+                        }
+                        return isUsed;
                     }
                 },
             }
@@ -637,6 +912,7 @@ $(document).ready(() => {
         $(this).addClass('table-warning');
         const isCheck = $(this).hasClass('table-success') ? true : false;
         const data_bwmx = $(this).attr('data-bwmx').split('$#$');
+        const data_charu = $(this).attr('data-charu') ? $(this).attr('data-charu').split('$#$') : [];
         const isDeal = $(this).data('gcl') !== undefined ? true : false;
         let codeHtml = '<tr quantity="'+ $(this).children('td').eq(5).text() +'" gcl_id="" mx_id=""><td class="text-center">1</td><td colspan="7" class="colspan_1">&nbsp;</td><td class="colspan_2"><input type="checkbox"></td></tr>';
         if (isDeal) {
@@ -653,15 +929,15 @@ $(document).ready(() => {
                 const gcl_id = leaf.gcl_id ? leaf.gcl_id : '';
                 const mx_id = leaf.mx_id ? leaf.mx_id : '';
                 const bwmx = leaf.bwmx !== undefined ? leaf.bwmx : (gcl.leafXmjs.length > 1 && gcl.name ? gcl.name : undefined);
-                const isChecked = data_bwmx.indexOf(
-                    leaf.code + '!_!' + (leaf.jldy ? leaf.jldy : '') + '!_!' +
+                const pushMsg = leaf.code + '!_!' + (leaf.jldy ? leaf.jldy : '') + '!_!' +
                     (leaf.dwgc ? leaf.dwgc : '') + '!_!' + (leaf.fbgc ? leaf.fbgc : '') + '!_!' + (leaf.fxgc ? leaf.fxgc : '')
                     + '!_!' + (leaf.gcl_id ? leaf.gcl_id : '0') + '!_!' + (leaf.mx_id ? leaf.mx_id : '') + '!_!' +
-                    (bwmx !== undefined ? bwmx : leaf.jldy ? leaf.jldy : '') + '*;*' + quantity) !== -1 && isCheck ?
-                    'checked' : '';
+                    (bwmx !== undefined ? bwmx : leaf.jldy ? leaf.jldy : '') + '*;*' + quantity;
+                const isChecked = data_bwmx.indexOf(pushMsg) !== -1 && isCheck ? 'checked ' : '';
                 const existGcl = _.find(changeList, {gcl_id: leaf.gcl_id, bwmx: (bwmx ? bwmx : leaf.jldy ? leaf.jldy : ''), oamount: leaf.quantity});
                 const isUsed = existGcl ? _.find(changeUsedData, { cbid: existGcl.id }) : null;
-                const isDisabled = isUsed ? 'disabled ' : '';
+                const isOldChaRu = changeOrder && isChecked && data_charu.indexOf(pushMsg) === -1;
+                const isDisabled = isUsed || isOldChaRu ? 'disabled ' : '';
                 codeHtml += '<tr quantity="' + quantity + '" gcl_id="' + gcl_id + '" mx_id="' + mx_id + '">' +
                     '<td class="text-center">' + (index+1) + (leaf.cid ? '<i class="text-danger" style="font-weight: 900">*</i>' : '') + '</td>' +
                     '<td>' + leaf.code + '</td>' +
@@ -676,7 +952,10 @@ $(document).ready(() => {
                 searchCodeList.push(leaf.code + '|!|' + (leaf.jldy ? leaf.jldy: '') + '|!|' + (bwmx !== undefined ? bwmx : ''));
             }
         } else if (!isDeal && isCheck) {
-            codeHtml = '<tr quantity="'+ $(this).children('td').eq(5).text() +'" gcl_id="" mx_id=""><td class="text-center">1</td><td colspan="7" class="colspan_1">&nbsp;</td><td class="colspan_2"><input type="checkbox" checked></td></tr>';
+            const pushMsg = '0*;*' + $(this).children('td').eq(5).text();
+            const isChecked = data_bwmx.indexOf(pushMsg) !== -1 && isCheck ? 'checked ' : '';
+            const isDisabeld = changeOrder && isChecked && data_charu.indexOf(pushMsg) === -1 ? 'disabled ' : '';
+            codeHtml = '<tr quantity="'+ $(this).children('td').eq(5).text() +'" gcl_id="" mx_id=""><td class="text-center">1</td><td colspan="7" class="colspan_1">&nbsp;</td><td class="colspan_2"><input type="checkbox" ' + isChecked + isDisabeld +'></td></tr>';
         }
         $('#code-list').attr('data-index', parseInt($(this).children('td').eq(0).text()));
         $('#code-input').val('');
@@ -688,6 +967,7 @@ $(document).ready(() => {
     // 右边项目节选择
     $('body').on('click', '#code-list input', function () {
         let index = $('#code-list').attr('data-index');
+        // 判断是否是自定义排序,是则另外保存一份到tr中,和data-bwmx不相通,最后提交再清除所有的data-charu清单
         if ($(this).is(':checked')) {
             // 去除其它可能已选的checked
             // $('#code-list input').prop('checked', false);
@@ -696,6 +976,7 @@ $(document).ready(() => {
             $('#table-list-select tr[data-index="' + index + '"]').addClass('table-success');
             // 去除部分data-detail值
             let data_bwmx = [];
+            let data_charu = [];
             $('#code-list input:checked').each(function () {
                 const tr = $(this).parents('tr');
                 const length = tr.children('td').length;
@@ -711,14 +992,22 @@ $(document).ready(() => {
                 const quantity = tr.attr('quantity');
                 const de_qu = bwmx + '*;*' + quantity;
                 data_bwmx.push(de_qu);
+                if (changeOrder && $(this).prop('disabled') !== true) {
+                    data_charu.push(de_qu);
+                }
             });
             data_bwmx = data_bwmx.join('$#$');
             $('#table-list-select tr[data-index="' + index + '"]').attr('data-bwmx', data_bwmx);
+            if (changeOrder) {
+                data_charu = data_charu.join('$#$');
+                $('#table-list-select tr[data-index="' + index + '"]').attr('data-charu', data_charu);
+            }
         } else {
             // 判断还有无选中项目节编号
             if ($('#code-list input').is(':checked')) {
                 // 去除部分data-detail值
                 let data_bwmx = [];
+                let data_charu = [];
                 $('#code-list input:checked').each(function () {
                     const tr = $(this).parents('tr');
                     const length = tr.children('td').length;
@@ -734,12 +1023,22 @@ $(document).ready(() => {
                     const quantity = tr.attr('quantity');
                     const de_qu = bwmx + '*;*' + quantity;
                     data_bwmx.push(de_qu);
+                    if (changeOrder && $(this).prop('disabled') !== true) {
+                        data_charu.push(de_qu);
+                    }
                 });
                 data_bwmx = data_bwmx.join('$#$');
                 $('#table-list-select tr[data-index="' + index + '"]').attr('data-bwmx', data_bwmx);
+                if (changeOrder) {
+                    data_charu = data_charu.join('$#$');
+                    $('#table-list-select tr[data-index="' + index + '"]').attr('data-charu', data_charu);
+                }
             } else {
                 $('#table-list-select tr[data-index="' + index + '"]').removeClass('table-success');
                 $('#table-list-select tr[data-index="' + index + '"]').attr('data-bwmx', '');
+                if (changeOrder) {
+                    $('#table-list-select tr[data-index="' + index + '"]').attr('data-charu', '');
+                }
             }
         }
         checkSelectAll();
@@ -747,17 +1046,30 @@ $(document).ready(() => {
 
     // 添加空白清单or签约清单
     $('.add-list-btn').on('click', function () {
+        let select = null;
+        if (changeOrder) {
+            select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+        }
         const newLedgerList = remakeChangeSpread();
+        console.log(newLedgerList, select);
         // 更新至服务器
-        postData(window.location.pathname + '/save', { type:'ledger_list', updateData: newLedgerList }, function (result) {
+        postData(window.location.pathname + '/save', { type:'ledger_list', updateData: newLedgerList, postData: select ? select.order : null }, function (result) {
             changeList = result.changeList;
             changeUsedData = result.usedList;
             SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
             changeSpreadObj.makeSjsFooter();
             const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
             changeSpreadObj.resetXmjSpread(select);
+            changeSpreadObj.refreshActn();
+            $('#table-list-select tr').attr('data-charu', '');
+            if(changeOrder) {
+                $('#code-list input:checked').each(function () {
+                    $(this).attr('disabled', true);
+                })
+            }
             $('#addlist').modal('hide');
         }, function () {
+            $('#table-list-select tr').attr('data-charu', '');
             $('#addlist').modal('hide');
         });
 
@@ -823,12 +1135,40 @@ $(document).ready(() => {
     });
     $('#list-input').on('blur', function () {
         const select = parseInt($('#select-list').val());
-        const value = $(this).val();
+        const value = _.trim($(this).val());
+        const valueList = _.slice(_.without(_.uniq(value.split(' ')), ''), 0, 10);
+        console.log(valueList);
+        // 判断是否存在多个分词,以换行或空格分隔,多个则显示左侧菜单
+        if (value !== '' && valueList.length > 1) {
+            if (_.without(_.uniq(value.split(' ')), '').length > 10) {
+                toastr.warning('最多筛选以空格分割的前10个不重复关键词');
+            }
+            $('#table-list').addClass('col-9').removeClass('col-12');
+            $('#table-list').siblings('.col-3').show();
+            $('#list-search-keyword').html('<a href="javascript:void(0);" data-keyword="" class="list-group-item list-group-item-action active">全部</a>');
+            for (const v of valueList) {
+                $('#list-search-keyword').append(`<a href="javascript:void(0);" data-keyword="${v}" class="list-group-item list-group-item-action">${v}</a>`);
+            }
+        } else {
+            $('#table-list').addClass('col-12').removeClass('col-9');
+            $('#table-list').siblings('.col-3').hide();
+            $('#list-search-keyword').html('<a href="javascript:void(0);" data-keyword="" class="list-group-item list-group-item-action active">全部</a>');
+        }
         let showListData = changeListData;
         if (select === 1 && value !== '') {
             $(this).siblings('a').show();
             showListData = _.filter(changeListData, function (c) {
-                return ((c.code && c.code.indexOf(value) !== -1) || (c.name && c.name.indexOf(value) !== -1)) && c.cid;
+                let flag = false;
+                if (c.cid) {
+                    for(const v of valueList) {
+                        if ((c.code && c.code.indexOf(v) !== -1) || (c.name && c.name.indexOf(v) !== -1)) {
+                            flag = true;
+                            break;
+                        }
+                    }
+                }
+                return flag;
+                // return ((c.code && c.code.indexOf(value) !== -1) || (c.name && c.name.indexOf(value) !== -1)) && c.cid;
             });
         } else if (select === 1 && value === '') {
             $(this).siblings('a').hide();
@@ -838,7 +1178,15 @@ $(document).ready(() => {
         } else if (value !== '') {
             $(this).siblings('a').show();
             showListData = _.filter(changeListData, function (c) {
-                return (c.code && c.code.indexOf(value) !== -1) || (c.name && c.name.indexOf(value) !== -1);
+                let flag = false;
+                for(const v of valueList) {
+                    if ((c.code && c.code.indexOf(v) !== -1) || (c.name && c.name.indexOf(v) !== -1)) {
+                        flag = true;
+                        break;
+                    }
+                }
+                return flag;
+                // return (c.code && c.code.indexOf(value) !== -1) || (c.name && c.name.indexOf(value) !== -1);
             });
         } else {
             $(this).siblings('a').hide();
@@ -850,6 +1198,29 @@ $(document).ready(() => {
         $('#code-list').html('');
         $('#code-select-all').prop('checked', false);
     });
+    // 检索关键字切换
+    $('body').on('click', '#list-search-keyword a', function () {
+        if (!$(this).hasClass('active')) {
+            const keyword = $(this).attr('data-keyword');
+            console.log(keyword);
+            $(this).siblings().removeClass('active');
+            $(this).addClass('active');
+            if (keyword === '') {
+                $('#list-input').blur();
+            } else {
+                const select = parseInt($('#select-list').val());
+                const showListData = _.filter(changeListData, function (c) {
+                    return ((c.code && c.code.indexOf(keyword) !== -1) || (c.name && c.name.indexOf(keyword) !== -1)) && (select === 1 ? c.cid : 1);
+                });
+                makeListTable(changeListData, showListData);
+                $('#table-list-select tr').removeClass('table-warning');
+                $('#code-input').val('');
+                $('#code-input').siblings('a').hide();
+                $('#code-list').html('');
+                $('#code-select-all').prop('checked', false);
+            }
+        }
+    });
     // 回车提交
     $('#code-input').on('keypress', function () {
         if(window.event.keyCode === 13) {
@@ -881,6 +1252,10 @@ $(document).ready(() => {
             makeListTable(changeListData, showListData);
             $('#table-list-select tr').removeClass('table-warning');
             $('#code-list').html('');
+            $('#table-list').addClass('col-12').removeClass('col-9');
+            $('#table-list').siblings('.col-3').hide();
+            $('#list-search-keyword').html('');
+            $('#list-search-keyword').siblings('a').addClass('active');
         } else {
             makeCodeTable();
         }
@@ -908,6 +1283,7 @@ $(document).ready(() => {
             if ($('#code-list input').is(':checked')) {
                 // 去除部分data-detail值
                 let data_bwmx = [];
+                let data_charu = [];
                 $('#code-list input:checked').each(function () {
                     const tr = $(this).parents('tr');
                     const length = tr.children('td').length;
@@ -923,13 +1299,23 @@ $(document).ready(() => {
                     const quantity = tr.attr('quantity');
                     const de_qu = bwmx + '*;*' + quantity;
                     data_bwmx.push(de_qu);
+                    if (changeOrder && $(this).prop('disabled') !== true) {
+                        data_charu.push(de_qu);
+                    }
                 });
                 data_bwmx = data_bwmx.join('$#$');
                 $('#table-list-select tr[data-index="' + index + '"]').attr('data-bwmx', data_bwmx);
+                if (changeOrder) {
+                    data_charu = data_charu.join('$#$');
+                    $('#table-list-select tr[data-index="' + index + '"]').attr('data-charu', data_charu);
+                }
                 $('#table-list-select tr[data-index="' + index + '"]').addClass('table-success');
             } else {
                 $('#table-list-select tr[data-index="' + index + '"]').removeClass('table-success');
                 $('#table-list-select tr[data-index="' + index + '"]').attr('data-bwmx', '');
+                if (changeOrder) {
+                    $('#table-list-select tr[data-index="' + index + '"]').attr('data-charu', '');
+                }
             }
         }
     });
@@ -1002,6 +1388,31 @@ $(document).ready(() => {
         }
         toastr.success('已还原到上次保存状态');
     });
+
+    $('.dropdown-menu input[name="paixu"]').on('click', function () {
+        const newChangeOrder = parseInt($(this).val());
+        if (newChangeOrder !== changeOrder) {
+            const newLedgerList = changeOrder ? remakeChangeSpread(0) : [];
+            // 更新至服务器
+            postData(window.location.pathname + '/save', { type:'order_by', updateData: newChangeOrder, newLedgerList }, function (result) {
+                if (newChangeOrder === 0) {
+                    $('#bpaixu').text('清单排序:清单编号');
+                    $('#upAndMoveBtn').attr('style', 'display: none !important');
+                    $('.order_text').text('添加');
+                    changeOrder = newChangeOrder;
+                } else if (newChangeOrder === 1) {
+                    $('#bpaixu').text('清单排序:添加顺序');
+                    $('#upAndMoveBtn').show();
+                    $('.order_text').text('插入');
+                    changeOrder = newChangeOrder;
+                }
+                changeList = result;
+                SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
+                changeSpreadObj.makeSjsFooter();
+                changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
+            });
+        }
+    });
 });
 function checkSelectAll() {
     let check = $('#code-list tr').length > 0 ? true : false;
@@ -1072,6 +1483,7 @@ function tableDataRemake(changeListData) {
     $('#table-list-select tr').removeClass('table-warning');
     $('#table-list-select tr').removeClass('table-success');
     $('#table-list-select tr').attr('data-bwmx', '');
+    $('#table-list-select tr').attr('data-charu', '');
     $('#code-list').html('');
     $('#code-list').attr('data-index', '');
     $('#code-input').val('');
@@ -1274,7 +1686,7 @@ function makeCodeTable(search = '') {
     }
 }
 
-function remakeChangeSpread() {
+function remakeChangeSpread(cOrder = changeOrder) {
     const newTableList = [];
     // 获取选中的签约清单判断并插入到原有清单中
     $('#table-list-select .table-success').each(function(){
@@ -1293,7 +1705,7 @@ function remakeChangeSpread() {
         let lid = $(this).data('lid');
         let lindex = $(this).data('index');
         // 原清单和数量改变
-        let data_bwmx = $(this).attr('data-bwmx').split('$#$');
+        let data_bwmx = cOrder ? ($(this).attr('data-charu') ? $(this).attr('data-charu').split('$#$') : []) : $(this).attr('data-bwmx').split('$#$');
 
         for (const b of data_bwmx) {
             const oamount = b.split('*;*')[1] != '' ? b.split('*;*')[1] : 0;

+ 9 - 9
app/public/js/material_list.js

@@ -41,10 +41,10 @@ function getMpSpreadByMBData(id) {
     return info ? info.m_spread : 0;
 }
 
-function getMaterialListByLeafXmj(gcl_id, xmj_id, mx_id = null) {
+function getMaterialListByLeafXmj(gcl_id, xmj_id, mx_id = '') {
     const list = [];
     for (const ml of materialListData) {
-        if (gcl_id === ml.gcl_id && xmj_id === ml.xmj_id && (mx_id === null || mx_id === ml.mx_id)) {
+        if (gcl_id === ml.gcl_id && xmj_id === ml.xmj_id && (mx_id === '' || mx_id === ml.mx_id)) {
             list.push(ml);
         }
     }
@@ -224,7 +224,7 @@ $(document).ready(() => {
                     indent: 16,
                     getColor: function (index, data) {
                         if (!data) return;
-                        if (_.findIndex(selfList, { gcl_id: data.gcl_id, xmj_id: data.id, mx_id: (data.mx_id ? data.mx_id : null) }) !== -1) {
+                        if (_.findIndex(selfList, { gcl_id: data.gcl_id, xmj_id: data.id, mx_id: (data.mx_id ? data.mx_id : '') }) !== -1) {
                             return '#dc3545';
                         }
                     }
@@ -484,7 +484,7 @@ $(document).ready(() => {
             const xmj = leafXmjs[iLXmjRow];
             console.log(xmj, iLXmjRow);
             materialListSelf = [];
-            if (_.findIndex(selfList, { gcl_id: xmj.gcl_id, xmj_id: xmj.id, mx_id: (xmj.mx_id ? xmj.mx_id : null) }) != -1) {
+            if (_.findIndex(selfList, { gcl_id: xmj.gcl_id, xmj_id: xmj.id, mx_id: (xmj.mx_id ? xmj.mx_id : '') }) != -1) {
                 for (const m of materialListData) {
                     if (m.gcl_id === xmj.gcl_id && m.xmj_id === xmj.id && ((xmj.mx_id !==undefined && m.mx_id === xmj.mx_id) || xmj.mx_id === undefined)) {
                         materialListSelf.push(m);
@@ -582,7 +582,7 @@ $(document).ready(() => {
                 const data = {
                     xmj_id: xmj.id,
                     gcl_id: xmj.gcl_id,
-                    mx_id: xmj.mx_id ? xmj.mx_id : null,
+                    mx_id: xmj.mx_id ? xmj.mx_id : '',
                     gather_qty: xmj.gather_qty,
                     is_join: notx === undefined ? 1 : 0,
                 };
@@ -617,7 +617,7 @@ $(document).ready(() => {
             const data = {
                 xmj_id: xmj.id,
                 gcl_id: xmj.gcl_id,
-                mx_id: xmj.mx_id ? xmj.mx_id : null,
+                mx_id: xmj.mx_id ? xmj.mx_id : '',
                 mb_id: mb_id,
                 gather_qty: xmj.gather_qty,
                 is_join: notx === undefined ? 1 : 0,
@@ -809,7 +809,7 @@ $(document).ready(() => {
                     const data = {
                         xmj_id: xmj.id,
                         gcl_id: xmj.gcl_id,
-                        mx_id: xmj.mx_id ? xmj.mx_id : null,
+                        mx_id: xmj.mx_id ? xmj.mx_id : '',
                     };
                     datas.push(data);
                 }
@@ -911,7 +911,7 @@ $(document).ready(() => {
                         const data = {
                             xmj_id: xmj.id,
                             gcl_id: xmj.gcl_id,
-                            mx_id: xmj.mx_id ? xmj.mx_id : null,
+                            mx_id: xmj.mx_id ? xmj.mx_id : '',
                         };
                         datas.push(data);
                     }
@@ -1040,7 +1040,7 @@ $(document).ready(() => {
                     const data2 = {
                         xmj_id: xmj.id,
                         gcl_id: xmj.gcl_id,
-                        mx_id: xmj.mx_id ? xmj.mx_id : null,
+                        mx_id: xmj.mx_id ? xmj.mx_id : '',
                     };
                     datas.push(data2);
                 }

+ 4 - 1
app/public/js/tender_list_manage.js

@@ -363,7 +363,10 @@ function bindTenderUrl() {
     });
     // 删除
     $('body').on('click', '.c-body a[name=del]', function () {
-        $('#del-bd-ok').attr('tid', $(this).parent().attr('tid'));
+        const tid = parseInt($(this).parent().attr('tid'));
+        const tender = _.find(tenders, {id: tid});
+        $('#del-bd-ok').attr('tid', tid);
+        $('#del-tender-name').text(tender.name);
         $('#del-bd').modal('show');
     });
 }

+ 12 - 2
app/public/report/js/jpc_output.js

@@ -352,7 +352,12 @@ let JpcCanvasOutput = {
                 const isCloseOutput = _chkIfCloseOutput(control, values.length, area, dftFontHeight);
                 let closeTopOffset = 0;
                 if (isCloseOutput) {
-                    closeTopOffset = (height - (dftFontHeight + 4) * values.length) / 2;
+                    closeTopOffset = (height - (dftFontHeight + 4) * values.length) / 2; // 默认居中对齐
+                    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'top') {
+                        closeTopOffset = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+                    } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+                        closeTopOffset = height - (dftFontHeight + 4) * values.length - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
+                    }
                 }
                 for (let i = 0; i < values.length; i++) {
                     // area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + me.offsetY + restTopH;
@@ -445,7 +450,12 @@ let JpcCanvasOutput = {
                 };
             } else if (cell.path) {
                 const img = new Image();
-                img.src = cell.path;
+                // img.src = cell.path;
+                if (cell.path.indexOf(OSS_PATH) < 0 && cell.path[0] !== '/') {
+                    img.src = OSS_PATH + cell.path;
+                } else {
+                    img.src = cell.path;
+                }
                 img.crossOrigin = 'anonymous';
                 img.onload = function() {
                     private_drawImage(cell, control, img, (!!cell.isStamp));

+ 1 - 1
app/public/report/js/rpt_jsexcel.js

@@ -8,7 +8,7 @@
 // const strUtil = require('../public/stringUtil'); // stringUtil对象也有
 const DPI = 96;
 const dftHeadXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
-const STD_COMP_STAMP_SIZE_WIDTH = Math.round(4.2 * 96 / 2.54); // 公章标准尺寸(宽4.2厘米)转成像素
+const STD_COMP_STAMP_SIZE_WIDTH = Math.round(5 * 96 / 2.54); // 公章标准尺寸(宽4.2厘米)转成像素
 const STD_COMP_STAMP_SIZE_HEIGHT = STD_COMP_STAMP_SIZE_WIDTH; // 公章标准尺寸(高4.2厘米)转成像素
 
 

+ 6 - 1
app/public/report/js/rpt_jspdf.js

@@ -377,7 +377,12 @@ let JpcJsPDFHelper = {
                 const isCloseOutput = _chkIfCloseOutput(control, values.length, area, dftFontHeight);
                 let closeTopOffset = 0;
                 if (isCloseOutput) {
-                    closeTopOffset = (height - (dftFontHeight + 4) * values.length) / 2;
+                    closeTopOffset = (height - (dftFontHeight + 4) * values.length) / 2; // 默认居中对齐
+                    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'top') {
+                        closeTopOffset = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+                    } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+                        closeTopOffset = height - (dftFontHeight + 4) * values.length - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
+                    }
                 }
                 // if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_CLOSE_OUTPUT]] === 'T') {
                 //     ah = (parseFloat(font[JV.FONT_PROPS[1]]) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]) * values.length;

+ 8 - 2
app/public/report/js/rpt_print.js

@@ -491,7 +491,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
             let innerDftFontHeight = (dftFontHeight * 3 / 4); //SVG的字体与canvas的字体大小的切换, 不用考虑取整
             if (control) {
                 if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
-                    y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
+                    // y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
+                    y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + innerDftFontHeight + JV.OUTPUT_OFFSET[JV.IDX_TOP] + 2; // 向上对齐
                 } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
                     y = innerArea[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
                 } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {
@@ -565,7 +566,12 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     const isCloseOutput = _chkIfCloseOutput(control, values.length, area, orgFontHeight);
     let closeTopOffset = 0;
     if (isCloseOutput) {
-        closeTopOffset = (height - (orgFontHeight + 4) * values.length) / 2;
+        closeTopOffset = (height - (orgFontHeight + 4) * values.length) / 2; // 默认居中对齐
+        if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'top') {
+            closeTopOffset = JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === 'bottom') {
+            closeTopOffset = height - (orgFontHeight + 4) * values.length - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
+        }
     }
     for (let vidx = 0; vidx < values.length; vidx++) {
         // area[JV.IDX_TOP] = top + vidx * (ah / values.length) + restTopH;

+ 82 - 59
app/public/report/js/rpt_signature.js

@@ -8,8 +8,8 @@ const DFT_ROLE_NAME = '';
 const NORMAL_SIGN_STR = 'normal_sign';
 const COMPANY_SIGN_STR = 'company_stamp';
 const PRIVATE_SIGN_STR = 'private_stamp';
-const STD_STAMP_SIZE_WIDTH = 4.2 * 96 / 2.54;   // 公章大小:宽度(4.2CM)
-const STD_STAMP_SIZE_HEIGHT = 4.2 * 96 / 2.54;  // 公章大小:高度(4.2CM)
+const STD_STAMP_SIZE_WIDTH = 5 * 96 / 2.54;   // 公章大小:宽度(5 CM)
+const STD_STAMP_SIZE_HEIGHT = 5 * 96 / 2.54;  // 公章大小:高度(5 CM)
 
 let rptSignatureHelper = {
     currentSelectedESignAccDom: null,
@@ -553,7 +553,7 @@ let rptSignatureHelper = {
                     rptSignatureHelper.originalRoleRelList = me._parseRoleRelList(result.signatureRelInfo[0].rel_content);
                     if (current_stage_status === 3) {
                         rptSignatureHelper.mergeSignDate(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST, true);
-                        rptSignatureHelper.mergeSignature(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST);
+                        rptSignatureHelper.mergeSignature(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST, true);
                         await rptSignatureHelper.resetDummySignature(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST); // 这里重新整理签章坐标信息(因签章大小在后台暂时获取不到,挪到前端处理)
                         rptSignatureHelper.mergeSignAudit(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST, STAGE_AUDIT);
                         zTreeOprObj.showPage(zTreeOprObj.currentPage, zTreeOprObj.canvas);
@@ -666,6 +666,11 @@ let rptSignatureHelper = {
             if (page.signature_cells) {
                 const adHocScells = [];
                 for (const sCell of page.signature_cells) {
+                    if (sCell.signature_name.indexOf(JV.SIGNATURE_NAME_DUMMY) < 0) {
+                        sCell.path = null;
+                        sCell.pre_path = null;
+                        sCell.pic = null;
+                    }
                     for (const role_rel of currRoleRelList) {
                         if (role_rel.signature_name === sCell.signature_name) {
                             // 处理签章
@@ -673,8 +678,6 @@ let rptSignatureHelper = {
                                 role_rel.sign_output = [];
                                 role_rel.sign_output.push(NORMAL_SIGN_STR);
                             }
-                            sCell.path = null;
-                            sCell.pre_path = null;
                             for (const signType of role_rel.sign_output) {
                                 switch (signType) {
                                     case NORMAL_SIGN_STR:
@@ -1070,60 +1073,80 @@ function resetTextSignature(pageData) {
 function _resetStampArea(ctrl, stampCell, roleRelItem) {
     let pLeft = stampCell.orgArea.Left,
         pTop = stampCell.orgArea.Top;
-    let std_stamp_size_width = STD_STAMP_SIZE_WIDTH, std_stamp_size_height = STD_STAMP_SIZE_HEIGHT;
-    if (roleRelItem.stampFeature) {
-        std_stamp_size_width = parseFloat(roleRelItem.stampFeature.ImageWidth.value);
-        std_stamp_size_height = parseFloat(roleRelItem.stampFeature.ImageHeight.value);
-    }
-    switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]]) {
-        case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_LEFT]:
-            pLeft = stampCell.orgArea.Left;
-            break;
-        case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_CENTER]:
-            pLeft = (stampCell.orgArea.Left + stampCell.orgArea.Right - std_stamp_size_width) / 2;
-            break;
-        case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_RIGHT]:
-            pLeft = stampCell.orgArea.Right - std_stamp_size_width;
-            break;
-        default:break;
-    }
-    switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]]) {
-        case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_TOP]:
-            pTop = stampCell.orgArea.Top;
-            break;
-        case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_CENTER]:
-            pTop = (stampCell.orgArea.Top + stampCell.orgArea.Bottom - std_stamp_size_height) / 2;
-            break;
-        case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_BOTTOM]:
-            pTop = stampCell.orgArea.Bottom - std_stamp_size_height;
-            break;
-        default:break;
-    }
-    stampCell.area.Left = pLeft;
-    stampCell.area.Top = pTop;
-    stampCell.area.Right = pLeft + std_stamp_size_width;
-    stampCell.area.Bottom = pTop + std_stamp_size_height;
-    // 最后一步,如超过报表范围,则要调整坐标
-    const maxRect = stampCell.maxRect;
-    if (stampCell.area.Left < maxRect[0]) {
-        const width = maxRect[0] - stampCell.area.Left;
-        stampCell.area.Left += width;
-        stampCell.area.Right += width;
-    }
-    if (stampCell.area.Top < maxRect[1]) {
-        const height = maxRect[1] - stampCell.area.Top;
-        stampCell.area.Top += height;
-        stampCell.area.Bottom += height;
-    }
-    if (stampCell.area.Right > maxRect[2]) {
-        const width = maxRect[2] - stampCell.area.Right; // 负
-        stampCell.area.Left += width;
-        stampCell.area.Right += width;
-    }
-    if (stampCell.area.Bottom > maxRect[3]) {
-        const height = maxRect[3] - stampCell.area.Bottom;
-        stampCell.area.Top += height;
-        stampCell.area.Bottom += height;
+    if (roleRelItem.stampFeature !== 'not found!') {
+        let std_stamp_size_width = STD_STAMP_SIZE_WIDTH, std_stamp_size_height = STD_STAMP_SIZE_HEIGHT;
+        let widthRate = 1, heightRate = 1;
+        if (roleRelItem.stampFeature) {
+            std_stamp_size_width = parseFloat(roleRelItem.stampFeature.ImageWidth.value);
+            std_stamp_size_height = parseFloat(roleRelItem.stampFeature.ImageHeight.value);
+            if (roleRelItem.stampFeature.ImageWidth.value !== roleRelItem.stampFeature.ImageHeight.value) {
+                //设置比例
+                if (std_stamp_size_width > std_stamp_size_height) {
+                    heightRate = std_stamp_size_height / std_stamp_size_width;
+                } else {
+                    widthRate = std_stamp_size_width / std_stamp_size_height;
+                }
+            }
+            if (std_stamp_size_width > STD_STAMP_SIZE_WIDTH || std_stamp_size_height > STD_STAMP_SIZE_HEIGHT) {
+                if (widthRate === 1) {
+                    std_stamp_size_width = Math.min(std_stamp_size_width, STD_STAMP_SIZE_WIDTH);
+                    std_stamp_size_height = std_stamp_size_width * heightRate;
+                } else {
+                    std_stamp_size_height = Math.min(std_stamp_size_height, STD_STAMP_SIZE_HEIGHT);
+                    std_stamp_size_width = std_stamp_size_height * widthRate;
+                }
+            }
+        }
+        switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]]) {
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_LEFT]:
+                pLeft = stampCell.orgArea.Left;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_CENTER]:
+                pLeft = (stampCell.orgArea.Left + stampCell.orgArea.Right - std_stamp_size_width) / 2;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_RIGHT]:
+                pLeft = stampCell.orgArea.Right - std_stamp_size_width;
+                break;
+            default:break;
+        }
+        switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]]) {
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_TOP]:
+                pTop = stampCell.orgArea.Top;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_CENTER]:
+                pTop = (stampCell.orgArea.Top + stampCell.orgArea.Bottom - std_stamp_size_height) / 2;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_BOTTOM]:
+                pTop = stampCell.orgArea.Bottom - std_stamp_size_height;
+                break;
+            default:break;
+        }
+        stampCell.area.Left = pLeft;
+        stampCell.area.Top = pTop;
+        stampCell.area.Right = pLeft + std_stamp_size_width;
+        stampCell.area.Bottom = pTop + std_stamp_size_height;
+        // 最后一步,如超过报表范围,则要调整坐标
+        const maxRect = stampCell.maxRect;
+        if (stampCell.area.Left < maxRect[0]) {
+            const width = maxRect[0] - stampCell.area.Left;
+            stampCell.area.Left += width;
+            stampCell.area.Right += width;
+        }
+        if (stampCell.area.Top < maxRect[1]) {
+            const height = maxRect[1] - stampCell.area.Top;
+            stampCell.area.Top += height;
+            stampCell.area.Bottom += height;
+        }
+        if (stampCell.area.Right > maxRect[2]) {
+            const width = maxRect[2] - stampCell.area.Right; // 负
+            stampCell.area.Left += width;
+            stampCell.area.Right += width;
+        }
+        if (stampCell.area.Bottom > maxRect[3]) {
+            const height = maxRect[3] - stampCell.area.Bottom;
+            stampCell.area.Top += height;
+            stampCell.area.Bottom += height;
+        }
     }
 }
 

+ 42 - 0
app/service/change.js

@@ -696,6 +696,48 @@ module.exports = app => {
         }
 
         /**
+         * 保存变更信息
+         * @param {int} order_by - 表单提交的数据
+         * @return {void}
+         */
+        async saveOrderBy(order_by, newLedgerList = []) {
+            const transaction = await this.db.beginTransaction();
+            let result = [];
+            try {
+                const postData = { order_by };
+                let changeList = await this.ctx.service.changeAuditList.getList(this.ctx.change.cid);
+                if (order_by) {
+                    let i = 1;
+                    const updateArray = [];
+                    for (const cl of changeList) {
+                        updateArray.push({
+                            id: cl.id,
+                            order: i,
+                        });
+                        cl.order = i;
+                        i++;
+                    }
+                    if (updateArray.length > 0) await transaction.updateRows(this.ctx.service.changeAuditList.tableName, updateArray);
+                } else {
+                    await this.ctx.service.changeAuditList.saveLedgerListDatas(newLedgerList, null, order_by);
+                    changeList = await this.ctx.service.changeAuditList.getList(this.ctx.change.cid, order_by);
+                }
+                const options = {
+                    where: {
+                        cid: this.ctx.change.cid,
+                    },
+                };
+                await transaction.update(this.tableName, postData, options);
+                await transaction.commit();
+                result = changeList;
+            } catch (error) {
+                await transaction.rollback();
+                result = false;
+            }
+            return result;
+        }
+
+        /**
          * 审批通过
          * @param {Number} pid 项目id
          * @param {int} postData - 表单提交的数据

+ 208 - 85
app/service/change_audit_list.js

@@ -27,63 +27,63 @@ module.exports = app => {
          * 取出变更令清单列表,并按台账清单在前,空白清单在后排序
          * @return {void}
          */
-        async getList(cid) {
+        async getList(cid, order_by = this.ctx.change.order_by) {
+            if (order_by) {
+                return await this.getAllDataByCondition({ where: { cid }, orders: [['order', 'asc']] });
+            }
             const sql = 'SELECT * FROM ?? WHERE `cid` = ? ORDER BY `lid` = "0", `id` asc';
             const sqlParam = [this.tableName, cid];
             return await this.db.query(sql, sqlParam);
         }
 
         /**
-         * 添加空白变更清单
-         * @return {void}
+         * 移除清单时,同步其后清单order
+         * @param transaction - 事务
+         * @param {Number} cid - 变更cid
+         * @param {Number} order - order之后的
+         * @return {Promise<*>}
+         * @private
          */
-        async add(data) {
-            if (!this.ctx.tender || !this.ctx.change) {
-                throw '数据错误';
-            }
-            const insertData = {
-                tid: this.ctx.tender.id,
-                cid: this.ctx.change.cid,
-                lid: '0',
-                code: '',
-                name: '',
-                bwmx: '',
-                unit: '',
-                unit_price: null,
-                oamount: 0,
-                camount: 0,
-                samount: '',
-                detail: '',
-                spamount: 0,
-                xmj_code: null,
-                xmj_jldy: null,
-                xmj_dwgc: null,
-                xmj_fbgc: null,
-                xmj_fxgc: null,
-                gcl_id: '',
-            };
-            // 新增工料
-            const result = await this.db.insert(this.tableName, insertData);
-            if (result.affectedRows === 0) {
-                throw '新增空白清单数据失败';
-            }
-            return await this.getDataById(result.insertId);
+        async _syncOrder(transaction, cid, order, selfOperate = '-', num = 1) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('cid', {
+                value: this.db.escape(cid),
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('order', {
+                value: order,
+                operate: '>=',
+            });
+            this.sqlBuilder.setUpdateData('order', {
+                value: num,
+                selfOperate,
+            });
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update');
+            const data = await transaction.query(sql, sqlParam);
+            return data;
         }
 
         /**
-         * 批量添加空白变更清单
+         * 添加空白变更清单
          * @return {void}
          */
-        async batchAdd(data) {
+        async add(data) {
             if (!this.ctx.tender || !this.ctx.change) {
                 throw '数据错误';
             }
-            const num = data.num ? parseInt(data.num) : 0;
-            if (num < 1 || num > 100) {
-                throw '批量添加的空白清单数目不能小于1或大于100';
-            }
-            const insertArray = [];
-            for (let i = 0; i < num; i++) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                let order = null;
+                if (this.ctx.change.order_by) {
+                    if (data) {
+                        order = parseInt(data) + 1;
+                        // order以下的清单+1
+                        await this._syncOrder(transaction, this.ctx.change.cid, order, '+');
+                    } else {
+                        order = await this.count({ cid: this.ctx.change.cid });
+                        order = order ? order + 1 : 1;
+                    }
+                }
                 const insertData = {
                     tid: this.ctx.tender.id,
                     cid: this.ctx.change.cid,
@@ -104,19 +104,88 @@ module.exports = app => {
                     xmj_fbgc: null,
                     xmj_fxgc: null,
                     gcl_id: '',
+                    order,
                 };
-                insertArray.push(insertData);
+                // 新增工料
+                const result = await transaction.insert(this.tableName, insertData);
+                if (result.affectedRows === 0) {
+                    throw '新增空白清单数据失败';
+                }
+                await transaction.commit();
+                return await this.getDataById(result.insertId);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
             }
-            // 新增工料
-            const result = await this.db.insert(this.tableName, insertArray);
-            if (result.affectedRows !== num) {
-                throw '批量添加空白清单数据失败';
+        }
+
+        /**
+         * 批量添加空白变更清单
+         * @return {void}
+         */
+        async batchAdd(data) {
+            if (!this.ctx.tender || !this.ctx.change) {
+                throw '数据错误';
             }
-            // 获取刚批量添加的所有list
-            for (let j = 0; j < num; j++) {
-                insertArray[j].id = result.insertId + j;
+            const transaction = await this.db.beginTransaction();
+            try {
+                const num = data.num ? parseInt(data.num) : 0;
+                if (num < 1 || num > 100) {
+                    throw '批量添加的空白清单数目不能小于1或大于100';
+                }
+                let order = null;
+                if (this.ctx.change.order_by) {
+                    if (data) {
+                        order = parseInt(data.postData) + 1;
+                        // order以下的清单+1
+                        await this._syncOrder(transaction, this.ctx.change.cid, order, '+', num);
+                    } else {
+                        order = await this.count({ cid: this.ctx.change.cid });
+                        order = order ? order + 1 : 1;
+                    }
+                }
+                const insertArray = [];
+                for (let i = 0; i < num; i++) {
+                    const insertData = {
+                        tid: this.ctx.tender.id,
+                        cid: this.ctx.change.cid,
+                        lid: '0',
+                        code: '',
+                        name: '',
+                        bwmx: '',
+                        unit: '',
+                        unit_price: null,
+                        oamount: 0,
+                        camount: 0,
+                        samount: '',
+                        detail: '',
+                        spamount: 0,
+                        xmj_code: null,
+                        xmj_jldy: null,
+                        xmj_dwgc: null,
+                        xmj_fbgc: null,
+                        xmj_fxgc: null,
+                        gcl_id: '',
+                        order: order ? order + i : null,
+                    };
+                    insertArray.push(insertData);
+                }
+                // 新增工料
+                const result = await transaction.insert(this.tableName, insertArray);
+                if (result.affectedRows !== num) {
+                    throw '批量添加空白清单数据失败';
+                }
+                await transaction.commit();
+                // // 获取刚批量添加的所有list
+                // for (let j = 0; j < num; j++) {
+                //     insertArray[j].id = result.insertId + j;
+                // }
+                // return insertArray;
+                return await this.getList(this.ctx.change.cid);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
             }
-            return insertArray;
         }
 
         /**
@@ -124,14 +193,18 @@ module.exports = app => {
          * @param {int} id 清单id
          * @return {void}
          */
-        async del(id) {
+        async del(data) {
             if (!this.ctx.tender || !this.ctx.change) {
                 throw '数据错误';
             }
             const transaction = await this.db.beginTransaction();
             try {
                 // 判断是否可删
-                await transaction.delete(this.tableName, { id });
+                await transaction.delete(this.tableName, { id: data.ids });
+                // // order以下的清单-1
+                if (this.ctx.change.order_by) {
+                    await this._syncOrder(transaction, this.ctx.change.cid, data.postData, '-', data.ids.length);
+                }
                 // 重新算变更令总额
                 await this.calcCamountSum(transaction);
                 await transaction.commit();
@@ -202,7 +275,7 @@ module.exports = app => {
          * @param {Object} datas 内容
          * @return {void}
          */
-        async saveLedgerListDatas(datas) {
+        async saveLedgerListDatas(datas, data = null, order_by = this.ctx.change.order_by) {
             if (!this.ctx.tender || !this.ctx.change) {
                 throw '数据错误';
             }
@@ -210,47 +283,63 @@ module.exports = app => {
             // 判断t_type是否为费用
             const transaction = await this.db.beginTransaction();
             try {
-                const sql1 = 'SELECT a.* FROM ?? as b LEFT JOIN ?? as a ON b.cbid = a.id WHERE b.cid = ? GROUP BY b.cbid';
-                const sqlParam1 = [this.ctx.service.stageChange.tableName, this.tableName, this.ctx.change.cid];
-                const usedList = await transaction.query(sql1, sqlParam1);
-                // 先删除原本的台账清单数据
-                const sql = 'DELETE FROM ?? WHERE cid = ? and lid != "0"';
-                const sqlParam = [this.tableName, this.ctx.change.cid];
-                await transaction.query(sql, sqlParam);
+                let order = null;
+                if (order_by) {
+                    if (data) {
+                        order = parseInt(data) + 1;
+                        // order以下的清单+1
+                        await this._syncOrder(transaction, this.ctx.change.cid, order, '+', datas.length);
+                    } else {
+                        order = await this.count({ cid: this.ctx.change.cid });
+                        order = order ? order + 1 : 1;
+                    }
+                } else {
+                    // 先删除原本的台账清单数据
+                    const sql = 'DELETE FROM ?? WHERE cid = ? and lid != "0"';
+                    const sqlParam = [this.tableName, this.ctx.change.cid];
+                    await transaction.query(sql, sqlParam);
+                }
                 const insertDatas = [];
                 for (const data of datas) {
                     data.tid = this.ctx.tender.id;
                     data.cid = this.ctx.change.cid;
                     data.spamount = data.camount;
                     data.samount = '';
+                    data.order = order ? order : null;
+                    order = order ? order + 1 : null;
                     insertDatas.push(data);
                 }
                 if (insertDatas.length > 0) await transaction.insert(this.tableName, insertDatas);
                 await this.calcCamountSum(transaction);
-                // 更新stage_change和stage_change_final的cbid
-                if (usedList.length > 0) {
-                    const updateList = [];
-                    const sql2 = 'SELECT * FROM ?? WHERE `cid` = ? AND `lid` != "0"';
-                    const sqlParam2 = [this.tableName, this.ctx.change.cid];
-                    const newList = await transaction.query(sql2, sqlParam2);
-                    // const newList = await transaction.select(this.tableName, { where: { cid: this.ctx.change.cid } });
-                    for (const used of usedList) {
-                        const newone = this._.find(newList, { code: used.code, lid: used.lid, gcl_id: used.gcl_id, bwmx: used.bwmx });
-                        if (newone) {
-                            updateList.push({
-                                row: {
-                                    cbid: newone.id,
-                                },
-                                where: {
-                                    cid: this.ctx.change.cid,
-                                    cbid: used.id,
-                                },
-                            });
+                if (!order_by) {
+                    const sql1 = 'SELECT a.* FROM ?? as b LEFT JOIN ?? as a ON b.cbid = a.id WHERE b.cid = ? GROUP BY b.cbid';
+                    const sqlParam1 = [this.ctx.service.stageChange.tableName, this.tableName, this.ctx.change.cid];
+                    const usedList = await transaction.query(sql1, sqlParam1);
+                    // 更新stage_change和stage_change_final的cbid
+                    if (usedList.length > 0) {
+                        const updateList = [];
+                        const sql2 = 'SELECT * FROM ?? WHERE `cid` = ? AND `lid` != "0"';
+                        const sqlParam2 = [this.tableName, this.ctx.change.cid];
+                        const newList = await transaction.query(sql2, sqlParam2);
+                        // const newList = await transaction.select(this.tableName, { where: { cid: this.ctx.change.cid } });
+                        for (const used of usedList) {
+                            const newone = this._.find(newList, { code: used.code, lid: used.lid, gcl_id: used.gcl_id, bwmx: used.bwmx });
+                            if (newone) {
+                                updateList.push({
+                                    row: {
+                                        cbid: newone.id,
+                                    },
+                                    where: {
+                                        cid: this.ctx.change.cid,
+                                        cbid: used.id,
+                                    },
+                                });
+                            }
+                        }
+                        if (updateList.length > 0) {
+                            await transaction.updateRows(this.ctx.service.stageChange.tableName, updateList);
+                            await transaction.updateRows(this.ctx.service.stageChangeFinal.tableName, updateList);
                         }
-                    }
-                    if (updateList.length > 0) {
-                        await transaction.updateRows(this.ctx.service.stageChange.tableName, updateList);
-                        await transaction.updateRows(this.ctx.service.stageChangeFinal.tableName, updateList);
                     }
                 }
                 await transaction.commit();
@@ -895,9 +984,43 @@ module.exports = app => {
             const DefaultDecimal = this.ctx.tender.info.decimal.tp;
             const sql = 'SELECT cal.*, c.tp_decimal FROM ' + this.ctx.service.changeAuditList.tableName + ' cal LEFT JOIN ' + this.ctx.service.change.tableName + ' c on cal.cid = c.cid where c.tid = ? and c.valid and c.status = ?';
             const changeBills = await this.db.query(sql, [tid, audit.flow.status.checked]);
-            changeBills.forEach(x => { x.tp_decimal = x.tp_decimal !== 0 ? x.tp_decimal : DefaultDecimal });
+            changeBills.forEach(x => {
+                x.tp_decimal = x.tp_decimal !== 0 ? x.tp_decimal : DefaultDecimal
+            });
             return changeBills;
         }
+
+        /**
+         * 交换两个清单的顺序
+         * @param {Number} id1 - 工料1的id
+         * @param {Number} id2 - 工料2的id
+         * @returns {Promise<void>}
+         */
+        async changeOrder(datas) {
+            if (!this.ctx.tender || !this.ctx.change) {
+                throw '数据错误';
+            }
+            // const bill1 = await this.getDataByCondition({ tid: this.ctx.tender.id, id: id1 });
+            // const bill2 = await this.getDataByCondition({ tid: this.ctx.tender.id, id: id2 });
+            // if (!bill1 || !bill2) {
+            //     throw '数据错误';
+            // }
+
+            const transaction = await this.db.beginTransaction();
+            try {
+                // const order = bill1.order;
+                // bill1.order = bill2.order;
+                // bill2.order = order;
+                // await transaction.update(this.tableName, { id: bill1.id, order: bill1.order });
+                // await transaction.update(this.tableName, { id: bill2.id, order: bill2.order });
+                await transaction.updateRows(this.tableName, datas);
+                await transaction.commit();
+                return true;
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
     }
 
     return ChangeAuditList;

+ 3 - 2
app/service/material_list.js

@@ -153,7 +153,7 @@ module.exports = app => {
                             mid: this.ctx.material.id,
                             gcl_id: xmj.gcl_id,
                             xmj_id: xmj.id,
-                            mx_id: xmj.mx_id ? xmj.mx_id : [null, ''],
+                            mx_id: xmj.mx_id,
                         },
                     });
                     const mbIdList = this._.map(mlList, 'mb_id');
@@ -167,7 +167,7 @@ module.exports = app => {
                             mb_id: mb.mb_id,
                             gcl_id: xmj.gcl_id,
                             xmj_id: xmj.id,
-                            mx_id: xmj.mx_id ? xmj.mx_id : '',
+                            mx_id: xmj.mx_id,
                             gather_qty: xmj.gather_qty ? xmj.gather_qty : null,
                             quantity: mb.quantity,
                             expr: mb.expr,
@@ -548,6 +548,7 @@ module.exports = app => {
                         });
                     }
                 }
+                console.log(updateDatas);
                 if (updateDatas.length > 0) await transaction.updateRows(this.tableName, updateDatas);
                 if (updateListGcl.length > 0) await transaction.updateRows(this.service.materialListGcl.tableName, updateListGcl);
                 await this.calcQuantityByML(transaction, mb_id);

+ 1 - 1
app/service/material_list_gcl.js

@@ -80,7 +80,7 @@ module.exports = app => {
             if (order >= 1) {
                 // 获取上一期的list值
                 const materialInfo = await this.ctx.service.material.getDataByCondition({ tid, order });
-                const materialList = await this.ctx.service.materialList.getAllDataByCondition({ where: { mid: materialInfo.id } });
+                const materialList = await this.ctx.service.materialList.getAllDataByCondition({ where: { mid: materialInfo.id, is_self: 0 } });
                 const lastMaterialGclList = this._.unionWith(materialList, function(item1, item2) {
                     return item1.gcl_id === item2.gcl_id && item1.mb_id === item2.mb_id;
                 });

+ 6 - 5
app/service/material_list_notjoin.js

@@ -37,11 +37,11 @@ module.exports = app => {
                     mid: this.ctx.material.id,
                     gcl_id: data.gcl_id,
                     xmj_id: data.id,
-                    mx_id: data.mx_id !== undefined ? data.mx_id : null,
+                    mx_id: data.mx_id ? data.mx_id : '',
                     in_time: new Date(),
                 };
                 data.xmj_id = data.id;
-                data.mx_id = data.mx_id !== undefined ? data.mx_id : null;
+                data.mx_id = data.mx_id ? data.mx_id : '';
                 await this.updateAllMaterials(transaction, data, 'add');
                 // 新增不参与调差清单
                 const result = await transaction.insert(this.tableName, newListNotJoin);
@@ -90,10 +90,11 @@ module.exports = app => {
                 mid: this.ctx.material.id,
                 gcl_id: data.gcl_id,
                 xmj_id: data.xmj_id,
+                mx_id: data.mx_id,
             };
-            if (data.mx_id !== null) {
-                searchSql.mx_id = data.mx_id;
-            }
+            // if (data.mx_id !== '') {
+            //     searchSql.mx_id = data.mx_id;
+            // }
             const materialListData = await this.ctx.service.materialList.getAllDataByCondition({
                 where: searchSql,
             });

+ 7 - 6
app/service/material_list_self.js

@@ -37,7 +37,7 @@ module.exports = app => {
                     mid: this.ctx.material.id,
                     gcl_id: data.gcl_id,
                     xmj_id: data.id,
-                    mx_id: data.mx_id !== undefined ? data.mx_id : null,
+                    mx_id: data.mx_id ? data.mx_id : '',
                     in_time: new Date(),
                 };
                 // 更新list表为is_self为1
@@ -47,7 +47,7 @@ module.exports = app => {
                         mid: this.ctx.material.id,
                         gcl_id: data.gcl_id,
                         xmj_id: data.id,
-                        mx_id: data.mx_id ? data.mx_id : null,
+                        mx_id: data.mx_id ? data.mx_id : '',
                     },
                 });
                 // data.xmj_id = data.id;
@@ -100,10 +100,11 @@ module.exports = app => {
                 mid: this.ctx.material.id,
                 gcl_id: data.gcl_id,
                 xmj_id: data.xmj_id,
+                mx_id: data.mx_id,
             };
-            if (data.mx_id !== null) {
-                searchSql.mx_id = data.mx_id;
-            }
+            // if (data.mx_id !== null) {
+            //     searchSql.mx_id = data.mx_id;
+            // }
             const materialListData = await this.ctx.service.materialList.getAllDataByCondition({
                 where: searchSql,
             });
@@ -121,7 +122,7 @@ module.exports = app => {
                     mid: this.ctx.material.id,
                     gcl_id: data.gcl_id,
                     xmj_id: data.xmj_id,
-                    mx_id: data.mx_id ? data.mx_id : null,
+                    mx_id: data.mx_id ? data.mx_id : '',
                 });
                 const materialListGclData = await this.ctx.service.materialListGcl.getAllDataByCondition({
                     where: { tid: this.ctx.tender.id, gcl_id: data.gcl_id },

+ 43 - 2
app/service/tender.js

@@ -324,10 +324,17 @@ module.exports = app => {
                 // 先删除附件文件
                 const attList = await this.ctx.service.changeAtt.getAllDataByCondition({ where: { tid: id } });
                 const newAttList = await this.ctx.service.materialFile.getAllMaterialFiles(id);
-                attList.concat(newAttList);
+                const changeProjectAttList = await this.ctx.service.changeProjectAtt.getAllDataByCondition({ where: { tid: id } });
+                const changeApplyAttList = await this.ctx.service.changeApplyAtt.getAllDataByCondition({ where: { tid: id } });
+                const changePlanAttList = await this.ctx.service.changePlanAtt.getAllDataByCondition({ where: { tid: id } });
+                const advanceAttList = await this.ctx.service.advanceFile.getAllDataByCondition({ where: { tid: id } });
+                attList.concat(newAttList, changeProjectAttList, changeApplyAttList, changePlanAttList, advanceAttList);
                 await this.ctx.helper.delFiles(attList);
                 await transaction.delete(this.tableName, { id });
                 await transaction.delete(this.ctx.service.tenderInfo.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.tenderTourist.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.tenderMap.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.tenderTag.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.ledger.departTableName(id), { tender_id: id });
                 await transaction.delete(this.ctx.service.ledgerAudit.tableName, { tender_id: id });
                 await transaction.delete(this.ctx.service.pos.departTableName(id), { tid: id });
@@ -343,6 +350,7 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.stageDetail.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.stagePay.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.stageChange.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.stageAtt.tableName, { tid: id });
 
                 await transaction.delete(this.ctx.service.stageJgcl.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.stageBonus.tableName, { tid: id });
@@ -357,6 +365,25 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.changeAuditList.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.changeCompany.tableName, { tid: id });
 
+                await transaction.delete(this.ctx.service.changeLedger.tableName, { tender_id: id });
+                await transaction.delete(this.ctx.service.changePos.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changeReviseLog.tableName, { tid: id });
+
+                await transaction.delete(this.ctx.service.changeProject.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changeProjectAudit.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changeProjectXsAudit.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changeProjectAtt.tableName, { tid: id });
+
+                await transaction.delete(this.ctx.service.changeApply.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changeApplyAudit.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changeApplyList.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changeApplyAtt.tableName, { tid: id });
+
+                await transaction.delete(this.ctx.service.changePlan.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changePlanAudit.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changePlanList.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.changePlanAtt.tableName, { tid: id });
+
                 await transaction.delete(this.ctx.service.ledgerRevise.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.reviseAudit.tableName, { tender_id: id });
                 await transaction.delete(this.ctx.service.reviseBills.departTableName(id), { tender_id: id });
@@ -370,6 +397,9 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.materialListNotjoin.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.materialExponent.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.materialExponentHistory.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.materialListGcl.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.materialListSelf.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.materialChecklist.tableName, { tid: id });
 
 
                 await transaction.delete(this.ctx.service.materialFile.tableName, { tid: id });
@@ -377,12 +407,23 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.signatureRole.tableName, { tender_id: id });
 
                 await transaction.delete(this.ctx.service.changeAtt.tableName, { tid: id });
-                await transaction.delete(this.ctx.service.materialFile.tableName, { tid: id });
+                // await transaction.delete(this.ctx.service.materialFile.tableName, { tid: id });
 
                 await transaction.delete(this.ctx.service.advanceFile.tableName, { tid: id });
 
                 await transaction.delete(this.ctx.service.datacollectTender.tableName, { pid: this.ctx.session.sessionProject.id, tid: id });
 
+                await transaction.delete(this.ctx.service.schedule.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.scheduleAudit.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.scheduleLedger.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.scheduleLedgerHistory.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.scheduleLedgerMonth.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.scheduleMonth.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.scheduleStage.tableName, { tid: id });
+
+
+                await transaction.delete(this.ctx.service.shenpiAudit.tableName, { tid: id });
+
                 // 记录删除日志
                 await this.ctx.service.projectLog.addProjectLog(transaction, projectLogConst.type.tender, projectLogConst.status.delete, tenderMsg.name, id);
                 await transaction.commit();

+ 27 - 2
app/view/change/information.ejs

@@ -11,10 +11,33 @@
                 <% } %>
                 <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
                     <div class="d-inline-block">
-                        <a href="#addlist" data-toggle="modal" class="btn btn-sm btn-light text-primary" id="open-list-modal" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加清单"><i class="fa fa-plus" aria-hidden="true"></i> 添加台账清单</a>
+                        <a href="#addlist" data-toggle="modal" class="btn btn-sm btn-light text-primary" id="open-list-modal" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加清单"><i class="fa fa-plus" aria-hidden="true"></i> <span class="order_text"><% if (change.order_by === 0) { %>添加<% } else { %>插入<% } %></span>台账清单</a>
+                    </div>
+                    <div class="d-inline-block mr-1">
+                        <a href="javascript:void(0);" class="btn btn-sm btn-light text-primary" id="add-white-btn" data-original-title="添加清单"><i class="fa fa-plus" aria-hidden="true"></i> <span class="order_text"><% if (change.order_by === 0) { %>添加<% } else { %>插入<% } %></span>空白清单</a>
                     </div>
                     <div class="d-inline-block mr-3">
-                        <a href="javascript:void(0);" class="btn btn-sm btn-light text-primary" id="add-white-btn" data-original-title="添加清单"><i class="fa fa-plus" aria-hidden="true"></i> 添加空白清单</a>
+                        <button type="button" class="btn btn-sm btn-light text-primary dropdown-toggle" data-toggle="dropdown" id="bpaixu">清单排序:<% if (change.order_by === 0) { %>清单编号<% } else { %>添加顺序<% } %></button>
+                        <div class="dropdown-menu" aria-labelledby="bpaixu">
+                            <ul class="list-unstyled px-3 mb-0">
+                                <li class="mb-2">
+                                    <div class="custom-control custom-radio">
+                                        <input type="radio" class="custom-control-input" name="paixu" id="order_0" value="0" <% if (change.order_by === 0) { %>checked<% } %>>
+                                        <label class="custom-control-label" for="order_0">清单编号</label>
+                                    </div>
+                                </li>
+                                <li class="mb-2">
+                                    <div class="custom-control custom-radio">
+                                        <input type="radio" class="custom-control-input" name="paixu" id="order_1" value="1" <% if (change.order_by === 1) { %>checked<% } %>>
+                                        <label class="custom-control-label" for="order_1">添加顺序</label>
+                                    </div>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                    <div class="d-inline-block mr-3" id="upAndMoveBtn" <% if (change.order_by === 0) { %>style="display: none!important;" <% } %>>
+                        <a href="javascript:void(0)" id="up-move" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                        <a href="javascript:void(0)" id="down-move" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
                     </div>
                 <% } %>
                 <div class="d-inline-block">
@@ -414,6 +437,7 @@
     const changeSpreadSheet = changeSpread.getActiveSheet();
     const xmjSpread = SpreadJsObj.createNewSpread($('#xmj-spread')[0]);
     let changeList = JSON.parse(unescape('<%- escape(JSON.stringify(changeList)) %>'));
+    console.log(changeList);
     const style1 = new GC.Spread.Sheets.Style();
     style1.locked = true;
 </script>
@@ -451,6 +475,7 @@
     };
     let changeInfo = Object.assign({}, back_changeInfo);
     let changeUsedData = JSON.parse(unescape('<%- escape(JSON.stringify(changeUsedData)) %>'));
+    let changeOrder = parseInt('<%- change.order_by %>');
     console.log(changeUsedData);
 </script>
 <script src="/public/js/change_information_set.js?202001181"></script>

Різницю між файлами не показано, бо вона завелика
+ 891 - 861
app/view/change/information_modal.ejs


+ 1 - 0
app/view/tender/manage_modal.ejs

@@ -63,6 +63,7 @@
             </div>
             <div class="modal-body">
                 <h5>删除后,数据无法恢复,请谨慎操作。</h5>
+                <h5>确定删除「<strong id="del-tender-name"></strong>」?</h5>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>

+ 9 - 2
sql/update.sql

@@ -71,7 +71,11 @@ UPDATE `zh_material` SET `exponent_rate`=`rate`;
 
 ALTER TABLE `zh_material_list` ADD `is_self` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否为单独添加的工料清单关联' AFTER `is_join`;
 
-UPDATE `zh_material_list` SET `mx_id`= null WHERE `mx_id` = '';
+UPDATE `zh_material_list` SET `mx_id`= '' WHERE `mx_id` is null;
+
+ALTER TABLE `zh_material_list_notjoin` CHANGE `mx_id` `mx_id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '部位明细id';
+
+UPDATE `zh_material_list_notjoin` SET `mx_id`= '' WHERE `mx_id` is null;
 
 CREATE TABLE `zh_material_list_self`  (
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -79,7 +83,7 @@ CREATE TABLE `zh_material_list_self`  (
   `mid` int(11) NOT NULL COMMENT '调差期id',
   `gcl_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '清单id',
   `xmj_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '项目节id',
-  `mx_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '部位明细id',
+  `mx_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '部位明细id',
   `in_time` datetime NOT NULL COMMENT '添加时间',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '单独调差的清单表';
@@ -92,3 +96,6 @@ ADD COLUMN `sorder`  int(11) UNSIGNED NOT NULL AFTER `sid`;
 
 Update zh_stage_change_final scf Join zh_stage s on scf.sid = s.id Set scf.sorder = s.`order`;
 
+ALTER TABLE `zh_change` ADD `order_by` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '清单排序规则,默认按清单编号排(0),自定义排序(1)' AFTER `is_revise`;
+ALTER TABLE `zh_change_audit_list` ADD `order` INT NULL DEFAULT NULL COMMENT '排序序号(自定义规则时使用)' AFTER `spamount`;
+