410 lines
18 KiB
JavaScript
410 lines
18 KiB
JavaScript
(function (vc) {
|
||
|
||
vc.extends({
|
||
propTypes: {
|
||
callBackListener: vc.propTypes.string, //父组件名称
|
||
callBackFunction: vc.propTypes.string //父组件监听方法
|
||
},
|
||
data: {
|
||
addCommunitySpacePersonInfo: {
|
||
cspId: '',
|
||
spaceId: '',
|
||
personName: '',
|
||
personTel: '',
|
||
appointmentDate: '',
|
||
appointmentTime: '',
|
||
receivableAmount: '',
|
||
receivedAmount: '',
|
||
payWay: '',
|
||
bookingType: '', // 修改字段名为bookingType,与后端一致
|
||
resourceId: '', // 添加资源ID字段
|
||
state: 'S',
|
||
remark: '',
|
||
openTime: '',
|
||
openTimes: [],
|
||
spaces: [],
|
||
conflictWarning: null,
|
||
showBookingTypeSelect: true, // 控制是否显示场地类型选择框
|
||
}
|
||
},
|
||
_initMethod: function () {
|
||
// 确保addCommunitySpacePersonInfo对象已初始化
|
||
if (!vc.component.addCommunitySpacePersonInfo) {
|
||
vc.component.addCommunitySpacePersonInfo = {
|
||
cspId: '',
|
||
spaceId: '',
|
||
personName: '',
|
||
personTel: '',
|
||
appointmentDate: '',
|
||
appointmentTime: '',
|
||
receivableAmount: '',
|
||
receivedAmount: '',
|
||
payWay: '',
|
||
bookingType: '',
|
||
resourceId: '',
|
||
state: 'S',
|
||
remark: '',
|
||
openTime: '',
|
||
openTimes: [],
|
||
spaces: [],
|
||
conflictWarning: null,
|
||
showBookingTypeSelect: true,
|
||
};
|
||
}
|
||
},
|
||
_initEvent: function () {
|
||
vc.on('addCommunitySpacePerson', 'openAddCommunitySpacePersonModal', function (_param) {
|
||
// 确保addCommunitySpacePersonInfo对象已初始化
|
||
if (!vc.component.addCommunitySpacePersonInfo) {
|
||
vc.component.addCommunitySpacePersonInfo = {
|
||
cspId: '',
|
||
spaceId: '',
|
||
personName: '',
|
||
personTel: '',
|
||
appointmentDate: '',
|
||
appointmentTime: '',
|
||
receivableAmount: '',
|
||
receivedAmount: '',
|
||
payWay: '',
|
||
bookingType: '',
|
||
resourceId: '',
|
||
state: 'S',
|
||
remark: '',
|
||
openTime: '',
|
||
openTimes: [],
|
||
spaces: [],
|
||
conflictWarning: null,
|
||
showBookingTypeSelect: true,
|
||
};
|
||
}
|
||
|
||
$that.clearAddCommunitySpacePersonInfo();
|
||
// 如果 _param 包含 appointmentDate 或 appointmentTime,赋值
|
||
vc.copyObject(_param, $that.addCommunitySpacePersonInfo);
|
||
if (_param.appointmentDate) {
|
||
$that.addCommunitySpacePersonInfo.appointmentDate = _param.appointmentDate;
|
||
}
|
||
if (_param.appointmentTime) {
|
||
$that.addCommunitySpacePersonInfo.appointmentTime = _param.appointmentTime;
|
||
}
|
||
// 将 openTime 添加到 openTimes
|
||
if (_param.openTime) {
|
||
$that.addCommunitySpacePersonInfo.openTimes.push({
|
||
hours: _param.openTime,
|
||
isOpen: 'Y'
|
||
});
|
||
}
|
||
|
||
// 自动将 resourceId 设置为 spaceId 的值
|
||
$that.addCommunitySpacePersonInfo.resourceId = $that.addCommunitySpacePersonInfo.spaceId;
|
||
|
||
// 根据球场的bookingType字段判断预约类型
|
||
let _spaceBookingType = _param.spaceBookingType || 'Full'; // 默认为全场
|
||
|
||
if (_spaceBookingType === 'Full') {
|
||
// 如果是全场预约,设置bookingType为Full并隐藏场地类型选择
|
||
$that.addCommunitySpacePersonInfo.bookingType = 'Full';
|
||
$that.addCommunitySpacePersonInfo.showBookingTypeSelect = false; // 控制是否显示场地类型选择框
|
||
} else if (_spaceBookingType === 'Half') {
|
||
// 如果是半场预约,检查该时间段是否已有半场预约
|
||
let _hasHalfBooking = false;
|
||
let _existingResourceId = '';
|
||
// 获取reportCommunitySpace组件的persons数据,添加空值检查
|
||
let _reportCommunitySpaceComponent = vc.getComponent('reportCommunitySpace', 'reportCommunitySpaceInfo');
|
||
let _persons = _reportCommunitySpaceComponent ? _reportCommunitySpaceComponent.persons : [];
|
||
|
||
if (_persons && _param.spaceId && _param.hours) {
|
||
_persons.forEach(item => {
|
||
if (item.spaceId == _param.spaceId) {
|
||
item.times.forEach(itemTime => {
|
||
if (itemTime.hours == _param.hours && item.bookingType === 'Half') {
|
||
_hasHalfBooking = true;
|
||
_existingResourceId = item.resourceId;
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
// 判断当前球场的类型:如果已有半场预约,则默认为半场预约模式
|
||
if (_hasHalfBooking) {
|
||
$that.addCommunitySpacePersonInfo.bookingType = 'Half';
|
||
// 提示用户已有半场预约
|
||
setTimeout(() => {
|
||
vc.toast('该时间段已有半场预约,您将预约另一半场');
|
||
}, 500);
|
||
} else {
|
||
// 如果没有半场预约,默认为全场预约模式
|
||
$that.addCommunitySpacePersonInfo.bookingType = 'Full';
|
||
}
|
||
$that.addCommunitySpacePersonInfo.showBookingTypeSelect = true; // 显示场地类型选择框
|
||
}
|
||
|
||
$('#addCommunitySpacePersonModel').modal('show');
|
||
});
|
||
},
|
||
methods: {
|
||
addCommunitySpacePersonValidate() {
|
||
return vc.validate.validate({
|
||
addCommunitySpacePersonInfo: vc.component.addCommunitySpacePersonInfo
|
||
}, {
|
||
'addCommunitySpacePersonInfo.spaceId': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "场地ID不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "30",
|
||
errInfo: "场地ID不能超过30"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.personName': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "预约人不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "64",
|
||
errInfo: "预约人不能超过64"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.personTel': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "预约电话不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "11",
|
||
errInfo: "预约电话不能超过11"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.appointmentTime': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "预约时间不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "64",
|
||
errInfo: "预约时间不能超过64"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.receivableAmount': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "应收金额不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "10",
|
||
errInfo: "应收金额不能超过10"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.receivedAmount': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "实收金额不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "10",
|
||
errInfo: "实收金额不能超过10"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.payWay': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "支付方式不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "12",
|
||
errInfo: "支付方式不能超过12"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.state': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "state不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "12",
|
||
errInfo: "state不能超过12"
|
||
},
|
||
],
|
||
'addCommunitySpacePersonInfo.remark': [{
|
||
limit: "required",
|
||
param: "",
|
||
errInfo: "remark不能为空"
|
||
},
|
||
{
|
||
limit: "maxLength",
|
||
param: "512",
|
||
errInfo: "remark不能超过512"
|
||
},
|
||
],
|
||
});
|
||
},
|
||
saveCommunitySpacePersonInfo: function () {
|
||
if (!vc.component.addCommunitySpacePersonValidate()) {
|
||
vc.toast(vc.validate.errInfo);
|
||
return;
|
||
}
|
||
|
||
// 验证场地类型是否已选择
|
||
if (!vc.component.addCommunitySpacePersonInfo.bookingType) {
|
||
vc.toast("请选择场地类型");
|
||
return;
|
||
}
|
||
|
||
// 如果选择半场,验证资源ID是否已填写
|
||
if (vc.component.addCommunitySpacePersonInfo.bookingType === 'Half' &&
|
||
!vc.component.addCommunitySpacePersonInfo.resourceId) {
|
||
vc.toast("半场预约必须指定资源ID");
|
||
return;
|
||
}
|
||
|
||
vc.component.addCommunitySpacePersonInfo.communityId = vc.getCurrentCommunity().communityId;
|
||
//不提交数据将数据 回调给侦听处理
|
||
if (vc.notNull($props.callBackListener)) {
|
||
vc.emit($props.callBackListener, $props.callBackFunction, vc.component.addCommunitySpacePersonInfo);
|
||
$('#addCommunitySpacePersonModel').modal('hide');
|
||
return;
|
||
}
|
||
const conflict = this.checkBookingConflict();
|
||
if (conflict) {
|
||
vc.toast(conflict.message);
|
||
return;
|
||
}
|
||
|
||
vc.http.apiPost(
|
||
'/communitySpace.saveCommunitySpacePerson',
|
||
JSON.stringify(vc.component.addCommunitySpacePersonInfo), {
|
||
emulateJSON: true
|
||
},
|
||
function (json, res) {
|
||
//vm.menus = vm.refreshMenuActive(JSON.parse(json),0);
|
||
let _json = JSON.parse(json);
|
||
if (_json.code == 0) {
|
||
//关闭model
|
||
$('#addCommunitySpacePersonModel').modal('hide');
|
||
vc.component.clearAddCommunitySpacePersonInfo();
|
||
vc.emit('communitySpacePersonManage', 'listCommunitySpacePerson', {});
|
||
vc.emit('communitySpaceManage', 'listCommunitySpacePerson', {});
|
||
|
||
return;
|
||
}
|
||
vc.toast(_json.msg);
|
||
|
||
},
|
||
function(errInfo, error) {
|
||
let errorMsg = errInfo;
|
||
// 解析特定错误
|
||
if (errInfo.includes("已有半场预约,不能预约全场")) {
|
||
errorMsg = "无法预约全场:" + errInfo;
|
||
// 自动切换为半场模式
|
||
vc.component.addCommunitySpacePersonInfo.bookingType = 'Half';
|
||
vc.component.addCommunitySpacePersonInfo.resourceId = '';
|
||
vc.toast("已自动切换为半场预约模式");
|
||
}
|
||
else if (errInfo.includes("已被预约全场,不能预约半场")) {
|
||
errorMsg = "无法预约半场:" + errInfo;
|
||
}
|
||
else if (errInfo.includes("资源") && errInfo.includes("已被占用")) {
|
||
errorMsg = "资源冲突:" + errInfo;
|
||
// 提示用户选择其他资源
|
||
vc.emit('refreshResourceList', {});
|
||
}
|
||
|
||
vc.toast(errorMsg);
|
||
}
|
||
);
|
||
},
|
||
clearAddCommunitySpacePersonInfo: function () {
|
||
vc.component.addCommunitySpacePersonInfo = {
|
||
cspId: '',
|
||
spaceId: '',
|
||
personName: '',
|
||
personTel: '',
|
||
appointmentDate: '',
|
||
appointmentTime: '',
|
||
receivableAmount: '',
|
||
receivedAmount: '',
|
||
payWay: '',
|
||
bookingType: '', // 重置场地类型字段
|
||
resourceId: '', // 重置资源ID字段
|
||
state: 'S',
|
||
remark: '',
|
||
openTime: '',
|
||
openTimes: [],
|
||
spaces: [],
|
||
conflictWarning: null,
|
||
};
|
||
},
|
||
// 处理场地类型变化
|
||
onBookingTypeChange: function () {
|
||
// 如果从半场切换到全场,清空资源ID
|
||
if (vc.component.addCommunitySpacePersonInfo.bookingType === 'Full') {
|
||
vc.component.addCommunitySpacePersonInfo.resourceId = '';
|
||
}else if (vc.component.addCommunitySpacePersonInfo.bookingType === 'Half'){
|
||
vc.component.addCommunitySpacePersonInfo.resourceId = vc.component.addCommunitySpacePersonInfo.spaceId;
|
||
}
|
||
const conflict = this.checkBookingConflict();
|
||
if (conflict) {
|
||
vc.toast(conflict.message);
|
||
if (conflict.type === 'HALF_CONFLICT') {
|
||
this.addCommunitySpacePersonInfo.bookingType = 'Half';
|
||
vc.toast('已自动切换为半场预约模式')
|
||
}
|
||
}
|
||
},
|
||
checkBookingConflict() {
|
||
const info = this.addCommunitySpacePersonInfo;
|
||
if (!info.spaceId || !info.appointmentDate || !info.openTimes) return null;
|
||
|
||
// 获取已存在的预约数据
|
||
const reportComp = vc.getComponent('reportCommunitySpace', 'reportCommunitySpaceInfo');
|
||
const persons = reportComp ? reportComp.persons : [];
|
||
|
||
// 检测每个时间段
|
||
for (const timeSlot of info.openTimes) {
|
||
if (timeSlot.isOpen !== 'Y') continue;
|
||
|
||
const hour = timeSlot.hours;
|
||
const existingBookings = persons.filter(p =>
|
||
p.spaceId === info.spaceId &&
|
||
p.appointmentDate === info.appointmentDate &&
|
||
p.times.some(t => t.hours == hour)
|
||
);
|
||
|
||
// 检测冲突类型
|
||
if (existingBookings.length > 0) {
|
||
const hasFullBooking = existingBookings.some(b => b.bookingType === 'Full');
|
||
const hasHalfBooking = existingBookings.some(b => b.bookingType === 'Half');
|
||
|
||
if (info.bookingType === 'Full' && (hasFullBooking || hasHalfBooking)) {
|
||
return {
|
||
type: 'HALF_CONFLICT',
|
||
message: `时间段 ${hour} 点已有预约,无法预约全场`,
|
||
hour
|
||
};
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
},
|
||
resolveConflict() {
|
||
vc.emit('showAvailableTimes', {
|
||
spaceId: this.addCommunitySpacePersonInfo.spaceId,
|
||
date: this.addCommunitySpacePersonInfo.appointmentDate
|
||
});
|
||
}
|
||
|
||
}
|
||
});
|
||
|
||
})(window.vc); |