从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源码下载

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值