背景
原本遇到需要维修问题时,业主需要先拨通物业客服电话,告知维修事项,再由客服分配维修员上门维修。如今,维修人员可在小程序上第一时间收知业主反馈的信息,实现报修、接单的无缝对接,省去了原有物业客服接单、派单的繁复流程。
功能模块
小程序分为“服务分类”、“报事报修”、“物业通知”、“我的工单”四个板块。 业主可以通过“报事报修”进行线上报修,物业方则可在“管理后台”上接单、分配内部工作等,极大地缩短为楼宇、居民区业主服务的中间环节,提高上门服务的响应速度和及时率 。 本项目前后端完整代码包括公告通知,报修记录,我的工单,物业通知,后台报修管理与处置,报修记录导出,后台用户管理,后台报修记录导出等功能
数据字段设计
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源码下载
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net