| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 | // 思路是点击签章的时候,原来的签章不显示,生成一个img用于拖动,实现拖动效果,再点击新生成的img就保存数据,干掉临时的imgclass MoveSignatureTool {    constructor(ctx, canvas, pageObj, pageIdx, jpcOutput) {        this.signatureList = [];        this.ctx = ctx;        // 被选中的签章        this.activeImg = undefined;        //鼠标位减图形位        this.subPos = null;        //图形是否被选择        this.selected = false;        // 上一个被选中的签章属性        this.lastPosition = { x: 0, y: 0, width: 0, height: 0 };        //canvas的dom对象        this.canvas = canvas;        this.pageObj = pageObj;        this.pageIdx = pageIdx;        this.jpcOutput = jpcOutput;        this.signatureCanvas = document.getElementById("rptSignatureCanvas");    }    setSignature(obj, x, y, width, height, signature_name, signatureName, signType) {        // 只有签章才能移动        if (signType) {            this.signatureList.push({                obj,                x,                y,                width,                height,                crossOrigin: 'Anonymous',                signature_name,                signatureName,                signType            })        }    }    //获取鼠标在canvas中的位置    getMousePos(event, me) {        //获取鼠标位置        const { clientX, clientY } = event;        //获取canvas 边界位置        const { top, left } = me.canvas.getBoundingClientRect();        //计算鼠标在canvas 中的位置        const x = clientX - left;        const y = clientY - top;        return { x, y };    }    //判断点是否在图形中    containPoint(data, mousePos) {        //解构图形位置和尺寸        const { x, y, width, height } = data;        //解构鼠标位置        const { x: mx, y: my } = mousePos;        //计算鼠标和图形上、下、左、右边界的关系        const l = mx > x;        const r = mx < x + width;        const t = my > y;        const b = my < y + height;        return l && r && t && b;    }    mousedownFn(event, me) {        //鼠标位置        const mousePos = me.getMousePos(event, me);        // 找到相应的对象        const target = me.signatureList.find((item) => me.containPoint(item, mousePos));        if ($('#templateSignature').length === 0 && target) {            //先把上一次的数据记录下来            const { x, y, width, height } = target;            Object.assign(me.lastPosition, { x, y, width, height });            me.selected = true;            me.activeImg = target;            //鼠标位减图形位            me.subPos = {                x: mousePos.x - me.activeImg.x,                y: mousePos.y - me.activeImg.y,            };            const orgTargetData = this.pageObj.items[0].signature_cells.find(item => item.signatureName === target.signatureName && item.signType === target.signType);            orgTargetData.isMoving = true;            this.render(me);            const { top, left } = $("#rptCanvas").position();            $("#rptCanvas").after(`<div id='templateSignature' data-ID='${orgTargetData.signature_name}' style="background-image:url('${orgTargetData.path}');background-size: contain;cursor: move;position: absolute;top: ${y + top + 10}px;left:${x + left + 10}px;width:${width}px;height:${height}px;"/>`);            $("#templateSignature").unbind('mousemove').on('mousemove', (e) => { this.templateSignatureMove(e, this) });            $("#templateSignature").unbind('click').on('click', (e) => { this.templateSignatureClick(e, this) });        } else {            me.selected = false;        }    }    saveSignature(me) {        //鼠标抬起,取消拖拽        me.selected = false;        me.render(me);        const params = {};        params.id = CURRENT_ROLE_REL_ID;        params.tender_id = TENDER_ID;        params.stage_id = getStageId();        params.rpt_id = zTreeOprObj.currentNode.refId;        params.business_id = BUSINESS_ID;        // params.rel_content = ROLE_REL_LIST;        params.rel_content = [];        ROLE_REL_LIST.forEach((role) => {            if (role.signature_name.indexOf('dummy_pic') < 0) {                params.rel_content.push(role);            }        });        const { x, y, width, height, signType, signatureName } = me.activeImg;        const target = ROLE_REL_LIST.find(item => item.signature_name === signatureName);        if (target) {            if (!target.areaData) target.areaData = {};            target.areaData[signType] = {                Top: y,                Bottom: y + height,                Left: x,                Right: x + width            }        }        CommonAjax.postXsrfEx("/tender/report_api/updateRoleRelationship", params, 10000, true, getCookie('csrfToken_j'),            async function (result) {                // console.log(result);            }        )    }    render(me, isHideSignature = false) {        let target;        // 因为只有一页,所以就默认取是一个数据        for (const signature of me.pageObj.items[0].signature_cells) {            //找到要移动的签章            if (signature.signature_name && me.activeImg && me.activeImg.signature_name.includes(signature.signature_name)) {                target = signature;            }        }        if (target) {            Object.assign(target.area, {                Top: me.activeImg.y,                Bottom: me.activeImg.y + me.activeImg.height,                Left: me.activeImg.x,                Right: me.activeImg.x + me.activeImg.width,            })            me.jpcOutput.cleanCanvas(me.canvas);            me.jpcOutput.drawPageBorder(me.pageObj, me.canvas, getScreenDPI())            me.jpcOutput.drawToCanvas(me.pageObj, me.canvas, me.pageIdx, isHideSignature);        }    }    domAddEventListener(canvas) {        //点击事件        $("#rptCanvas").unbind('mousedown').on('mousedown', (e) => { this.mousedownFn(e, this) });        // $("#rptCanvas").unbind('mousemove').on('mousemove', (e) => { this.mouseMove(e, this) });    }    // 临时签章移动事件(控制签章只能在报表中移动)    templateSignatureMove(event, me) {        // 表格大小        const size = me.jpcOutput.getReportSizeInPixel(me.pageObj, getScreenDPI());        const reportMarginTop= me.pageObj.打印页面_信息.页边距.Top * 96/2;        const reportMarginBottom= me.pageObj.打印页面_信息.页边距.Bottom * 96/2;        const { top, left } = $("#rptCanvas").position();        const signatureWidth = $("#templateSignature").width();        const signatureHeight = $("#templateSignature").height();        const maxTop = size[1] + top - signatureHeight + me.jpcOutput.offsetY - reportMarginBottom  ; //签章的最大y坐标        const maxLeft =  me.pageObj.MergeBand.Right + left - signatureWidth + me.jpcOutput.offsetX ; //签章的最大x坐标        const mousePos = me.getMousePos(event, me);        let newTop = mousePos.y - me.subPos.y + top;        let newLeft = mousePos.x - me.subPos.x + left;        if ((mousePos.y - me.subPos.y) < reportMarginTop+top) newTop = reportMarginTop + top + me.jpcOutput.offsetY;        if ((mousePos.x - me.subPos.x) < me.pageObj.MergeBand.Left) newLeft = me.pageObj.MergeBand.Left+left + me.jpcOutput.offsetX;        if ((mousePos.y - me.subPos.y) > maxTop ) newTop = maxTop + me.jpcOutput.offsetY*2;        if ((mousePos.x - me.subPos.x) > maxLeft - left) newLeft = maxLeft + me.jpcOutput.offsetX/2;        event.currentTarget.style.top = `${newTop}px`;        event.currentTarget.style.left = `${newLeft}px`;    }    // 临时签章点击事件    templateSignatureClick(event, me) {        const canvasOuterTop = $("#rptCanvas").position().top;        const canvasOuterLeft = $("#rptCanvas").position().left;        const { top, left } = $(event.currentTarget).position();        me.activeImg.y = top - canvasOuterTop - this.jpcOutput.offsetY;        me.activeImg.x = left - canvasOuterLeft - this.jpcOutput.offsetX;        const orgTargetData = this.pageObj.items[0].signature_cells.find(item => item.signature_name === $(event.currentTarget).data('id'));        orgTargetData.isMoving = false;        this.saveSignature(me);        if (this.pageObj.items.length > 1) {            for (let idx = 0; idx < this.pageObj.items.length; idx++) {                const targetCell = this.pageObj.items[idx].signature_cells.find(item => item.signatureName === orgTargetData.signatureName && item.signType === orgTargetData.signType);                if (targetCell) {                    targetCell.area.Left = orgTargetData.area.Left;                    targetCell.area.Right = orgTargetData.area.Right;                    targetCell.area.Top = orgTargetData.area.Top;                    targetCell.area.Bottom = orgTargetData.area.Bottom;                }            }        }        $("#templateSignature").remove();    }}
 |