diff --git a/server/CoreCms.Net.Web.Admin/wwwroot/views/sq/sqroompricing/day-content.html b/server/CoreCms.Net.Web.Admin/wwwroot/views/sq/sqroompricing/day-content.html new file mode 100644 index 0000000..8b3f0bc --- /dev/null +++ b/server/CoreCms.Net.Web.Admin/wwwroot/views/sq/sqroompricing/day-content.html @@ -0,0 +1,36 @@ + diff --git a/server/CoreCms.Net.Web.Admin/wwwroot/views/sq/sqroompricing/index.html b/server/CoreCms.Net.Web.Admin/wwwroot/views/sq/sqroompricing/index.html index 1ecaa65..bfc071e 100644 --- a/server/CoreCms.Net.Web.Admin/wwwroot/views/sq/sqroompricing/index.html +++ b/server/CoreCms.Net.Web.Admin/wwwroot/views/sq/sqroompricing/index.html @@ -264,7 +264,7 @@ if (debug) { console.log(d); } indexData = d.data; - layui.use(['index', 'table', 'laydate', 'util', 'coredropdown', 'coreHelper', 'element'], + layui.use(['index', 'table', 'laydate', 'util', 'coredropdown', 'coreHelper', 'element', 'laytpl', 'view'], function () { var $ = layui.$ , admin = layui.admin @@ -275,34 +275,108 @@ , coreHelper = layui.coreHelper , util = layui.util , view = layui.view - , element = layui.element; + , element = layui.element + , laytpl = layui.laytpl; var searchwhere; - - // 加载房间选项 - coreHelper.Post("Api/SQRoomUnavailableTimes/GetIndex", null, function (e) { - if (e.code === 0 && e.data && e.data.roomOptions) { - roomOptions = e.data.roomOptions; - var roomSelect = $('#search_room_id'); - roomSelect.empty(); - roomSelect.append(''); - layui.each(roomOptions, function (index, item) { - roomSelect.append(''); - }); - - // 默认选择第一个房间并渲染日历视图 - if (roomOptions.length > 0) { - selectedRoomId = roomOptions[0].id; - roomSelect.val(selectedRoomId); - } - - form.render('select'); - - // 房间加载完成后渲染日历 - if (currentView === 'calendar' && selectedRoomId) { - renderCalendar(); - } + + // 日期内容模板缓存(只加载一次,永久缓存) + var dayContentTemplate = null; + var templateLoadPromise = null; + + // 加载日期内容模板(只加载一次,后续直接返回缓存的模板) + function loadDayContentTemplate() { + // 如果模板已缓存,直接返回已解决的 Promise + if (dayContentTemplate) { + return $.Deferred().resolve().promise(); } + + // 如果正在加载,返回现有的 Promise + if (templateLoadPromise) { + return templateLoadPromise; + } + + // 创建新的加载 Promise(只加载一次) + templateLoadPromise = $.ajax({ + url: setter.views + 'sq/sqroompricing/day-content.html', + type: 'GET', + dataType: 'html', + cache: true // 启用浏览器缓存 + }).then(function(html) { + var tempDiv = $('
').html(html); + var templateElement = tempDiv.find('#LAY-template-day-content'); + if (templateElement.length > 0) { + // 缓存模板内容,后续不再请求 + dayContentTemplate = templateElement.html(); + return dayContentTemplate; + } else { + console.error('日期内容模板未找到'); + throw new Error('日期内容模板未找到'); + } + }).fail(function() { + console.error('加载日期内容模板失败'); + templateLoadPromise = null; // 失败后重置,允许重试 + throw new Error('加载日期内容模板失败'); + }); + + return templateLoadPromise; + } + + // 统一的日期内容渲染函数(使用缓存的模板 + laytpl 处理数据) + // 注意:此函数假设模板已经加载并缓存,直接使用缓存的模板进行渲染 + function renderDayContent(roomData, errorMsg) { + // 错误信息直接返回,不使用模板 + if (errorMsg) { + return '
' + (errorMsg || '加载失败') + '
'; + } + + // 如果没有房间数据,直接返回提示 + if (!roomData || !roomData.time_slots || !Array.isArray(roomData.time_slots) || roomData.time_slots.length === 0) { + return '
无房间数据
'; + } + + // 使用缓存的模板,通过 laytpl 渲染数据(不再请求网络,直接使用内存中的缓存) + if (dayContentTemplate) { + // 模板已缓存,直接使用 laytpl 渲染(不请求网络,使用缓存) + return laytpl(dayContentTemplate).render({ roomData: roomData }); + } else { + // 模板未加载(正常情况下不应该发生,因为初始化时已加载) + console.warn('模板未加载,返回默认提示'); + return '
模板加载中...
'; + } + } + + // ========== 页面初始化加载流程:先加载模板,模板加载成功后再加载日历数据 ========== + // 步骤1:页面加载时先获取模板(只加载一次并缓存) + loadDayContentTemplate().then(function() { + // 步骤2:模板加载成功后,再加载房间选项 + coreHelper.Post("Api/SQRoomUnavailableTimes/GetIndex", null, function (e) { + if (e.code === 0 && e.data && e.data.roomOptions) { + roomOptions = e.data.roomOptions; + var roomSelect = $('#search_room_id'); + roomSelect.empty(); + roomSelect.append(''); + layui.each(roomOptions, function (index, item) { + roomSelect.append(''); + }); + + // 默认选择第一个房间并渲染日历视图 + if (roomOptions.length > 0) { + selectedRoomId = roomOptions[0].id; + roomSelect.val(selectedRoomId); + } + + form.render('select'); + + // 步骤3:房间加载完成后渲染日历(此时模板已经加载成功并缓存) + if (currentView === 'calendar' && selectedRoomId) { + renderCalendar(); + } + } + }); + }).fail(function(error) { + console.error('模板加载失败,无法继续加载日历数据', error); + layer.msg('模板加载失败,请刷新页面重试'); }); //监听搜索 @@ -994,52 +1068,13 @@ return r.id == selectedRoomId || r.id == parseInt(selectedRoomId); }); - if (roomData && roomData.time_slots && Array.isArray(roomData.time_slots)) { - var dayContentHtml = ''; - - // 显示价格信息 - var firstSlot = roomData.time_slots[0]; - if (firstSlot && firstSlot.price_desc_standard != '') { - dayContentHtml += '
' + firstSlot.price_desc_standard + '
'; - } - if (firstSlot && firstSlot.price_desc_member != '') { - dayContentHtml += '
' + firstSlot.price_desc_member + '
'; - } - - // 显示时段状态 - dayContentHtml += '
'; - roomData.time_slots.forEach(function (slot) { - var statusClass = 'unavailable'; - var statusIcon = '✗'; - - // 检查该时段是否被后台预约禁用(unavailable_type=2) - if (slot.status === 'unavailable' && slot.unavailable_type === 2) { - // 后台预约:深橙色 + ✓ - statusClass = 'backend-reservation'; - statusIcon = '✓'; - } else if (slot.status === 'available') { - statusClass = 'available'; - statusIcon = '◯'; - } else if (slot.status === 'reserved') { - statusClass = 'reserved'; - statusIcon = '✓ '; - } else if (slot.status === 'using') { - statusClass = 'using'; - statusIcon = '✗'; - } - - dayContentHtml += '
' + - slot.slot_name + statusIcon + '
'; - }); - dayContentHtml += '
'; - - dayElement.append(dayContentHtml); - } else { - dayElement.append('
无房间数据
'); - } + // 使用统一的模板渲染函数 + var dayContentHtml = renderDayContent(roomData, null); + dayElement.append(dayContentHtml); } else { var errorMsg = e.msg || '加载失败'; - dayElement.append('
' + errorMsg + '
'); + var errorHtml = renderDayContent(null, errorMsg); + dayElement.append(errorHtml); } }); @@ -1097,53 +1132,13 @@ console.log('查找房间:', roomId, '找到:', roomData ? '是' : '否'); } - if (roomData && roomData.time_slots && Array.isArray(roomData.time_slots)) { - var dayContentHtml = ''; - - // 显示价格信息 - var firstSlot = roomData.time_slots[0]; - if (firstSlot && firstSlot.price_desc_standard != '') { - dayContentHtml += '
' + firstSlot.price_desc_standard + '
'; - } - if (firstSlot && firstSlot.price_desc_member != '') { - dayContentHtml += '
' + firstSlot.price_desc_member + '
'; - } - - - // 显示时段状态 - dayContentHtml += '
'; - roomData.time_slots.forEach(function (slot) { - var statusClass = 'unavailable'; - var statusIcon = '✗'; - - // 检查该时段是否被后台预约禁用(unavailable_type=2) - if (slot.status === 'unavailable' && slot.unavailable_type === 2) { - // 后台预约:深橙色 + ✓ - statusClass = 'backend-reservation'; - statusIcon = '✓'; - } else if (slot.status === 'available') { - statusClass = 'available'; - statusIcon = '◯'; - } else if (slot.status === 'reserved') { - statusClass = 'reserved'; - statusIcon = '✓ '; - } else if (slot.status === 'using') { - statusClass = 'using'; - statusIcon = '✗'; - } - - dayContentHtml += '
' + - slot.slot_name + statusIcon + '
'; - }); - dayContentHtml += '
'; - - dayElement.append(dayContentHtml); - } else { - dayElement.append('
无房间数据
'); - } + // 使用统一的模板渲染函数 + var dayContentHtml = renderDayContent(roomData, null); + dayElement.append(dayContentHtml); } else { var errorMsg = e.msg || '加载失败'; - dayElement.append('
' + errorMsg + '
'); + var errorHtml = renderDayContent(null, errorMsg); + dayElement.append(errorHtml); } });