687 lines
23 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const {
registerExtendedProducts,
starEventOn,
getIcCardList,
selectLock
} = requirePlugin('starCloud')
Page({
data: {
cardId: -1,
cardNumber: 0,
cardName: '',
cardType: 1,
isAdmin: 1,
isForce: 0,
isRound: 0,
weekDayInput: '', // 新增输入框的值
weekDay: [], // 修改为空数组,不再使用 0/1 数组
weekdayPattern: 'workday', // 添加周期模式选择
weekdayPatterns: ['工作日循环(星期一到星期五)', '周末循环(星期六日)', '每天循环'],
weekdayPatternIndex: 0,
startDate: 0,
endDate: 0,
startDateDisplay: '', // 添加用于显示的日期字符串
endDateDisplay: '', // 添加用于显示的日期字符串
startTime: '00:00',
endTime: '00:00',
cardList: [],
currentParams: null,
editMode: false,
selectedCard: null,
dateTimeArray: [], // 日期时间选择器的数据
startDateTimeArray: [0, 0, 0, 0, 0], // 开始时间选择器的当前值
endDateTimeArray: [0, 0, 0, 0, 0] // 结束时间选择器的当前值
},
observers: {
'weekDayInput': function (val) {
if (!val) {
this.setData({
weekDay: [],
isRound: 0
});
return;
}
const weekDay = val.split(',')
.map(item => item.trim())
.filter(item => /^[0-6]$/.test(item))
.filter((item, index, self) => self.indexOf(item) === index)
.sort((a, b) => Number(a) - Number(b));
console.log('Observer - Input:', val);
console.log('Observer - Processed weekDay:', weekDay);
this.setData({
weekDay,
isRound: weekDay.length > 0 ? 1 : 0
});
}
},
onLoad() {
starEventOn('registerCardConfirm', async (data) => {
if (data.code === 0) {
this.setData({
cardId: data.data.cardId,
cardNumber: data.data.cardNumber
})
console.log('收到卡片确认事件', data, this.data.cardId, this.data.cardNumber);
// 添加成功后自动刷新列表
await this.findAllCard();
} else {
console.log('收到卡片确认事件', data, this.data.cardId, this.data.cardNumber);
}
});
// 初始化时间
const now = new Date();
const nextHour = new Date(now.getTime() + 60 * 60 * 1000);
const nowArr = [
now.getFullYear(),
now.getMonth(),
now.getDate(),
now.getHours(),
now.getMinutes()
];
const nextArr = [
nextHour.getFullYear(),
nextHour.getMonth(),
nextHour.getDate(),
nextHour.getHours(),
nextHour.getMinutes()
];
this.setData({
startTime: now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0'),
endTime: nextHour.getHours().toString().padStart(2, '0') + ':' + nextHour.getMinutes().toString().padStart(2, '0'),
startDateTimeArray: nowArr,
endDateTimeArray: nextArr,
startDate: now.getTime(),
endDate: nextHour.getTime(),
startDateDisplay: this.formatDateTime(now),
endDateDisplay: this.formatDateTime(nextHour)
});
// 页面加载时获取卡片列表
this.findAllCard();
// 初始化日期时间选择器数据
this.initDateTimeArray();
},
// 修改格式化日期时间的方法,增加更多格式化选项
formatDateTime(date, format = 'display') {
if (!date || !(date instanceof Date)) {
return '';
}
if (format === 'display') {
return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
} else if (format === 'params') {
return `${date.getFullYear()}${(date.getMonth() + 1).toString().padStart(2, '0')}${date.getDate().toString().padStart(2, '0')}${date.getHours().toString().padStart(2, '0')}${date.getMinutes().toString().padStart(2, '0')}`;
}
},
// 初始化日期时间选择器数据
initDateTimeArray() {
const date = new Date();
const years = [];
const months = [];
const days = [];
const hours = [];
const minutes = [];
// 生成年份选项当前年份往后5年
for (let i = date.getFullYear(); i <= date.getFullYear() + 5; i++) {
years.push(i + '年');
}
// 生成月份选项 - 显示1-12月
for (let i = 1; i <= 12; i++) {
months.push(i.toString().padStart(2, '0') + '月');
}
// 生成天数选项默认31天
for (let i = 1; i <= 31; i++) {
days.push(i.toString().padStart(2, '0') + '日');
}
// 生成小时选项
for (let i = 0; i < 24; i++) {
hours.push(i.toString().padStart(2, '0') + '时');
}
// 生成分钟选项
for (let i = 0; i < 60; i++) {
minutes.push(i.toString().padStart(2, '0') + '分');
}
this.setData({
dateTimeArray: [years, months, days, hours, minutes]
});
},
onStartDateTimeChange(e) {
const val = e.detail.value;
const dateTimeArray = this.data.dateTimeArray;
const yearStr = dateTimeArray[0][val[0]];
const year = parseInt(yearStr);
const month = parseInt(dateTimeArray[1][val[1]]) - 1; // 转换为0-11的月份
const day = parseInt(dateTimeArray[2][val[2]]);
const hour = parseInt(dateTimeArray[3][val[3]]);
const minute = parseInt(dateTimeArray[4][val[4]]);
const date = new Date();
date.setFullYear(year);
date.setMonth(month); // 使用0-11的月份
date.setDate(day);
date.setHours(hour);
date.setMinutes(minute);
date.setSeconds(0);
date.setMilliseconds(0);
const timestamp = date.getTime();
this.setData({
startDateTimeArray: val,
startDate: timestamp,
startDateDisplay: this.formatDateTime(date)
});
},
onEndDateTimeChange(e) {
const val = e.detail.value;
const dateTimeArray = this.data.dateTimeArray;
const yearStr = dateTimeArray[0][val[0]];
const year = parseInt(yearStr);
const month = parseInt(dateTimeArray[1][val[1]]) - 1; // 转换为0-11的月份
const day = parseInt(dateTimeArray[2][val[2]]);
const hour = parseInt(dateTimeArray[3][val[3]]);
const minute = parseInt(dateTimeArray[4][val[4]]);
const date = new Date();
date.setFullYear(year);
date.setMonth(month); // 使用0-11的月份
date.setDate(day);
date.setHours(hour);
date.setMinutes(minute);
date.setSeconds(59);
date.setMilliseconds(999);
const timestamp = date.getTime();
this.setData({
endDateTimeArray: val,
endDate: timestamp,
endDateDisplay: this.formatDateTime(date)
});
},
// 处理日期时间选择器列变化
onStartDateTimeColumnChange(e) {
// 处理月份天数联动
if (e.detail.column === 1) {
this.updateDays('startDateTimeArray', e.detail.value);
}
},
onEndDateTimeColumnChange(e) {
if (e.detail.column === 1) {
this.updateDays('endDateTimeArray', e.detail.value);
}
},
// 更新天数
updateDays(arrayName, monthIndex) {
const year = this.data.dateTimeArray[0][this.data[arrayName][0]];
const month = monthIndex + 1;
const days = new Date(parseInt(year), month, 0).getDate();
const newDays = [];
for (let i = 1; i <= days; i++) {
newDays.push(i.toString().padStart(2, '0') + '日');
}
const dateTimeArray = this.data.dateTimeArray;
dateTimeArray[2] = newDays;
this.setData({
dateTimeArray: dateTimeArray
});
},
async icCardOperate(e) {
const operate = e.currentTarget.dataset.operate;
const cardData = e.currentTarget.dataset.card;
if (cardData) {
this.setData({
cardId: cardData.cardId,
cardNumber: cardData.cardNumber,
cardName: cardData.cardName,
cardType: cardData.cardType,
isAdmin: cardData.isAdmin,
isForce: cardData.isForce,
isRound: cardData.isRound,
weekDay: cardData.weekDay || [],
startDate: cardData.startDate || 0,
endDate: cardData.endDate || 0,
startDateDisplay: cardData.startDate ? new Date(cardData.startDate).toISOString().split('T')[0] : '',
endDateDisplay: cardData.endDate ? new Date(cardData.endDate).toISOString().split('T')[0] : '',
startTime: cardData.startTime || '00:00',
endTime: cardData.endTime || '00:00'
});
}
await this._icCardOperate(Number(operate));
},
async _icCardOperate(operate) {
// 如果是修改操作,需要验证 cardNumber
if (operate === 1) {
if (!this.data.cardNumber || this.data.cardNumber === '0' || this.data.cardNumber === 0) {
wx.showToast({
title: '卡号无效',
icon: 'error',
duration: 2000
});
return;
}
}
// 新增:验证循环卡的周期设置
if (this.data.cardType === 4) {
if (!this.data.weekDay || !this.data.weekDay.length) {
wx.showToast({
title: '请设置循环周期',
icon: 'none',
duration: 2000
});
return;
}
}
wx.showLoading({
title: '处理中...',
mask: true
});
try {
const app = getApp();
const {accountInfo} = app.globalData;
const {lock} = app.globalData;
await selectLock({
accountInfo: accountInfo,
lockId: lock.lockId
});
let finalStartDate = this.data.startDate;
let finalEndDate = this.data.endDate;
// 处理循环卡的时间戳
if (this.data.cardType === 4) {
if (!this.data.weekDay || !this.data.weekDay.length) {
wx.showToast({
title: '请输入循环周期',
icon: 'none',
duration: 2000
});
return;
}
// 将时间部分应用到日期时间戳中
if (this.data.startDate && this.data.startTime) {
const [startHours, startMinutes] = this.data.startTime.split(':');
const startDate = new Date(this.data.startDate);
startDate.setHours(parseInt(startHours), parseInt(startMinutes), 0, 0);
finalStartDate = startDate.getTime();
}
if (this.data.endDate && this.data.endTime) {
const [endHours, endMinutes] = this.data.endTime.split(':');
const endDate = new Date(this.data.endDate);
endDate.setHours(parseInt(endHours), parseInt(endMinutes), 59, 999);
finalEndDate = endDate.getTime();
}
}
console.log('发送请求前的 weekDay:', this.data.weekDay);
// 转换 weekDay 为数字数组
const weekDayNumbers = this.data.weekDay.map(Number);
console.log('转换后的 weekDayNumbers:', weekDayNumbers);
const parms = {
type: 'card',
keyId: String(lock.keyId),
uid: String(accountInfo.uid),
userCountLimit: 0xFFFF,
operate: operate,
isAdmin: this.data.isAdmin,
isForce: this.data.isForce,
isRound: this.data.isRound,
weekDay: weekDayNumbers,
cardId: this.data.cardId,
cardNumber: Number(this.data.cardNumber), // 确保 cardNumber 是数字类型
cardName: this.data.cardName,
cardType: this.data.cardType,
cardUserNo: 999,
startDate: finalStartDate,
endDate: finalEndDate,
startTime: this.data.cardType === 4 ? this.data.startTime : undefined,
endTime: this.data.cardType === 4 ? this.data.endTime : undefined
};
// 更新参数显示,添加格式化的时间显示
if (this.data.cardType === 2) {
const startDateTime = new Date(this.data.startDate);
const endDateTime = new Date(this.data.endDate);
parms.displayTimeRange = `${this.formatDateTime(startDateTime, 'params')}-${this.formatDateTime(endDateTime, 'params')}`;
}
this.setData({
currentParams: parms
});
const registerExtendedProductsResult = await registerExtendedProducts(parms)
console.log('registerExtendedProductsResult', registerExtendedProductsResult);
if (registerExtendedProductsResult.code === 0) {
// 操作成功后清空表单
this.setData({
cardName: '',
cardType: 1,
isAdmin: 1,
isForce: 0,
isRound: 0,
weekDayInput: '',
weekDay: [],
startDate: 0,
endDate: 0,
startDateDisplay: '',
endDateDisplay: '',
startTime: '00:00',
endTime: '00:00'
});
// 刷新列表
await this.findAllCard();
wx.showToast({
title: '操作成功',
icon: 'success'
});
} else {
wx.showToast({
title: '操作失败',
icon: 'error'
});
}
} catch (error) {
console.error('操作失败:', error);
wx.showToast({
title: '操作失败',
icon: 'error'
});
} finally {
wx.hideLoading();
}
},
async findAllCard() {
const app = getApp();
const {lock} = app.globalData;
const result = await getIcCardList({lockId: lock.lockId})
console.log('findAllCard', result)
// 处理返回的卡片列表数据
const processedList = (result.data.list || []).map(card => {
// 将周期数字转换为周几文本
const weekDayText = card.weekDay ? card.weekDay.map(day => {
if (day === 7) return '周日';
return `${['一', '二', '三', '四', '五', '六'][day - 1]}`;
}).join(', ') : '';
return {
...card,
isAdmin: card.cardRight === 1 ? 1 : 0,
isForce: card.isCoerced === 1 ? 1 : 0,
isRound: (card.weekDay && card.weekDay.length > 0) ? 1 : 0,
weekDayText // 添加文本形式的周期显示
};
});
this.setData({
cardList: processedList
});
},
onCardTypeChange(e) {
const type = Number(e.detail.value);
this.setData({
cardType: type,
// 当选择永久类型时,重置时间
startTime: type === 1 ? '00:00' : this.data.startTime,
endTime: type === 1 ? '00:00' : this.data.endTime
})
},
onAdminChange(e) {
this.setData({
isAdmin: e.detail.value ? 1 : 0
})
},
onForceChange(e) {
this.setData({
isForce: e.detail.value ? 1 : 0
})
},
onStartDateChange(e) {
const dateStr = e.detail.value;
const timestamp = new Date(dateStr).getTime();
this.setData({
startDate: timestamp,
startDateDisplay: dateStr
});
},
onEndDateChange(e) {
const dateStr = e.detail.value;
const timestamp = new Date(dateStr).getTime();
this.setData({
endDate: timestamp,
endDateDisplay: dateStr
});
},
onStartTimeChange(e) {
this.setData({
startTime: e.detail.value
})
},
onEndTimeChange(e) {
this.setData({
endTime: e.detail.value
})
},
// 修改周期模式切换处理方法
onWeekdayPatternChange(e) {
const index = e.detail.value;
let weekDay = [];
switch (index) {
case '0': // 工作日循环
weekDay = [2, 3, 4, 5, 6]; // 星期一到星期五
break;
case '1': // 周末循环
weekDay = [1, 7]; // 星期日和星期六
break;
case '2': // 每天循环
weekDay = [1, 2, 3, 4, 5, 6, 7]; // 所有天
break;
}
this.setData({
weekdayPatternIndex: index,
weekDay,
isRound: weekDay.length > 0 ? 1 : 0
});
console.log('周期模式变更:', this.data.weekdayPatterns[index], weekDay);
},
onWeekDayChange(e) {
const selectedDays = e.detail.value.map(Number);
// 创建一个长度为7的数组初始值都是0
const weekDay = selectedDays.sort((a, b) => a - b);
this.setData({
weekDay,
isRound: weekDay.length > 0 ? 1 : 0
});
console.log('自定义周期变更:', weekDay);
},
// 修改选择卡片方法中的处理
selectCard(e) {
const cardData = e.currentTarget.dataset.card;
// 处理循环数据
let weekDay = [];
let weekdayPatternIndex = 0;
if (cardData.weekDay && Array.isArray(cardData.weekDay)) {
weekDay = cardData.weekDay;
weekDay.sort((a, b) => a - b); // 确保顺序一致
// 判断是否符合预设模式
const weekDayStr = weekDay.join(',');
if (weekDayStr === '2,3,4,5,6') {
weekdayPatternIndex = 0; // 工作日
} else if (weekDayStr === '1,7') {
weekdayPatternIndex = 1; // 周末
} else if (weekDayStr === '1,2,3,4,5,6,7') {
weekdayPatternIndex = 2; // 每天
}
}
// 处理时间戳转换
const startDateTime = new Date(Number(cardData.startDate) || 0);
const endDateTime = new Date(Number(cardData.endDate) || 0);
// 提取时间部分
const startTime = cardData.startTime ||
`${startDateTime.getHours().toString().padStart(2, '0')}:${startDateTime.getMinutes().toString().padStart(2, '0')}`;
const endTime = cardData.endTime ||
`${endDateTime.getHours().toString().padStart(2, '0')}:${endDateTime.getMinutes().toString().padStart(2, '0')}`;
// 格式化日期显示
const startDateDisplay = this.formatDateTime(startDateTime).split(' ')[0];
const endDateDisplay = this.formatDateTime(endDateTime).split(' ')[0];
this.setData({
cardId: cardData.cardId,
cardNumber: this.data.cardNumber || cardData.cardNumber || 0,
cardName: cardData.cardName,
cardType: cardData.cardType,
isAdmin: cardData.isAdmin || (cardData.cardRight === 1 ? 1 : 0),
isForce: cardData.isForce || (cardData.isCoerced === 1 ? 1 : 0),
isRound: weekDay.length > 0 ? 1 : 0,
weekDay,
weekdayPatternIndex,
startTime,
endTime,
startDateDisplay,
endDateDisplay,
startDate: cardData.startDate || 0,
endDate: cardData.endDate || 0,
editMode: true,
selectedCard: cardData
}, () => {
// 强制触发一次视图更新
this.setData({_forceUpdate: Date.now()});
});
},
// 添加辅助方法,计算年份索引
getYearIndex(year) {
const currentYear = new Date().getFullYear();
return year - currentYear;
},
// 修改确认编辑方法,直接使用时间戳
async confirmEdit() {
// 验证 cardNumber
if (!this.data.cardNumber || this.data.cardNumber === '0' || this.data.cardNumber === 0) {
wx.showToast({
title: '卡号无效',
icon: 'error',
duration: 2000
});
return;
}
// 直接使用当前的时间戳,不再重新构造
const formData = {
cardId: this.data.cardId,
cardNumber: this.data.cardNumber,
cardName: this.data.cardName,
cardType: this.data.cardType,
isAdmin: this.data.isAdmin,
isForce: this.data.isForce,
isRound: this.data.isRound,
weekDay: this.data.weekDay,
startDate: this.data.startDate,
endDate: this.data.endDate
};
// 更新当前数据
this.setData(formData);
// 执行修改操作
await this._icCardOperate(1);
// 修改完成后,退出编辑模式
if (this.data.editMode) {
this.cancelEdit();
}
},
// 修改取消编辑方法
cancelEdit() {
this.setData({
editMode: false,
selectedCard: null,
cardId: -1,
cardNumber: 0,
cardName: '',
cardType: 1,
isAdmin: 1,
isForce: 0,
isRound: 0,
weekDayInput: '',
weekdayPatternIndex: 0,
weekDay: [], // 默认为空数组
startDate: 0,
endDate: 0,
startDateDisplay: '',
endDateDisplay: '',
startTime: '00:00',
endTime: '00:00'
});
},
// 删除单个卡片
async deleteCard(e) {
const cardData = e.currentTarget.dataset.card;
this.setData({
cardId: cardData.cardId,
cardNumber: cardData.cardNumber
});
await this._icCardOperate(2); // 2 表示删除操作
}
})