背景
本来遇到须要培修问题时,业主须要先拨通物业客服电话,告知培修事项,再由客服调配培修员上门培修。现在,培修人员可在小程序上第一工夫收知业主反馈的信息,实现报修、接单的无缝对接,省去了原有物业客服接单、派单的简约流程。
功能模块
小程序分为“服务分类”、“报事报修”、“物业告诉”、“我的工单”四个板块。 业主能够通过“报事报修”进行线上报修,物业方则可在“治理后盾”上接单、调配外部工作等,极大地缩短为楼宇、居民区业主服务的中间环节,进步上门服务的响应速度和及时率 。 本我的项目前后端残缺代码包含布告告诉,报修记录,我的工单,物业告诉,后盾报修治理与处理,报修记录导出,后盾用户治理,后盾报修记录导出等性能
数据字段设计
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源码下载