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

news2024/12/26 22:11:00

背景

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

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

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

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

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

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

功能设计

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

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

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

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

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

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

概要设计

在这里插入图片描述

数据库设计

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

下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

精品Python的大学教室资源预约管理系统

《[含文档PPT源码等]精品基于Python的大学教室资源管理系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 开发语言:python 使用框架:Django 前…

0028Java程序设计-智能农场监控报警系统设计与实现

文章目录 摘要目 录系统设计开发环境 摘要 我国是一个以农业为主的国家,在当今社会信息化迅速发展的背景下,将信息技术与农业相融合是必然的趋势。现代信息技术在农业生产中的运用,主要体现在两个领域:一是传感器技术&#xff1b…

基于SpringBoot和Vue的车辆违章信息查询系统

一、绪论 1.1 研究背景 当前社会交通事故频发,车辆违章现象屡见不鲜。为了解决这一问题,车辆违章信息查询系统应运而生。该系统能够自动检测车辆违章行为并提供相关信息,为交通管理提供了便利。 目前,基于 Java 语言的前后端完…

0030Java程序设计-积分管理系统论文

文章目录 摘  要**目  录**系统实现系统功能需求3.2.1 管理员功能3.2.2 柜员功能 开发环境 摘  要 随着计算机和网络的不断革新,世界已经进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域。然…

丰富你的场景验证用例

即使对于一个非常简单的IP,我们也无法验证充分,或者说无法证明芯片没有bug。一个验证人员所能够做的就是尽可能地发现更多的bug,增强流片成功的信心。 对于芯片的验证用例,在各个基本分支通路都已经覆盖了之后,还需要考…

Proteus仿真--单个数码管循环显示0-9(仿真文件+程序)

本文主要介绍基于51单片机的单个数码管循环显示0-9,Proteus仿真(完整仿真源文件及代码见文末链接) 仿真运行视频 Proteus仿真--单个数码管循环显示0-9(仿真文件程序) 附完整Proteus仿真资料代码资料 百度网盘链接: ht…

【波形图】在X轴上显示时间和日期

下面的VI截图展示了使用“获取日期/时间(秒)VI”的不同方法。 然后需要设置一下波形图的属性。 由“获取日期/时间(秒)(Get Date/Time In Seconds)”VI创建的时间标识表示自世界时间1904年1月1日星期五12:0…

走近Python爬虫(上):爬虫的作用和技术、获取网页内容、解析网页内容

文章目录 一、绪论爬虫的作用爬虫的技术 二、获取网页—requests模块1.requests模块简单使用2.使用多线程 三、解析网页1.XPath 参考 本文是Python爬虫系列博客的第一篇,内容概览如下: 一、绪论 爬虫的作用 收集数据: 爬虫可用于收集数据&…

roboflow标注检测 / 分割数据集

对比了labelme, makesense.ai和roboflow这3个可以标注数据集的工具之后, 总结一下它们的特点: labelme需要配环境安装,标注的结果是json文件,需要转成所需格式。 makesense.ai不需要下载,在线标注,能用来标…

ENSP L2TP Over IPSec

本文拓扑沿用上一篇文章《ENSP L2TP 配置》,相关配置有差异。 拓扑 准备工作 客户端软件:URL 真机网络可以到达LNS10.100.1.254 防火墙上接口划分到相应安全区域,安全策略全开(本文只是测试,现网中根据自己网络情况严格设置安…

Python selenium驱动下载,模块安装以及基本使用

视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 我们以谷歌浏览器为例讲解。首先我们要去下载谷歌浏览器驱动。 谷歌浏览器驱动下载地址:Chromium History Versions Download ↓ 查看谷歌浏览器版本 右上角三个点 …

SpringCloud之Eureka的学习【详细】

目录 服务架构演变 单体架构 分布式架构 分布式架构需要考虑的问题 微服务 架构比较 微服务技术对比 服务拆分注意事项 案例 服务远程调用 RestTemplate Eureka注册中心 RestTemplate存在的问题 服务调用考虑的问题 Eureka的作用 搭建EurekaServer 服务注册 …

【达梦数据库】数据查询操作(超详细)

文章目录 数据查询1. 单表查询1. 简单查询2. 条件查询总结举例 3. 函数查询常用多行函数常用单行函数1. 字符函数2. 数值函数3. 日期时间函数常用日期型函数举例 4. 转换函数 4. 查询结果排序(order by)参数说明:注意事项: 2. 连接查询1. 交叉连接&#…

0034Java程序设计-基于Java的飞机大战游戏的设计与实现论文

文章目录 摘 要目 录系统设计开发环境 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communication ,第四代移动通信技术)网络的深入,越来越多的IT行业开始向手机行业转移重心…

JVM虚拟机:从结构到指令让你对栈有足够的认识

本文重点 在前面的课程中,我们学习了运行时数据区的大概情况,从本文开始,我们将对一些组件进行详细的介绍,本文我们将学习栈。栈内存主管java的运行,是在线程创建时创建的,它是线程私有的,它的生命周期是跟随线程的生命期,也就是说线程结束栈内存就释放了,对于栈来说…

web:[网鼎杯 2020 青龙组]AreUSerialz

题目 点进题目发现 需要进行代码审计 function __destruct() {if($this->op "2")$this->op "1";$this->content "";$this->process();}这里有__destruct()函数,在对象销毁时自动调用,根据$op属性的值进行…

数据结构与算法:二叉树之“堆排序”

目录 一、树概念及结构 二、二叉树树概念及结构 特殊的二叉树 三、堆的概念及结构 四、堆的创建 1、声明结构体 2、初始化 3、销毁 4、添加新元素 5、交换元素 6、向上调整 7、判断堆是否为空 8、移除堆顶元素 9、向下调整 10、获取堆元素个数 五、使用堆排序…

【网络编程】传输层——UDP协议

文章目录 一、传输层1. 再谈端口号2. 端口号范围划分3. 认识知名端口号4. 两个问题5. netstat 与 pidof 二、UDP协议1. UDP协议格式2. UDP协议的特点3. 面向数据报4. UDP的缓冲区5. UDP使用注意事项6. 基于UDP的应用层协议 一、传输层 传输层 负责负责两台计算机之间的端到端的…

阿里云2023年双11活动时间、活动入口、活动内容详细解读

阿里云2023年双11活动正在火热进行中,双11活动时间,阿里云推出了金秋上云季活动,活动包括满减礼包福利,云产品降价让利,下面给大家整理分享阿里云双11活动时间、活动入口、活动内容,助力大家轻松上云&#…

网络爬虫-Requests库主要方法解析

一、Requests库的7个主要方法 其中,request()是 基础方法,其他6个方法都是基于request()的,但最常用的是get() 和 head() 二、request() 13个访问控制参数: 三、get(): 获取某一个url链接的相关资源 四、head() 五、post() 六、…