背景

本来遇到须要培修问题时,业主须要先拨通物业客服电话,告知培修事项,再由客服调配培修员上门培修。现在,培修人员可在小程序上第一工夫收知业主反馈的信息,实现报修、接单的无缝对接,省去了原有物业客服接单、派单的简约流程。

功能模块

小程序分为“服务分类”、“报事报修”、“物业告诉”、“我的工单”四个板块。 业主能够通过“报事报修”进行线上报修,物业方则可在“治理后盾”上接单、调配外部工作等,极大地缩短为楼宇、居民区业主服务的中间环节,进步上门服务的响应速度和及时率 。 本我的项目前后端残缺代码包含布告告诉,报修记录,我的工单,物业告诉,后盾报修治理与处理,报修记录导出,后盾用户治理,后盾报修记录导出等性能

数据字段设计

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