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

背景

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

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

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

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

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

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

功能设计

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

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

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

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

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

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

概要设计

在这里插入图片描述

数据库设计

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

下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公网IP怎么设置?公网ip有哪些优点和缺点?

随着互联网的普及,越来越多的人开始关注网络安全和隐私保护。其中,公网IP的设置成为了一个备受关注的话题。本文将详细介绍公网IP的设置方法以及公网IP的优点和缺点。 一、公网IP设置方法 1. 路由器设置 在家庭或企业网络中,路由器通常是最重…

[C++进阶篇]STL以及string的使用

目录 1. 什么是STL 2. STL库的六大组件 3. 标准库中的string类 3.3 对比size和capacity接口函数 size代表字符串有效长度 capacity代表字符串的实际长度 3.4 reserve,resize函数的使用 3.5 string类的访问和遍历 4. string的修改操作 5. insert和e…

电厂数据可视化三维大屏展示平台加强企业安全防范

园区可视化大屏是一种新型的信息化手段,能够将园区内各项数据信息以图像的形式直观呈现在大屏幕上,便于管理员和员工进行实时监控、分析和决策。本文将从以下几个方面介绍园区可视化大屏的作用和应用。 VR数字孪生园区系统是通过将实际园区的各种数据和信…

【计算机视觉】相机

文章目录 一、原始的相机:针孔相机(Pinhole Camera)二、针孔相机的数学模型三、真实相机四、透镜的缺陷 我的《计算机视觉》系列参考UC Berkeley的CS180课程,PPT可以在课程主页看到。 成像原理 一、原始的相机:针孔相机…

Linux redis 安装

1、解压 tar -zxvf redis-5.0.10.tar.gz 2、cd /data/redis-5.0.10 文件夹 3、make 等待make命令执行完成即可。 make命令报错:cc 未找到命令,系统中缺少gcc,执行命令安装 gcc: yum -y install gcc automake autocon…

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析 1 题目 2023 年MathorCup 高校数学建模挑战赛——大数据竞赛赛道B:电商零售商家需求预测及库存优化问题电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库…

【刷题宝典NO.1】

Nim游戏 https://leetcode.cn/problems/nim-game/description/ 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。 你们轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人…

TextureView和SurfaceView

1、Surface Surface对应了一块屏幕的缓冲区,每一个window对应一个Surface,任何View都是画在Surface上的,传统的View共享一块屏幕缓冲区,所有的绘制都必须在UI线程上进行。 2、SurfaceView 顾名思义就是Surface的View,…

AWTK 液体流动效果控件发布

液体流动效果控件。 主要特色: 支持水平和垂直方向。支持正向和反向流动。支持设置头尾的图片。支持设置流动的图片。支持设置速度的快慢。支持启停操作。 准备 获取 awtk 并编译 git clone https://github.com/zlgopen/awtk.git cd awtk; scons; cd -运行 生成…

Ansible脚本进阶---playbook

目录 一、playbooks的组成 二、案例 2.1 在webservers主机组中执行一系列任务,包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。 2.2 在名为dbservers的主机组中创建一个用户组(mysql)和一个用户&#xf…

java项目之机房预约系统(ssm框架)

项目简介 机房预约系统实现了以下功能: 管理员:个人中心、学生管理、教师管理、机房号管理、机房信息管理、申请预约管理、取消预约管理、留言板管理、论坛管理、系统管理。学生:个人中心、机房信息管理、申请预约管理、取消预约管理、留言…

大数据可视化BI分析工具Apache Superset实现公网远程访问

大数据可视化BI分析工具Apache Superset实现公网远程访问 文章目录 大数据可视化BI分析工具Apache Superset实现公网远程访问前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网…

一文通透位置编码:从标准位置编码、欧拉公式到旋转位置编码RoPE

前言 关于位置编码和RoPE 我之前在本博客中的另外两篇文章中有阐述过(一篇是关于LLaMA解读的,一篇是关于transformer从零实现的),但自觉写的不是特别透彻好懂再后来在我参与主讲的类ChatGPT微调实战课中也有讲过,但有些学员依然反馈RoPE不是…

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值之at()、ptr()、iscontinuous()

🎉🎉🎉 欢 迎 各 位 来 到 小 白 p i a o 的 学 习 空 间 ! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖&…

大数据Flink(一百零五):SQL性能调优

文章目录 SQL性能调优 一、 ​​​​​​​MiniBatch 聚合

基于Ubuntu20.04安装ROS系统

文章目录 一、ROS简介二、ROS安装三、ROS安装测试四、安装问题解决1. sudo rosdepc init:找不到命令2. ERROR: cannot download default sources list from...3. Command roscore not found...4. Resource not found: roslaunch... 一、ROS简介 ROS是用于编写机器人…

阅读JDK源码的经验分享

理论先行。阅读某一个模块时,先搜索它的理论支撑,甚至可以先看别人的阅读经验,有了一个大致的了轮廓之后,自己再去实践。 必须试用。面对一个新的类,最好是先搜索一下它的基本用法,写成一个小的示例&#…

【Git】HEAD detached from xxx 问题及解决方案

问题背景 最近用git的时候遇到了一个问题,场景是这样的。 我有一个分支main,其中有两个commit A和B,A是最新commit,B是历史commit。我先切到B看了看之前的代码,然后切到A,并进行了一些代码修改&#xff0…

React JSX常用语法总结

React JSX语法 什么是React JSX JSX(javascript xml) 就是JavaScript和XML结合的一种格式,是JavaScript的语法扩展,只要把HTML代码写在JS中,就为JSX。用于动态构建用户界面的Javascript库,发送请求获取数据…

Glide原理

本文基于Carson整理 1.简介 相比其他几种图片加载框架,Glide性能最好。这得益于其高效的图片缓存策略 其还有多样化的媒体格式加载:如GIF、Video,对于商城首页需展示丰富样式、信息的页面需求来说,也是必不可少的。 2.加载原理…