# 蓝领安装
**Repository Path**: bujinmayun/llaz
## Basic Information
- **Project Name**: 蓝领安装
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 13
- **Created**: 2018-11-22
- **Last Updated**: 2020-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
注意:项目中使用了Lombok,IDEA直接安装Lombok插件,eclipse需要手动执行java -jar [lombok.jar(本地仓库lombok.jar文件路径)]之后点击install/update按钮,即可安装完成
**==学习过程有问题麻烦及时反映!!!!!!!!!!==**
学习一门技术:
首先你要搞清楚,这个技术可以给我们解决什么样的问题?
做项目也是这样:
蓝领就是一个可以在全国很多城市提供这个汽配装饰的安装服务。
解决线下客户在线购买的汽配配件的就近安装。
# 项目背景
3M 晶锐70 晶锐90 晶锐40
龙膜 llumar AVS70
威固 V-KOOL V70
大师 Z70
车载导航
行车记录仪
取电:保险盒取电(常电 acc 负(搭铁))
点烟器取电
# 项目介绍
蓝领安装是一家汽车后市场O2O模式安装服务平台,同时也是天猫的汽车类目的服务商,车主线上购买,就近到服务商门店安装,蓝领安装汽车服务商订单管理系统负责管理车主到店的安装订单。该系统分为Web端和微信公众号端,业务主要分为创建订单(天猫推送、手动录入、Excel导入)、派单(将安装订单推送到服务商门店微信端)、回访、结算、商家管理、服务商门店管理、门店区域分布等模块。
责任描述:主要参与服务商线下门店的管理、订单的派单功能开发模块的需求分析、数据库设计及Web前端的开发。门店管理用于维护门店的基本信息、维护门店的经纬度信息、报价表信息。
派单功能需要根据车主信息的地址、安装项目显示车主所在地的附近门店,派单客户线下与车主沟通选择合适的门店给车主,确定好,线上通过短信方式发送门店的基本信息给车主,同时提交订单信息到门店的微信端,并发送短信提醒门店。
# 项目流程

