从0到1:校园物业报修小程序开发笔记一

背景

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

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

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

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

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

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

功能设计

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

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

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

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

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

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

概要设计

数据库设计

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

vbnet 复制代码
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') } ); }

ini 复制代码
	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下载

下载

相关推荐
面向星辰1 小时前
html各种常用标签
前端·javascript·html
梦6501 小时前
HTML新属性
前端
东风西巷3 小时前
PDFgear:免费全能的PDF处理工具
前端·pdf·软件需求
小沈同学呀3 小时前
创建一个Spring Boot Starter风格的Basic认证SDK
java·spring boot·后端
森之鸟4 小时前
Mac电脑上如何打印出字体图标
前端·javascript·macos
mCell4 小时前
GSAP 入门指南
前端·javascript·动效
gnip5 小时前
组件循环引用依赖问题处理
前端·javascript
方圆想当图灵5 小时前
如何让百万 QPS 下的服务更高效?
分布式·后端
凤山老林5 小时前
SpringBoot 轻量级一站式日志可视化与JVM监控
jvm·spring boot·后端
凡梦千华6 小时前
Django时区感知
后端·python·django