Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
dingding
Project
Project
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
Graph
比较
统计图
议题
0
议题
0
列表
看板
标记
Milestones
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
注册表
注册表
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
svn
dingding
Commits
547107b4
提交
547107b4
authored
3月 16, 2020
作者:
liupengfei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加字段更改,分页查询列表
上级
04a1d8c8
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
46 个修改的文件
包含
2921 行增加
和
8 行删除
+2921
-8
pom.xml
pom.xml
+41
-1
Application.java
src/main/java/com/Application.java
+4
-1
Swagger2Config.java
src/main/java/com/config/Swagger2Config.java
+82
-0
URLConstant.java
src/main/java/com/config/URLConstant.java
+5
-0
IndexController.java
src/main/java/com/controller/IndexController.java
+1
-0
CustomerController.java
...main/java/com/controller/customer/CustomerController.java
+42
-0
UserController.java
src/main/java/com/controller/dingding/UserController.java
+13
-5
BooleanStatusEnum.java
src/main/java/com/enums/BooleanStatusEnum.java
+79
-0
EnvironmentEnum.java
src/main/java/com/enums/EnvironmentEnum.java
+73
-0
ResponseCodeEnum.java
src/main/java/com/enums/ResponseCodeEnum.java
+42
-0
EnumsBindBean.java
src/main/java/com/enums/interfaces/EnumsBindBean.java
+19
-0
EnumsInterface.java
src/main/java/com/enums/interfaces/EnumsInterface.java
+22
-0
LoggerFactory.java
src/main/java/com/enums/interfaces/LoggerFactory.java
+8
-0
EnumsBindObject.java
src/main/java/com/enums/interfaces/bean/EnumsBindObject.java
+24
-0
SqlConditionEnum.java
src/main/java/com/enums/sql/SqlConditionEnum.java
+114
-0
SqlConditionInterface.java
src/main/java/com/enums/sql/SqlConditionInterface.java
+26
-0
LikeSqlCondition.java
src/main/java/com/enums/sql/impl/LikeSqlCondition.java
+66
-0
ListSqlCondition.java
src/main/java/com/enums/sql/impl/ListSqlCondition.java
+73
-0
RegexpSqlCondition.java
src/main/java/com/enums/sql/impl/RegexpSqlCondition.java
+55
-0
SimpleSqlCondition.java
src/main/java/com/enums/sql/impl/SimpleSqlCondition.java
+74
-0
BaseException.java
src/main/java/com/excetion/BaseException.java
+63
-0
QueryCustomerForm.java
src/main/java/com/form/customer/QueryCustomerForm.java
+21
-0
BaseMapper.java
src/main/java/com/mapper/BaseMapper.java
+13
-0
InsertUidListMapper.java
src/main/java/com/mapper/InsertUidListMapper.java
+14
-0
SqlXMLLanguageDriver.java
src/main/java/com/mapper/SqlXMLLanguageDriver.java
+61
-0
ZrqxMapper.java
src/main/java/com/mapper/ZrqxMapper.java
+51
-0
ZrqxProvider.java
src/main/java/com/mapper/ZrqxProvider.java
+86
-0
CustomerMapper.java
src/main/java/com/mapper/customer/CustomerMapper.java
+38
-0
Customer.java
src/main/java/com/model/customer/Customer.java
+60
-0
BaseService.java
src/main/java/com/service/BaseService.java
+263
-0
BaseServiceImpl.java
src/main/java/com/service/BaseServiceImpl.java
+398
-0
NotNullInterface.java
src/main/java/com/service/NotNullInterface.java
+70
-0
CustomerService.java
src/main/java/com/service/customer/CustomerService.java
+13
-0
CustomerServiceImpl.java
src/main/java/com/service/customer/CustomerServiceImpl.java
+37
-0
ArrayUtils.java
src/main/java/com/util/ArrayUtils.java
+74
-0
BeanUtils.java
src/main/java/com/util/BeanUtils.java
+167
-0
CallBack.java
src/main/java/com/util/CallBack.java
+174
-0
DingTalkResult.java
src/main/java/com/util/DingTalkResult.java
+13
-0
PageInfo.java
src/main/java/com/util/PageInfo.java
+0
-0
PageMap.java
src/main/java/com/util/PageMap.java
+176
-0
PageParam.java
src/main/java/com/util/PageParam.java
+19
-0
StringUtils.java
src/main/java/com/util/StringUtils.java
+166
-0
SimpleUserListVo.java
src/main/java/com/vo/dingding/SimpleUserListVo.java
+13
-0
SimpleUserVo.java
src/main/java/com/vo/dingding/SimpleUserVo.java
+17
-0
application.properties
src/main/resources/application.properties
+2
-1
application.yml
src/main/resources/application.yml
+49
-0
没有找到文件。
pom.xml
浏览文件 @
547107b4
...
...
@@ -9,7 +9,7 @@
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
1.4.2
.RELEASE
</version>
<version>
2.0.6
.RELEASE
</version>
<relativePath
/>
<!-- lookup parent from repository -->
</parent>
...
...
@@ -87,6 +87,46 @@
<groupId>
org.yaml
</groupId>
<artifactId>
snakeyaml
</artifactId>
</dependency>
<!--阿里的连接池 -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid
</artifactId>
<version>
1.1.20
</version>
</dependency>
<dependency>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
</dependency>
<dependency>
<groupId>
tk.mybatis
</groupId>
<artifactId>
mapper-spring-boot-starter
</artifactId>
<version>
1.2.4
</version>
</dependency>
<dependency>
<groupId>
com.github.pagehelper
</groupId>
<artifactId>
pagehelper-spring-boot-starter
</artifactId>
<version>
1.2.4
</version>
</dependency>
<dependency>
<groupId>
org.mybatis.spring.boot
</groupId>
<artifactId>
mybatis-spring-boot-starter
</artifactId>
<version>
1.3.1
</version>
</dependency>
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger2
</artifactId>
<version>
2.7.0
</version>
</dependency>
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger-ui
</artifactId>
<version>
2.7.0
</version>
</dependency>
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-lang3
</artifactId>
<version>
3.7
</version>
</dependency>
</dependencies>
<build>
...
...
src/main/java/com/Application.java
浏览文件 @
547107b4
...
...
@@ -4,10 +4,13 @@ import org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
;
import
tk.mybatis.spring.annotation.MapperScan
;
/**
* 启动入口
*/
@SpringBootApplication
(
exclude
=
{
DataSourceAutoConfiguration
.
class
})
@SpringBootApplication
@MapperScan
(
basePackages
=
{
"com.mapper.*"
})
public
class
Application
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
Application
.
class
,
args
);
...
...
src/main/java/com/config/Swagger2Config.java
0 → 100644
浏览文件 @
547107b4
package
com
.
config
;
import
java.util.ArrayList
;
import
java.util.List
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
springfox.documentation.builders.ApiInfoBuilder
;
import
springfox.documentation.builders.ParameterBuilder
;
import
springfox.documentation.builders.PathSelectors
;
import
springfox.documentation.builders.RequestHandlerSelectors
;
import
springfox.documentation.schema.ModelRef
;
import
springfox.documentation.service.ApiInfo
;
import
springfox.documentation.service.Parameter
;
import
springfox.documentation.spi.DocumentationType
;
import
springfox.documentation.spring.web.plugins.ApiSelectorBuilder
;
import
springfox.documentation.spring.web.plugins.Docket
;
import
springfox.documentation.swagger2.annotations.EnableSwagger2
;
/**
* 访问地址
* http://ip:port/swagger-ui.html
最常用的5个注解
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
其它若干
@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiClass
@ApiError
@ApiErrors
@ApiParamImplicit
@ApiParamsImplicit
*/
@EnableSwagger2
@Configuration
public
class
Swagger2Config
{
@Value
(
"${server.env}"
)
private
String
env
;
@Bean
public
Docket
createRestApi
()
{
String
path
=
"com.prod"
;
if
(
"test"
.
equals
(
env
))
{
path
=
"com.controller"
;
}
return
new
Docket
(
DocumentationType
.
SWAGGER_2
)
.
apiInfo
(
apiInfo
())
.
select
()
.
apis
(
RequestHandlerSelectors
.
basePackage
(
path
))
.
paths
(
PathSelectors
.
any
())
.
build
();
}
//构建 api文档的详细信息函数
private
ApiInfo
apiInfo
()
{
return
new
ApiInfoBuilder
()
//页面标题
.
title
(
"测试使用 Swagger2 构建RESTful API"
)
//描述
.
description
(
"服务 API 描述"
)
//创建人
//.contact(new Contact("", "www.baidu.com", "cxinchang@126.com"))
//版本号
.
version
(
"4.0"
)
.
build
();
}
}
\ No newline at end of file
src/main/java/com/config/URLConstant.java
浏览文件 @
547107b4
...
...
@@ -15,4 +15,9 @@ public class URLConstant {
*获取用户姓名的接口url
*/
public
static
final
String
URL_USER_GET
=
"https://oapi.dingtalk.com/user/get"
;
/**
* 获取部门用户
*/
public
static
final
String
URL_USER_SIMPLELIST
=
"https://oapi.dingtalk.com/user/simplelist"
;
}
src/main/java/com/controller/IndexController.java
浏览文件 @
547107b4
...
...
@@ -66,6 +66,7 @@ public class IndexController {
Map
<
String
,
Object
>
resultMap
=
new
HashMap
<>();
resultMap
.
put
(
"userId"
,
userId
);
resultMap
.
put
(
"userName"
,
userName
);
// TODO 获取用户权限
ServiceResult
serviceResult
=
ServiceResult
.
success
(
resultMap
);
return
serviceResult
;
}
...
...
src/main/java/com/controller/customer/CustomerController.java
0 → 100644
浏览文件 @
547107b4
package
com
.
controller
.
customer
;
import
java.util.Date
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.form.customer.QueryCustomerForm
;
import
com.model.customer.Customer
;
import
com.service.customer.CustomerService
;
import
com.util.CallBack
;
import
com.util.PageInfo
;
import
com.util.PageParam
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
@RestController
@RequestMapping
(
"/customer"
)
@Api
(
description
=
"客户管理"
)
public
class
CustomerController
{
@Autowired
private
CustomerService
service
;
@ApiOperation
(
value
=
"保存客户信息"
,
notes
=
"保存客户信息"
)
@PostMapping
(
"/save"
)
public
CallBack
<?>
save
(
Customer
entity
){
entity
.
setCreateTime
(
new
Date
());
service
.
insert
(
entity
);
return
CallBack
.
success
();
}
@ApiOperation
(
value
=
"查询客户信息"
,
notes
=
"查询全部客户信息"
)
@GetMapping
(
"/page"
)
public
CallBack
<
PageInfo
<
Customer
>>
page
(
PageParam
pageParam
,
QueryCustomerForm
form
)
{
return
CallBack
.
success
(
service
.
page
(
pageParam
,
form
));
}
}
src/main/java/com/controller/dingding/UserController.java
浏览文件 @
547107b4
package
com
.
controller
.
dingding
;
import
java.util.List
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -7,6 +9,9 @@ import org.springframework.web.bind.annotation.GetMapping;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.config.DingDingParam
;
import
com.config.URLConstant
;
import
com.dingtalk.api.DefaultDingTalkClient
;
...
...
@@ -16,6 +21,8 @@ import com.dingtalk.api.response.OapiUserSimplelistResponse;
import
com.taobao.api.ApiException
;
import
com.util.AccessTokenUtil
;
import
com.util.ServiceResult
;
import
com.vo.dingding.SimpleUserListVo
;
import
com.vo.dingding.SimpleUserVo
;
/**
* 钉钉 用户对接接口
...
...
@@ -33,20 +40,20 @@ public class UserController {
/**
* 获取部门用户
* 获取部门用户
,默认获取市场部下所有人员
* @param departmentId 部门id
* @return
* @author lpf
* @date: 2020年3月15日 下午10:12:20
*/
@GetMapping
(
"/simplelist"
)
public
ServiceResult
simplelist
(
Long
departmentId
)
{
public
ServiceResult
<
List
<
SimpleUserVo
>>
simplelist
(
Long
departmentId
)
{
if
(
departmentId
==
null
)
{
departmentId
=
param
.
getSalesDepartmentId
();
}
// 获取调用接口凭证
String
accessToken
=
AccessTokenUtil
.
getToken
();
DingTalkClient
client
=
new
DefaultDingTalkClient
(
URLConstant
.
URL_
GET_USER_INFO
);
DingTalkClient
client
=
new
DefaultDingTalkClient
(
URLConstant
.
URL_
USER_SIMPLELIST
);
OapiUserSimplelistRequest
request
=
new
OapiUserSimplelistRequest
();
request
.
setHttpMethod
(
"GET"
);
request
.
setDepartmentId
(
departmentId
);
...
...
@@ -59,8 +66,9 @@ public class UserController {
return
ServiceResult
.
failure
(
"-2"
,
"获取部门用户调用接口失败:"
+
e
.
toString
());
}
if
(
response
.
isSuccess
())
{
// TODO 获取部门用户列表
SimpleUserListVo
vo
=
JSON
.
parseObject
(
response
.
getBody
(),
SimpleUserListVo
.
class
);
return
ServiceResult
.
success
(
vo
.
getUserlist
());
}
return
ServiceResult
.
failure
(
"-3"
,
response
.
toString
());
return
ServiceResult
.
failure
(
"-3"
,
response
.
getBody
());
}
}
src/main/java/com/enums/BooleanStatusEnum.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
;
public
enum
BooleanStatusEnum
{
/** 是 */
YES
(
"1"
,
"是"
),
/** 否 */
NO
(
"0"
,
"否"
);
private
final
String
code
;
private
final
String
name
;
private
BooleanStatusEnum
(
String
code
,
String
name
)
{
this
.
code
=
code
;
this
.
name
=
name
;
}
/**
* 判断名称是否有效
* @param name
* @return
* @author lpf
* @date: 2018年6月11日 下午6:30:16
*/
public
static
boolean
isExist
(
String
code
)
{
BooleanStatusEnum
[]
enums
=
BooleanStatusEnum
.
values
();
for
(
BooleanStatusEnum
BooleanStatusEnum
:
enums
)
{
if
(
BooleanStatusEnum
.
code
.
equals
(
code
))
{
return
true
;
}
}
return
false
;
}
/**
* 根据code 获取名字
* @Title getName
* @param code
* @return String
* @author Conan
* @date 2018年6月19日 上午11:28:16
*/
public
static
String
getName
(
String
code
)
{
BooleanStatusEnum
[]
enums
=
BooleanStatusEnum
.
values
();
for
(
BooleanStatusEnum
BooleanStatusEnum
:
enums
)
{
if
(
BooleanStatusEnum
.
code
.
equals
(
code
))
{
return
BooleanStatusEnum
.
name
;
}
}
return
null
;
}
/**
* 根据名字 获取code
* @Title getCode
* @param name
* @return String
* @author Conan
* @date 2018年7月9日 下午2:52:30
*/
public
static
String
getCode
(
String
name
)
{
BooleanStatusEnum
[]
enums
=
BooleanStatusEnum
.
values
();
for
(
BooleanStatusEnum
BooleanStatusEnum
:
enums
)
{
if
(
BooleanStatusEnum
.
name
.
equals
(
name
))
{
return
BooleanStatusEnum
.
code
;
}
}
return
null
;
}
public
String
getCode
()
{
return
code
;
}
public
String
getName
()
{
return
name
;
}
}
src/main/java/com/enums/EnvironmentEnum.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
;
import
java.util.HashMap
;
import
java.util.stream.Stream
;
import
com.enums.interfaces.EnumsInterface
;
/**
* 0:测试环境
* 1:生产环境
* @author lpf
* @date 2019年3月22日上午10:04:17
*/
public
enum
EnvironmentEnum
implements
EnumsInterface
<
String
>{
/** 测试环境 */
TEST
(
"0"
,
"测试环境"
),
/** 生产环境 */
PRODUCT
(
"1"
,
"生产环境"
);
//状态码
private
final
String
code
;
private
final
String
name
;
private
static
final
HashMap
<
String
,
String
>
MAP
=
new
HashMap
<
String
,
String
>();
static
{
stream
().
forEach
(
e
->
{
MAP
.
put
(
e
.
code
,
e
.
name
);
});
}
/**
* @return
* @author lpf
* @date: 2019年3月18日 下午5:05:16
*/
public
static
Stream
<
EnvironmentEnum
>
stream
(){
return
Stream
.
of
(
values
());
}
private
EnvironmentEnum
(
String
code
,
String
name
)
{
this
.
code
=
code
;
this
.
name
=
name
;
}
/**
* 判断名称是否有效
* @param name
* @return
* @author lpf
* @date: 2018年6月11日 下午6:30:16
*/
public
static
boolean
isExist
(
String
code
)
{
return
stream
().
anyMatch
(
e
->
e
.
code
.
equals
(
code
));
}
/**
* 通过ID获取中文名称
* @param code
* @return
*/
public
static
String
getName
(
String
code
)
{
return
stream
().
filter
(
e
->
e
.
code
.
equals
(
code
)).
findFirst
().
map
(
e
->
e
.
name
).
orElse
(
null
);
}
public
String
getCode
()
{
return
code
;
}
public
String
getName
()
{
return
name
;
}
public
static
HashMap
<
String
,
String
>
getMap
()
{
return
MAP
;
}
}
src/main/java/com/enums/ResponseCodeEnum.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
;
/**
* 响应编码
* @ClassName ReponseCodeEnum
* @Description:
* @author lpf
* @date 2018年5月9日下午4:27:58
*
*/
public
enum
ResponseCodeEnum
{
/** 200 ,操作成功" */
OK
(
0
,
"操作成功"
),
/** -1,操作失败" */
FAIL
(-
1
,
"操作失败"
),
/** 500,服务器异常" */
EXCEPTION
(
500
,
"服务器异常"
),
/** 600, BaseException */
BASE_EXCEPTION
(
600
,
"BaseException"
),
/** -2,验证不通过" */
VALIDATE
(-
2
,
"验证不通过"
),
/** -4 接口调用 参数类型转换异常*/
BIND_EXCEPTION
(-
4
,
"参数不合法"
),
/** -5 接口调用缺少必填参数 */
MISS_EXCEPTION
(-
5
,
"缺少必填参数"
),
/** -6 登录过期或未登录 */
NO_LOGIN
(-
6
,
"请重新登录"
);
private
final
int
code
;
private
final
String
msg
;
private
ResponseCodeEnum
(
int
code
,
String
msg
)
{
this
.
code
=
code
;
this
.
msg
=
msg
;
}
public
int
getCode
()
{
return
code
;
}
public
String
getMsg
()
{
return
msg
;
}
}
src/main/java/com/enums/interfaces/EnumsBindBean.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
interfaces
;
import
java.util.List
;
/**
* 枚举类型接口,用于给枚举绑定操作
* @author lpf
* @date 2019年1月4日上午11:59:53
*/
public
interface
EnumsBindBean
<
T
extends
EnumsInterface
<?>>
{
/**
* 获取绑定的枚举
* @return
* @author lpf
* @date: 2019年1月4日 下午12:41:05
*/
List
<
T
>
getEnums
();
}
src/main/java/com/enums/interfaces/EnumsInterface.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
interfaces
;
public
interface
EnumsInterface
<
T
>
{
/**
* 获取编码
* @return
* @author lpf
* @date: 2019年1月4日 下午12:01:13
*/
T
getCode
();
/**
* 获取中文含义
* @return
* @author lpf
* @date: 2019年1月4日 下午12:01:44
*/
T
getName
();
}
src/main/java/com/enums/interfaces/LoggerFactory.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
interfaces
;
import
org.slf4j.Logger
;
public
interface
LoggerFactory
{
Logger
getLog
();
}
src/main/java/com/enums/interfaces/bean/EnumsBindObject.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
interfaces
.
bean
;
import
com.enums.interfaces.EnumsBindBean
;
import
com.enums.interfaces.EnumsInterface
;
import
lombok.Data
;
/**
* 枚举绑定的对象
* @author lpf
* @date 2019年1月7日上午9:11:07
*/
@Data
public
class
EnumsBindObject
<
T
extends
EnumsInterface
<?>>
{
/** 绑定的对象 在spring容器中的名称 */
private
String
name
;
/** 对象绑定的 枚举 */
private
T
enumObject
;
/** 绑定的对象 */
private
EnumsBindBean
<
T
>
bindBean
;
}
src/main/java/com/enums/sql/SqlConditionEnum.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
sql
;
import
java.util.HashMap
;
import
java.util.stream.Stream
;
import
com.enums.interfaces.EnumsInterface
;
import
com.enums.sql.impl.LikeSqlCondition
;
import
com.enums.sql.impl.ListSqlCondition
;
import
com.enums.sql.impl.RegexpSqlCondition
;
import
com.enums.sql.impl.SimpleSqlCondition
;
import
com.excetion.BaseException
;
/**
* sql 条件枚举
* @author lpf
* @date 2019年7月31日下午4:43:10
*/
public
enum
SqlConditionEnum
implements
EnumsInterface
<
String
>{
/** equal to 等于 */
EQ
(
"="
,
"eq"
,
SimpleSqlCondition
.
getInstance
()),
/** less than 小于 */
LT
(
"<"
,
"lt"
,
SimpleSqlCondition
.
getInstance
()),
/** greater than 大于 */
GT
(
">"
,
"gt"
,
SimpleSqlCondition
.
getInstance
()),
/** less than or equal to 小于等于 */
LE
(
"<="
,
"le"
,
SimpleSqlCondition
.
getInstance
()),
/** greater than or equal to 大于等于 */
GE
(
">="
,
"ge"
,
SimpleSqlCondition
.
getInstance
()),
/** not equal to 不等于 <> */
NE
(
"!="
,
"ne"
,
SimpleSqlCondition
.
getInstance
()),
/** in */
IN
(
"in"
,
"in"
,
ListSqlCondition
.
getInstance
()),
/** not in */
NIN
(
"not in"
,
"nin"
,
ListSqlCondition
.
getInstance
()),
/** all like */
LIKE
(
"like"
,
"like"
,
LikeSqlCondition
.
getInstance
()),
/** right like */
RIGHT_LIKE
(
"like"
,
"rlike"
,
LikeSqlCondition
.
getInstance
()),
/** left like */
LEFT_LIKE
(
"like"
,
"llike"
,
LikeSqlCondition
.
getInstance
()),
/** REGEXP */
REGEXP
(
"REGEXP"
,
"regexp"
,
RegexpSqlCondition
.
getInstance
());
/**
* regular: SqlConditionEnum
*/
private
static
final
HashMap
<
String
,
SqlConditionEnum
>
MAP
=
new
HashMap
<
String
,
SqlConditionEnum
>();
/** 数据库关键字 */
private
final
String
key
;
/** 正则匹配内容 */
private
final
String
regular
;
private
final
SqlConditionInterface
fun
;
private
SqlConditionEnum
(
String
key
,
String
regular
,
SqlConditionInterface
fun
)
{
this
.
key
=
key
;
this
.
regular
=
regular
;
this
.
fun
=
fun
;
}
static
{
stream
().
forEach
(
e
->
{
MAP
.
put
(
e
.
regular
,
e
);
});
}
/**
* @return
* @author lpf
* @date: 2019年3月18日 下午5:05:16
*/
public
static
Stream
<
SqlConditionEnum
>
stream
(){
return
Stream
.
of
(
values
());
}
/**
* 根据正则匹配查找枚举
* @param regular
* @return
* @author lpf
* @date: 2019年7月31日 下午5:13:00
*/
public
static
SqlConditionEnum
get
(
String
regular
)
{
SqlConditionEnum
result
=
MAP
.
get
(
regular
);
if
(
result
==
null
)
{
throw
new
BaseException
(
"根据regular获取SqlConditionEnum为空:"
+
regular
);
}
return
result
;
}
public
String
getKey
()
{
return
key
;
}
public
String
getRegular
()
{
return
regular
;
}
@Override
public
String
getCode
()
{
return
regular
;
}
@Override
public
String
getName
()
{
return
key
;
}
public
SqlConditionInterface
getFun
()
{
return
fun
;
}
}
src/main/java/com/enums/sql/SqlConditionInterface.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
sql
;
import
com.enums.interfaces.EnumsBindBean
;
/**
* sql操作 行为接口
* @author lpf
* @date 2019年8月1日下午2:27:39
*/
public
interface
SqlConditionInterface
extends
EnumsBindBean
<
SqlConditionEnum
>
{
/**
* sql条件缩写转换为 xml判断条件
* eq(m.type, query.type) ->
* <if test = 'NOTBLANK (query.type)'>
* and m.type = #{query.type}
* </if>
* @param en xml中运算符号 SqlConditionEnum.key
* @param column 列名
* @param attr 属性名
* @return
* @author lpf
* @date: 2019年8月1日 下午2:22:19
*/
String
apply
(
SqlConditionEnum
en
,
String
column
,
String
attr
);
}
src/main/java/com/enums/sql/impl/LikeSqlCondition.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
sql
.
impl
;
import
java.util.Arrays
;
import
java.util.List
;
import
com.enums.sql.SqlConditionEnum
;
import
com.enums.sql.SqlConditionInterface
;
import
com.mapper.BaseMapper
;
public
class
LikeSqlCondition
implements
SqlConditionInterface
{
@Override
public
List
<
SqlConditionEnum
>
getEnums
()
{
return
Arrays
.
asList
(
SqlConditionEnum
.
LIKE
,
SqlConditionEnum
.
RIGHT_LIKE
,
SqlConditionEnum
.
LEFT_LIKE
);
}
/**
* like(m.name,query.name)
* "<if test = '" + NOTBLANK + "(query.name)'> "
" and m.name like concat('%',#{query.name},'%') "
" </if> "
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(java.lang.String, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:01:30
*/
@Override
public
String
apply
(
SqlConditionEnum
en
,
String
column
,
String
attr
)
{
StringBuffer
sb
=
new
StringBuffer
(
" <if test = '"
);
sb
.
append
(
BaseMapper
.
NOTBLANK
);
sb
.
append
(
"("
);
sb
.
append
(
attr
);
sb
.
append
(
")'>"
);
sb
.
append
(
" and "
);
sb
.
append
(
column
);
sb
.
append
(
" "
);
sb
.
append
(
en
.
getKey
());
sb
.
append
(
" concat("
);
if
(
SqlConditionEnum
.
LIKE
.
equals
(
en
)
||
SqlConditionEnum
.
LEFT_LIKE
.
equals
(
en
))
{
sb
.
append
(
"'%',"
);
}
sb
.
append
(
" #{"
);
sb
.
append
(
attr
);
sb
.
append
(
"}"
);
if
(
SqlConditionEnum
.
LIKE
.
equals
(
en
)
||
SqlConditionEnum
.
RIGHT_LIKE
.
equals
(
en
))
{
sb
.
append
(
",'%'"
);
}
sb
.
append
(
")"
);
sb
.
append
(
" </if>"
);
return
sb
.
toString
();
}
private
LikeSqlCondition
(){}
public
static
LikeSqlCondition
getInstance
(){
return
DefultStatusImplHolder
.
LAZY
;
}
private
static
class
DefultStatusImplHolder
{
private
static
final
LikeSqlCondition
LAZY
=
new
LikeSqlCondition
();
}
}
src/main/java/com/enums/sql/impl/ListSqlCondition.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
sql
.
impl
;
import
java.util.Arrays
;
import
java.util.List
;
import
com.enums.sql.SqlConditionEnum
;
import
com.enums.sql.SqlConditionInterface
;
import
com.mapper.BaseMapper
;
/**
* 解析list操作
* @author lpf
* @date 2019年8月1日下午2:35:45
*/
public
class
ListSqlCondition
implements
SqlConditionInterface
{
/**
* in notin
* @see com.zrqx.core.enums.interfaces.EnumsBindBean#getEnums()
* @return
* @author lpf
* @date: 2019年8月1日 下午2:37:16
*/
@Override
public
List
<
SqlConditionEnum
>
getEnums
()
{
return
Arrays
.
asList
(
SqlConditionEnum
.
IN
,
SqlConditionEnum
.
NIN
);
}
/**
* in(m.type, query.type)
* <if test=' LIST_NOT_EMPTY ( query.type )'>
AND query.type in
<foreach item='item' index='index' collection= 'query.type' open='(' separator=',' close=')'>
#{item}
</foreach>
</if>
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(com.zrqx.core.enums.sql.SqlConditionEnum, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:18:58
*/
@Override
public
String
apply
(
SqlConditionEnum
en
,
String
column
,
String
attr
)
{
StringBuffer
sb
=
new
StringBuffer
(
" <if test = '"
);
sb
.
append
(
BaseMapper
.
LIST_NOT_EMPTY
);
sb
.
append
(
"("
);
sb
.
append
(
attr
);
sb
.
append
(
")'>"
);
sb
.
append
(
" and "
);
sb
.
append
(
column
);
sb
.
append
(
" "
);
sb
.
append
(
en
.
getKey
());
sb
.
append
(
" <foreach item='item' index='index' collection= '"
);
sb
.
append
(
attr
);
sb
.
append
(
"' open='(' separator=',' close=')'> "
);
sb
.
append
(
"#{item}"
);
sb
.
append
(
" </foreach>"
);
sb
.
append
(
" </if>"
);
return
sb
.
toString
();
}
private
ListSqlCondition
(){}
public
static
ListSqlCondition
getInstance
(){
return
DefultStatusImplHolder
.
LAZY
;
}
private
static
class
DefultStatusImplHolder
{
private
static
final
ListSqlCondition
LAZY
=
new
ListSqlCondition
();
}
}
src/main/java/com/enums/sql/impl/RegexpSqlCondition.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
sql
.
impl
;
import
java.util.Arrays
;
import
java.util.List
;
import
com.enums.sql.SqlConditionEnum
;
import
com.enums.sql.SqlConditionInterface
;
import
com.mapper.BaseMapper
;
public
class
RegexpSqlCondition
implements
SqlConditionInterface
{
@Override
public
List
<
SqlConditionEnum
>
getEnums
()
{
return
Arrays
.
asList
(
SqlConditionEnum
.
REGEXP
);
}
/**
*
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(com.zrqx.core.enums.sql.SqlConditionEnum, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:30:48
*/
@Override
public
String
apply
(
SqlConditionEnum
en
,
String
column
,
String
attr
)
{
StringBuffer
sb
=
new
StringBuffer
(
" <if test = '"
);
sb
.
append
(
BaseMapper
.
LIST_NOT_EMPTY
);
sb
.
append
(
"("
);
sb
.
append
(
attr
);
sb
.
append
(
")'>"
);
sb
.
append
(
" and "
);
sb
.
append
(
column
);
sb
.
append
(
" "
);
sb
.
append
(
en
.
getKey
());
sb
.
append
(
" REPLACE(<foreach item='item' index='index' collection= '"
);
sb
.
append
(
attr
);
sb
.
append
(
"' open='(' separator=',' close=')'> "
);
sb
.
append
(
"^#{item}"
);
sb
.
append
(
" </foreach>,' ','') "
);
sb
.
append
(
" </if>"
);
return
sb
.
toString
();
}
private
RegexpSqlCondition
(){}
public
static
RegexpSqlCondition
getInstance
(){
return
DefultStatusImplHolder
.
LAZY
;
}
private
static
class
DefultStatusImplHolder
{
private
static
final
RegexpSqlCondition
LAZY
=
new
RegexpSqlCondition
();
}
}
src/main/java/com/enums/sql/impl/SimpleSqlCondition.java
0 → 100644
浏览文件 @
547107b4
package
com
.
enums
.
sql
.
impl
;
import
java.util.Arrays
;
import
java.util.List
;
import
com.enums.sql.SqlConditionEnum
;
import
com.enums.sql.SqlConditionInterface
;
import
com.mapper.BaseMapper
;
/**
* 简单操作
* @author lpf
* @date 2019年8月1日下午2:35:27
*/
public
class
SimpleSqlCondition
implements
SqlConditionInterface
{
/**
* = < > <= >= !=
* @see com.zrqx.core.enums.interfaces.EnumsBindBean#getEnums()
* @return
* @author lpf
* @date: 2019年8月1日 下午2:33:27
*/
@Override
public
List
<
SqlConditionEnum
>
getEnums
()
{
return
Arrays
.
asList
(
SqlConditionEnum
.
EQ
,
SqlConditionEnum
.
LT
,
SqlConditionEnum
.
GT
,
SqlConditionEnum
.
LE
,
SqlConditionEnum
.
GE
,
SqlConditionEnum
.
NE
);
}
/**
* sql条件缩写转换为 xml判断条件
* eq(m.type, query.type) ->
* <if test = 'NOTBLANK (query.type)'>
* and m.type = #{query.type}
* </if>
* @param en xml中运算符号 SqlConditionEnum.key
* @param column 列名
* @param attr 属性名
* @return
* @author lpf
* @date: 2019年8月1日 下午2:22:19
*/
@Override
public
String
apply
(
SqlConditionEnum
en
,
String
column
,
String
attr
)
{
StringBuffer
sb
=
new
StringBuffer
(
" <if test = '"
);
sb
.
append
(
BaseMapper
.
NOTBLANK
);
sb
.
append
(
"("
);
sb
.
append
(
attr
);
sb
.
append
(
")'>"
);
sb
.
append
(
" and "
);
sb
.
append
(
column
);
sb
.
append
(
" "
);
sb
.
append
(
en
.
getKey
());
sb
.
append
(
" #{"
);
sb
.
append
(
attr
);
sb
.
append
(
"} </if>"
);
return
sb
.
toString
();
}
private
SimpleSqlCondition
(){}
public
static
SimpleSqlCondition
getInstance
(){
return
DefultStatusImplHolder
.
LAZY
;
}
private
static
class
DefultStatusImplHolder
{
private
static
final
SimpleSqlCondition
LAZY
=
new
SimpleSqlCondition
();
}
}
src/main/java/com/excetion/BaseException.java
0 → 100644
浏览文件 @
547107b4
package
com
.
excetion
;
public
class
BaseException
extends
RuntimeException
{
/**
*
*/
private
static
final
long
serialVersionUID
=
1L
;
private
int
code
=
500
;
private
Object
data
=
null
;
// 无参构造方法
public
BaseException
()
{
super
();
}
// 有参的构造方法
public
BaseException
(
String
message
)
{
super
(
message
);
}
public
BaseException
(
int
code
,
String
message
)
{
super
(
message
);
this
.
code
=
code
;
}
public
BaseException
(
int
code
,
String
message
,
Object
data
)
{
super
(
message
);
this
.
code
=
code
;
this
.
data
=
data
;
}
// 用指定的详细信息和原因构造一个新的异常
public
BaseException
(
String
message
,
Throwable
cause
)
{
super
(
message
,
cause
);
}
// 用指定原因构造一个新的异常
public
BaseException
(
Throwable
cause
)
{
super
(
cause
);
}
public
int
getCode
()
{
return
code
;
}
public
void
setCode
(
int
code
)
{
this
.
code
=
code
;
}
public
Object
getData
()
{
return
data
;
}
public
void
setData
(
Object
data
)
{
this
.
data
=
data
;
}
}
\ No newline at end of file
src/main/java/com/form/customer/QueryCustomerForm.java
0 → 100644
浏览文件 @
547107b4
package
com
.
form
.
customer
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
@Data
public
class
QueryCustomerForm
{
@ApiModelProperty
(
"负责人id"
)
private
String
userId
;
@ApiModelProperty
(
"用户输入"
)
private
String
text
;
@ApiModelProperty
(
"是否分配了负责人,0全部,1 未分配,2已分配"
)
private
String
hasUser
;
@ApiModelProperty
(
"商机,''全部 1 有, 0无"
)
private
String
hasBusiness
;
@ApiModelProperty
(
"中央级, ''全部 1 是 0 否"
)
private
String
central
;
@ApiModelProperty
(
"签约 '' 全部 1 是 0 否"
)
private
String
signing
;
}
src/main/java/com/mapper/BaseMapper.java
0 → 100644
浏览文件 @
547107b4
package
com
.
mapper
;
import
tk.mybatis.mapper.common.Mapper
;
import
tk.mybatis.mapper.common.MySqlMapper
;
public
interface
BaseMapper
<
T
>
extends
Mapper
<
T
>,
MySqlMapper
<
T
>,
ZrqxMapper
<
T
>{
/** 字符串不能为空 NOTBLANK (your filed) */
String
NOTBLANK
=
"@com.util.StringUtils@isNotBlank"
;
/** List集合不能为空 LIST_NOT_EMPTY (your filed) */
String
LIST_NOT_EMPTY
=
"@com.util.ArrayUtils@isNotEmpty"
;
/** 字符串为空 BLANK (your filed) */
String
BLANK
=
"@com.util.StringUtils@isBlank"
;
}
src/main/java/com/mapper/InsertUidListMapper.java
0 → 100644
浏览文件 @
547107b4
package
com
.
mapper
;
import
java.util.List
;
import
org.apache.ibatis.annotations.InsertProvider
;
import
org.apache.ibatis.annotations.Options
;
import
tk.mybatis.mapper.provider.SpecialProvider
;
public
interface
InsertUidListMapper
<
T
>
{
@Options
(
useGeneratedKeys
=
true
,
keyProperty
=
"uid"
)
@InsertProvider
(
type
=
SpecialProvider
.
class
,
method
=
"dynamicSQL"
)
int
insertList
(
List
<
T
>
recordList
);
}
\ No newline at end of file
src/main/java/com/mapper/SqlXMLLanguageDriver.java
0 → 100644
浏览文件 @
547107b4
package
com
.
mapper
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
org.apache.ibatis.mapping.SqlSource
;
import
org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
;
import
org.apache.ibatis.session.Configuration
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.enums.sql.SqlConditionEnum
;
public
class
SqlXMLLanguageDriver
extends
XMLLanguageDriver
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
SqlXMLLanguageDriver
.
class
);
private
static
String
REGULAR
;
static
{
logger
.
info
(
"生成则表达式"
);
// String regular = "(eq|like|nin|regexp)\\((\\w*\\.?\\w+),\\s*(\\w*\\.?\\w+)\\)";
StringBuffer
sb
=
new
StringBuffer
(
"("
);
SqlConditionEnum
.
stream
().
forEach
(
s
->
{
sb
.
append
(
s
.
getRegular
());
sb
.
append
(
"|"
);
});
sb
.
deleteCharAt
(
sb
.
length
()
-
1
);
sb
.
append
(
")"
);
sb
.
append
(
"\\((\\w*\\.?\\w+),\\s*(\\w*\\.?\\w+)\\)"
);
REGULAR
=
sb
.
toString
();
logger
.
info
(
"匹配sql正则"
+
REGULAR
);
}
@Override
public
SqlSource
createSqlSource
(
Configuration
configuration
,
String
script
,
Class
<?>
parameterType
)
{
logger
.
info
(
"configuration:"
+
configuration
+
";script:"
+
script
+
";parameterType:"
+
parameterType
);
logger
.
info
(
"sql script:"
+
script
);
String
afterScript
=
this
.
apply
(
script
);
logger
.
info
(
"fmt script: "
+
afterScript
);
return
super
.
createSqlSource
(
configuration
,
afterScript
,
parameterType
);
}
public
String
apply
(
String
script
){
Pattern
pattern
=
Pattern
.
compile
(
REGULAR
,
Pattern
.
CASE_INSENSITIVE
);
Matcher
m
=
pattern
.
matcher
(
script
);
StringBuffer
sb
=
new
StringBuffer
();
while
(
m
.
find
())
{
// 操作
String
con
=
m
.
group
(
1
);
SqlConditionEnum
en
=
SqlConditionEnum
.
get
(
con
.
toLowerCase
());
String
column
=
m
.
group
(
2
);
String
attr
=
m
.
group
(
3
);
String
str
=
en
.
getFun
().
apply
(
en
,
column
,
attr
);
m
.
appendReplacement
(
sb
,
str
);
}
m
.
appendTail
(
sb
);
return
sb
.
toString
();
}
}
src/main/java/com/mapper/ZrqxMapper.java
0 → 100644
浏览文件 @
547107b4
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2017 abel533@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package
com
.
mapper
;
import
java.util.List
;
import
org.apache.ibatis.annotations.InsertProvider
;
import
org.apache.ibatis.annotations.Options
;
/**
* 通用Mapper接口,特殊方法,批量插入,支持批量插入的数据库都可以使用,例如mysql,h2等
* @author lizhuo
*
* @param <T>
*/
public
interface
ZrqxMapper
<
T
>{
/**
* 批量插入,uuid
*
* @param recordList
* @return
*/
@Options
(
keyProperty
=
"id"
)
@InsertProvider
(
type
=
ZrqxProvider
.
class
,
method
=
"dynamicSQL"
)
int
insertUuidList
(
List
<
T
>
recordList
);
}
\ No newline at end of file
src/main/java/com/mapper/ZrqxProvider.java
0 → 100644
浏览文件 @
547107b4
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2017 abel533@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package
com
.
mapper
;
import
org.apache.ibatis.mapping.MappedStatement
;
import
tk.mybatis.mapper.entity.EntityColumn
;
import
tk.mybatis.mapper.mapperhelper.EntityHelper
;
import
tk.mybatis.mapper.mapperhelper.MapperHelper
;
import
tk.mybatis.mapper.mapperhelper.MapperTemplate
;
import
tk.mybatis.mapper.mapperhelper.SqlHelper
;
import
java.util.Set
;
/**
* SpecialProvider实现类,特殊方法实现类
*
* @author lizhuo
*/
public
class
ZrqxProvider
extends
MapperTemplate
{
public
ZrqxProvider
(
Class
<?>
mapperClass
,
MapperHelper
mapperHelper
)
{
super
(
mapperClass
,
mapperHelper
);
}
/**
* 批量插入
*
* @param ms
*/
public
String
insertUuidList
(
MappedStatement
ms
)
{
final
Class
<?>
entityClass
=
getEntityClass
(
ms
);
//开始拼sql
StringBuilder
sql
=
new
StringBuilder
();
//uuid的情况,直接插入bind节点
sql
.
append
(
SqlHelper
.
insertIntoTable
(
entityClass
,
tableName
(
entityClass
)));
sql
.
append
(
SqlHelper
.
insertColumns
(
entityClass
,
false
,
false
,
false
));
sql
.
append
(
" VALUES "
);
sql
.
append
(
"<foreach collection=\"list\" item=\"record\" separator=\",\" >"
);
sql
.
append
(
"<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">"
);
//获取全部列
Set
<
EntityColumn
>
columnList
=
EntityHelper
.
getColumns
(
entityClass
);
//当某个列有主键策略时,不需要考虑他的属性是否为空,因为如果为空,一定会根据主键策略给他生成一个值
for
(
EntityColumn
column
:
columnList
)
{
if
(!
column
.
isId
()
&&
column
.
isInsertable
())
{
sql
.
append
(
column
.
getColumnHolder
(
"record"
)
+
","
);
}
else
if
(
column
.
isId
()){
sql
.
append
(
"REPLACE (UUID(), '-', '')"
+
","
);
}
}
sql
.
append
(
"</trim>"
);
sql
.
append
(
"</foreach>"
);
return
sql
.
toString
();
}
public
String
insertUseGeneratedKeys
(
MappedStatement
ms
)
{
final
Class
<?>
entityClass
=
getEntityClass
(
ms
);
//开始拼sql
StringBuilder
sql
=
new
StringBuilder
();
sql
.
append
(
SqlHelper
.
insertIntoTable
(
entityClass
,
tableName
(
entityClass
)));
sql
.
append
(
SqlHelper
.
insertColumns
(
entityClass
,
true
,
false
,
false
));
sql
.
append
(
SqlHelper
.
insertValuesColumns
(
entityClass
,
true
,
false
,
false
));
return
sql
.
toString
();
}
}
src/main/java/com/mapper/customer/CustomerMapper.java
0 → 100644
浏览文件 @
547107b4
package
com
.
mapper
.
customer
;
import
java.util.List
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Select
;
import
com.form.customer.QueryCustomerForm
;
import
com.mapper.BaseMapper
;
import
com.model.customer.Customer
;
public
interface
CustomerMapper
extends
BaseMapper
<
Customer
>{
@Select
(
" <script> "
+
" select * from crm_customer c where 1=1 "
+
" eq(c.userId, form.userId) "
+
" eq(c.hasBusiness, form.hasBusiness) "
+
" eq(c.central, form.central) "
+
" eq(c.signing, form.signing) "
+
" <if test = 'form.hasUser == \"1\"'> "
+
" and (c.userId is null or c.userId ='' ) "
+
" </if> "
+
" <if test = 'form.hasUser == \"2\"'> "
+
" and c.userId is not null "
+
" </if> "
+
" <if test = '"
+
NOTBLANK
+
" (form.text)'> "
+
" and (c.companyName like concat('%',#{form.text},'%')"
+
" or c.position like concat('%',#{form.text},'%')"
+
" or c.name like concat('%',#{form.text},'%') "
+
" or c.userName like concat('%',#{form.text},'%') "
+
" or c.remark like concat('%',#{form.text},'%') ) "
+
" </if> "
+
"</script>"
)
List
<
Customer
>
list
(
@Param
(
"form"
)
QueryCustomerForm
form
);
}
src/main/java/com/model/customer/Customer.java
0 → 100644
浏览文件 @
547107b4
package
com
.
model
.
customer
;
import
java.util.Date
;
import
javax.persistence.GeneratedValue
;
import
javax.persistence.Id
;
import
javax.persistence.Table
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
@Data
@Table
(
name
=
"crm_customer"
)
public
class
Customer
{
@Id
@GeneratedValue
(
generator
=
"JDBC"
)
private
Integer
id
;
@ApiModelProperty
(
"客户单位"
)
private
String
companyName
;
@ApiModelProperty
(
"部门名称"
)
private
String
departmentName
;
@ApiModelProperty
(
"客户职位"
)
private
String
position
;
@ApiModelProperty
(
"客户名称"
)
private
String
name
;
@ApiModelProperty
(
"客户手机号"
)
private
String
phone
;
@ApiModelProperty
(
"客户座机"
)
private
String
tel
;
@ApiModelProperty
(
"负责人id"
)
private
String
userId
;
@ApiModelProperty
(
"负责人名称"
)
private
String
userName
;
@ApiModelProperty
(
"备注"
)
private
String
remark
;
@ApiModelProperty
(
"创建时间"
)
private
Date
createTime
;
@ApiModelProperty
(
"创建人id"
)
private
String
creater
;
@ApiModelProperty
(
"创建人名称"
)
private
String
createName
;
@ApiModelProperty
(
"修改时间"
)
private
Date
updateTime
;
@ApiModelProperty
(
"修改人"
)
private
String
updater
;
@ApiModelProperty
(
"修改人名称"
)
private
String
updateName
;
@ApiModelProperty
(
"指派时间"
)
private
Date
allotTime
;
@ApiModelProperty
(
"商机,''全部 1 有, 0无"
)
private
String
hasBusiness
;
@ApiModelProperty
(
"中央级, ''全部 1 是 0 否"
)
private
String
central
;
@ApiModelProperty
(
"签约 '' 全部 1 是 0 否"
)
private
String
signing
;
}
src/main/java/com/service/BaseService.java
0 → 100644
浏览文件 @
547107b4
package
com
.
service
;
import
java.io.Serializable
;
import
java.util.List
;
import
java.util.function.Consumer
;
import
org.apache.ibatis.session.RowBounds
;
import
com.util.PageInfo
;
import
com.util.PageParam
;
import
tk.mybatis.mapper.entity.Example
;
import
tk.mybatis.mapper.entity.Example.Criteria
;
public
interface
BaseService
<
M
,
ID
extends
Serializable
>
extends
NotNullInterface
<
M
,
ID
>
{
/**
* 返回一个where模板
*/
public
Criteria
createCriteria
();
/**
* 返回一个where模板
*/
public
Criteria
createCriteria
(
Class
<
M
>
entityClass
);
/**
* 返回一个模板
*/
public
Example
createExample
();
/**
* 返回一个模板
*/
public
Example
createExample
(
Class
entityClass
);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件删除数据
*
* @return
*/
boolean
deleteByCriteria
();
/**
* 分页
*/
public
PageInfo
<
M
>
queryAll
(
PageParam
pageParam
);
/**
* 分页查询
*/
public
PageInfo
<
M
>
query
(
M
entity
,
PageParam
pageParam
);
/**
* 分页查询,使用内部模板,条件查询
*/
public
PageInfo
<
M
>
queryExample
(
PageParam
pageParam
,
Example
example
);
/**
* 根据实体属性作为条件进行删除,查询条件使用等号
*
* @param record
* @return
*/
boolean
delete
(
M
record
);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件删除数据
*
* @return
*/
boolean
deleteByExample
(
Example
example
);
/**
* 根据主键字段进行删除,方法参数必须包含完整的主键属性
*
* @param key
* @return
*/
boolean
deleteByPrimaryKey
(
Object
key
);
/**
* 根据主键字段查询总数,方法参数必须包含完整的主键属性,查询条件使用等号
*
* @param key
* @return
*/
boolean
existsWithPrimaryKey
(
Object
key
);
/**
* 保存一个实体,null的属性也会保存,不会使用数据库默认值
*
* @param record
* @return
*/
boolean
insert
(
M
record
);
/**
* 批量插入,支持批量插入的数据库可以使用,例如MySQL,H2等,另外该接口限制实体包含`id`属性并且必须为自增列
*
* @param recordList
* @return
*/
boolean
insertList
(
List
<
M
>
recordList
);
/**
* 批量插入,uuid的list
*
* @param recordList
* @return
*/
boolean
insertUuidList
(
List
<
M
>
recordList
);
/**
* 保存一个实体,null的属性不会保存,会使用数据库默认值
*
* @param record
* @return
*/
boolean
insertSelective
(
M
record
);
/**
* 插入数据,限制为实体包含`id`属性并且必须为自增列,实体配置的主键策略无效
*
* @param record
* @return
*/
boolean
insertUseGeneratedKeys
(
M
record
);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件更新实体`record`包含的全部属性,null值会被更新
*
* @param record
* @return
*/
boolean
UpdateByExample
(
M
record
,
Example
example
);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件更新实体`record`包含的不是null的属性值
*
* @param record
* @return
*/
boolean
UpdateByExampleSelective
(
M
record
,
Example
example
);
/**
* 根据主键更新实体全部字段,null值会被更新
*
* @param record
* @return
*/
boolean
updateByPrimaryKey
(
M
record
);
/**
* 根据主键更新属性不为null的值
*
* @param record
* @return
*/
boolean
updateByPrimaryKeySelective
(
M
record
);
/**
* 根据实体中的属性值进行查询,查询条件使用等号
*
* @param record
* @return
*/
List
<
M
>
select
(
M
record
);
/**
* 查询全部结果
*
* @return
*/
List
<
M
>
selectAll
();
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件进行查询
*
* @return
*/
List
<
M
>
selectByExample
(
Example
example
);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件和RowBounds进行分页查询
*
* @param rowBounds
* @return
*/
List
<
M
>
selectByExampleAndRowBounds
(
RowBounds
rowBounds
,
Example
example
);
/**
* 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
*
* @param key
* @return
*/
M
selectByPrimaryKey
(
Object
key
);
/**
* 根据实体属性和RowBounds进行分页查询
*
* @param record
* @param rowBounds
* @return
*/
List
<
M
>
selectByRowBounds
(
M
record
,
RowBounds
rowBounds
);
/**
* 根据实体中的属性查询总数,查询条件使用等号
*
* @param record
* @return
*/
int
selectCount
(
M
record
);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件进行查询总数
*
* @return
*/
int
selectCountByExample
(
Example
example
);
/**
* 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
*
* @param record
* @return
*/
M
selectOne
(
M
record
);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件进行查询
*
* @return
*/
M
selectOneByExample
(
Example
example
);
boolean
batchDelete
(
List
<
ID
>
ids
);
/**
* 批量删除,携带附属逻辑,附属逻辑执行完成后才会执行删除主表内容
* @param ids
* @param consumers 附属逻辑 M -> void
* @return
* @author lpf
* @date: 2020年3月11日 下午9:09:25
*/
boolean
batchDeleteAndOther
(
List
<
ID
>
ids
,
@SuppressWarnings
(
"unchecked"
)
Consumer
<
M
>...
consumers
)
;
/**
* 批量删除,携带附属逻辑
* 跳过异常循环,执行不出现异常的循环,返回去重后的异常信息
* @param ids
* @param consumers
* @return
*/
List
<
String
>
batchDeleteContinueException
(
List
<
ID
>
ids
,
@SuppressWarnings
(
"unchecked"
)
Consumer
<
M
>...
consumers
);
}
\ No newline at end of file
src/main/java/com/service/BaseServiceImpl.java
0 → 100644
浏览文件 @
547107b4
差异被折叠。
点击展开。
src/main/java/com/service/NotNullInterface.java
0 → 100644
浏览文件 @
547107b4
package
com
.
service
;
import
java.io.Serializable
;
import
java.util.Optional
;
import
java.util.function.Consumer
;
public
interface
NotNullInterface
<
M
,
ID
extends
Serializable
>
{
/**
* 根据id查询不为空的对象
* @param id
* @return
* @author lpf
* @date: 2019年2月18日 下午2:45:21
*/
M
notNull
(
ID
id
);
/**
* 根据id 查询不为空的对象
* @param id
* @param consumer 更多的筛选条件
* @return
* @author lpf
* @date: 2019年2月18日 下午2:46:20
*/
M
notNull
(
ID
id
,
Consumer
<
M
>
consumer
);
/**
* selectOne 封装notNull
* @param record
* @return
* @author ycw
* @date: 2019年2月20日 下午3:55:01
*/
M
notNull
(
M
record
);
/**
* selectOne 封装notNull
* @param consumer
* @return
* @author ycw
* @date: 2019年2月20日 下午4:58:55
*/
M
notNull
(
Consumer
<
M
>
consumer
);
/**
* 根据id查询可能存在的对象
* @param id
* @return
* @author lpf
* @date: 2019年12月3日 下午3:44:21
*/
Optional
<
M
>
ofNullable
(
ID
id
);
Optional
<
M
>
ofNullable
(
ID
id
,
Consumer
<
M
>
consumer
);
Optional
<
M
>
ofNullable
(
M
record
);
Optional
<
M
>
ofNullable
(
Consumer
<
M
>
consumer
);
/**
* 当查询结果存在的情况下执行的逻辑
* @param id
* @param result 消费方法
* @author lpf
* @date: 2019年12月3日 下午3:46:56
*/
void
ifPresent
(
ID
id
,
Consumer
<
M
>
result
);
void
ifPresent
(
ID
id
,
Consumer
<
M
>
consumer
,
Consumer
<
M
>
result
);
void
ifPresent
(
M
record
,
Consumer
<
M
>
result
);
void
ifPresent
(
Consumer
<
M
>
consumer
,
Consumer
<
M
>
result
);
}
src/main/java/com/service/customer/CustomerService.java
0 → 100644
浏览文件 @
547107b4
package
com
.
service
.
customer
;
import
com.form.customer.QueryCustomerForm
;
import
com.model.customer.Customer
;
import
com.service.BaseService
;
import
com.util.PageInfo
;
import
com.util.PageParam
;
public
interface
CustomerService
extends
BaseService
<
Customer
,
Integer
>{
PageInfo
<
Customer
>
page
(
PageParam
pageParam
,
QueryCustomerForm
form
);
}
src/main/java/com/service/customer/CustomerServiceImpl.java
0 → 100644
浏览文件 @
547107b4
package
com
.
service
.
customer
;
import
java.util.List
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
com.form.customer.QueryCustomerForm
;
import
com.mapper.BaseMapper
;
import
com.mapper.customer.CustomerMapper
;
import
com.model.customer.Customer
;
import
com.service.BaseServiceImpl
;
import
com.util.PageInfo
;
import
com.util.PageParam
;
@Service
public
class
CustomerServiceImpl
extends
BaseServiceImpl
<
Customer
,
Integer
>
implements
CustomerService
{
@Autowired
private
CustomerMapper
mapper
;
@Override
public
BaseMapper
<
Customer
>
getMapper
()
{
return
this
.
mapper
;
}
@Override
public
PageInfo
<
Customer
>
page
(
PageParam
pageParam
,
QueryCustomerForm
form
)
{
if
(
StringUtils
.
isNotBlank
(
pageParam
.
getOrderBy
()))
{
pageParam
.
setOrderBy
(
" createTime desc "
);
}
startPage
(
pageParam
);
List
<
Customer
>
list
=
mapper
.
list
(
form
);
return
new
PageInfo
<>(
list
);
}
}
src/main/java/com/util/ArrayUtils.java
0 → 100644
浏览文件 @
547107b4
package
com
.
util
;
import
java.util.List
;
import
java.util.Optional
;
public
class
ArrayUtils
{
/**
* 判断list是否为空
* @param list
* @return
* @author lpf
* @date: 2018年11月23日 上午9:24:06
*/
public
static
boolean
empty
(
List
<?>
list
){
return
list
==
null
||
list
.
isEmpty
();
}
/**
* 判断list不为空
* @param list
* @return
* @author lpf
* @date: 2018年11月30日 下午2:47:06
*/
public
static
boolean
isNotEmpty
(
List
<?>
list
){
return
!
empty
(
list
);
}
/**
* 获取list的首位
* @param list
* @return
* @author lpf
* @date: 2018年11月23日 上午9:27:56
*/
public
static
<
T
>
Optional
<
T
>
first
(
List
<
T
>
list
)
{
if
(
empty
(
list
))
{
return
Optional
.
empty
();
}
return
Optional
.
ofNullable
(
list
.
get
(
0
));
}
/**
* 省份对比
*
* @param array
* @param objectToFind
* @return
* @author Conan
* @date: 2018年10月24日 下午6:02:05
*/
public
static
boolean
contains
(
String
[]
array
,
String
objectToFind
)
{
if
(
objectToFind
==
null
)
{
for
(
int
i
=
0
;
i
<
array
.
length
;
i
++)
{
if
(
array
[
i
]
==
null
)
{
return
true
;
}
}
}
String
str
=
(
String
)
objectToFind
;
objectToFind
=
str
.
substring
(
0
,
2
);
for
(
int
i
=
0
;
i
<
array
.
length
;
i
++)
{
if
(
array
[
i
].
startsWith
(
objectToFind
))
{
return
true
;
}
}
return
false
;
}
public
static
void
main
(
String
[]
args
)
{
String
[]
s
=
{
"新疆維吾爾族自治區"
,
"上海"
,
"香港"
};
String
str
=
"香港特別行政區"
;
System
.
out
.
println
(
contains
(
s
,
str
));
}
}
src/main/java/com/util/BeanUtils.java
0 → 100644
浏览文件 @
547107b4
package
com
.
util
;
import
java.lang.reflect.Field
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.function.BiConsumer
;
import
java.util.function.Consumer
;
import
java.util.function.Predicate
;
import
java.util.stream.Collectors
;
import
java.util.stream.Stream
;
import
org.springframework.beans.BeanInstantiationException
;
public
class
BeanUtils
extends
org
.
springframework
.
beans
.
BeanUtils
{
/**
* 拷贝对象
* @param source 拷贝源
* @param clazz 目标对象类
* @return
* @author lpf
* @date: 2019年2月19日 下午4:57:19
*/
public
static
<
R
,
VO
>
VO
copy
(
R
source
,
Class
<
VO
>
clazz
){
return
copy
(
source
,
clazz
,
(
r
,
vo
)
->
{});
}
/**
* 拷贝对象
* @param source 拷贝源
* @param clazz 目标对象类
* @param consumer (VO) -> void 复制对象后 执行程序
* @return
* @author lpf
* @date: 2019年2月19日 下午4:57:19
*/
public
static
<
R
,
VO
>
VO
copy
(
R
source
,
Class
<
VO
>
clazz
,
Consumer
<
VO
>
consumer
)
{
VO
vo
=
copy
(
source
,
clazz
);
consumer
.
accept
(
vo
);
return
vo
;
}
/**
* 拷贝对象
* @param source 拷贝源
* @param clazz 目标对象类
* @param biConSumer (R,VO) -> void 复制对象后 执行程序
* @return
* @author lpf
* @date: 2019年2月19日 下午5:16:23
*/
public
static
<
R
,
VO
>
VO
copy
(
R
source
,
Class
<
VO
>
clazz
,
BiConsumer
<
R
,
VO
>
biConsumer
)
{
VO
vo
=
null
;
try
{
vo
=
BeanUtils
.
instantiate
(
clazz
);
BeanUtils
.
copyProperties
(
source
,
vo
);
}
catch
(
BeanInstantiationException
e
)
{
e
.
printStackTrace
();
}
biConsumer
.
accept
(
source
,
vo
);
return
vo
;
}
/**
* 批量复制对象
* @param list
* @param clazz
* @return
* @author lpf
*/
public
static
<
R
,
VO
>
List
<
VO
>
copyList
(
List
<
R
>
list
,
Class
<
VO
>
clazz
)
{
return
copyList
(
list
,
clazz
,
(
r
,
vo
)
->{});
}
/**
* 过滤批量复制对象
* @param list
* @param clazz
* @param BiConsumer (VO) -> void 复制对象后 执行程序
* @param filter
* @return
* @author lpf
*/
@SafeVarargs
public
static
<
R
,
VO
>
List
<
VO
>
copyList
(
List
<
R
>
list
,
Class
<
VO
>
clazz
,
Consumer
<
VO
>
consumer
,
Predicate
<
R
>...
filter
)
{
Stream
<
R
>
stream
=
list
.
stream
();
for
(
Predicate
<
R
>
predicate
:
filter
)
{
stream
=
stream
.
filter
(
predicate
);
}
return
stream
.
map
(
obj
->
{
try
{
VO
vo
=
BeanUtils
.
instantiate
(
clazz
);
BeanUtils
.
copyProperties
(
obj
,
vo
);
consumer
.
accept
(
vo
);
return
vo
;
}
catch
(
BeanInstantiationException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}).
collect
(
Collectors
.
toList
());
}
/**
* 过滤批量复制对象
* @param list
* @param clazz
* @param BiConsumer (R,VO) -> void 复制对象后 执行程序
* @param filter
* @return
* @author lpf
*/
@SafeVarargs
public
static
<
R
,
VO
>
List
<
VO
>
copyList
(
List
<
R
>
list
,
Class
<
VO
>
clazz
,
BiConsumer
<
R
,
VO
>
biConsumer
,
Predicate
<
R
>...
filter
)
{
Stream
<
R
>
stream
=
list
.
stream
();
for
(
Predicate
<
R
>
predicate
:
filter
)
{
stream
=
stream
.
filter
(
predicate
);
}
return
stream
.
map
(
obj
->
{
try
{
VO
vo
=
BeanUtils
.
instantiate
(
clazz
);
BeanUtils
.
copyProperties
(
obj
,
vo
);
biConsumer
.
accept
(
obj
,
vo
);
return
vo
;
}
catch
(
BeanInstantiationException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}).
collect
(
Collectors
.
toList
());
}
/**
* 获取包括父类在内的所有属性
* @param clazz
* @return
* @author lpf
* @date: 2018年12月26日 上午9:03:59
*/
public
static
List
<
Field
>
getAllFields
(
Class
<?>
clazz
)
{
List
<
Field
>
fieldList
=
new
ArrayList
<>();
while
(
clazz
!=
null
)
{
fieldList
.
addAll
(
new
ArrayList
<>(
Arrays
.
asList
(
clazz
.
getDeclaredFields
())));
clazz
=
clazz
.
getSuperclass
();
}
return
fieldList
;
}
/**
* 筛选类的属性
* @param clazz
* @param filters
* @return
* @author lpf
* @date: 2018年12月11日 下午7:29:51
*/
public
static
<
T
>
Stream
<
Field
>
getFieldsByAnnotation
(
Class
<?>
clazz
,
Predicate
<
Field
>...
filters
){
Stream
<
Field
>
stream
=
getAllFields
(
clazz
).
stream
()
.
map
(
f
->
{
f
.
setAccessible
(
true
);
return
f
;
});
for
(
Predicate
<
Field
>
predicate
:
filters
)
{
stream
=
stream
.
filter
(
predicate
);
}
return
stream
;
}
}
src/main/java/com/util/CallBack.java
0 → 100644
浏览文件 @
547107b4
package
com
.
util
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.function.Consumer
;
import
java.util.function.Supplier
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.enums.ResponseCodeEnum
;
import
com.excetion.BaseException
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
@ApiModel
(
"响应报文"
)
public
class
CallBack
<
T
>
implements
Serializable
{
/**
*
*/
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
"标志位,标记操作是否成功"
)
private
boolean
status
=
true
;
@ApiModelProperty
(
"响应编码"
)
private
int
code
;
@ApiModelProperty
(
"响应描述"
)
private
String
msg
;
@ApiModelProperty
(
"响应数据"
)
@JSONField
(
name
=
"data"
)
private
T
data
;
@ApiModelProperty
(
"响应时间戳"
)
private
Date
timestamp
=
new
Date
();
private
CallBack
(
int
code
)
{
this
.
code
=
code
;
}
public
CallBack
(
ResponseCodeEnum
en
)
{
this
(
en
.
getCode
());
if
(!
ResponseCodeEnum
.
OK
.
equals
(
en
))
{
this
.
status
=
false
;
}
}
public
CallBack
(){
}
public
static
<
T
>
CallBack
<
T
>
create
(
ResponseCodeEnum
en
,
T
data
,
String
message
){
CallBack
<
T
>
back
=
new
CallBack
<
T
>(
en
);
back
.
data
=
data
;
back
.
msg
=
message
;
return
back
;
}
public
static
<
T
>
CallBack
<
T
>
create
(
ResponseCodeEnum
en
,
T
data
){
return
create
(
en
,
data
,
null
);
}
public
static
<
T
>
CallBack
<
T
>
create
(
ResponseCodeEnum
en
){
return
create
(
en
,
null
);
}
public
static
<
T
>
CallBack
<
T
>
createMsg
(
ResponseCodeEnum
en
,
String
message
)
{
return
create
(
en
,
null
,
message
);
}
public
static
<
T
>
CallBack
<
T
>
createMsg
(
ResponseCodeEnum
en
,
String
message
,
T
data
)
{
return
create
(
en
,
data
,
message
);
}
public
static
<
T
>
CallBack
<
T
>
success
()
{
return
create
(
ResponseCodeEnum
.
OK
,
null
);
}
public
static
<
T
>
CallBack
<
T
>
success
(
T
data
)
{
return
create
(
ResponseCodeEnum
.
OK
,
data
);
}
public
static
<
T
>
CallBack
<
T
>
success
(
T
data
,
String
message
)
{
return
create
(
ResponseCodeEnum
.
OK
,
data
,
message
);
}
public
static
<
T
>
CallBack
<
T
>
fail
(
String
message
)
{
return
createMsg
(
ResponseCodeEnum
.
FAIL
,
message
);
}
public
static
<
T
>
CallBack
<
T
>
fail
()
{
return
fail
(
null
);
}
public
static
<
T
>
CallBack
<
T
>
exception
(
String
message
)
{
return
createMsg
(
ResponseCodeEnum
.
EXCEPTION
,
message
);
}
public
static
<
T
>
CallBack
<
T
>
exception
()
{
return
exception
(
null
);
}
public
static
<
T
>
CallBack
<
T
>
baseException
(
String
message
){
return
createMsg
(
ResponseCodeEnum
.
BASE_EXCEPTION
,
message
);
}
public
static
<
T
>
CallBack
<
T
>
baseException
(
String
message
,
T
data
)
{
return
createMsg
(
ResponseCodeEnum
.
BASE_EXCEPTION
,
message
,
data
);
}
public
boolean
isStatus
()
{
return
this
.
status
;
}
public
T
getData
(){
return
this
.
data
;
}
public
Date
getTimestamp
()
{
return
this
.
timestamp
;
}
public
void
setStatus
(
boolean
status
)
{
this
.
status
=
status
;
}
public
void
setCode
(
int
code
)
{
this
.
code
=
code
;
}
public
int
getCode
()
{
return
this
.
code
;
}
public
String
getMsg
()
{
return
this
.
msg
;
}
public
void
setMsg
(
String
msg
)
{
this
.
msg
=
msg
;
}
public
boolean
notEntity
()
{
return
this
.
isStatus
()
&&
this
.
data
==
null
;
}
public
boolean
hasEntity
(){
return
this
.
isStatus
()
&&
this
.
data
!=
null
;
}
public
boolean
hasError
()
{
return
!
this
.
isStatus
()
||
this
.
data
==
null
;
}
public
boolean
ifPresent
()
{
return
this
.
hasEntity
();
}
public
void
ifPresent
(
Consumer
<
T
>
consumer
)
{
this
.
ifPresentThrowBaseException
(
consumer
,
null
);
}
public
void
ifPresentThrowBaseException
(
Consumer
<
T
>
consumer
,
Supplier
<
BaseException
>
supplier
)
{
if
(
this
.
hasEntity
())
{
consumer
.
accept
(
this
.
data
);
}
else
{
if
(
supplier
!=
null
)
{
BaseException
exception
=
supplier
.
get
();
throw
exception
;
}
}
}
public
void
setData
(
T
data
)
{
this
.
data
=
data
;
}
public
static
<
T
>
CallBack
<
T
>
validate
(
T
data
)
{
return
create
(
ResponseCodeEnum
.
VALIDATE
,
data
);
}
public
static
<
T
>
CallBack
<
T
>
validate
()
{
return
fail
(
null
);
}
}
src/main/java/com/util/DingTalkResult.java
0 → 100644
浏览文件 @
547107b4
package
com
.
util
;
import
lombok.Data
;
@Data
public
class
DingTalkResult
{
/** 错误编码 */
private
String
errcode
;
/** 错误信息 */
private
String
errmsg
;
}
src/main/java/com/util/PageInfo.java
0 → 100644
浏览文件 @
547107b4
差异被折叠。
点击展开。
src/main/java/com/util/PageMap.java
0 → 100644
浏览文件 @
547107b4
package
com
.
util
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
java.io.Serializable
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
import
com.github.pagehelper.Page
;
import
lombok.Data
;
@ApiModel
(
value
=
"PageMap"
,
description
=
"分页分组工具类"
)
@Data
public
class
PageMap
<
K
,
V
>
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
"当前页"
)
private
int
pageNum
;
@ApiModelProperty
(
"每页的数量"
)
private
int
pageSize
;
@ApiModelProperty
(
"当前页的数量"
)
private
int
size
;
@ApiModelProperty
(
"当前页面第一个元素在数据库中的行号"
)
private
int
startRow
;
@ApiModelProperty
(
"当前页面最后一个元素在数据库中的行号"
)
private
int
endRow
;
@ApiModelProperty
(
"总记录数"
)
private
long
total
;
@ApiModelProperty
(
"总页数"
)
private
int
pages
;
@ApiModelProperty
(
"结果集"
)
private
Map
<
K
,
V
>
map
;
@ApiModelProperty
(
"前一页"
)
private
int
prePage
;
@ApiModelProperty
(
"下一页"
)
private
int
nextPage
;
@ApiModelProperty
(
"是否为第一页"
)
private
boolean
isFirstPage
=
false
;
@ApiModelProperty
(
"是否为最后一页"
)
private
boolean
isLastPage
=
false
;
@ApiModelProperty
(
"是否有前一页"
)
private
boolean
hasPreviousPage
=
false
;
@ApiModelProperty
(
"是否有下一页"
)
private
boolean
hasNextPage
=
false
;
@ApiModelProperty
(
"导航页码数"
)
private
int
navigatePages
;
@ApiModelProperty
(
"所有导航页号"
)
private
int
[]
navigatepageNums
;
@ApiModelProperty
(
"导航条上的第一页"
)
private
int
navigateFirstPage
;
@ApiModelProperty
(
"导航条上的最后一页"
)
private
int
navigateLastPage
;
public
PageMap
(){
}
public
PageMap
(
List
<?>
list
,
Map
<
K
,
V
>
result
)
{
this
(
list
,
8
);
this
.
map
=
result
;
}
/**
* 包装Page对象
*
* @param list page结果
* @param navigatePages 页码数量
*/
public
PageMap
(
List
<?>
list
,
int
navigatePages
)
{
if
(
list
instanceof
Page
)
{
Page
page
=
(
Page
)
list
;
this
.
pageNum
=
page
.
getPageNum
();
this
.
pageSize
=
page
.
getPageSize
();
this
.
pages
=
page
.
getPages
();
this
.
size
=
page
.
size
();
this
.
total
=
page
.
getTotal
();
//由于结果是>startRow的,所以实际的需要+1
if
(
this
.
size
==
0
)
{
this
.
startRow
=
0
;
this
.
endRow
=
0
;
}
else
{
this
.
startRow
=
page
.
getStartRow
()
+
1
;
//计算实际的endRow(最后一页的时候特殊)
this
.
endRow
=
this
.
startRow
-
1
+
this
.
size
;
}
}
else
if
(
list
instanceof
Collection
)
{
this
.
pageNum
=
1
;
this
.
pageSize
=
list
.
size
();
this
.
pages
=
this
.
pageSize
>
0
?
1
:
0
;
this
.
size
=
list
.
size
();
this
.
total
=
list
.
size
();
this
.
startRow
=
0
;
this
.
endRow
=
list
.
size
()
>
0
?
list
.
size
()
-
1
:
0
;
}
if
(
list
instanceof
Collection
)
{
this
.
navigatePages
=
navigatePages
;
//计算导航页
calcNavigatepageNums
();
//计算前后页,第一页,最后一页
calcPage
();
//判断页面边界
judgePageBoudary
();
}
}
/**
* 计算导航页
*/
private
void
calcNavigatepageNums
()
{
//当总页数小于或等于导航页码数时
if
(
pages
<=
navigatePages
)
{
navigatepageNums
=
new
int
[
pages
];
for
(
int
i
=
0
;
i
<
pages
;
i
++)
{
navigatepageNums
[
i
]
=
i
+
1
;
}
}
else
{
//当总页数大于导航页码数时
navigatepageNums
=
new
int
[
navigatePages
];
int
startNum
=
pageNum
-
navigatePages
/
2
;
int
endNum
=
pageNum
+
navigatePages
/
2
;
if
(
startNum
<
1
)
{
startNum
=
1
;
//(最前navigatePages页
for
(
int
i
=
0
;
i
<
navigatePages
;
i
++)
{
navigatepageNums
[
i
]
=
startNum
++;
}
}
else
if
(
endNum
>
pages
)
{
endNum
=
pages
;
//最后navigatePages页
for
(
int
i
=
navigatePages
-
1
;
i
>=
0
;
i
--)
{
navigatepageNums
[
i
]
=
endNum
--;
}
}
else
{
//所有中间页
for
(
int
i
=
0
;
i
<
navigatePages
;
i
++)
{
navigatepageNums
[
i
]
=
startNum
++;
}
}
}
}
/**
* 计算前后页,第一页,最后一页
*/
private
void
calcPage
()
{
if
(
navigatepageNums
!=
null
&&
navigatepageNums
.
length
>
0
)
{
navigateFirstPage
=
navigatepageNums
[
0
];
navigateLastPage
=
navigatepageNums
[
navigatepageNums
.
length
-
1
];
if
(
pageNum
>
1
)
{
prePage
=
pageNum
-
1
;
}
if
(
pageNum
<
pages
)
{
nextPage
=
pageNum
+
1
;
}
}
}
/**
* 判定页面边界
*/
private
void
judgePageBoudary
()
{
isFirstPage
=
pageNum
==
1
;
isLastPage
=
pageNum
==
pages
||
pages
==
0
;;
hasPreviousPage
=
pageNum
>
1
;
hasNextPage
=
pageNum
<
pages
;
}
}
\ No newline at end of file
src/main/java/com/util/PageParam.java
0 → 100644
浏览文件 @
547107b4
package
com
.
util
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
@ApiModel
(
value
=
"PageParam"
,
description
=
"分页参数"
)
@Data
public
class
PageParam
{
@ApiModelProperty
(
value
=
"页码"
,
example
=
"1"
,
required
=
true
)
private
Integer
pageNum
=
1
;
@ApiModelProperty
(
value
=
"每页展示行数"
,
example
=
"10"
,
required
=
true
)
private
Integer
pageSize
=
10
;
@ApiModelProperty
(
"排序列"
)
private
String
orderBy
;
}
\ No newline at end of file
src/main/java/com/util/StringUtils.java
0 → 100644
浏览文件 @
547107b4
package
com
.
util
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Method
;
/**
* 字符串的一些公共方法
* @ClassName: StringUtils
* @author
* @date 2014-7-14 上午11:14:00
*
*/
public
class
StringUtils
extends
org
.
apache
.
commons
.
lang3
.
StringUtils
{
private
final
static
String
[]
agent
=
{
"Android"
,
"iPhone"
,
"iPod"
,
"iPad"
,
"Windows Phone"
,
"MQQBrowser"
};
private
final
static
String
[]
enletters
=
{
"a"
,
"c"
,
"d"
,
"e"
,
"f"
,
"g"
,
"h"
,
"i"
,
"j"
,
"k"
,
"l"
,
"m"
,
"n"
,
"o"
,
"p"
,
"q"
,
"r"
,
"t"
,
"u"
,
"v"
,
"w"
,
"x"
,
"y"
,
"z"
};
public
static
boolean
isNotBlank
(
Integer
value
){
return
value
!=
null
;
}
/**
* 判断User-Agent 是不是来自于手机
* @param ua
* @return
*/
public
static
boolean
checkAgentIsMobile
(
String
ua
)
{
boolean
flag
=
false
;
if
(!
ua
.
contains
(
"Windows NT"
)
||
(
ua
.
contains
(
"Windows NT"
)
&&
ua
.
contains
(
"compatible; MSIE 9.0;"
)))
{
// 排除 苹果桌面系统
if
(!
ua
.
contains
(
"Windows NT"
)
&&
!
ua
.
contains
(
"Macintosh"
))
{
for
(
String
item
:
agent
)
{
if
(
ua
.
contains
(
item
))
{
flag
=
true
;
break
;
}
}
}
}
return
flag
;
}
/**
* 给定指定字符串res,去除字符串首尾的指定字符c
* @Title: trim
* @param res 原字符串
* @param c 要删除的字符,只删除首尾,且不能截取Unicode 大于 'A'的字符
* @return
* @return String 返回类型
* @author
* @date 2014-7-14 上午11:21:21
*/
public
static
String
trim
(
String
res
,
char
c
)
{
int
count
=
res
.
toCharArray
().
length
;
int
len
=
res
.
toCharArray
().
length
;
int
st
=
0
;
int
off
=
0
;
/* avoid getfield opcode */
char
[]
val
=
res
.
toCharArray
();
/* avoid getfield opcode */
while
((
st
<
len
)
&&
(
val
[
off
+
st
]
<=
c
))
{
st
++;
}
while
((
st
<
len
)
&&
(
val
[
off
+
len
-
1
]
<=
c
))
{
len
--;
}
return
((
st
>
0
)
||
(
len
<
count
))
?
res
.
substring
(
st
,
len
)
:
res
;
}
/**
* 获取setter方法名称
* @Title: getSetterMethodName
* @param key
* @return
* @return String 返回类型
* @author
* @date 2014年7月24日 下午3:43:22
*/
public
static
String
getMethodName
(
String
begin
,
String
key
)
{
StringBuilder
result
=
new
StringBuilder
(
begin
);
result
.
append
(
key
.
substring
(
0
,
1
).
toUpperCase
()).
append
(
key
.
substring
(
1
));
return
result
.
toString
();
}
/**
* 获取随机英文字符串
* @param caseType 1大写,其他小写
* @param length 返回字符串长度
* @param hasRepeat 是否包含重复字符 1包含0不包含
* @return
* @author ydm
* @date: 2018年7月11日 上午11:33:25
*/
public
static
String
getRandomEnSign
(
int
caseType
,
int
length
,
int
hasRepeat
){
StringBuffer
resultBuffer
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
length
;
i
++
){
int
x
=
1
+(
int
)(
Math
.
random
()*
enletters
.
length
-
1
);
if
(
hasRepeat
*
1
==
0
){
if
(
resultBuffer
.
toString
().
toLowerCase
().
indexOf
(
enletters
[
x
].
toLowerCase
())>
0
){
continue
;
}
}
resultBuffer
.
append
(
caseType
*
1
==
1
?
enletters
[
x
].
toUpperCase
()
:
enletters
[
x
].
toLowerCase
());
}
return
resultBuffer
.
toString
();
}
public
static
Object
checkNull
(
Object
obj
)
{
Class
<?
extends
Object
>
clazz
=
obj
.
getClass
();
// 获取实体类的所有属性,返回Field数组
Field
[]
fields
=
clazz
.
getDeclaredFields
();
for
(
Field
field
:
fields
)
{
// 可访问私有变量
field
.
setAccessible
(
true
);
// 获取属性类型
String
type
=
field
.
getGenericType
().
toString
();
// 如果type是类类型,则前面包含"class ",后面跟类名
if
(
"class java.lang.String"
.
equals
(
type
))
{
// 将属性的首字母大写
String
methodName
=
field
.
getName
().
replaceFirst
(
field
.
getName
().
substring
(
0
,
1
),
field
.
getName
().
substring
(
0
,
1
).
toUpperCase
());
System
.
out
.
println
(
methodName
);
try
{
Method
methodGet
=
clazz
.
getMethod
(
"get"
+
methodName
);
// 调用getter方法获取属性值
String
str
=
(
String
)
methodGet
.
invoke
(
obj
);
if
(
str
==
null
)
{
// Method methodSet = clazz.getMethod("set" +
// methodName, new Class[] { String.class });
// methodSet.invoke(o, new Object[] { "" });
System
.
out
.
println
(
field
.
getType
());
// class java.lang.String
// 如果为null的String类型的属性则重新复制为空字符串
field
.
set
(
obj
,
field
.
getType
().
getConstructor
(
field
.
getType
()).
newInstance
(
""
));
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
return
obj
;
}
}
src/main/java/com/vo/dingding/SimpleUserListVo.java
0 → 100644
浏览文件 @
547107b4
package
com
.
vo
.
dingding
;
import
java.util.List
;
import
com.util.DingTalkResult
;
import
lombok.Data
;
@Data
public
class
SimpleUserListVo
extends
DingTalkResult
{
private
List
<
SimpleUserVo
>
userlist
;
}
src/main/java/com/vo/dingding/SimpleUserVo.java
0 → 100644
浏览文件 @
547107b4
package
com
.
vo
.
dingding
;
import
lombok.Data
;
/**
* 获取部门用户vo
* @author lpf
* @date 2020年3月16日下午12:20:29
*/
@Data
public
class
SimpleUserVo
{
/** 钉钉用户id */
private
String
userid
;
/** 钉钉用户名称 */
private
String
name
;
}
src/main/resources/application.properties
浏览文件 @
547107b4
#服务启动端口号。钉钉云ECS目前只开放80和22端口
server.port
=
8080
server.env
=
test
#销售部门id
dingding.sales.departmentId
=
1
dingding.sales.departmentId
=
26966822
src/main/resources/application.yml
0 → 100644
浏览文件 @
547107b4
server
:
tomcat
:
uri-encoding
:
UTF-8
security
:
sessions
:
always
#always设置保存用户状态(内存可能会被占满) stateless设置不保存用户状态
basic
:
enabled
:
false
#开启认证
logging
:
level
:
com.mapper
:
DEBUG
mybatis
:
type-aliases-package
:
com.model
configuration
:
default-scripting-language
:
com.mapper.SqlXMLLanguageDriver
mapper
:
not-empty
:
false
i-d-e-n-t-i-t-y
:
MYSQL
style
:
normal
b-e-f-o-r-e
:
true
pagehelper
:
helperDialect
:
mysql
reasonable
:
true
supportMethodsArguments
:
true
params
:
count=countSql
spring
:
thymeleaf
:
cache
:
false
encoding
:
UTF-8
jackson
:
date-format
:
yyyy-MM-dd HH:mm:ss
time-zone
:
GMT+8
http
:
multipart
:
maxFileSize
:
20Mb
maxRequestSize
:
20Mb
encoding
:
enabled
:
true
force
:
true
charset
:
UTF-8
application
:
name
:
sysuser
#服务名称
datasource
:
driver-class-name
:
com.mysql.jdbc.Driver
url
:
'
jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull'
username
:
root
password
:
root
initialize
:
true
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论