20252 月11
@Column
@ColDefine(customType = "GEOGRAPHY(Point,4326)", adaptor = PsqlPointAdaptor.class)
@ApiModelProperty(description = "坐标")
private String geomPoint;//值格式为"POINT(经度 纬度)"
import net.postgis.jdbc.PGgeometry;
import net.postgis.jdbc.geometry.Point;
import org.nutz.dao.jdbc.ValueAdaptor;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
public class PsqlPointAdaptor implements ValueAdaptor {
@Override
public Object get(ResultSet rs, String colName) throws SQLException {
return rs.getObject(colName);
}
@Override
public void set(PreparedStatement stat, Object obj, int index) throws SQLException{
if (null == obj) {
stat.setNull(index, Types.NULL);
} else {
String pointStr = (String) obj;
Point point = new Point(pointStr);
PGgeometry pgGeometry = new PGgeometry(point);
stat.setObject(index, pgGeometry, Types.OTHER);
}
}
}
<properties>
<postgis-jdbc.version>2024.1.0</postgis-jdbc.version>
</properties>
<dependencies>
<!-- PostGIS扩展类型 -->
<dependency>
<groupId>net.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>${postgis-jdbc.version}</version>
</dependency>
202411 月29
以下以Nutz代码为例:
Header header = Header.create();
header.addv("Content-Type", "application/json");
header.addv("AppCode", appcode);
Request request = Request.create(url, Request.METHOD.POST);
NutMap body = NutMap.NEW();
body.put("kssj", kssj);
body.put("jssj", jssj);
request.setHeader(header);
request.setData(Json.toJson(body));
Sender sender = Sender.create(request).setTimeout(30 * 1000);
if (url.startsWith("https")) {
try {
SSLContext sslcontext = this.createIgnoreVerifySSL();
sender.setSSLSocketFactory(sslcontext.getSocketFactory());
sender.setHostnameVerifier((urlHostName, session) -> true);
} catch (Exception e) {
e.printStackTrace();
}
}
Response response = sender.send();
if (response.isOK()) {
//todo
}
private static class TrustAllManager
implements X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[] certs,
String authType) {
}
public void checkClientTrusted(X509Certificate[] certs,
String authType) {
}
}
public SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new CityLifelineServer.TrustAllManager()}, null);
return sc;
}
20238 月10
@IocBean
@Slf4j
public class CimApiServer {
@Inject
private RedisService redisService;
private String redis_key = "cim:accessToken";
@Inject
@Reference(check = false)
private ISysConfigProvider sysConfigProvider;
public String getAccessToken() {
String token = redisService.get(redis_key);
if (Strings.isBlank(token)) {
token = this.getHttpToken();
redisService.setex(redis_key, 3600 * 24 - 100, token);
}
return token;
}
private String getHttpToken() {
String CIM_GIS_APPID = sysConfigProvider.getString("COMMON", "CIM_GIS_APPID");
String CIM_GIS_HTTP_BASE = sysConfigProvider.getString("COMMON", "CIM_GIS_HTTP_BASE");
String CIM_GIS_APPKEY = sysConfigProvider.getString("COMMON", "CIM_GIS_APPKEY");
String CIM_GIS_APPSECRET = sysConfigProvider.getString("COMMON", "CIM_GIS_APPSECRET");
Map<String, Object> params = new HashMap<>();
params.put("apiKey", CIM_GIS_APPKEY);
params.put("secret", CIM_GIS_APPSECRET);
Header header = Header.create();
header.addv("Content-Type", "application/json");
Request request = Request.create(CIM_GIS_HTTP_BASE + "/auth/getAccessToken", Request.METHOD.POST);
request.setHeader(header);
request.setData(Json.toJson(params));
Sender sender = Sender.create(request).setTimeout(20 * 1000);
if (CIM_GIS_HTTP_BASE.startsWith("https")) {
try {
SSLContext sslcontext = createIgnoreVerifySSL();
sender.setSSLSocketFactory(sslcontext.getSocketFactory());
sender.setHostnameVerifier((urlHostName, session) -> true);
} catch (Exception e) {
e.printStackTrace();
}
}
Response response = sender.send();
if (response.isOK()) {
NutMap map = Json.fromJson(NutMap.class, response.getContent());
log.debug("getHttpToken:::" + Json.toJson(map));
if (0 == map.getInt("code")) {
return map.getString("data");
}
}
return "";
}
private static class TrustAllManager
implements X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[] certs,
String authType) {
}
public void checkClientTrusted(X509Certificate[] certs,
String authType) {
}
}
public SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new TrustAllManager()}, null);
return sc;
}
}
20198 月2
项目介绍:
NutzWk 是有五年多历史的Java Web开源开发框架,其5.x 是Java 微服务分布式版本,采用nutzboot(nutz核心)、dubbo、redis、zookeeper、shiro、quartz、beetl、logback、vue、sentinel(流控框架,可选)、seata(分布式事务,可选) 等开源技术的微服务分布式版本,自带系统管理、简易CMS、微信模块、定时任务、服务API等功能,目前已应用于全国各地上千个各类商业项目中。
演示地址(Vue版本): https://nutzwk.wizzer.cn
后端技术架构:nutzboot(国产,基于国产nutz) + dubbo(国产) + redis + zookeeper + shiro + quartz + logback 等主流技术
前端技术架构:vue+ element
NutzWk v5.2.6 更新内容:
- 修改错误页机制,将前后台404/403/505 错误页严格区分;
- 修改POJO类,引入 @PrevInsert 注解,在执行fastInsert数据快速入库时有效;
- 修改web项目,Globals类 Map 对象改为 NutMap 方便开发;
- 修改vue后台,系统管理中的页面弹出框,改为手动关闭;
- 修复vue后台,数据字典管理的排序问题;
- 其他功能的完善,vue页面优化等;
- 相关jar包及第三方依赖的版本升级;
NutzWk v5.2.6-mini 版本发布:
- 具有v5.2.6 全部功能的微服务mini版本(系统管理/CMS管理/微信管理/API接口等功能齐全);
- 管理后台 vue + element;
- 非分布式,一个jar包即可运行(无dubbo依赖、无需zookepper,只需安装数据库+redis);
- 非常适合小型项目快速开发;
20186 月9
NutzWk 5.x 已发布一段时间,这段时间基于此版本开发了智慧水务系统(NB-IOT)、某物联网平台、某设备租赁平台、某智慧睡眠平台、某智慧园区项目等,开发和部署过程中遇到一些小问题,开这个帖子把一些经验分享出来省的大家走弯路。
项目地址1: https://github.com/Wizzercn/NutzWk
项目地址2: https://gitee.com/wizzer/NutzWk
1、运行环境
其实项目readme和wk-wiki 已经写的很清楚了,在此强调一下,不是说非这些版本不可,但对于新手来说最好版本号保持一致,能跑起来了您再折腾玩~~
<span class="pln">JDK </span>
<span class="lit">8</span> <span class="lit">162</span> <span class="pun">+</span>
<span class="typ">Maven</span> <span class="lit">3.5</span>
<span class="pun">.</span>
<span class="lit">3</span> <span class="pun">+</span>
<span class="typ">Redis</span> <span class="lit">4.0</span>
<span class="pun">.</span>
<span class="lit">8</span> <span class="pun">+</span>
<span class="typ">MySql</span> <span class="lit">5.7</span> <span class="pun">+</span>
<span class="typ">Zookeeper</span> <span class="lit">3.4</span>
<span class="pun">.</span>
<span class="lit">11</span> <span class="pun">+</span>
2、开发环境
一般建议使用IDEA进行开发,因为是maven多模块的项目,直接用IDEA打开项目根目录,它会通过maven下载jar包,自动构建项目
然后如何启动项目呢,有很多种方式,简单说几个:
1)打开每个NB项目(nutzboot简称)项目里的main类,右击运行,例如 cn.wizzer.sys.commons.core.***MainLauncher
2)通过IDEA 的Run 配置 Application 运行,详见 https://github.com/Wizzercn/NutzWk/blob/nutzboot-dubbo/wk-wiki/01.QuickStart/01.02.Start.md
3)命令行在NB项目根目录运行mvn compile nutzboot:run 或者IDEA右侧Maven管理界面里通过插件运行,,详见 https://github.com/nutzam/nutzboot-maven-plugin
3、启动顺序
保证MySQL、Redis、Zookeeper 都正常启动且为默认端口及默认配置(当然这些配置项可以在application.properties 修改的)
1)MySQL创建一个空白数据库,编码格式为UTF-8,数据库名称 nutzwk_nb
2)NB项目的模块启动顺序是 sys –> cms[可选] –> wx[可选] –> task[可选] –> web-platform –> web-api[可选]
3)如上所述,如果想运行访问后台,只需要启动 sys 和 web-platform即可,注意是有启动顺序的,其他模块需要用就启
4)task 定时任务是依赖于sys的,而web-platform系统管理对定时任务管理是依赖于 task模块的,如果你想让task独立运行并且不需要通过页面进行管理,自己少做改动即可,不是不可以哦
4、部署注意事项
1)因为登录页面对密码进行了RSA加密,有时候部署会遇到怎么也登录不了,而后台抛异常 java.lang.SecurityException: JCE cannot authenticate the provider BC 的情况,解决方法在代码注释里已写明了,不过很少有人去看
https://github.com/Wizzercn/NutzWk/blob/nutzboot-dubbo/wk-app/wk-nb-web-platform/src/main/java/cn/wizzer/app/web/commons/shiro/filter/PlatformAuthenticationFilter.java
<span class="lit">1</span>
<span class="pun">、编辑文件</span> <span class="pun">/</span>
<span class="pln">usr</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">/</span>
<span class="pln">jdk1</span>
<span class="pun">.</span>
<span class="lit">8.0</span>
<span class="pln">_162</span>
<span class="pun">/</span>
<span class="pln">jre</span>
<span class="pun">/</span>
<span class="pln">lib</span>
<span class="pun">/</span>
<span class="pln">security</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">.</span>
<span class="pln">security
</span>
<span class="pun">在</span>
<span class="lit">9</span>
<span class="pun">下面添加</span>
<span class="pln"> security</span>
<span class="pun">.</span>
<span class="pln">provider</span>
<span class="pun">.</span>
<span class="lit">10</span>
<span class="pun">=</span>
<span class="pln">org</span>
<span class="pun">.</span>
<span class="pln">bouncycastle</span>
<span class="pun">.</span>
<span class="pln">jce</span>
<span class="pun">.</span>
<span class="pln">provider</span>
<span class="pun">.</span>
<span class="typ">BouncyCastleProvider</span>
<span class="lit">2</span>
<span class="pun">、拷贝</span>
<span class="pln"> bcprov</span>
<span class="pun">-</span>
<span class="pln">jdk16</span>
<span class="pun">-</span>
<span class="lit">143.jar</span> <span class="pun">和</span>
<span class="pln"> bcprov</span>
<span class="pun">-</span>
<span class="pln">jdk15</span>
<span class="pun">-</span>
<span class="lit">135.jar</span> <span class="pun">到</span> <span class="pun">/</span>
<span class="pln">usr</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">/</span>
<span class="pln">jdk1</span>
<span class="pun">.</span>
<span class="lit">8.0</span>
<span class="pln">_162</span>
<span class="pun">/</span>
<span class="pln">jre</span>
<span class="pun">/</span>
<span class="pln">lib</span>
<span class="pun">/</span>
<span class="pln">ext </span>
<span class="pun">目录下</span>
<span class="lit">3</span>
<span class="pun">、别问我上面两个文件怎么找……</span>
(如果您是https的话可以把RSA加密方式改掉弃用哦)
2)服务器注意事项:服务器时间同步做没做、hosts里配没配主机名hostname和127.0.0.1的映射关系、内存够不够用(有没有给jar指定内存大小)等
5、其他
1)请关注 NutzWk 的动态,有新的版本发布建议及时更新,往往会修复问题或新增功能
2)如果 NutzWk 给了您帮助,或已用于生产, https://wizzer.cn/donation 欢迎打赏一定金额以资鼓励,创造国内良好的开源环境
3)最后感谢兽兽及nutz社区广大网友的帮助和鼓励,没有您们的支持,这个项目不会历经6年多还在更新前进
20182 月26