## 工单
车主通过天猫、京东、淘宝等电商平台购买产品后,如果是天猫订单且开通安装服务的订单,天猫会给蓝领安装平台推送工单,工单内包括消费者的姓名、联系方式、住址、产品信息相关信息。
### 手动录入
非天猫订单,无法将工单推送到蓝领安装系统里,这时就需要进行手动录入的形式将车主信息和安装服务相关信息录入到系统内。
### Excel导入
当手动录入的工单过多时,手动录入比较麻烦,这时可以采用Excel导入可以方便的将工单导入到系统里。
## 派单
派单是安装平台将订单分配到消费者合理距离内的安装门店并将门店的信息告知用户,将消费者的信息告知安装门店。
## 核销
门店安装完成后,安装师傅会向消费者索取核销码,安装师傅通过微信公众平台进行验证,验证通过后,订单完成。
# 数据库设计
用户表(t_user):
| 列名 | 数据库类型 | Java类型 | 描述 |
| --------- | ------------ | -------- | ------------------ |
| id | bigint | Long | 主键 |
| username | varchar(50) | String | 唯一键,登录用户名 |
| password | varchar(64) | String | 用户密码 |
| telephone | varchar(11) | String | 用户的手机号 |
| address | varchar(200) | String | 用户的地址 |
| name | varchar(50) | String | 用户的名称 |
商家表(t_seller):
| 列名 | 数据库类型 | Java类型 | 描述 |
| --------- | ------------ | -------- | ------------------ |
| id | bigint | Long | 主键 |
| username | varchar(50) | String | 唯一键,登录用户名 |
| password | varchar(64) | String | 用户密码 |
| telephone | varchar(11) | String | 商家手机号 |
| address | varchar(200) | String | 商家的地址 |
| name | varchar(50) | String | 商家的名称 |
门店表(t_store):
| 列名 | 数据库类型 | Java类型 | 描述 |
| ---------- | ------------ | -------- | -------------- |
| id | bigint | Long | 主键 |
| name | varchar(50) | String | 店名 |
| linkName | varchar(50) | String | 联系人 |
| phone | varchar(11) | String | 联系电话 |
| address | varchar(200) | String | 地址 |
| remark | text | String | 主营业务及价格 |
| createUid | bigint | Long | 创建门店的人 |
| createTime | datetime | Date | 创建门店的时间 |
工单表(t_order):
| 列名 | 数据库类型 | Java类型 | 描述 |
| ----------- | ------------- | ---------- | ------------------------------------------------------------ |
| id | bigint | Long | 主键 |
| sellerId | bigint | Long | 商家ID |
| sellerName | varchar(50) | String | 商家名称 |
| name | varchar(50) | String | 车主姓名 |
| phone | varchar(11) | String | 车主手机号 |
| address | varchar(200) | String | 车主地址 |
| carType | varchar(50) | String | 车主车型 |
| product | varchar(100) | String | 安装产品 |
| remark | text | String | 备注 |
| price | decimal(10,2) | BigDecimal | 收商家的价格 |
| state | int(1) | Integer | 订单的状态
1、新工单
2、待安装
3、订单结束
|
| storeId | bigint | Long | 门店ID |
| storeName | varchar(50) | String | 门店名称 |
| pdUid | bigint | Long | 派单人的ID |
| pdUname | varchar(50) | String | 派单人的名字 |
| pdTime | datetime | Date | 派单的时间 |
| hxm | varchar(20) | String | 核销码(派单时生成) |
| hxUid | bigint | Long | 核销人的ID |
| hxUname | varchar(50) | String | 核销人的名字 |
| hxTime | datetime | Date | 核销的时间 |
| createTime | datetime | Date | 下单时间 |
| createUid | bigint | Long | 下单人Id |
| createUname | varchar(50) | String | 下单人姓名 |
| orderId | varchar(50) | String | 淘宝jd后台订单号 |
建表sql
```sql
create table t_user(
id BIGINT PRIMARY KEY auto_increment,
username VARCHAR(50) UNIQUE,
password VARCHAR(64),
telephone VARCHAR(11),
address VARCHAR(200),
name VARCHAR(50)
);
CREATE TABLE `t_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`sellerId` bigint(20) DEFAULT NULL,
`sellerName` varchar(50) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`phone` varchar(11) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
`carType` varchar(50) DEFAULT NULL,
`product` varchar(100) DEFAULT NULL,
`remark` text,
`price` decimal(10,2) DEFAULT NULL,
`state` int(1) DEFAULT NULL,
`storeId` bigint(20) DEFAULT NULL,
`storeName` varchar(50) DEFAULT NULL,
`pdUid` bigint(20) DEFAULT NULL,
`pdUname` varchar(50) DEFAULT NULL,
`pdTime` datetime DEFAULT NULL,
`hxm` varchar(20) DEFAULT NULL,
`hxUid` bigint(20) DEFAULT NULL,
`hxUname` varchar(50) DEFAULT NULL,
`hxTime` datetime DEFAULT NULL,
`createTime` datetime DEFAULT NULL,
`createUid` bigint(20) DEFAULT NULL,
`createUname` varchar(50) DEFAULT NULL,
`orderId` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create table t_seller (
id BIGINT PRIMARY KEY auto_increment,
username varchar(50) UNIQUE,
password varchar(64),
telephone VARCHAR(11),
address VARCHAR(200),
name VARCHAR(50)
);
create table t_store(
id bigint primary key auto_increment,
name varchar(50),
linkName varchar(50),
phone varchar(11),
address varchar(200),
remark text,
createUid bigint,
createTime datetime,
regionId bigint
);
```
druid配置:
| 配置 | 缺省值 | 说明 |
| ----------------------------- | ------------------ | ------------------------------------------------------------ |
| name | | 配置这个属性的意义在于,如果存在多个数据源,监控的时候 可以通过名字来区分开来。如果没有配置,将会生成一个名字, 格式是:"DataSource-" + System.identityHashCode(this) |
| jdbcUrl | | 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto |
| username | | 连接数据库的用户名 |
| password | | 连接数据库的密码。如果你不希望密码直接写在配置文件中, 可以使用ConfigFilter。详细看这里: |
| driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName |
| initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 |
| maxActive | 8 | 最大连接池数量 |
| maxIdle | 8 | 已经不再使用,配置了也没效果 |
| minIdle | | 最小连接池数量 |
| maxWait | | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后, 缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 |
| poolPreparedStatements | false | 是否缓存preparedStatement,也就是PSCache。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。 在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。 作者在5.5版本中使用PSCache,通过监控界面发现PSCache有缓存命中率记录, 该应该是支持PSCache。 |
| maxOpenPreparedStatements | -1 | 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true。 在Druid中,不会存在Oracle下PSCache占用内存过多的问题, 可以把这个数值配置大一些,比如说100 |
| validationQuery | | 用来检测连接是否有效的sql,要求是一个查询语句。 如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作用。 |
| testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
| testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
| testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。 |
| timeBetweenEvictionRunsMillis | | 有两个含义: 1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 |
| numTestsPerEvictionRun | | 不再使用,一个DruidDataSource只支持一个EvictionRun |
| minEvictableIdleTimeMillis | | |
| connectionInitSqls | | 物理连接初始化的时候执行的sql |
| exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
| filters | | 属性类型是字符串,通过别名的方式配置扩展插件, 常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall |
| proxyFilters | | 类型是List, 如果同时配置了filters和proxyFilters, 是组合关系,并非替换关系 |