From 223ce7dcb236cad6679275d8941e1a909f8a1efc Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期三, 21 一月 2026 10:12:30 +0800
Subject: [PATCH] #库区分配
---
src/main/webapp/static/js/report/locMap.js | 323 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 321 insertions(+), 2 deletions(-)
diff --git a/src/main/webapp/static/js/report/locMap.js b/src/main/webapp/static/js/report/locMap.js
index 205cd7d..58b6171 100644
--- a/src/main/webapp/static/js/report/locMap.js
+++ b/src/main/webapp/static/js/report/locMap.js
@@ -2,11 +2,102 @@
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
+ var areaMap = {};
+
+ // Handlebars helper for area color
+ Handlebars.registerHelper('getAreaColor', function(areaId) {
+ if (areaId && areaMap[areaId] && areaMap[areaId].color) {
+ return areaMap[areaId].color;
+ }
+ return 'transparent';
+ });
// 鍒濆鍔犺浇
+ loadAreas(); // 鍔犺浇搴撳尯棰滆壊淇℃伅
loadRowsOptions(); // 鍔犺浇銆屾帓銆嶉�夐」锛堝缁堥渶瑕侊級
loadLayersOptions(); // 鍔犺浇銆屽眰銆嶉�夐」锛堟彁鍓嶅噯澶囷級
getLocTable('byRow', 1); // 榛樿鎸夋帓 + 绗�1鎺�
+
+ // 鍔犺浇搴撳尯淇℃伅骞舵樉绀哄浘渚�
+ function loadAreas() {
+ $.ajax({
+ url: baseUrl + '/area/list/auth?page=1&limit=1000',
+ headers: {'token': localStorage.getItem('token')},
+ async: false,
+ success: function(res) {
+ if (res.code === 200) {
+ areaMap = {};
+ var legendHtml = '<div class="area-legend-item" style="cursor:default;font-weight:bold;">搴撳尯鍥句緥:</div>';
+ // 榛樿棰滆壊鍒楄〃锛岀敤浜庤嚜鍔ㄥ垎閰�
+ var defaultColors = ['#FF5733', '#33FF57', '#3357FF', '#FF33A1', '#A133FF', '#33FFF5', '#FFD700', '#FF8C00'];
+ var colorIndex = 0;
+
+ res.data.records.forEach(function(area) {
+ var color = area.backup1;
+ // 澧炲己棰滆壊鏍¢獙锛氬鏋滀负绌恒�乶ull瀛楃涓叉垨闀垮害杩囩煭锛屽垯瑙嗕负鏃犳晥
+ if (!color || color === 'null' || color.trim().length < 3) {
+ color = defaultColors[colorIndex % defaultColors.length];
+ colorIndex++;
+ }
+ areaMap[area.id] = {name: area.areaName, color: color, fullArea: area};
+ legendHtml += '<div class="area-legend-item" onclick="editAreaColor(\'' + area.id + '\')"><span class="area-color-box" style="background-color:' + color + '"></span>' + area.areaName + '</div>';
+ });
+ $('#areaLegend').html(legendHtml).show();
+ }
+ }
+ });
+ }
+
+ // 缂栬緫搴撳尯棰滆壊
+ window.editAreaColor = function(areaId) {
+ if (!areaId || !areaMap[areaId]) return;
+ var areaData = areaMap[areaId];
+
+ var contentHtml = '<div style="padding: 20px;"><form class="layui-form">' +
+ '<div class="layui-form-item">' +
+ '<label class="layui-form-label" style="width: auto; padding-left: 0;">搴撳尯鍚嶇О:</label>' +
+ '<div class="layui-input-inline" style="line-height: 45px;">' + areaData.name + '</div>' +
+ '</div>' +
+ '<div class="layui-form-item">' +
+ '<label class="layui-form-label" style="width: auto; padding-left: 0;">閫夋嫨棰滆壊</label>' +
+ '<div class="layui-input-inline"><input type="color" id="singleAreaColorPicker" value="' + (areaData.color || '#cccccc') + '" style="height: 38px; width: 100%;"></div>' +
+ '</div>' +
+ '</form></div>';
+
+ layer.open({
+ type: 1,
+ title: '淇敼搴撳尯棰滆壊',
+ area: ['350px', '250px'],
+ content: contentHtml,
+ btn: ['淇濆瓨', '鍙栨秷'],
+ yes: function(index) {
+ var newColor = $('#singleAreaColorPicker').val();
+ if (newColor !== areaData.color) {
+ $.ajax({
+ url: baseUrl + '/area/update/auth',
+ method: 'POST',
+ headers: {'token': localStorage.getItem('token')},
+ data: { id: areaId, backup1: newColor },
+ success: function(res) {
+ if (res.code === 200) {
+ layer.msg('棰滆壊宸叉洿鏂�');
+ layer.close(index);
+ loadAreas(); // 鍒锋柊鍥句緥鍜岀紦瀛�
+ // 鍒锋柊鍦板浘浠ュ簲鐢ㄦ柊棰滆壊
+ var mode = $('#viewMode').val();
+ if (mode === 'byRow') getLocTable('byRow', $('#rowSelect').val());
+ else getLocTable('byLayer', $('#layerSelect').val());
+ } else {
+ layer.msg(res.msg || '鏇存柊澶辫触');
+ }
+ }
+ });
+ } else {
+ layer.close(index);
+ }
+ }
+ });
+ };
// 鍔犺浇鎵�鏈夊彲鐢ㄦ帓
function loadRowsOptions() {
@@ -31,13 +122,13 @@
// 鍔犺浇鎵�鏈夊彲鐢ㄥ眰锛堥渶瑕佸悗绔敮鎸佹柊鎺ュ彛锛�
function loadLayersOptions() {
$.ajax({
- url: baseUrl + "/report/viewLocMapList/layers.action", // 鈫� 闇�瑕佹柊澧炴帴鍙�
+ url: baseUrl + "/report/viewLocMapList/layers.action",
headers: {'token': localStorage.getItem('token')},
method: 'POST',
async: false,
success: function (res) {
if (res.code === 200) {
- var tpl = $("#locMastRowTemplate").html(); // 澶嶇敤妯℃澘
+ var tpl = $("#locMastRowTemplate").html();
var template = Handlebars.compile(tpl);
$('#layerSelect').append(template(res));
form.render('select');
@@ -106,4 +197,232 @@
getLocTable('byLayer', data.value);
}
});
+
+ // --- 妗嗛�夊姛鑳� ---
+ var isSelectionMode = false;
+ var isDragging = false;
+ var startX, startY;
+ var $selectionBox = $('#selectionBox');
+ var $container = $('#locMapContain');
+
+ $('#btnSelectMode').click(function () {
+ isSelectionMode = !isSelectionMode;
+ if (isSelectionMode) {
+ $(this).text('鍏抽棴妗嗛��').addClass('layui-btn-danger').removeClass('layui-btn-normal');
+ // 绂佺敤鍘熸湁鐐瑰嚮浜嬩欢锛岄槻姝㈠啿绐� (閫氳繃 CSS pointer-events 鎴栫Щ闄� onclick)
+ // 杩欓噷閫夋嫨绉婚櫎 onclick 灞炴��
+ $('.a-loc').each(function(){
+ $(this).attr('data-onclick', $(this).attr('onclick')).removeAttr('onclick');
+ });
+ layer.msg('宸插紑鍚閫夋ā寮忥紝璇峰湪搴撲綅鍥句笂鎷栨嫿閫夋嫨');
+ } else {
+ $(this).text('寮�鍚閫�').addClass('layui-btn-normal').removeClass('layui-btn-danger');
+ $('.loc-selected').removeClass('loc-selected');
+ $('#btnAssignZone').hide();
+ // 鎭㈠鐐瑰嚮浜嬩欢
+ $('.a-loc').each(function(){
+ if($(this).attr('data-onclick')) {
+ $(this).attr('onclick', $(this).attr('data-onclick'));
+ }
+ });
+ }
+ });
+
+ $container.on('mousedown', function (e) {
+ if (!isSelectionMode) return;
+ // 濡傛灉鐐瑰湪婊氬姩鏉′笂锛屽彲鑳戒篃浼氳Е鍙戯紝绠�鍗曞垽鏂洰鏍囨槸鍚︽槸 container 鎴� table
+ if(e.target.tagName !== 'TD' && e.target.id !== 'locMapContain' && e.target.tagName !== 'TABLE' && e.target.tagName !== 'TBODY' && e.target.tagName !== 'TR') return;
+
+ isDragging = true;
+ var offset = $container.offset();
+ // 鐩稿浜� container 鍐呭鐨勫潗鏍� (鍖呭惈婊氬姩)
+ startX = e.pageX - offset.left + $container.scrollLeft();
+ startY = e.pageY - offset.top + $container.scrollTop();
+
+ $selectionBox.css({
+ left: startX,
+ top: startY,
+ width: 0,
+ height: 0,
+ display: 'block'
+ });
+
+ // 闃绘榛樿鏂囨湰閫夋嫨
+ e.preventDefault();
+ });
+
+ $container.on('mousemove', function (e) {
+ if (!isSelectionMode || !isDragging) return;
+ var offset = $container.offset();
+ var currentX = e.pageX - offset.left + $container.scrollLeft();
+ var currentY = e.pageY - offset.top + $container.scrollTop();
+
+ var width = Math.abs(currentX - startX);
+ var height = Math.abs(currentY - startY);
+ var left = Math.min(currentX, startX);
+ var top = Math.min(currentY, startY);
+
+ $selectionBox.css({
+ width: width,
+ height: height,
+ left: left,
+ top: top
+ });
+ });
+
+ $(document).on('mouseup', function (e) {
+ if (!isSelectionMode || !isDragging) return;
+ isDragging = false;
+ $selectionBox.hide();
+
+ // 璁$畻妗嗛�夊尯鍩� (鐩稿浜庤鍙o紝鐢ㄤ簬 getBoundingClientRect 姣旇緝)
+ // 鎴栬�呴兘杞崲涓虹浉瀵逛簬 container 鐨勫潗鏍�
+ // 杩欓噷浣跨敤鐩稿浜� container 鐨勫潗鏍囨瘮杈冩洿绋冲Ε
+
+ var boxLeft = parseFloat($selectionBox.css('left'));
+ var boxTop = parseFloat($selectionBox.css('top'));
+ var boxWidth = parseFloat($selectionBox.css('width'));
+ var boxHeight = parseFloat($selectionBox.css('height'));
+ var boxRight = boxLeft + boxWidth;
+ var boxBottom = boxTop + boxHeight;
+
+ // 鑾峰彇 container 鐨� offset
+ var containerOffset = $container.offset();
+
+ $('.a-loc').each(function () {
+ var $el = $(this);
+ var elOffset = $el.offset();
+ // 杞崲涓虹浉瀵逛簬 container 鐨勫潗鏍� (鍔犱笂 scroll)
+ var elLeft = elOffset.left - containerOffset.left + $container.scrollLeft();
+ var elTop = elOffset.top - containerOffset.top + $container.scrollTop();
+ var elWidth = $el.outerWidth();
+ var elHeight = $el.outerHeight();
+ var elRight = elLeft + elWidth;
+ var elBottom = elTop + elHeight;
+
+ // 纰版挒妫�娴�
+ if (!(elLeft > boxRight || elRight < boxLeft || elTop > boxBottom || elBottom < boxTop)) {
+ $el.toggleClass('loc-selected');
+ }
+ });
+
+ if ($('.loc-selected').length > 0) {
+ $('#btnAssignZone').show().text('鍒嗛厤搴撳尯 (' + $('.loc-selected').length + ')');
+ } else {
+ $('#btnAssignZone').hide();
+ }
+ });
+
+ // --- 鍒嗛厤搴撳尯 ---
+ $('#btnAssignZone').click(function () {
+ var selectedLocs = [];
+ $('.loc-selected').each(function () {
+ selectedLocs.push($(this).attr('title')); // title has locNo
+ });
+
+ if (selectedLocs.length === 0) return;
+
+ // 鑾峰彇搴撳尯鍒楄〃
+ $.ajax({
+ url: baseUrl + '/area/list/auth?page=1&limit=1000',
+ headers: {'token': localStorage.getItem('token')},
+ success: function(listRes) {
+ if (listRes.code === 200) {
+ var optionsHtml = '<option value="">璇烽�夋嫨搴撳尯</option>';
+ var areas = listRes.data.records;
+ areas.forEach(function(area) {
+ optionsHtml += '<option value="' + area.id + '">' + area.areaName + ' (' + area.areaId + ')</option>';
+ });
+
+ var contentHtml = '<div style="padding: 20px;"><form class="layui-form">' +
+ '<div class="layui-form-item"><select id="selectArea" lay-filter="selectArea">' + optionsHtml + '</select></div>' +
+ '<div class="layui-form-item">' +
+ '<label class="layui-form-label" style="width: auto; padding-left: 0;">搴撳尯棰滆壊</label>' +
+ '<div class="layui-input-inline"><input type="color" id="areaColorPicker" value="#cccccc" style="height: 38px; width: 100%;"></div>' +
+ '</div>' +
+ '</form></div>';
+
+ layer.open({
+ type: 1,
+ title: '鍒嗛厤搴撳尯鍙婇鑹�',
+ area: ['400px', '350px'],
+ content: contentHtml,
+ btn: ['纭畾', '鍙栨秷'],
+ success: function(layero, index) {
+ form.render('select');
+ form.on('select(selectArea)', function(data){
+ var areaId = data.value;
+ if(areaId && areaMap[areaId]) {
+ $('#areaColorPicker').val(areaMap[areaId].color || '#cccccc');
+ }
+ });
+ },
+ yes: function(index) {
+ var areaId = $('#selectArea').val();
+ var newColor = $('#areaColorPicker').val();
+
+ if (!areaId) {
+ layer.msg('璇烽�夋嫨搴撳尯');
+ return;
+ }
+
+ // 1. 鏇存柊搴撳尯棰滆壊 (濡傛灉鏈夊彉鍖�)
+ if (areaMap[areaId] && areaMap[areaId].color !== newColor) {
+ $.ajax({
+ url: baseUrl + '/area/update/auth',
+ method: 'POST',
+ headers: {'token': localStorage.getItem('token')},
+ data: { id: areaId, backup1: newColor },
+ async: false, // 鍚屾鏇存柊浠ョ‘淇濆埛鏂版椂棰滆壊姝g‘
+ success: function() {
+ loadAreas(); // 鍒锋柊鍥句緥鍜岀紦瀛�
+ }
+ });
+ }
+
+ // 2. 鎵归噺鏇存柊搴撲綅
+ $.ajax({
+ url: baseUrl + '/locMast/batchUpdateArea/auth',
+ method: 'POST',
+ headers: {'token': localStorage.getItem('token')},
+ contentType: 'application/json',
+ data: JSON.stringify({
+ locNos: selectedLocs,
+ areaId: parseInt(areaId)
+ }),
+ success: function(updRes) {
+ if (updRes.code === 200) {
+ layer.msg('鍒嗛厤鎴愬姛');
+ layer.close(index);
+ // 鍒锋柊
+ var mode = $('#viewMode').val();
+ if (mode === 'byRow') getLocTable('byRow', $('#rowSelect').val());
+ else getLocTable('byLayer', $('#layerSelect').val());
+
+ // 閲嶇疆鐘舵��
+ $('.loc-selected').removeClass('loc-selected');
+ $('#btnAssignZone').hide();
+ // 淇濇寔妗嗛�夋ā寮�
+ if(isSelectionMode) {
+ // 閲嶆柊绉婚櫎onclick
+ setTimeout(function(){
+ $('.a-loc').each(function(){
+ $(this).attr('data-onclick', $(this).attr('onclick')).removeAttr('onclick');
+ });
+ }, 500); // 绠�鍗曞欢鏃剁瓑寰呮覆鏌�
+ }
+ } else {
+ layer.msg(updRes.msg || '鎿嶄綔澶辫触');
+ }
+ }
+ });
+ }
+ });
+ } else {
+ layer.msg(listRes.msg || '鏃犳硶鑾峰彇搴撳尯鍒楄〃');
+ }
+ }
+ });
+ });
+
});
\ No newline at end of file
--
Gitblit v1.9.1