1、MainServer 启动类
/**
* Created by Wizzer on 2018/2/26.
*/
@IocBean
public class MainServer {
private static final Log log = Logs.get();
public static void main(String[] args) {
try {
ComboIocLoader loader = new ComboIocLoader(
new String[]{"*json", "config/ioc/", "*anno", "cn.wizzer","*rabbitmq"}
);
NutIoc ioc = new NutIoc(loader);
//socket
ioc.get(SocketServer.class).init();
//http
ioc.get(HttpServer.class).init();
//mq
String topicQueue = "sweeper-tioTopicQueue";
ConnectionFactory factory = ioc.get(ConnectionFactory.class, "rabbitmq_cf");
Connection rabbitmq_conn = factory.newConnection();
Channel rabbitmq_channel = rabbitmq_conn.createChannel();
rabbitmq_channel.queueDeclare(topicQueue, true, false, false, null);
rabbitmq_channel.exchangeDeclare("sweeper-tioTopicExchange", BuiltinExchangeType.TOPIC, true);
rabbitmq_channel.queueBind(topicQueue, "sweeper-tioTopicExchange", "tio.#");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、SocketServer 数据接收
/**
* Created by Wizzer on 2018/2/26.
*/
@IocBean
public class SocketServer {
private static final Log log = Logs.get();
//handler, 包括编码、解码、消息处理
@Inject
private MyServerAioHandler myServerAioHandler;
//事件监听器,可以为null,但建议自己实现该接口,可以参考showcase了解些接口
private ServerAioListener aioListener;
//一组连接共用的上下文对象
private ServerGroupContext serverGroupContext;
//aioServer对象
private AioServer aioServer;
//有时候需要绑定ip,不需要则null
private String serverIp;
@Inject
private PropertiesProxy conf;
public void init() throws Exception {
int port = conf.getInt("server.socket.port", 8600);
log.debug("socket port::" + port);
serverGroupContext = new ServerGroupContext("tio", myServerAioHandler, aioListener);
serverGroupContext.setHeartbeatTimeout(30000);
aioServer = new AioServer(serverGroupContext);
aioServer.start(serverIp, port);
}
}
3、socket 数据包的解析
4、RabbitMQ 队列+消费者 实现数据入库
5、HttpServer 提供HTTP API用于对设备发送命令
6、socket 命令包的下发
源码:https://gitee.com/wizzer/demo
20181 月21
后台代码,自定义tag:
<span class="kwd">package</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">modules</span>
<span class="pun">.</span>
<span class="pln">tags</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">ex</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="typ">EsService</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">utils</span>
<span class="pun">.</span>
<span class="typ">YcDateUtil</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">ycold</span>
<span class="pun">.</span>
<span class="pln">modules</span>
<span class="pun">.</span>
<span class="pln">services</span>
<span class="pun">.</span>
<span class="typ">YcoldInquiryService</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">framework</span>
<span class="pun">.</span>
<span class="pln">page</span>
<span class="pun">.</span>
<span class="typ">Pagination</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="typ">BooleanUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="typ">StringUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="pln">math</span>
<span class="pun">.</span>
<span class="typ">NumberUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">beetl</span>
<span class="pun">.</span>
<span class="pln">core</span>
<span class="pun">.</span>
<span class="typ">GeneralVarTagBinding</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchRequestBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchResponse</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchType</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">common</span>
<span class="pun">.</span>
<span class="pln">text</span>
<span class="pun">.</span>
<span class="typ">Text</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">index</span>
<span class="pun">.</span>
<span class="pln">query</span>
<span class="pun">.</span>
<span class="typ">BoolQueryBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">index</span>
<span class="pun">.</span>
<span class="pln">query</span>
<span class="pun">.</span>
<span class="typ">QueryBuilders</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchHits</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">fetch</span>
<span class="pun">.</span>
<span class="pln">subphase</span>
<span class="pun">.</span>
<span class="pln">highlight</span>
<span class="pun">.</span>
<span class="typ">HighlightBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">fetch</span>
<span class="pun">.</span>
<span class="pln">subphase</span>
<span class="pun">.</span>
<span class="pln">highlight</span>
<span class="pun">.</span>
<span class="typ">HighlightField</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">sort</span>
<span class="pun">.</span>
<span class="typ">SortOrder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">impl</span>
<span class="pun">.</span>
<span class="typ">PropertiesProxy</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">loader</span>
<span class="pun">.</span>
<span class="pln">annotation</span>
<span class="pun">.</span>
<span class="typ">Inject</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">loader</span>
<span class="pun">.</span>
<span class="pln">annotation</span>
<span class="pun">.</span>
<span class="typ">IocBean</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">lang</span>
<span class="pun">.</span>
<span class="typ">Strings</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">lang</span>
<span class="pun">.</span>
<span class="typ">Times</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">log</span>
<span class="pun">.</span>
<span class="typ">Log</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">log</span>
<span class="pun">.</span>
<span class="typ">Logs</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">ArrayList</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">Date</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">List</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">Map</span>
<span class="pun">;</span>
<span class="com">/**
* Created by wizzer on 2018/1/20.
*/</span>
<span class="lit">@IocBean</span>
<span class="kwd">public</span> <span class="kwd">class</span> <span class="typ">YcoldInquiryListTag</span> <span class="kwd">extends</span> <span class="typ">GeneralVarTagBinding</span> <span class="pun">{</span>
<span class="kwd">private</span> <span class="kwd">final</span> <span class="kwd">static</span> <span class="typ">Log</span>
<span class="pln"> log </span>
<span class="pun">=</span> <span class="typ">Logs</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">();</span>
<span class="lit">@Inject</span>
<span class="kwd">private</span> <span class="typ">EsService</span>
<span class="pln"> esService</span>
<span class="pun">;</span>
<span class="lit">@Inject</span>
<span class="kwd">private</span> <span class="typ">YcoldInquiryService</span>
<span class="pln"> ycoldInquiryService</span>
<span class="pun">;</span>
<span class="lit">@Inject</span>
<span class="kwd">private</span> <span class="typ">PropertiesProxy</span>
<span class="pln"> cfg</span>
<span class="pun">;</span>
<span class="lit">@Override</span>
<span class="kwd">public</span> <span class="kwd">void</span>
<span class="pln"> render</span>
<span class="pun">()</span> <span class="pun">{</span>
<span class="typ">String</span>
<span class="pln"> startDate </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"startDate"</span>
<span class="pun">));</span>
<span class="typ">String</span>
<span class="pln"> endDate </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"endDate"</span>
<span class="pun">));</span>
<span class="typ">String</span>
<span class="pln"> keyword </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"keyword"</span>
<span class="pun">));</span>
<span class="kwd">int</span>
<span class="pln"> pageNumber </span>
<span class="pun">=</span> <span class="typ">NumberUtils</span>
<span class="pun">.</span>
<span class="pln">toInt</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"pageNumber"</span>
<span class="pun">)),</span> <span class="lit">1</span>
<span class="pun">);</span>
<span class="kwd">int</span>
<span class="pln"> pageSize </span>
<span class="pun">=</span> <span class="typ">NumberUtils</span>
<span class="pun">.</span>
<span class="pln">toInt</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"pageSize"</span>
<span class="pun">)),</span> <span class="lit">10</span>
<span class="pun">);</span>
<span class="kwd">boolean</span>
<span class="pln"> highlight </span>
<span class="pun">=</span> <span class="typ">BooleanUtils</span>
<span class="pun">.</span>
<span class="pln">toBoolean</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"highlight"</span>
<span class="pun">)));</span>
<span class="kwd">boolean</span>
<span class="pln"> explain </span>
<span class="pun">=</span> <span class="typ">BooleanUtils</span>
<span class="pun">.</span>
<span class="pln">toBoolean</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"explain"</span>
<span class="pun">)));</span>
<span class="typ">String</span>
<span class="pln"> sortName </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"sortName"</span>
<span class="pun">));</span>
<span class="typ">String</span>
<span class="pln"> sortOrder </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"sortOrder"</span>
<span class="pun">));</span>
<span class="typ">Pagination</span>
<span class="pln"> page </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Pagination</span>
<span class="pun">();</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setPageNo</span>
<span class="pun">(</span>
<span class="pln">pageNumber</span>
<span class="pun">);</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setPageSize</span>
<span class="pun">(</span>
<span class="pln">pageSize</span>
<span class="pun">);</span>
<span class="kwd">try</span> <span class="pun">{</span>
<span class="typ">BoolQueryBuilder</span>
<span class="pln"> query </span>
<span class="pun">=</span> <span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">boolQuery</span>
<span class="pun">();</span>
<span class="com">//根据名称查询</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">keyword</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">wildcardQuery</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">,</span> <span class="str">"*"</span> <span class="pun">+</span>
<span class="pln"> keyword </span>
<span class="pun">+</span> <span class="str">"*"</span>
<span class="pun">));</span>
<span class="pun">}</span>
<span class="com">//截止时间大于等于现在</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">).</span>
<span class="pln">gte</span>
<span class="pun">(</span>
<span class="typ">Times</span>
<span class="pun">.</span>
<span class="pln">format</span>
<span class="pun">(</span>
<span class="str">"yyyyMMddHHmmss"</span>
<span class="pun">,</span> <span class="kwd">new</span> <span class="typ">Date</span>
<span class="pun">())));</span>
<span class="com">//公共日期起</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">startDate</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">gte</span>
<span class="pun">(</span>
<span class="pln">startDate</span>
<span class="pun">.</span>
<span class="pln">replaceAll</span>
<span class="pun">(</span>
<span class="str">"-"</span>
<span class="pun">,</span>
<span class="str">""</span>
<span class="pun">)));</span>
<span class="pun">}</span>
<span class="com">//公共日期至</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">endDate</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">lte</span>
<span class="pun">(</span>
<span class="pln">endDate</span>
<span class="pun">.</span>
<span class="pln">replaceAll</span>
<span class="pun">(</span>
<span class="str">"-"</span>
<span class="pun">,</span>
<span class="str">""</span>
<span class="pun">)));</span>
<span class="pun">}</span>
<span class="com">//几个状态条件</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"BUYER_STS"</span>
<span class="pun">,</span> <span class="str">"N"</span>
<span class="pun">));</span>
<span class="com">//采购商状态</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"STS"</span>
<span class="pun">,</span> <span class="str">"A"</span>
<span class="pun">));</span>
<span class="com">//状态</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"ANNOMK"</span>
<span class="pun">,</span> <span class="str">"Y"</span>
<span class="pun">));</span>
<span class="com">//公告註記</span>
<span class="typ">SearchRequestBuilder</span>
<span class="pln"> srb </span>
<span class="pun">=</span>
<span class="pln"> esService</span>
<span class="pun">.</span>
<span class="pln">getClient</span>
<span class="pun">().</span>
<span class="pln">prepareSearch</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">))</span>
<span class="pun">.</span>
<span class="pln">setSearchType</span>
<span class="pun">(</span>
<span class="typ">SearchType</span>
<span class="pun">.</span>
<span class="pln">DFS_QUERY_THEN_FETCH</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">setTypes</span>
<span class="pun">(</span>
<span class="str">"inquiry"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">setQuery</span>
<span class="pun">(</span>
<span class="pln">query</span>
<span class="pun">)</span>
<span class="com">//分页</span>
<span class="pun">.</span>
<span class="pln">setFrom</span>
<span class="pun">((</span>
<span class="pln">pageNumber </span>
<span class="pun">-</span> <span class="lit">1</span>
<span class="pun">)</span> <span class="pun">*</span>
<span class="pln"> pageSize</span>
<span class="pun">).</span>
<span class="pln">setSize</span>
<span class="pun">(</span>
<span class="pln">pageSize</span>
<span class="pun">)</span>
<span class="com">//是否按匹配度排序</span>
<span class="pun">.</span>
<span class="pln">setExplain</span>
<span class="pun">(</span>
<span class="pln">explain</span>
<span class="pun">);</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="pln">highlight</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="typ">HighlightBuilder</span>
<span class="pln"> highlightBuilder </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">HighlightBuilder</span>
<span class="pun">().</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"*"</span>
<span class="pun">).</span>
<span class="pln">requireFieldMatch</span>
<span class="pun">(</span>
<span class="kwd">false</span>
<span class="pun">);</span>
<span class="pln">
highlightBuilder</span>
<span class="pun">.</span>
<span class="pln">preTags</span>
<span class="pun">(</span>
<span class="str">"<span style=\"color:red\">"</span>
<span class="pun">);</span>
<span class="pln">
highlightBuilder</span>
<span class="pun">.</span>
<span class="pln">postTags</span>
<span class="pun">(</span>
<span class="str">"</span>"</span>
<span class="pun">);</span>
<span class="pln">
srb</span>
<span class="pun">.</span>
<span class="pln">highlighter</span>
<span class="pun">(</span>
<span class="pln">highlightBuilder</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">sortName</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="typ">String</span>
<span class="pun">[]</span>
<span class="pln"> sortNames </span>
<span class="pun">=</span> <span class="typ">StringUtils</span>
<span class="pun">.</span>
<span class="pln">split</span>
<span class="pun">(</span>
<span class="pln">sortName</span>
<span class="pun">,</span> <span class="str">","</span>
<span class="pun">);</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="str">"asc"</span>
<span class="pun">.</span>
<span class="pln">equalsIgnoreCase</span>
<span class="pun">(</span>
<span class="pln">sortOrder</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> s </span>
<span class="pun">:</span>
<span class="pln"> sortNames</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
srb</span>
<span class="pun">.</span>
<span class="pln">addSort</span>
<span class="pun">(</span>
<span class="pln">s</span>
<span class="pun">,</span> <span class="typ">SortOrder</span>
<span class="pun">.</span>
<span class="pln">ASC</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
<span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> s </span>
<span class="pun">:</span>
<span class="pln"> sortNames</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
srb</span>
<span class="pun">.</span>
<span class="pln">addSort</span>
<span class="pun">(</span>
<span class="pln">s</span>
<span class="pun">,</span> <span class="typ">SortOrder</span>
<span class="pun">.</span>
<span class="pln">DESC</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="pun">}</span>
<span class="pun">}</span>
<span class="pln">
log</span>
<span class="pun">.</span>
<span class="pln">debug</span>
<span class="pun">(</span>
<span class="str">"srb:::\r\n"</span> <span class="pun">+</span>
<span class="pln"> srb</span>
<span class="pun">.</span>
<span class="pln">toString</span>
<span class="pun">());</span>
<span class="typ">SearchResponse</span>
<span class="pln"> response </span>
<span class="pun">=</span>
<span class="pln"> srb</span>
<span class="pun">.</span>
<span class="pln">execute</span>
<span class="pun">().</span>
<span class="pln">actionGet</span>
<span class="pun">();</span>
<span class="typ">SearchHits</span>
<span class="pln"> hits </span>
<span class="pun">=</span>
<span class="pln"> response</span>
<span class="pun">.</span>
<span class="pln">getHits</span>
<span class="pun">();</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setTotalCount</span>
<span class="pun">((</span>
<span class="kwd">int</span>
<span class="pun">)</span>
<span class="pln"> hits</span>
<span class="pun">.</span>
<span class="pln">getTotalHits</span>
<span class="pun">());</span>
<span class="typ">List</span>
<span class="pun"><</span>
<span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">Object</span>
<span class="pun">>></span>
<span class="pln"> list </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">ArrayList</span>
<span class="pun"><>();</span>
<span class="pln">
hits</span>
<span class="pun">.</span>
<span class="pln">forEach</span>
<span class="pun">(</span>
<span class="pln">searchHit </span>
<span class="pun">-></span> <span class="pun">{</span>
<span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">Object</span>
<span class="pun">></span>
<span class="pln"> source </span>
<span class="pun">=</span>
<span class="pln"> searchHit</span>
<span class="pun">.</span>
<span class="pln">getSourceAsMap</span>
<span class="pun">();</span>
<span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">HighlightField</span>
<span class="pun">></span>
<span class="pln"> highlightFields </span>
<span class="pun">=</span>
<span class="pln"> searchHit</span>
<span class="pun">.</span>
<span class="pln">getHighlightFields</span>
<span class="pun">();</span>
<span class="com">//name高亮</span>
<span class="typ">HighlightField</span>
<span class="pln"> nameField </span>
<span class="pun">=</span>
<span class="pln"> highlightFields</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">);</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="pln">nameField </span>
<span class="pun">!=</span> <span class="kwd">null</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="typ">Text</span>
<span class="pun">[]</span>
<span class="pln"> fragments </span>
<span class="pun">=</span>
<span class="pln"> nameField</span>
<span class="pun">.</span>
<span class="pln">fragments</span>
<span class="pun">();</span>
<span class="typ">String</span>
<span class="pln"> tmp </span>
<span class="pun">=</span> <span class="str">""</span>
<span class="pun">;</span>
<span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">Text</span>
<span class="pln"> text </span>
<span class="pun">:</span>
<span class="pln"> fragments</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
tmp </span>
<span class="pun">+=</span>
<span class="pln"> text</span>
<span class="pun">;</span>
<span class="pun">}</span>
<span class="pln">
source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">,</span>
<span class="pln"> tmp</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="pln">
source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">,</span> <span class="typ">YcDateUtil</span>
<span class="pun">.</span>
<span class="pln">get_yyyyMMdd_HHmm</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">))));</span>
<span class="pln">
source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">,</span> <span class="typ">YcDateUtil</span>
<span class="pun">.</span>
<span class="pln">get_yyyyMMdd</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">))));</span>
<span class="pln">
list</span>
<span class="pun">.</span>
<span class="pln">add</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">);</span>
<span class="pun">});</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setList</span>
<span class="pun">(</span>
<span class="pln">list</span>
<span class="pun">);</span>
<span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span>
<span class="typ">Exception</span>
<span class="pln"> e</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
e</span>
<span class="pun">.</span>
<span class="pln">printStackTrace</span>
<span class="pun">();</span>
<span class="pun">}</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">binds</span>
<span class="pun">(</span>
<span class="pln">page</span>
<span class="pun">);</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">doBodyRender</span>
<span class="pun">();</span>
<span class="pun">}</span>
<span class="pun">}</span>
前台beetl页面:
<span class="pln"> <#ycold_inquiry_list pageNumber="${pageNumber}" pageSize="${pageSize}" startDate="${startDate}" endDate="${endDate}" keyword="${keyword}" sortName="ANNODAT" sortOrder="desc" highlight="false" var="p">
</span>
<span class="tag"><table</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"list_table_blue even_table"</span>
<span class="tag">></span>
<span class="tag"><thead></span>
<span class="tag"><tr></span>
<span class="tag"><th></span>
<span class="pln">公告日期</span>
<span class="tag"></th></span>
<span class="tag"><th></span>
<span class="pln">案件名称</span>
<span class="tag"></th></span>
<span class="tag"><th></span>
<span class="pln">交货地点</span>
<span class="tag"></th></span>
<span class="tag"><th></span>
<span class="pln">报价截止日期</span>
<span class="tag"></th></span>
<span class="tag"><th</span> <span class="atn">width</span>
<span class="pun">=</span>
<span class="atv">"110"</span>
<span class="tag">></span>
<span class="pln">查看详细</span>
<span class="tag"></th></span>
<span class="tag"></tr></span>
<span class="tag"></thead></span>
<span class="tag"><tbody></span>
<span class="pun"><%</span>
<span class="kwd">for</span>
<span class="pun">(</span>
<span class="pln">o </span>
<span class="kwd">in</span>
<span class="pln"> p</span>
<span class="pun">.</span>
<span class="pln">list</span>
<span class="pun">){</span>
<span class="pln">%>
</span>
<span class="tag"><tr></span>
<span class="tag"><td></span>
<span class="pln">${o.ANNODAT!}</span>
<span class="tag"></td></span>
<span class="tag"><td</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"l_text"</span>
<span class="tag">><a</span> <span class="atn">href</span>
<span class="pun">=</span>
<span class="atv">"${base!}/purchase/info/${o.XUID!}"</span> <span class="atn">target</span>
<span class="pun">=</span>
<span class="atv">"_blank"</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"td_a hide1"</span>
<span class="tag">></span>
<span class="pln">${o.CASNM!}</span>
<span class="tag"></a></span>
<span class="tag"></td></span>
<span class="tag"><td</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"l_text"</span>
<span class="tag">></span>
<span class="pln">${o.DLSITE!}</span>
<span class="tag"></td></span>
<span class="tag"><td></span>
<span class="pln">${o.IQDAT!}</span>
<span class="tag"></td></span>
<span class="tag"><td><a</span> <span class="atn">href</span>
<span class="pun">=</span>
<span class="atv">"${base!}/purchase/info/${o.XUID!}"</span> <span class="atn">target</span>
<span class="pun">=</span>
<span class="atv">"_blank"</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"more_a png"</span>
<span class="tag">></a></td></span>
<span class="tag"></tr></span>
<span class="pun"><%}</span>
<span class="pln">%>
</span>
<span class="tag"></tbody></span>
<span class="tag"></table></span>
<span class="pun"><%</span>
<span class="kwd">if</span>
<span class="pun">(</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalCount</span>
<span class="pun">></span>
<span class="lit">1</span>
<span class="pun">){</span>
<span class="pln">%>
</span>
<span class="tag"><div</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"page round_s_a"</span>
<span class="tag">></div></span>
<span class="tag"><script</span> <span class="atn">type</span>
<span class="pun">=</span>
<span class="atv">"text/javascript"</span>
<span class="tag">></span>
<span class="pln">
$</span>
<span class="pun">(</span>
<span class="kwd">function</span> <span class="pun">()</span> <span class="pun">{</span>
<span class="pln">
$</span>
<span class="pun">(</span>
<span class="str">".page"</span>
<span class="pun">).</span>
<span class="pln">createPage</span>
<span class="pun">({</span>
<span class="pln">
pageCount</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalPage</span>
<span class="pun">},</span>
<span class="pln">
totalCount</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalCount</span>
<span class="pun">},</span>
<span class="pln">
current</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">pageNo</span>
<span class="pun">},</span>
<span class="pln">
backFn</span>
<span class="pun">:</span> <span class="kwd">function</span> <span class="pun">(</span>
<span class="pln">p</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
window</span>
<span class="pun">.</span>
<span class="pln">location</span>
<span class="pun">.</span>
<span class="pln">href </span>
<span class="pun">=</span> <span class="str">"?page="</span> <span class="pun">+</span>
<span class="pln"> p </span>
<span class="pun">+</span> <span class="str">"&size=${p.pageSize}"</span>
<span class="pun">;</span>
<span class="pun">}</span>
<span class="pun">});</span>
<span class="pun">});</span>
<span class="tag"></script></span>
<span class="pun"><%}</span>
<span class="pln">%></span>
20181 月21
<span class="kwd">if</span> <span class="pun">(!</span>
<span class="pln">esService</span>
<span class="pun">.</span>
<span class="pln">isExistsType</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">),</span>
<span class="pln"> type</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="com">//初始化索引表</span>
<span class="typ">XContentBuilder</span>
<span class="pln"> mapping </span>
<span class="pun">=</span>
<span class="pln"> jsonBuilder</span>
<span class="pun">().</span>
<span class="pln">startObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="pln">type</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"_all"</span>
<span class="pun">)</span>
<span class="com">//设置IK分词</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"search_analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"term_vector"</span>
<span class="pun">,</span> <span class="str">"no"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"store"</span>
<span class="pun">,</span> <span class="str">"false"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"properties"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"index"</span>
<span class="pun">,</span> <span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"fielddata"</span>
<span class="pun">,</span>
<span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"index"</span>
<span class="pun">,</span> <span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"fielddata"</span>
<span class="pun">,</span>
<span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">();</span>
<span class="pln">
esService</span>
<span class="pun">.</span>
<span class="pln">putMapping</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">),</span> <span class="str">"inquiry"</span>
<span class="pun">,</span>
<span class="pln"> mapping</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="com">/**
* @param indexName 索引名
* @param type 数据类型(表名)
* @param mapping mapping对象
*/</span>
<span class="kwd">public</span> <span class="kwd">boolean</span>
<span class="pln"> putMapping</span>
<span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> indexName</span>
<span class="pun">,</span> <span class="typ">String</span>
<span class="pln"> type</span>
<span class="pun">,</span> <span class="typ">XContentBuilder</span>
<span class="pln"> mapping</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="typ">PutMappingRequest</span>
<span class="pln"> mappingRequest </span>
<span class="pun">=</span> <span class="typ">Requests</span>
<span class="pun">.</span>
<span class="pln">putMappingRequest</span>
<span class="pun">(</span>
<span class="pln">indexName</span>
<span class="pun">).</span>
<span class="pln">type</span>
<span class="pun">(</span>
<span class="pln">type</span>
<span class="pun">).</span>
<span class="pln">source</span>
<span class="pun">(</span>
<span class="pln">mapping</span>
<span class="pun">);</span>
<span class="typ">PutMappingResponse</span>
<span class="pln"> response </span>
<span class="pun">=</span>
<span class="pln"> getClient</span>
<span class="pun">().</span>
<span class="pln">admin</span>
<span class="pun">().</span>
<span class="pln">indices</span>
<span class="pun">().</span>
<span class="pln">putMapping</span>
<span class="pun">(</span>
<span class="pln">mappingRequest</span>
<span class="pun">).</span>
<span class="pln">actionGet</span>
<span class="pun">();</span>
<span class="kwd">return</span>
<span class="pln"> response</span>
<span class="pun">.</span>
<span class="pln">isAcknowledged</span>
<span class="pun">();</span>
<span class="pun">}</span>
.field(“fielddata”,”true”) //text字段默认不允许排序,是单独设置数据格式
20173 月23
1、wx_config 实体类添加三个字段,对应的表结构也要手动修改:
@Column
@Comment("access_token")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String access_token;
@Column
@Comment("access_token_expires")
@ColDefine(type = ColType.INT)
private Integer access_token_expires;
@Column
@Comment("access_token_lastat")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String access_token_lastat;
get set ...方法生成出来
2、nutzwx版本升级为1.r.61-SNAPSHOT
org.nutz
nutzwx
1.r.61-SNAPSHOT
3、nutz版本升级为1.r.60
org.nutz
nutz
1.r.60
4、WxConfigService 类getWxApi2替换为如下代码(主要是DaoAccessTokenStore从数据库取access_token)
public WxApi2 getWxApi2(String wxid) {
Wx_config appInfo = this.fetch(Cnd.where("id", "=", wxid));
DaoAccessTokenStore myDaoAccessTokenStore = new DaoAccessTokenStore(dao());
Map params = new HashMap();
params.put("id", appInfo.getId());
myDaoAccessTokenStore.setTableAccessToken("access_token");
myDaoAccessTokenStore.setTableAccessTokenExpires("access_token_expires");
myDaoAccessTokenStore.setTableAccessTokenLastat("access_token_lastat");
myDaoAccessTokenStore.setFetch("select access_token,access_token_expires,access_token_lastat from wx_config where id=@id");
myDaoAccessTokenStore.setUpdate("update wx_config set access_token=@access_token, access_token_expires=@access_token_expires, access_token_lastat=@access_token_lastat where id=@id");
myDaoAccessTokenStore.setParams(params);
WxApi2Impl wxApi2 = new WxApi2Impl();
wxApi2.setAppid(appInfo.getAppid());
wxApi2.setAppsecret(appInfo.getAppsecret());
wxApi2.setEncodingAesKey(appInfo.getEncodingAESKey());
wxApi2.setToken(appInfo.getToken());
wxApi2.setAccessTokenStore(myDaoAccessTokenStore);
return wxApi2;
}
201612 月8
Cnd cnd = Cnd.NEW();
if (!Strings.isBlank(src)) {
cnd.and("srcFrom", "=", src);
}
if (!Strings.isBlank(name)) {
String[] n = StringUtils.split(name, " ");
SqlExpressionGroup group = new SqlExpressionGroup();
for (String s : n) {
SqlExpression sqlExpression = Cnd.exp("srcName", "like", "%" + s + "%");
group.or(sqlExpression);
}
cnd.and(group);
}
cnd.and(Cnd.exps("productSku", "=", "").or("productSku", "is", null));
201610 月20
Shop_goods_type obj = shopGoodsTypeService.fetch(id);
shopGoodsTypeService.fetchLinks(obj, null, Cnd.orderBy().asc("location"));
for (Shop_goods_type_props o : obj.getPropsList()) {
shopGoodsTypeService.dao().fetchLinks(o, null, Cnd.orderBy().asc("location"));
}
20156 月11
pom.xml
org.apache.cxf
cxf-api
2.7.15
org.apache.cxf
cxf-rt-frontend-jaxws
2.7.15
org.apache.cxf
cxf-rt-bindings-soap
2.7.15
org.apache.cxf
cxf-rt-transports-http
2.7.15
org.apache.cxf
cxf-rt-ws-security
2.7.15
org.springframework
spring-web
4.1.5.RELEASE
web.xml
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
1
CXFServlet
/webservice/*
cxf-servlet.xml
接口类
WorkflowService.java
package com.auto.webservice.server;
import org.nutz.json.Json;
import javax.jws.WebService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by wizzer on 15-4-13.
*/
@WebService(targetNamespace = "http://server.webservice.auto.com/", name = "workflowServicePortType")
public interface WorkflowService {
@WebResult(name = "return")
@Action(input = "urn:start", output = "urn:startResponse")
@RequestWrapper(localName = "start")
@WebMethod(action = "urn:start")
@ResponseWrapper(localName = "startResponse")
String start(@WebParam(name = "flowKey") String flowKey, @WebParam(name = "userId") String userId);//启动流程
}
实现类
WorkflowServiceImpl.java
package com.auto.webservice.server;
import org.activiti.engine.*;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.form.StartFormData;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.json.JsonFormat;
import org.nutz.lang.Strings;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.Mvcs;
import javax.jws.WebService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by wizzer on 15-4-13.
*/
@IocBean(name = "workflowService")
@WebService
public class WorkflowServiceImpl implements WorkflowService {
private final Log log = Logs.get();
FormService formService=Mvcs.ctx().getDefaultIoc().get(FormService.class);
IdentityService identityService=Mvcs.ctx().getDefaultIoc().get(IdentityService.class);
RuntimeService runtimeService=Mvcs.ctx().getDefaultIoc().get(RuntimeService.class);
TaskService taskService=Mvcs.ctx().getDefaultIoc().get(TaskService.class);
RepositoryService repositoryService=Mvcs.ctx().getDefaultIoc().get(RepositoryService.class);
/**
* 启动一个流程
*
* @param flowKey 流程模型key
* @param userId 用户ID
* @return
*/
public String start(String flowKey, String userId) {
Map map = new HashMap();
try {
if (!Strings.isEmpty(userId)) {
identityService.setAuthenticatedUserId(userId);
}
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(flowKey);
map.put("errcode", 0);
map.put("errmsg", "");
map.put("processInstanceId", processInstance.getId());
} catch (Exception e) {
log.error("WebServcice启动流程出错", e);
map.put("errcode", 1);
map.put("errmsg", e.getMessage());
} finally {
identityService.setAuthenticatedUserId(null);
}
return Json.toJson(map, JsonFormat.compact());
}
}
/**
* IP地址拦截器
*
* @author Sunshine
*/
public class IpAddressInInterceptor extends AbstractPhaseInterceptor {
private final Log log = Logs.get();
public IpAddressInInterceptor() {
super(Phase.RECEIVE);
}
public void handleMessage(Message message) throws Fault {
HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
//获取所有的白名单访问主机
UserInfoServiceImpl userInfoService = Mvcs.ctx().getDefaultIoc().get(UserInfoServiceImpl.class);
List hostList = userInfoService.queryHostListByType("w");
// 取客户端IP地址
String ipAddress = request.getRemoteAddr();
// 如果允许访问的集合非空,继续处理,否则认为全部IP地址均合法
if (!hostList.isEmpty()) {
boolean contains = false;
for (ListInfo hostInfo : hostList) {
log.debug("hostInfo:" + hostInfo.getIpaddress() + "|ipAddress:" + ipAddress);
if (hostInfo.getIpaddress().equals(ipAddress)) {
contains = true;
break;
}
}
if (!contains) {
throw new Fault(new IllegalAccessException("IP address " + ipAddress + " is not allowed"));
}
}
}
}
20155 月18
@At
public String test5(@Param("taskId") String taskId) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task == null)
return "null";
ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(task.getProcessDefinitionId());
List activitiList = def.getActivities();
System.out.println("getTaskDefinitionKey:::" + task.getTaskDefinitionKey());
NutMap map = new NutMap();
int type = 0;
getTaskActivitys(task.getTaskDefinitionKey(), activitiList, type, map);
return Json.toJson(map);
}
public static List getTaskActivitys(String activityId, List activityList, int type, NutMap map) {
List activitiyIds = new ArrayList();
for (ActivityImpl activityImpl : activityList) {
String id = activityImpl.getId();
if (activityId.equals(id)) {
List outgoingTransitions = activityImpl.getOutgoingTransitions();//获取某节点所有线路
List list = new ArrayList();
for (PvmTransition tr : outgoingTransitions) {
NutMap map1 = new NutMap();
PvmActivity ac = tr.getDestination();//获取线路的终点节点
if (ac.getProperty("type").equals("userTask")) {
map.setv("type", type++);
map1.setv("id", ac.getId());
map1.setv("name", ac.getProperty("name"));
String conditionText=Strings.sNull(tr.getProperty("conditionText"));
if(!Strings.isEmpty(conditionText)){
map1.setv("conditionText",conditionText );
}
list.add(map1);
} else if (ac.getProperty("type").equals("exclusiveGateway")) {
getTaskActivitys(ac.getId(), activityList, type, map);
} else {
map.setv("type", type++);
break;
}
}
if (list.size() > 0)
map.addv("list", list);
break;
}
}
return activitiyIds;
}
20155 月12
通过配置文件实现(这个支持CXF spring注解)点这里
pom.xml
org.apache.cxf
cxf-api
2.7.15
org.apache.cxf
cxf-rt-frontend-jaxws
2.7.15
org.apache.cxf
cxf-rt-bindings-soap
2.7.15
org.apache.cxf
cxf-rt-transports-http
2.7.15
org.apache.cxf
cxf-rt-ws-security
2.7.15
web.xml
CXFServlet
com.auto.webservice.servlet.CXFServlet
1
CXFServlet
/webservice/*
CXFServlet.java:
package com.auto.webservice.servlet;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
import org.nutz.ioc.Ioc;
import org.nutz.lang.Strings;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.Mvcs;
import javax.jws.WebService;
import javax.servlet.ServletConfig;
import javax.xml.namespace.QName;
/**
* Created by wizzer on 15-4-10.
*/
@SuppressWarnings("serial")
public class CXFServlet extends CXFNonSpringServlet {
private final Log log = Logs.get();
@Override
protected void loadBus(ServletConfig sc) {
super.loadBus(sc);
//全局配置
Bus bus = getBus();
//添加白名单过滤器
bus.getInInterceptors().add(new IpAddressInInterceptor());
//使用全局配置
BusFactory.setDefaultBus(bus);
Ioc ioc = Mvcs.ctx().getDefaultIoc();
for (String name : ioc.getNames()) {
try {
Object obj = ioc.get(null, name);
if (!obj.getClass().getPackage().getName().equals("com.auto.webservice.server")) {
continue;
}
if (obj.getClass().getAnnotation(WebService.class) == null)
continue;
Class face = Class.forName(obj.getClass().getPackage().getName() + "." + Strings.upperFirst(name));
ServerFactoryBean serverFactoryBean = new ServerFactoryBean();
// 设置服务接口类
serverFactoryBean.setServiceClass(face);
// 服务请求路径
serverFactoryBean.setAddress("/" + name.substring(0, name.indexOf("Service")));
// 设置服务实现类
serverFactoryBean.setServiceBean(obj);
serverFactoryBean.setBindingId("http://schemas.xmlsoap.org/wsdl/soap12/");
serverFactoryBean.create();
} catch (Throwable e) {
}
}
}
}
接口类
WorkflowService.java
package com.auto.webservice.server;
import org.nutz.json.Json;
import javax.jws.WebService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by wizzer on 15-4-13.
*/
@WebService
public interface WorkflowService {
String start(String flowKey, String userId);//启动流程
}
实现类
WorkflowServiceImpl.java
package com.auto.webservice.server;
import org.activiti.engine.*;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.form.StartFormData;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.json.JsonFormat;
import org.nutz.lang.Strings;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.Mvcs;
import javax.jws.WebService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by wizzer on 15-4-13.
*/
@IocBean(name = "workflowService")
@WebService
public class WorkflowServiceImpl implements WorkflowService {
private final Log log = Logs.get();
@Inject
Dao dao;
@Inject
FormService formService;
@Inject
IdentityService identityService;
@Inject
RepositoryService repositoryService;
@Inject
RuntimeService runtimeService;
@Inject
TaskService taskService;
/**
* 启动一个流程
*
* @param flowKey 流程模型key
* @param userId 用户ID
* @return
*/
public String start(String flowKey, String userId) {
Map map = new HashMap();
try {
if (!Strings.isEmpty(userId)) {
identityService.setAuthenticatedUserId(userId);
}
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(flowKey);
map.put("errcode", 0);
map.put("errmsg", "");
map.put("processInstanceId", processInstance.getId());
} catch (Exception e) {
log.error("WebServcice启动流程出错", e);
map.put("errcode", 1);
map.put("errmsg", e.getMessage());
} finally {
identityService.setAuthenticatedUserId(null);
}
return Json.toJson(map, JsonFormat.compact());
}
}
20155 月7
在nutz filter作用域内才能Mvcs.getIoc()
其他情况:
Mvcs.ctx().getDefaultIoc().get(xxx.class)
20154 月27
首先值得一提的是,taskService.createTaskQuery().taskCandidateOrAssigned(userId) 方法有bug,不会调用重写的工厂类,请使用taskService.createTaskQuery().taskCandidateUser(userId)方法。
CustomGroupEntityManager
/**
* 分组工厂类
* Created by wizzer on 15-4-27.
*/
@IocBean
public class CustomGroupEntityManager extends GroupEntityManager {
Dao dao= Mvcs.getIoc().get(Dao.class);
private final Log log = Logs.get();
@Override
public List findGroupsByUser(String userId) {
Sql sql = Sqls.create("SELECT a.* FROM sys_role a,sys_user_role b WHERE a.id=b.roleid AND b.userid=@c");
sql.params().set("c", userId);
sql.setCallback(Sqls.callback.maps());
dao.execute(sql);
List
CustomGroupEntityManagerFactory
/**
* 分组接口类
* Created by wizzer on 15-4-27.
*/
@IocBean
public class CustomGroupEntityManagerFactory implements SessionFactory {
private GroupEntityManager groupEntityManager;
public void setGroupEntityManager(GroupEntityManager groupEntityManager) {
this.groupEntityManager = groupEntityManager;
}
@Override
public Class getSessionType() {
return GroupIdentityManager.class;
}
@Override
public Session openSession() {
return groupEntityManager;
}
}
CustomUserEntityManager
/**
* 用户工厂类
* Created by wizzer on 15-4-24.
*/
@IocBean
public class CustomUserEntityManager extends UserEntityManager {
Dao dao= Mvcs.getIoc().get(Dao.class);
private final Log log = Logs.get();
@Override
public User findUserById(String userId) {
log.info("findUserById:::::::::::::::::::::::::::::::"+userId);
UserEntity userEntity = new UserEntity();
Sys_user sysUser = dao.fetch(Sys_user.class, Cnd.where("uid", "=", userId));
userEntity.setId(userId);
userEntity.setFirstName(sysUser.getRealname());
userEntity.setEmail(sysUser.getEmail());
userEntity.setRevision(1);
return userEntity;
}
@Override
public List findGroupsByUser(String userId) {
// TODO Auto-generated method stub
log.info("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
Sql sql = Sqls.create("SELECT a.* FROM sys_role a,sys_user_role b WHERE a.id=b.roleid AND b.userid=@c");
sql.params().set("c", userId);
sql.setCallback(Sqls.callback.maps());
dao.execute(sql);
List
CustomUserEntityManagerFactory
/**
* 用户接口类
* Created by wizzer on 15-4-24.
*/
@IocBean
public class CustomUserEntityManagerFactory implements SessionFactory {
private UserEntityManager userEntityManager;
public void setUserEntityManager(UserEntityManager userEntityManager) {
this.userEntityManager = userEntityManager;
}
@Override
public Class getSessionType() {
return UserIdentityManager.class;
}
@Override
public Session openSession() {
return userEntityManager;
}
}
在初始化activiti时追加代码:
List list=new ArrayList();
CustomGroupEntityManagerFactory customGroupManagerFactory=new CustomGroupEntityManagerFactory();
customGroupManagerFactory.setGroupEntityManager(new CustomGroupEntityManager());
CustomUserEntityManagerFactory customUserEntityManagerFactory=new CustomUserEntityManagerFactory();
customUserEntityManagerFactory.setUserEntityManager(new CustomUserEntityManager());
list.add(customGroupManagerFactory);
list.add(customUserEntityManagerFactory);
processEngineConfiguration.setCustomSessionFactories(list);
20154 月27
@SetupBy(value=StartSetup.class)
public class MainModule {
}
private void activitiInit(NutConfig config) {
log.info("Activiti Init Start...");
ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration();
processEngineConfiguration.setDataSource(config.getIoc().get(DataSource.class));
processEngineConfiguration.setDatabaseSchemaUpdate("false");
processEngineConfiguration.setJobExecutorActivate(false);
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
processEngineConfiguration.setXmlEncoding("utf-8");
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
((Ioc2) config.getIoc()).getIocContext().save("app", "processEngine", new ObjectProxy(processEngine));
((Ioc2) config.getIoc()).getIocContext().save("app", "repositoryService", new ObjectProxy(processEngine.getProcessEngineConfiguration().getRepositoryService()));
((Ioc2) config.getIoc()).getIocContext().save("app", "runtimeService", new ObjectProxy(processEngine.getProcessEngineConfiguration().getRuntimeService()));
((Ioc2) config.getIoc()).getIocContext().save("app", "taskService", new ObjectProxy(processEngine.getProcessEngineConfiguration().getTaskService()));
((Ioc2) config.getIoc()).getIocContext().save("app", "formService", new ObjectProxy(processEngine.getProcessEngineConfiguration().getFormService()));
((Ioc2) config.getIoc()).getIocContext().save("app", "historyService", new ObjectProxy(processEngine.getProcessEngineConfiguration().getHistoryService()));
((Ioc2) config.getIoc()).getIocContext().save("app", "managementService", new ObjectProxy(processEngine.getProcessEngineConfiguration().getManagementService()));
((Ioc2) config.getIoc()).getIocContext().save("app", "identityService", new ObjectProxy(processEngine.getProcessEngineConfiguration().getIdentityService()));
log.info("Activiti Init End.");
}
20154 月24
public String getTemplateStr(String template, Map para) {
StringWriter writer = new StringWriter();
try {
RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices();
StringReader reader = new StringReader(template);
SimpleNode node = runtimeServices.parse(reader, "Template name");
Template t = new Template();
t.setRuntimeServices(runtimeServices);
t.setData(node);
t.initDocument();
VelocityContext context = new VelocityContext();
if (para.size() > 0) {
for (String key : para.keySet()) {
context.put(key, para.get(key));
}
}
t.merge(context, writer);
} catch (Exception e) {
throw new RuntimeException("Error commiting transaction! cause:"+ e.getMessage());
}
return writer.toString();
}
@At("/form")
@Ok("vm:template.private.test")
public void form(HttpServletRequest req, HttpServletResponse resp) {
Map formParams = new HashMap();
formParams.put("formKey", "form/waizhibiaodan/01/01.form");
int timeout = 60 * 1000;
String str = Http.post("http://127.0.0.1/test/getFormKey", formParams, timeout);
NutMap map = Json.fromJson(NutMap.class, str);
String formData = map.getString("data");
Map params = new HashMap();
params.put("startDate", "2015-04-21");
params.put("endDate", "2015-04-25");
req.setAttribute("formData", getTemplateStr(formData, params));
}
20154 月21
mvn package -Dmaven.test.skip=true