写点什么

校园物业报修小程序开发笔记一

作者:CC同学
  • 2023-10-30
    广东
  • 本文字数:3926 字

    阅读完需:约 13 分钟

背景

  • 校园规模和复杂性: 大型学校和校园通常拥有众多的建筑物、设施和设备,需要有效的维护和报修系统,以满足学生、教职员工和校园管理人员的需求。

  • 学生和员工需求: 学生和员工在校园内可能遇到各种维修问题,如故障的电灯、漏水、损坏的设备等。他们需要一种便捷的方式来报修问题并追踪报修进度。

  • 校园安全和卫生: 校园管理方需要确保校园内的设施和设备处于良好状态,以提供安全和卫生的学习和工作环境。因此,他们需要一个系统来管理和处理报修请求。

  • 工作效率提升: 传统的报修方式可能涉及电话、邮件或纸质报修单,这可能会导致信息不准确或丢失。校园需要一种更高效的方式来收集和处理报修请求。

  • 数据管理和分析: 校园管理方需要能够记录和分析报修数据,以便了解常见的问题、维修成本和维修工作的效率。

  • 可持续性和资源分配: 通过维护设施和设备,校园可以延长其使用寿命,降低维修成本,减少资源浪费,有助于可持续性管理。

功能设计

基于这些需求和背景,校园物业报修小程序的开发变得重要。这样的小程序可以提供以下功能:


  • 报修请求提交: 学生和员工可以使用小程序提交报修请求,包括问题的描述、照片等信息。

  • 报修进度追踪: 用户可以随时追踪其报修请求的进度,以了解何时将解决问题。

  • 工单分配和管理: 校园管理人员可以使用小程序来分配工单给维修人员,确保问题得到及时解决。

  • 维修资源管理: 系统可以帮助管理方有效地分配维修资源,提高维修效率。


开发校园物业报修小程序有助于提高校园的效率、安全性和可持续性,同时提供更好的用户体验。此外,小程序还可以降低沟通成本,减少信息丢失的可能性,为校园管理提供有力的工具。

概要设计

数据库设计

TaskModel.DB_STRUCTURE = {_pid: 'string|true',TASK_ID: 'string|true',


TASK_TYPE: 'int|true|default=0|comment=类型 0=用户创建,1=系统创建',
TASK_USER_ID: 'string|false|comment=用户ID',
TASK_STATUS: 'int|true|default=0|comment=状态 0=待派工,1=已派工,2=待处理, 9=已完成', TASK_FORMS: 'array|true|default=[]', TASK_OBJ: 'object|true|default={}',
TASK_MEMBER_ID: 'string|false|comment=工作人员ID', TASK_MEMBER_NAME: 'string|false',TASK_MEMBER_PHONE: 'string|false',TASK_MEMBER_CATE_NAME: 'string|false|comment=工作人员分类',TASK_MEMBER_CATE_ID: 'string|false|comment=工作人员分类ID',TASK_MEMBER_TIME: 'int|true|default=0|comment=工作人员派工时间',

TASK_RUN_FORMS: 'array|true|default=[]',TASK_RUN_OBJ: 'object|true|default={}',TASK_RUN_TIME: 'int|true|default=0',
TASK_OVER_FORMS: 'array|true|default=[]',TASK_OVER_OBJ: 'object|true|default={}',TASK_OVER_TIME: 'int|true|default=0',
TASK_COMMENT_FORMS: 'array|true|default=[]',TASK_COMMENT_OBJ: 'object|true|default={}',TASK_COMMENT_TIME: 'int|true|default=0',TASK_COMMENT_STATUS: 'int|true|default=0',

TASK_MEMBER_ADMIN_ID: 'string|false',TASK_MEMBER_ADMIN_NAME: 'string|false',
TASK_ADD_TIME: 'int|true',TASK_EDIT_TIME: 'int|true',TASK_ADD_IP: 'string|false',TASK_EDIT_IP: 'string|false',
复制代码


};


// 字段前缀 TaskModel.FIELD_PREFIX = "TASK_";


