乐趣区

关于小程序:从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 源码下载

退出移动版