从0到100:小区物业报修小程序开发笔记

背景

原本遇到需要维修问题时,业主需要先拨通物业客服电话,告知维修事项,再由客服分配维修员上门维修。如今,维修人员可在小程序上第一时间收知业主反馈的信息,实现报修、接单的无缝对接,省去了原有物业客服接单、派单的繁复流程。

功能模块

小程序分为“服务分类”、“报事报修”、“物业通知”、“我的工单”四个板块。 业主可以通过“报事报修”进行线上报修,物业方则可在“管理后台”上接单、分配内部工作等,极大地缩短为楼宇、居民区业主服务的中间环节,提高上门服务的响应速度和及时率 。 本项目前后端完整代码包括公告通知,报修记录,我的工单,物业通知,后台报修管理与处置,报修记录导出,后台用户管理,后台报修记录导出等功能,在这里插入图片描述

数据字段设计

TaskModel.DB_STRUCTURE = {
	_pid: 'string|true',
	TASK_ID: 'string|true',
	TASK_USER_ID: 'string|true|comment=用户ID', 

	TASK_STATUS: 'int|true|default=0|comment=状态 0=待处理,1=处理中 9=已办结',

	TASK_FORMS: 'array|true|default=[]',
	TASK_OBJ: 'object|true|default={}',

	TASK_LAST_TIME: 'int|true|default=0',

	TASK_ADD_TIME: 'int|true',
	TASK_EDIT_TIME: 'int|true',
	TASK_ADD_IP: 'string|false',
	TASK_EDIT_IP: 'string|false',
};
UserModel.DB_STRUCTURE = {
	_pid: 'string|true',
	USER_ID: 'string|true',

	USER_MINI_OPENID: 'string|true|comment=小程序openid',
	USER_STATUS: 'int|true|default=1|comment=状态 0=待审核,1=正常,8=审核未过,9=禁用',
	USER_CHECK_REASON: 'string|false|comment=审核未过的理由',

	USER_NAME: 'string|false|comment=用户昵称',
	USER_MOBILE: 'string|false|comment=联系电话',

	USER_FORMS: 'array|true|default=[]',
	USER_OBJ: 'object|true|default={}',

	USER_LOGIN_CNT: 'int|true|default=0|comment=登陆次数',
	USER_LOGIN_TIME: 'int|false|comment=最近登录时间',


	USER_ADD_TIME: 'int|true',
	USER_ADD_IP: 'string|false',

	USER_EDIT_TIME: 'int|true',
	USER_EDIT_IP: 'string|false',
}

核心实现

async getTaskCountByType(userId) {
		let status0Cnt = await TaskModel.count({ TASK_STATUS: 0, TASK_USER_ID: userId });
		let status1Cnt = await TaskModel.count({ TASK_STATUS: 1, TASK_USER_ID: userId });
		let status2Cnt = await TaskModel.count({ TASK_STATUS: 2, TASK_USER_ID: userId });
		let task = {
			status0Cnt,
			status1Cnt,
			status2Cnt
		}
		return task;
	}

	async getTaskDetail(userId, id, isAdmin = false) {
		let where = {
			_id: id
		}
		if (!isAdmin) where.TASK_USER_ID = userId;
		return await TaskModel.getOne(where);
	}


	/**添加 */
	async insertTask(userId, {
		forms
	}) {

		// 赋值 
		let data = {};
		data.TASK_USER_ID = userId;

		data.TASK_OBJ = dataUtil.dbForms2Obj(forms);
		data.TASK_FORMS = forms;

		let id = await TaskModel.insert(data);

		return {
			id
		};
	}


	/**修改 */
	async editTask(userId, {
		id,
		forms
	}) {
		// 异步处理 新旧文件
		let oldForms = await TaskModel.getOneField(id, 'TASK_FORMS');
		if (!oldForms) return;
		cloudUtil.handlerCloudFilesForForms(oldForms, forms);

		// 赋值 
		let data = {};
		data.TASK_USER_ID = userId;
		data.TASK_OBJ = dataUtil.dbForms2Obj(forms);
		data.TASK_FORMS = forms;

		await TaskModel.edit(id, data);
	}

	// 更新forms信息
	async updateTaskForms({
		id,
		hasImageForms
	}) {
		await TaskModel.editForms(id, 'TASK_FORMS', 'TASK_OBJ', hasImageForms);
	}

	/**删除数据 */
	async delTask(userId, id, isAdmin) {
		let where = {
			_id: id
		}
		if (!isAdmin) where.TASK_USER_ID = userId;

		// 异步处理 新旧文件
		let task = await TaskModel.getOne(id, 'TASK_FORMS');
		if (!task) return;
		cloudUtil.handlerCloudFilesForForms(task.TASK_FORMS, []);

		await TaskModel.del(where);

	}


	/** 取得我的 */
	async getMyTaskList(userId, {
		search, // 搜索条件
		sortType, // 搜索菜单
		sortVal, // 搜索菜单
		orderBy, // 排序 
		page,
		size,
		isTotal = true,
		oldTotal
	}) {
		orderBy = orderBy || {
			'TASK_ADD_TIME': 'desc'
		};
		let fields = '*';

		let where = {};
		where.and = {
			_pid: this.getProjectId(), //复杂的查询在此处标注PID 
			TASK_USER_ID: userId
		};

		if (util.isDefined(search) && search) {
			where.or = [{ ['TASK_OBJ.title']: ['like', search] }];
		} else if (sortType && sortVal !== '') {
			// 搜索菜单
			switch (sortType) {
				case 'level': {
					where.and['TASK_OBJ.level'] = sortVal;
					break;
				}
				case 'type': {
					where.and['TASK_OBJ.type'] = sortVal;
					break;
				}
				case 'status': {
					where.and.TASK_STATUS = Number(sortVal);
					break;
				}
				case 'sort': {
					orderBy = this.fmtOrderBySort(sortVal, 'TASK_ADD_TIME');
					break;
				}
			}
		}
		let result = await TaskModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);

		return result;
	}

业主端 UI

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

物业端UI

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码

gitee源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值