/**


  • 状态 0=待处理,1=处理中 9=已完成*/TaskModel.STATUS = {WAIT: 0,APPT: 1,RUN: 2,OVER: 9};


TaskModel.STATUS_DESC = {WAIT: '待派工',APPT: '已派工',RUN: '处理中',OVER: '已完成',};

难点攻关

// 取得处理流程 getTaskLogList(task) {let taskLogList = [];if (task.TASK_TYPE == 0) {taskLogList.push({desc: '用户提交',time: timeUtil.timestamp2Time(task.TASK_ADD_TIME, 'Y-M-D h:m')});}else {taskLogList.push({desc: '后台录入',time: timeUtil.timestamp2Time(task.TASK_ADD_TIME, 'Y-M-D h:m')});}


  if (task.TASK_STATUS >= TaskModel.STATUS.APPT) {    let desc = '已派工给 [' + task.TASK_MEMBER_CATE_NAME + '] ' + task.TASK_MEMBER_NAME + ',正在等待处理';    if (task.TASK_MEMBER_PHONE) desc += ' ,电话' + task.TASK_MEMBER_PHONE + ' ';    taskLogList.push(      {        desc,        time: timeUtil.timestamp2Time(task.TASK_MEMBER_TIME, 'Y-M-D h:m')      }    );  }
if (task.TASK_STATUS >= TaskModel.STATUS.RUN) taskLogList.push( { desc: '[' + task.TASK_MEMBER_CATE_NAME + '] ' + task.TASK_MEMBER_NAME + ' 开始处理', time: timeUtil.timestamp2Time(task.TASK_RUN_TIME, 'Y-M-D h:m'), content: task.TASK_RUN_OBJ.content, img: task.TASK_RUN_OBJ.img, } ); if (task.TASK_STATUS >= TaskModel.STATUS.OVER) taskLogList.push( { desc: '[' + task.TASK_MEMBER_CATE_NAME + '] ' + task.TASK_MEMBER_NAME + ' 已完成', time: timeUtil.timestamp2Time(task.TASK_OVER_TIME, 'Y-M-D h:m'), content: task.TASK_OVER_OBJ.content, img: task.TASK_OVER_OBJ.img, } );
return taskLogList;}
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 status9Cnt = await TaskModel.count({ TASK_STATUS: 9, TASK_USER_ID: userId }); let task = { status0Cnt, status1Cnt, status2Cnt, status9Cnt } return task;}
async getTaskDetail(userId, id, isAdmin = false) { let where = { _id: id } if (!isAdmin) where.TASK_USER_ID = userId;
let task = await TaskModel.getOne(where);
task.taskLogList = this.getTaskLogList(task);
return task;}

/**添加 */async insertTask(userId, { forms}) {
this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');}

/**修改 */async editTask({ id, forms}, formsName = 'TASK_FORMS', objName = 'TASK_OBJ') {
this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');}
// 更新forms信息async updateTaskForms({ id, hasImageForms}, formsName = 'TASK_FORMS', objName = 'TASK_OBJ') { await TaskModel.editForms(id, formsName, objName, hasImageForms);}
/**删除数据 */async delTask(userId, id, isAdmin) { this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');
}
async commentTask(id, forms) {
this.AppError('[校园报修]该功能暂不开放,如有需要请加作者微信:cclinux0730');}

/** 取得我的 */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.type']: ['like', search] }, { ['TASK_OBJ.address']: ['like', search] }, { ['TASK_OBJ.person']: ['like', search] } ]; } else if (sortType && sortVal !== '') { // 搜索菜单 switch (sortType) { 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;}

async getTaskList({ 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 };
if (util.isDefined(search) && search) { where.or = [ { ['TASK_OBJ.title']: ['like', search] }, { ['TASK_OBJ.building']: ['like', search] }, ]; } else if (sortType && sortVal !== '') { // 搜索菜单 switch (sortType) { 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 设计




管理人员 UI 设计






git 下载

下载

用户头像

CC同学

关注

CC同学的小程序开发笔记 2021-06-13 加入

大鹅厂的小小程序媛,vx: cclinux0730

评论

发布
暂无评论
校园物业报修小程序开发笔记一_CC同学_InfoQ写作社区