Commit bd1fd5fe12abfc8db192585feb623c7f38f077fd

Authored by ljq
1 parent 865aac0b

嘉定升级修改

Showing 31 changed files with 2664 additions and 265 deletions
src/main/java/com/bsth/WebAppConfiguration.java
1 package com.bsth; 1 package com.bsth;
2 2
3 import com.bsth.filter.ResourceFilter; 3 import com.bsth.filter.ResourceFilter;
  4 +import com.bsth.listener.UserLogoutSessionListener;
4 import com.bsth.websocket.WebSocketHandshakeInterceptor; 5 import com.bsth.websocket.WebSocketHandshakeInterceptor;
5 import com.bsth.websocket.handler.RealControlSocketHandler; 6 import com.bsth.websocket.handler.RealControlSocketHandler;
6 import org.slf4j.Logger; 7 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
8 import org.springframework.boot.context.embedded.FilterRegistrationBean; 9 import org.springframework.boot.context.embedded.FilterRegistrationBean;
  10 +import org.springframework.boot.context.embedded.ServletListenerRegistrationBean;
9 import org.springframework.context.annotation.Bean; 11 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.ComponentScan; 12 import org.springframework.context.annotation.ComponentScan;
11 import org.springframework.context.annotation.Configuration; 13 import org.springframework.context.annotation.Configuration;
@@ -76,4 +78,16 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS @@ -76,4 +78,16 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS
76 registry.addHandler(new RealControlSocketHandler(), "/sockjs/realcontrol","/freeLogin/sockjs/realcontrol").addInterceptors(new WebSocketHandshakeInterceptor()) 78 registry.addHandler(new RealControlSocketHandler(), "/sockjs/realcontrol","/freeLogin/sockjs/realcontrol").addInterceptors(new WebSocketHandshakeInterceptor())
77 .withSockJS(); 79 .withSockJS();
78 } 80 }
  81 + //--------------------- 配置listener ---------------------//
  82 + @Bean
  83 + public ServletListenerRegistrationBean<UserLogoutSessionListener> UserLogoutSessionListenerRegistrationBean() {
  84 + ServletListenerRegistrationBean<UserLogoutSessionListener> userLogoutSessionListenerRegistrationBean =
  85 + new ServletListenerRegistrationBean<>();
  86 + userLogoutSessionListenerRegistrationBean.setListener(userLogoutSessionListenerBean());
  87 + return userLogoutSessionListenerRegistrationBean;
  88 + }
  89 + @Bean
  90 + public UserLogoutSessionListener userLogoutSessionListenerBean() {
  91 + return new UserLogoutSessionListener();
  92 + }
79 } 93 }
src/main/java/com/bsth/controller/logger/UserSignController.java 0 → 100644
  1 +package com.bsth.controller.logger;
  2 +
  3 +
  4 +import com.bsth.controller.schedule.BController;
  5 +import com.bsth.entity.logger.UserSign;
  6 +import org.springframework.web.bind.annotation.RequestMapping;
  7 +import org.springframework.web.bind.annotation.RestController;
  8 +
  9 +@RestController
  10 +@RequestMapping("logger_user_sign")
  11 +public class UserSignController extends BController<UserSign, Long> {
  12 +
  13 +}
src/main/java/com/bsth/controller/sys/UserController.java
@@ -8,6 +8,7 @@ import com.bsth.controller.sys.util.RSAUtils; @@ -8,6 +8,7 @@ import com.bsth.controller.sys.util.RSAUtils;
8 import com.bsth.entity.sys.CompanyAuthority; 8 import com.bsth.entity.sys.CompanyAuthority;
9 import com.bsth.entity.sys.SysUser; 9 import com.bsth.entity.sys.SysUser;
10 import com.bsth.security.util.SecurityUtils; 10 import com.bsth.security.util.SecurityUtils;
  11 +import com.bsth.service.logger.UserSignService;
11 import com.bsth.service.sys.CompanyAuthorityService; 12 import com.bsth.service.sys.CompanyAuthorityService;
12 import com.bsth.service.sys.SysUserService; 13 import com.bsth.service.sys.SysUserService;
13 import com.google.common.collect.ArrayListMultimap; 14 import com.google.common.collect.ArrayListMultimap;
@@ -42,6 +43,9 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; { @@ -42,6 +43,9 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; {
42 @Autowired 43 @Autowired
43 CompanyAuthorityService companyAuthorityService; 44 CompanyAuthorityService companyAuthorityService;
44 45
  46 + @Autowired
  47 + UserSignService userLogInoutService;
  48 +
45 @RequestMapping(value = "/login/jCryptionKey") 49 @RequestMapping(value = "/login/jCryptionKey")
46 public Map<String, Object> jCryptionKey(HttpServletRequest request) { 50 public Map<String, Object> jCryptionKey(HttpServletRequest request) {
47 //公匙返回页面 51 //公匙返回页面
@@ -128,6 +132,9 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; { @@ -128,6 +132,9 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; {
128 132
129 captchaMap.remove(userName); 133 captchaMap.remove(userName);
130 rs.put("status", ResponseCode.SUCCESS); 134 rs.put("status", ResponseCode.SUCCESS);
  135 +
  136 + // 记录登录日志
  137 + userLogInoutService.userLogIn(user.getUserName(), session.getId(), new Date());
131 } catch (Exception e) { 138 } catch (Exception e) {
132 logger.error("", e); 139 logger.error("", e);
133 rs.put("msg", "服务器出现异常,请联系管理员"); 140 rs.put("msg", "服务器出现异常,请联系管理员");
src/main/java/com/bsth/entity/logger/UserSign.java 0 → 100644
  1 +package com.bsth.entity.logger;
  2 +
  3 +import javax.persistence.*;
  4 +import java.util.Date;
  5 +
  6 +/**
  7 + * 用户的登录登出日志。
  8 + */
  9 +@Entity
  10 +@Table(name = "logger_user_sign")
  11 +public class UserSign {
  12 + @Id
  13 + @GeneratedValue
  14 + private Long id;
  15 +
  16 + /** sessionId */
  17 + @Column(nullable = false, unique = true)
  18 + private String sessionId;
  19 +
  20 + /** 登录用户名 */
  21 + private String logName;
  22 + /** 实际用户名 */
  23 + private String realName;
  24 +
  25 + /** 登录时间(包含日期和具体时刻)*/
  26 + @Temporal(TemporalType.TIMESTAMP)
  27 + private Date logInDateTime;
  28 + /** 登录时间(只包含日期) */
  29 + @Temporal(TemporalType.DATE)
  30 + private Date logInDate;
  31 +
  32 + /** 登出时间(包含日期和具体时刻)*/
  33 + @Temporal(TemporalType.TIMESTAMP)
  34 + private Date logOutDateTime;
  35 + /** 登录时间(只包含日期) */
  36 + @Temporal(TemporalType.DATE)
  37 + private Date logOutDate;
  38 +
  39 + @Version
  40 + private int version;
  41 +
  42 + public Long getId() {
  43 + return id;
  44 + }
  45 +
  46 + public void setId(Long id) {
  47 + this.id = id;
  48 + }
  49 +
  50 + public String getSessionId() {
  51 + return sessionId;
  52 + }
  53 +
  54 + public void setSessionId(String sessionId) {
  55 + this.sessionId = sessionId;
  56 + }
  57 +
  58 + public String getLogName() {
  59 + return logName;
  60 + }
  61 +
  62 + public void setLogName(String logName) {
  63 + this.logName = logName;
  64 + }
  65 +
  66 + public String getRealName() {
  67 + return realName;
  68 + }
  69 +
  70 + public void setRealName(String realName) {
  71 + this.realName = realName;
  72 + }
  73 +
  74 + public Date getLogInDateTime() {
  75 + return logInDateTime;
  76 + }
  77 +
  78 + public void setLogInDateTime(Date logInDateTime) {
  79 + this.logInDateTime = logInDateTime;
  80 + }
  81 +
  82 + public Date getLogInDate() {
  83 + return logInDate;
  84 + }
  85 +
  86 + public void setLogInDate(Date logInDate) {
  87 + this.logInDate = logInDate;
  88 + }
  89 +
  90 + public Date getLogOutDateTime() {
  91 + return logOutDateTime;
  92 + }
  93 +
  94 + public void setLogOutDateTime(Date logOutDateTime) {
  95 + this.logOutDateTime = logOutDateTime;
  96 + }
  97 +
  98 + public Date getLogOutDate() {
  99 + return logOutDate;
  100 + }
  101 +
  102 + public void setLogOutDate(Date logOutDate) {
  103 + this.logOutDate = logOutDate;
  104 + }
  105 +
  106 + public int getVersion() {
  107 + return version;
  108 + }
  109 +
  110 + public void setVersion(int version) {
  111 + this.version = version;
  112 + }
  113 +}
src/main/java/com/bsth/listener/UserLogoutSessionListener.java 0 → 100644
  1 +package com.bsth.listener;
  2 +
  3 +import com.bsth.common.Constants;
  4 +import com.bsth.service.logger.UserSignService;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +
  7 +import javax.servlet.http.HttpSession;
  8 +import javax.servlet.http.HttpSessionEvent;
  9 +import javax.servlet.http.HttpSessionListener;
  10 +import java.util.Date;
  11 +
  12 +public class UserLogoutSessionListener implements HttpSessionListener {
  13 + @Autowired
  14 + private UserSignService userLogInoutService;
  15 +
  16 + @Override
  17 + public void sessionCreated(HttpSessionEvent se) {
  18 +
  19 + }
  20 +
  21 + @Override
  22 + public void sessionDestroyed(HttpSessionEvent se) {
  23 + HttpSession httpSession = se.getSession();
  24 + String userName = String.valueOf(httpSession.getAttribute(Constants.SESSION_USERNAME));
  25 + String sessionId = httpSession.getId();
  26 +
  27 + userLogInoutService.userLogOut(userName, sessionId, new Date());
  28 + }
  29 +}
src/main/java/com/bsth/repository/logger/UserSignRepository.java 0 → 100644
  1 +package com.bsth.repository.logger;
  2 +
  3 +import com.bsth.entity.logger.UserSign;
  4 +import com.bsth.repository.BaseRepository;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +@Repository
  8 +public interface UserSignRepository extends BaseRepository<UserSign, Long> {
  9 + UserSign findBySessionId(String sessionId);
  10 +}
src/main/java/com/bsth/service/logger/UserSignService.java 0 → 100644
  1 +package com.bsth.service.logger;
  2 +
  3 +import com.bsth.entity.logger.UserSign;
  4 +import com.bsth.service.schedule.BService;
  5 +
  6 +import java.util.Date;
  7 +
  8 +public interface UserSignService extends BService<UserSign, Long> {
  9 +
  10 + /**
  11 + * 用户登录日志。
  12 + * @param userName 登录用户名
  13 + * @param sessionId sessionId
  14 + * @param logInDate 登入时间
  15 + */
  16 + void userLogIn(String userName, String sessionId, Date logInDate);
  17 +
  18 + /**
  19 + * 用户登出日志。
  20 + * @param userName 登录用户名
  21 + * @param sessionId sessionId
  22 + * @param logOutDate 登出时间
  23 + */
  24 + void userLogOut(String userName, String sessionId, Date logOutDate);
  25 +}
src/main/java/com/bsth/service/logger/impl/UserSignDataToolsImpl.java 0 → 100644
  1 +package com.bsth.service.logger.impl;
  2 +
  3 +import com.bsth.service.schedule.exception.ScheduleException;
  4 +import com.bsth.service.schedule.utils.DataToolsFile;
  5 +import com.bsth.service.schedule.utils.DataToolsProperties;
  6 +import com.bsth.service.schedule.utils.DataToolsService;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Qualifier;
  11 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  12 +import org.springframework.stereotype.Service;
  13 +
  14 +import java.io.File;
  15 +import java.io.PrintWriter;
  16 +import java.io.StringWriter;
  17 +import java.util.HashMap;
  18 +import java.util.Map;
  19 +
  20 +@EnableConfigurationProperties(DataToolsProperties.class)
  21 +@Service(value = "usersign_dataTool")
  22 +public class UserSignDataToolsImpl implements DataToolsService {
  23 + /** 日志记录器 */
  24 + private final static Logger LOGGER = LoggerFactory.getLogger(UserSignDataToolsImpl.class);
  25 +
  26 + @Autowired
  27 + @Qualifier(value = "dataToolsServiceImpl")
  28 + private DataToolsService dataToolsService;
  29 +
  30 + @Autowired
  31 + private DataToolsProperties dataToolsProperties;
  32 +
  33 + @Override
  34 + public DataToolsFile uploadFile(String filename, byte[] filedata) throws ScheduleException {
  35 + throw new RuntimeException("不支持DataToolsFile!");
  36 + }
  37 +
  38 + @Override
  39 + public void importData(File file, Map<String, Object> params) throws ScheduleException {
  40 + throw new RuntimeException("不支持importData!");
  41 + }
  42 +
  43 + @Override
  44 + public DataToolsFile exportData(Map<String, Object> params) throws ScheduleException {
  45 + try {
  46 + LOGGER.info("//---------------- 导出用户登录日志 start... ----------------//");
  47 + // 创建ktr转换所需参数
  48 + Map<String, Object> ktrParms = new HashMap<>();
  49 + File ktrFile = new File(this.getClass().getResource(
  50 + dataToolsProperties.getUsersignDataoutputktr()).toURI());
  51 +
  52 + // 通用参数,转换文件路径,excel输出文件名
  53 + ktrParms.put("transpath", ktrFile.getAbsolutePath());
  54 + ktrParms.put("filename", "用户登录日志_download-");
  55 +
  56 + ktrParms.putAll(params);
  57 +
  58 + DataToolsFile file = dataToolsService.exportData(ktrParms);
  59 +
  60 + LOGGER.info("//---------------- 导出用户登录日志 success... ----------------//");
  61 +
  62 + return file;
  63 +
  64 + } catch (Exception exp) {
  65 + LOGGER.info("//---------------- 导出用户登录日志 failed... ----------------//");
  66 +
  67 + StringWriter sw = new StringWriter();
  68 + exp.printStackTrace(new PrintWriter(sw));
  69 + LOGGER.info(sw.toString());
  70 +
  71 + throw new ScheduleException(exp.getMessage());
  72 + }
  73 + }
  74 +
  75 +}
src/main/java/com/bsth/service/logger/impl/UserSignServiceImpl.java 0 → 100644
  1 +package com.bsth.service.logger.impl;
  2 +
  3 +import com.bsth.entity.logger.UserSign;
  4 +import com.bsth.entity.sys.SysUser;
  5 +import com.bsth.repository.logger.UserSignRepository;
  6 +import com.bsth.service.logger.UserSignService;
  7 +import com.bsth.service.schedule.exception.ScheduleException;
  8 +import com.bsth.service.schedule.impl.BServiceImpl;
  9 +import com.bsth.service.schedule.utils.DataToolsFile;
  10 + import com.bsth.service.schedule.utils.DataToolsService;
  11 +import com.bsth.service.sys.SysUserService;
  12 +import org.joda.time.DateTime;
  13 +import org.slf4j.Logger;
  14 +import org.slf4j.LoggerFactory;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.beans.factory.annotation.Qualifier;
  17 +import org.springframework.stereotype.Service;
  18 +import org.springframework.transaction.annotation.Isolation;
  19 +import org.springframework.transaction.annotation.Propagation;
  20 +import org.springframework.transaction.annotation.Transactional;
  21 +
  22 +import java.io.File;
  23 +import java.util.Date;
  24 +import java.util.List;
  25 +import java.util.Map;
  26 +
  27 +@Service
  28 +public class UserSignServiceImpl extends BServiceImpl<UserSign, Long> implements UserSignService {
  29 + /** 日志记录器 */
  30 + private final static Logger LOG = LoggerFactory.getLogger(UserSignServiceImpl.class);
  31 +
  32 + @Autowired
  33 + @Qualifier(value = "usersign_dataTool")
  34 + private DataToolsService dataToolsService;
  35 +
  36 + @Autowired
  37 + private UserSignRepository userLogInoutRepository;
  38 + @Autowired
  39 + private SysUserService sysUserService;
  40 +
  41 + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  42 + @Override
  43 + public void userLogIn(String userName, String sessionId, Date logInDate) {
  44 + try {
  45 + SysUser user = sysUserService.findByUserName(userName);
  46 + if (user == null) {
  47 + LOG.warn("用户{}不存在!", userName);
  48 + return;
  49 + }
  50 + if (!user.isEnabled()) {
  51 + LOG.warn("用户{}被锁定!", userName);
  52 + }
  53 +
  54 + // joda日期转换
  55 + DateTime _jodaDT = new DateTime(logInDate.getTime());
  56 +
  57 + UserSign userLogInout = new UserSign();
  58 + userLogInout.setLogName(userName);
  59 + userLogInout.setRealName(user.getName());
  60 + userLogInout.setSessionId(sessionId);
  61 + userLogInout.setLogInDate(_jodaDT.dayOfWeek().roundFloorCopy().toDate()); // 登录时间(不带时分秒)
  62 + userLogInout.setLogInDateTime(_jodaDT.toDate()); // 登录时间(带时分秒)
  63 +
  64 + userLogInoutRepository.save(userLogInout);
  65 +
  66 + } catch (Exception exp) {
  67 + LOG.error("用户登录日志异常!", exp);
  68 + }
  69 + }
  70 +
  71 + @Override
  72 + public void userLogOut(String userName, String sessionId, Date logOutDate) {
  73 + try {
  74 + SysUser user = sysUserService.findByUserName(userName);
  75 + if (user == null) {
  76 + LOG.warn("用户{}不存在!", userName);
  77 + return;
  78 + }
  79 + if (!user.isEnabled()) {
  80 + LOG.warn("用户{}被锁定!", userName);
  81 + }
  82 +
  83 + // 根据sessionId查找对应的登录日志
  84 + UserSign userLogInout = userLogInoutRepository.findBySessionId(sessionId);
  85 +
  86 + // joda日期转换
  87 + DateTime _jodaDT = new DateTime(logOutDate.getTime());
  88 +
  89 + if (userLogInout == null) { // 说明之前登录的操作没有记录日志
  90 + userLogInout = new UserSign();
  91 + userLogInout.setLogName(userName);
  92 + userLogInout.setRealName(user.getName());
  93 + userLogInout.setSessionId(sessionId);
  94 + userLogInout.setLogOutDate(_jodaDT.dayOfWeek().roundFloorCopy().toDate()); // 登出时间(不带时分秒)
  95 + userLogInout.setLogOutDateTime(_jodaDT.toDate()); // 登出时间(带时分秒)
  96 + } else {
  97 + userLogInout.setLogOutDate(_jodaDT.dayOfWeek().roundFloorCopy().toDate()); // 登出时间(不带时分秒)
  98 + userLogInout.setLogOutDateTime(_jodaDT.toDate()); // 登出时间(带时分秒)
  99 + }
  100 +
  101 + userLogInoutRepository.save(userLogInout);
  102 +
  103 + } catch (Exception exp) {
  104 + LOG.error("用户登出日志异常!", exp);
  105 + }
  106 + }
  107 +
  108 + @Override
  109 + public UserSign save(UserSign userLogInout) {
  110 + throw new RuntimeException("不支持save方法!");
  111 + }
  112 +
  113 + @Override
  114 + public <S extends UserSign> List<S> bulkSave(List<S> entities) {
  115 + throw new RuntimeException("不支持bulkSave方法!");
  116 + }
  117 +
  118 + @Override
  119 + public void delete(Long aLong) throws ScheduleException {
  120 + throw new RuntimeException("不支持delete方法!");
  121 + }
  122 +
  123 + @Override
  124 + public DataToolsFile uploadFile(String filename, byte[] filedata) throws ScheduleException {
  125 + throw new RuntimeException("不支持uploadFile方法!");
  126 + }
  127 +
  128 + @Override
  129 + public void importData(File file, Map<String, Object> params) throws ScheduleException {
  130 + throw new RuntimeException("不支持importData方法!");
  131 + }
  132 +
  133 + @Override
  134 + public DataToolsFile exportData(Map<String, Object> params) throws ScheduleException {
  135 + return dataToolsService.exportData(params);
  136 + }
  137 +}
src/main/java/com/bsth/service/schedule/utils/DataToolsProperties.java
@@ -115,6 +115,10 @@ public class DataToolsProperties { @@ -115,6 +115,10 @@ public class DataToolsProperties {
115 /** 路牌信息导出 */ 115 /** 路牌信息导出 */
116 private String guideboardsDataoutputktr; 116 private String guideboardsDataoutputktr;
117 117
  118 + @NotNull
  119 + /** 用户登录日志信息导出 */
  120 + private String usersignDataoutputktr;
  121 +
118 // TODO: 122 // TODO:
119 123
120 public String getFileuploadDir() { 124 public String getFileuploadDir() {
@@ -364,4 +368,11 @@ public class DataToolsProperties { @@ -364,4 +368,11 @@ public class DataToolsProperties {
364 public void setTtinfodetailDatainputktr2version2(String ttinfodetailDatainputktr2version2) { 368 public void setTtinfodetailDatainputktr2version2(String ttinfodetailDatainputktr2version2) {
365 this.ttinfodetailDatainputktr2version2 = ttinfodetailDatainputktr2version2; 369 this.ttinfodetailDatainputktr2version2 = ttinfodetailDatainputktr2version2;
366 } 370 }
  371 + public String getUsersignDataoutputktr() {
  372 + return usersignDataoutputktr;
  373 + }
  374 +
  375 + public void setUsersignDataoutputktr(String usersignDataoutputktr) {
  376 + this.usersignDataoutputktr = usersignDataoutputktr;
  377 + }
367 } 378 }
src/main/resources/datatools/config-dev.properties
@@ -76,7 +76,8 @@ datatools.employeesconfig_dataoutputktr=/datatools/ktrs/employeesConfigDataOutpu @@ -76,7 +76,8 @@ datatools.employeesconfig_dataoutputktr=/datatools/ktrs/employeesConfigDataOutpu
76 # 路牌信息导出 76 # 路牌信息导出
77 datatools.guideboards_dataoutputktr=/datatools/ktrs/guideboardDataOutput.ktr 77 datatools.guideboards_dataoutputktr=/datatools/ktrs/guideboardDataOutput.ktr
78 78
79 - 79 +# 用户登录日志导出
  80 +datatools.usersign_dataoutputktr=/datatools/ktrs/userSignLogOutput.ktr
80 # TODO: 81 # TODO:
81 82
82 83
src/main/resources/datatools/config-prod.properties
@@ -77,5 +77,6 @@ datatools.employeesconfig_dataoutputktr=/datatools/ktrs/employeesConfigDataOutpu @@ -77,5 +77,6 @@ datatools.employeesconfig_dataoutputktr=/datatools/ktrs/employeesConfigDataOutpu
77 # 路牌信息导出 77 # 路牌信息导出
78 datatools.guideboards_dataoutputktr=/datatools/ktrs/guideboardDataOutput.ktr 78 datatools.guideboards_dataoutputktr=/datatools/ktrs/guideboardDataOutput.ktr
79 79
80 - 80 +# 用户登录日志导出
  81 +datatools.usersign_dataoutputktr=/datatools/ktrs/userSignLogOutput.ktr
81 # TODO: 82 # TODO:
src/main/resources/datatools/ktrs/userSignLogOutput.ktr 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<transformation>
  3 + <info>
  4 + <name>&#x7528;&#x6237;&#x767b;&#x5f55;&#x65e5;&#x5fd7;&#x5bfc;&#x51fa;</name>
  5 + <description/>
  6 + <extended_description/>
  7 + <trans_version/>
  8 + <trans_type>Normal</trans_type>
  9 + <trans_status>0</trans_status>
  10 + <directory>&#x2f;</directory>
  11 + <parameters>
  12 + <parameter>
  13 + <name>QUERY</name>
  14 + <default_value/>
  15 + <description>&#x67e5;&#x8be2;</description>
  16 + </parameter>
  17 + <parameter>
  18 + <name>filepath</name>
  19 + <default_value>1&#x3d;1</default_value>
  20 + <description>excel&#x6587;&#x4ef6;&#x8def;&#x5f84;</description>
  21 + </parameter>
  22 + </parameters>
  23 + <log>
  24 +<trans-log-table><connection/>
  25 +<schema/>
  26 +<table/>
  27 +<size_limit_lines/>
  28 +<interval/>
  29 +<timeout_days/>
  30 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STATUS</id><enabled>Y</enabled><name>STATUS</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name><subject/></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name><subject/></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name><subject/></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name><subject/></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name><subject/></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name><subject/></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>STARTDATE</id><enabled>Y</enabled><name>STARTDATE</name></field><field><id>ENDDATE</id><enabled>Y</enabled><name>ENDDATE</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>DEPDATE</id><enabled>Y</enabled><name>DEPDATE</name></field><field><id>REPLAYDATE</id><enabled>Y</enabled><name>REPLAYDATE</name></field><field><id>LOG_FIELD</id><enabled>Y</enabled><name>LOG_FIELD</name></field><field><id>EXECUTING_SERVER</id><enabled>N</enabled><name>EXECUTING_SERVER</name></field><field><id>EXECUTING_USER</id><enabled>N</enabled><name>EXECUTING_USER</name></field><field><id>CLIENT</id><enabled>N</enabled><name>CLIENT</name></field></trans-log-table>
  31 +<perf-log-table><connection/>
  32 +<schema/>
  33 +<table/>
  34 +<interval/>
  35 +<timeout_days/>
  36 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>SEQ_NR</id><enabled>Y</enabled><name>SEQ_NR</name></field><field><id>LOGDATE</id><enabled>Y</enabled><name>LOGDATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>INPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>INPUT_BUFFER_ROWS</name></field><field><id>OUTPUT_BUFFER_ROWS</id><enabled>Y</enabled><name>OUTPUT_BUFFER_ROWS</name></field></perf-log-table>
  37 +<channel-log-table><connection/>
  38 +<schema/>
  39 +<table/>
  40 +<timeout_days/>
  41 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>LOGGING_OBJECT_TYPE</id><enabled>Y</enabled><name>LOGGING_OBJECT_TYPE</name></field><field><id>OBJECT_NAME</id><enabled>Y</enabled><name>OBJECT_NAME</name></field><field><id>OBJECT_COPY</id><enabled>Y</enabled><name>OBJECT_COPY</name></field><field><id>REPOSITORY_DIRECTORY</id><enabled>Y</enabled><name>REPOSITORY_DIRECTORY</name></field><field><id>FILENAME</id><enabled>Y</enabled><name>FILENAME</name></field><field><id>OBJECT_ID</id><enabled>Y</enabled><name>OBJECT_ID</name></field><field><id>OBJECT_REVISION</id><enabled>Y</enabled><name>OBJECT_REVISION</name></field><field><id>PARENT_CHANNEL_ID</id><enabled>Y</enabled><name>PARENT_CHANNEL_ID</name></field><field><id>ROOT_CHANNEL_ID</id><enabled>Y</enabled><name>ROOT_CHANNEL_ID</name></field></channel-log-table>
  42 +<step-log-table><connection/>
  43 +<schema/>
  44 +<table/>
  45 +<timeout_days/>
  46 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>TRANSNAME</id><enabled>Y</enabled><name>TRANSNAME</name></field><field><id>STEPNAME</id><enabled>Y</enabled><name>STEPNAME</name></field><field><id>STEP_COPY</id><enabled>Y</enabled><name>STEP_COPY</name></field><field><id>LINES_READ</id><enabled>Y</enabled><name>LINES_READ</name></field><field><id>LINES_WRITTEN</id><enabled>Y</enabled><name>LINES_WRITTEN</name></field><field><id>LINES_UPDATED</id><enabled>Y</enabled><name>LINES_UPDATED</name></field><field><id>LINES_INPUT</id><enabled>Y</enabled><name>LINES_INPUT</name></field><field><id>LINES_OUTPUT</id><enabled>Y</enabled><name>LINES_OUTPUT</name></field><field><id>LINES_REJECTED</id><enabled>Y</enabled><name>LINES_REJECTED</name></field><field><id>ERRORS</id><enabled>Y</enabled><name>ERRORS</name></field><field><id>LOG_FIELD</id><enabled>N</enabled><name>LOG_FIELD</name></field></step-log-table>
  47 +<metrics-log-table><connection/>
  48 +<schema/>
  49 +<table/>
  50 +<timeout_days/>
  51 +<field><id>ID_BATCH</id><enabled>Y</enabled><name>ID_BATCH</name></field><field><id>CHANNEL_ID</id><enabled>Y</enabled><name>CHANNEL_ID</name></field><field><id>LOG_DATE</id><enabled>Y</enabled><name>LOG_DATE</name></field><field><id>METRICS_DATE</id><enabled>Y</enabled><name>METRICS_DATE</name></field><field><id>METRICS_CODE</id><enabled>Y</enabled><name>METRICS_CODE</name></field><field><id>METRICS_DESCRIPTION</id><enabled>Y</enabled><name>METRICS_DESCRIPTION</name></field><field><id>METRICS_SUBJECT</id><enabled>Y</enabled><name>METRICS_SUBJECT</name></field><field><id>METRICS_TYPE</id><enabled>Y</enabled><name>METRICS_TYPE</name></field><field><id>METRICS_VALUE</id><enabled>Y</enabled><name>METRICS_VALUE</name></field></metrics-log-table>
  52 + </log>
  53 + <maxdate>
  54 + <connection/>
  55 + <table/>
  56 + <field/>
  57 + <offset>0.0</offset>
  58 + <maxdiff>0.0</maxdiff>
  59 + </maxdate>
  60 + <size_rowset>10000</size_rowset>
  61 + <sleep_time_empty>50</sleep_time_empty>
  62 + <sleep_time_full>50</sleep_time_full>
  63 + <unique_connections>N</unique_connections>
  64 + <feedback_shown>Y</feedback_shown>
  65 + <feedback_size>50000</feedback_size>
  66 + <using_thread_priorities>Y</using_thread_priorities>
  67 + <shared_objects_file/>
  68 + <capture_step_performance>N</capture_step_performance>
  69 + <step_performance_capturing_delay>1000</step_performance_capturing_delay>
  70 + <step_performance_capturing_size_limit>100</step_performance_capturing_size_limit>
  71 + <dependencies>
  72 + </dependencies>
  73 + <partitionschemas>
  74 + </partitionschemas>
  75 + <slaveservers>
  76 + </slaveservers>
  77 + <clusterschemas>
  78 + </clusterschemas>
  79 + <created_user>-</created_user>
  80 + <created_date>2020&#x2f;07&#x2f;30 13&#x3a;32&#x3a;25.920</created_date>
  81 + <modified_user>-</modified_user>
  82 + <modified_date>2020&#x2f;07&#x2f;30 13&#x3a;32&#x3a;25.920</modified_date>
  83 + <key_for_session_key/>
  84 + <is_key_private>N</is_key_private>
  85 + </info>
  86 + <notepads>
  87 + </notepads>
  88 + <connection>
  89 + <name>192.168.168.1_jwgl_dw</name>
  90 + <server>192.168.168.1</server>
  91 + <type>ORACLE</type>
  92 + <access>Native</access>
  93 + <database>orcl</database>
  94 + <port>1521</port>
  95 + <username>jwgl_dw</username>
  96 + <password>Encrypted 2be98afc86aa7f2e4cb13b977d2adabcd</password>
  97 + <servername/>
  98 + <data_tablespace/>
  99 + <index_tablespace/>
  100 + <attributes>
  101 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  102 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  103 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  104 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  105 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  106 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  107 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  108 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  109 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  110 + </attributes>
  111 + </connection>
  112 + <connection>
  113 + <name>bus_control_variable</name>
  114 + <server>&#x24;&#x7b;v_db_ip&#x7d;</server>
  115 + <type>MYSQL</type>
  116 + <access>Native</access>
  117 + <database>&#x24;&#x7b;v_db_dname&#x7d;</database>
  118 + <port>3306</port>
  119 + <username>&#x24;&#x7b;v_db_uname&#x7d;</username>
  120 + <password>&#x24;&#x7b;v_db_pwd&#x7d;</password>
  121 + <servername/>
  122 + <data_tablespace/>
  123 + <index_tablespace/>
  124 + <attributes>
  125 + <attribute><code>EXTRA_OPTION_MYSQL.characterEncoding</code><attribute>utf8</attribute></attribute>
  126 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  127 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  128 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  129 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  130 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  131 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  132 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  133 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  134 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  135 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  136 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  137 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  138 + </attributes>
  139 + </connection>
  140 + <connection>
  141 + <name>bus_control_&#x516c;&#x53f8;_201</name>
  142 + <server>localhost</server>
  143 + <type>MYSQL</type>
  144 + <access>Native</access>
  145 + <database>control</database>
  146 + <port>3306</port>
  147 + <username>root</username>
  148 + <password>Encrypted </password>
  149 + <servername/>
  150 + <data_tablespace/>
  151 + <index_tablespace/>
  152 + <attributes>
  153 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  154 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  155 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  156 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  157 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  158 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  159 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  160 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  161 + <attribute><code>STREAM_RESULTS</code><attribute>N</attribute></attribute>
  162 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  163 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  164 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  165 + </attributes>
  166 + </connection>
  167 + <connection>
  168 + <name>bus_control_&#x672c;&#x673a;</name>
  169 + <server>localhost</server>
  170 + <type>MYSQL</type>
  171 + <access>Native</access>
  172 + <database>control</database>
  173 + <port>3306</port>
  174 + <username>root</username>
  175 + <password>Encrypted </password>
  176 + <servername/>
  177 + <data_tablespace/>
  178 + <index_tablespace/>
  179 + <attributes>
  180 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  181 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  182 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  183 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  184 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  185 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  186 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  187 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  188 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  189 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  190 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  191 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  192 + </attributes>
  193 + </connection>
  194 + <connection>
  195 + <name>JGJW_VM</name>
  196 + <server>192.168.198.240</server>
  197 + <type>ORACLE</type>
  198 + <access>Native</access>
  199 + <database>orcl</database>
  200 + <port>1521</port>
  201 + <username>jwgl</username>
  202 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d485a8d6</password>
  203 + <servername/>
  204 + <data_tablespace/>
  205 + <index_tablespace/>
  206 + <attributes>
  207 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  208 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  209 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  210 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  211 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  212 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  213 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  214 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  215 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  216 + </attributes>
  217 + </connection>
  218 + <connection>
  219 + <name>NHJW_VM</name>
  220 + <server>192.168.198.240</server>
  221 + <type>ORACLE</type>
  222 + <access>Native</access>
  223 + <database>orcl</database>
  224 + <port>1521</port>
  225 + <username>nhjw</username>
  226 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d09aa5cd</password>
  227 + <servername/>
  228 + <data_tablespace/>
  229 + <index_tablespace/>
  230 + <attributes>
  231 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  232 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  233 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  234 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  235 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  236 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  237 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  238 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  239 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  240 + </attributes>
  241 + </connection>
  242 + <connection>
  243 + <name>PDGJ_VM</name>
  244 + <server>192.168.198.240</server>
  245 + <type>ORACLE</type>
  246 + <access>Native</access>
  247 + <database>orcl</database>
  248 + <port>1521</port>
  249 + <username>pdgj</username>
  250 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10ce96a8d0</password>
  251 + <servername/>
  252 + <data_tablespace/>
  253 + <index_tablespace/>
  254 + <attributes>
  255 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  256 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  257 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  258 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  259 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  260 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  261 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  262 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  263 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  264 + </attributes>
  265 + </connection>
  266 + <connection>
  267 + <name>SNJW_VM</name>
  268 + <server>192.168.198.240</server>
  269 + <type>ORACLE</type>
  270 + <access>Native</access>
  271 + <database>orcl</database>
  272 + <port>1521</port>
  273 + <username>snjw</username>
  274 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10cd9ca5cd</password>
  275 + <servername/>
  276 + <data_tablespace/>
  277 + <index_tablespace/>
  278 + <attributes>
  279 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  280 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  281 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  282 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  283 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  284 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  285 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  286 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  287 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  288 + </attributes>
  289 + </connection>
  290 + <connection>
  291 + <name>test_control&#xff08;&#x672c;&#x673a;&#xff09;</name>
  292 + <server>127.0.0.1</server>
  293 + <type>MYSQL</type>
  294 + <access>Native</access>
  295 + <database>test_control</database>
  296 + <port>3306</port>
  297 + <username>root</username>
  298 + <password>Encrypted </password>
  299 + <servername/>
  300 + <data_tablespace/>
  301 + <index_tablespace/>
  302 + <attributes>
  303 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  304 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  305 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  306 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  307 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  308 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  309 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  310 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  311 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  312 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  313 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  314 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  315 + </attributes>
  316 + </connection>
  317 + <connection>
  318 + <name>xlab_mysql_youle</name>
  319 + <server>101.231.124.8</server>
  320 + <type>MYSQL</type>
  321 + <access>Native</access>
  322 + <database>xlab_youle</database>
  323 + <port>45687</port>
  324 + <username>xlab-youle</username>
  325 + <password>Encrypted 2be98afc86aa78a88aa1be369d187a3df</password>
  326 + <servername/>
  327 + <data_tablespace/>
  328 + <index_tablespace/>
  329 + <attributes>
  330 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  331 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  332 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  333 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  334 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  335 + <attribute><code>PORT_NUMBER</code><attribute>45687</attribute></attribute>
  336 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  337 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  338 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  339 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  340 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  341 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  342 + </attributes>
  343 + </connection>
  344 + <connection>
  345 + <name>xlab_mysql_youle&#xff08;&#x672c;&#x673a;&#xff09;</name>
  346 + <server>localhost</server>
  347 + <type>MYSQL</type>
  348 + <access>Native</access>
  349 + <database>xlab_youle</database>
  350 + <port>3306</port>
  351 + <username>root</username>
  352 + <password>Encrypted </password>
  353 + <servername/>
  354 + <data_tablespace/>
  355 + <index_tablespace/>
  356 + <attributes>
  357 + <attribute><code>EXTRA_OPTION_MYSQL.defaultFetchSize</code><attribute>500</attribute></attribute>
  358 + <attribute><code>EXTRA_OPTION_MYSQL.useCursorFetch</code><attribute>true</attribute></attribute>
  359 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  360 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  361 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  362 + <attribute><code>PORT_NUMBER</code><attribute>3306</attribute></attribute>
  363 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  364 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  365 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  366 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
  367 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>N</attribute></attribute>
  368 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  369 + </attributes>
  370 + </connection>
  371 + <connection>
  372 + <name>xlab_youle</name>
  373 + <server/>
  374 + <type>MYSQL</type>
  375 + <access>JNDI</access>
  376 + <database>xlab_youle</database>
  377 + <port>1521</port>
  378 + <username/>
  379 + <password>Encrypted </password>
  380 + <servername/>
  381 + <data_tablespace/>
  382 + <index_tablespace/>
  383 + <attributes>
  384 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  385 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  386 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  387 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  388 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  389 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  390 + <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
  391 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  392 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  393 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  394 + </attributes>
  395 + </connection>
  396 + <connection>
  397 + <name>YGJW_VM</name>
  398 + <server>192.168.198.240</server>
  399 + <type>ORACLE</type>
  400 + <access>Native</access>
  401 + <database>orcl</database>
  402 + <port>1521</port>
  403 + <username>ygjw</username>
  404 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10c795a5cd</password>
  405 + <servername/>
  406 + <data_tablespace/>
  407 + <index_tablespace/>
  408 + <attributes>
  409 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  410 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  411 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  412 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  413 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  414 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  415 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  416 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  417 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  418 + </attributes>
  419 + </connection>
  420 + <connection>
  421 + <name>&#x516c;&#x53f8;jgjw</name>
  422 + <server>192.168.168.1</server>
  423 + <type>ORACLE</type>
  424 + <access>Native</access>
  425 + <database>orcl</database>
  426 + <port>1521</port>
  427 + <username>jwgl</username>
  428 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10d485a8d6</password>
  429 + <servername/>
  430 + <data_tablespace/>
  431 + <index_tablespace/>
  432 + <attributes>
  433 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  434 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  435 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  436 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  437 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  438 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  439 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  440 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  441 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  442 + </attributes>
  443 + </connection>
  444 + <connection>
  445 + <name>&#x516c;&#x53f8;snjw</name>
  446 + <server>192.168.168.1</server>
  447 + <type>ORACLE</type>
  448 + <access>Native</access>
  449 + <database>orcl</database>
  450 + <port>1521</port>
  451 + <username>snjw</username>
  452 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10cd9ca5cd</password>
  453 + <servername/>
  454 + <data_tablespace/>
  455 + <index_tablespace/>
  456 + <attributes>
  457 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  458 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  459 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  460 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  461 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  462 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  463 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  464 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  465 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  466 + </attributes>
  467 + </connection>
  468 + <connection>
  469 + <name>&#x516c;&#x53f8;ygjw</name>
  470 + <server>192.168.168.1</server>
  471 + <type>ORACLE</type>
  472 + <access>Native</access>
  473 + <database>orcl</database>
  474 + <port>1521</port>
  475 + <username>ygjw</username>
  476 + <password>Encrypted 2be98afc86aa7f2e4cb79ce10c795a5cd</password>
  477 + <servername/>
  478 + <data_tablespace/>
  479 + <index_tablespace/>
  480 + <attributes>
  481 + <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
  482 + <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
  483 + <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
  484 + <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
  485 + <attribute><code>PRESERVE_RESERVED_WORD_CASE</code><attribute>N</attribute></attribute>
  486 + <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
  487 + <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>Y</attribute></attribute>
  488 + <attribute><code>SUPPORTS_TIMESTAMP_DATA_TYPE</code><attribute>Y</attribute></attribute>
  489 + <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
  490 + </attributes>
  491 + </connection>
  492 + <order>
  493 + <hop> <from>&#x7528;&#x6237;&#x767b;&#x5f55;&#x65e5;&#x5fd7;&#x8f93;&#x5165;</from><to>&#x5904;&#x7406;&#x65e5;&#x671f;</to><enabled>Y</enabled> </hop>
  494 + <hop> <from>&#x5904;&#x7406;&#x65e5;&#x671f;</from><to>&#x8fc7;&#x6ee4;&#x65e5;&#x671f;&#x4e3a;&#x7a7a;</to><enabled>Y</enabled> </hop>
  495 + <hop> <from>&#x8fc7;&#x6ee4;&#x65e5;&#x671f;&#x4e3a;&#x7a7a;</from><to>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</to><enabled>Y</enabled> </hop>
  496 + <hop> <from>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</from><to>&#x5b57;&#x6bb5;&#x8f6c;&#x6362;</to><enabled>Y</enabled> </hop>
  497 + <hop> <from>&#x5b57;&#x6bb5;&#x8f6c;&#x6362;</from><to>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</to><enabled>Y</enabled> </hop>
  498 + <hop> <from>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</from><to>Excel&#x8f93;&#x51fa;</to><enabled>Y</enabled> </hop>
  499 + </order>
  500 + <step>
  501 + <name>&#x7528;&#x6237;&#x767b;&#x5f55;&#x65e5;&#x5fd7;&#x8f93;&#x5165;</name>
  502 + <type>TableInput</type>
  503 + <description/>
  504 + <distribute>Y</distribute>
  505 + <custom_distribution/>
  506 + <copies>1</copies>
  507 + <partitioning>
  508 + <method>none</method>
  509 + <schema_name/>
  510 + </partitioning>
  511 + <connection>bus_control_variable</connection>
  512 + <sql>select &#x2a; from logger_user_sign&#xa;where &#x24;&#x7b;QUERY&#x7d;</sql>
  513 + <limit>0</limit>
  514 + <lookup/>
  515 + <execute_each_row>N</execute_each_row>
  516 + <variables_active>Y</variables_active>
  517 + <lazy_conversion_active>N</lazy_conversion_active>
  518 + <cluster_schema/>
  519 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  520 + <xloc>111</xloc>
  521 + <yloc>60</yloc>
  522 + <draw>Y</draw>
  523 + </GUI>
  524 + </step>
  525 +
  526 + <step>
  527 + <name>&#x5904;&#x7406;&#x65e5;&#x671f;</name>
  528 + <type>ScriptValueMod</type>
  529 + <description/>
  530 + <distribute>Y</distribute>
  531 + <custom_distribution/>
  532 + <copies>1</copies>
  533 + <partitioning>
  534 + <method>none</method>
  535 + <schema_name/>
  536 + </partitioning>
  537 + <compatible>N</compatible>
  538 + <optimizationLevel>9</optimizationLevel>
  539 + <jsScripts> <jsScript> <jsScript_type>0</jsScript_type>
  540 + <jsScript_name>Script 1</jsScript_name>
  541 + <jsScript_script>&#x2f;&#x2f;Script here&#xa;&#xa;&#x2f;&#x2a;&#xa; &#x8ba1;&#x7b97;&#x65e5;&#x671f;&#xff0c;&#x4ee5;&#x767b;&#x5f55;&#x65f6;&#x95f4;&#x4e3a;&#x4e3b;&#xff0c;&#x6ca1;&#x6709;&#x9009;&#x62e9;&#x767b;&#x51fa;&#x65f6;&#x95f4;&#xa;&#x2a;&#x2f;&#xa;var _date_ &#x3d; null&#x3b;&#xa;if &#x28;log_in_date &#x21;&#x3d; null&#x29; &#x7b;&#xa; _date_ &#x3d; log_in_date&#x3b;&#xa;&#x7d; else if &#x28;log_out_date &#x21;&#x3d; null&#x29; &#x7b;&#xa; _date_ &#x3d; log_out_date&#x3b;&#xa;&#x7d;</jsScript_script>
  542 + </jsScript> </jsScripts> <fields> <field> <name>_date_</name>
  543 + <rename>_date_</rename>
  544 + <type>Date</type>
  545 + <length>-1</length>
  546 + <precision>-1</precision>
  547 + <replace>N</replace>
  548 + </field> </fields> <cluster_schema/>
  549 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  550 + <xloc>236</xloc>
  551 + <yloc>60</yloc>
  552 + <draw>Y</draw>
  553 + </GUI>
  554 + </step>
  555 +
  556 + <step>
  557 + <name>&#x8fc7;&#x6ee4;&#x65e5;&#x671f;&#x4e3a;&#x7a7a;</name>
  558 + <type>FilterRows</type>
  559 + <description/>
  560 + <distribute>Y</distribute>
  561 + <custom_distribution/>
  562 + <copies>1</copies>
  563 + <partitioning>
  564 + <method>none</method>
  565 + <schema_name/>
  566 + </partitioning>
  567 +<send_true_to/>
  568 +<send_false_to/>
  569 + <compare>
  570 +<condition>
  571 + <negated>N</negated>
  572 + <leftvalue>_date_</leftvalue>
  573 + <function>IS NOT NULL</function>
  574 + <rightvalue/>
  575 + </condition>
  576 + </compare>
  577 + <cluster_schema/>
  578 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  579 + <xloc>382</xloc>
  580 + <yloc>61</yloc>
  581 + <draw>Y</draw>
  582 + </GUI>
  583 + </step>
  584 +
  585 + <step>
  586 + <name>&#x6392;&#x5e8f;&#x8bb0;&#x5f55;</name>
  587 + <type>SortRows</type>
  588 + <description/>
  589 + <distribute>Y</distribute>
  590 + <custom_distribution/>
  591 + <copies>1</copies>
  592 + <partitioning>
  593 + <method>none</method>
  594 + <schema_name/>
  595 + </partitioning>
  596 + <directory>&#x25;&#x25;java.io.tmpdir&#x25;&#x25;</directory>
  597 + <prefix>out</prefix>
  598 + <sort_size>1000000</sort_size>
  599 + <free_memory/>
  600 + <compress>N</compress>
  601 + <compress_variable/>
  602 + <unique_rows>N</unique_rows>
  603 + <fields>
  604 + <field>
  605 + <name>_date_</name>
  606 + <ascending>Y</ascending>
  607 + <case_sensitive>N</case_sensitive>
  608 + <presorted>N</presorted>
  609 + </field>
  610 + </fields>
  611 + <cluster_schema/>
  612 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  613 + <xloc>511</xloc>
  614 + <yloc>60</yloc>
  615 + <draw>Y</draw>
  616 + </GUI>
  617 + </step>
  618 +
  619 + <step>
  620 + <name>&#x5b57;&#x6bb5;&#x8f6c;&#x6362;</name>
  621 + <type>SelectValues</type>
  622 + <description/>
  623 + <distribute>Y</distribute>
  624 + <custom_distribution/>
  625 + <copies>1</copies>
  626 + <partitioning>
  627 + <method>none</method>
  628 + <schema_name/>
  629 + </partitioning>
  630 + <fields> <select_unspecified>N</select_unspecified>
  631 + <meta> <name>_date_</name>
  632 + <rename>&#x65e5;&#x671f;</rename>
  633 + <type>String</type>
  634 + <length>-2</length>
  635 + <precision>-2</precision>
  636 + <conversion_mask>yyyy&#x2f;MM&#x2f;dd</conversion_mask>
  637 + <date_format_lenient>false</date_format_lenient>
  638 + <date_format_locale/>
  639 + <date_format_timezone/>
  640 + <lenient_string_to_number>false</lenient_string_to_number>
  641 + <encoding/>
  642 + <decimal_symbol/>
  643 + <grouping_symbol/>
  644 + <currency_symbol/>
  645 + <storage_type/>
  646 + </meta> <meta> <name>log_name</name>
  647 + <rename>&#x8d26;&#x6237;&#x540d;&#x79f0;</rename>
  648 + <type>String</type>
  649 + <length>-2</length>
  650 + <precision>-2</precision>
  651 + <conversion_mask/>
  652 + <date_format_lenient>false</date_format_lenient>
  653 + <date_format_locale/>
  654 + <date_format_timezone/>
  655 + <lenient_string_to_number>false</lenient_string_to_number>
  656 + <encoding/>
  657 + <decimal_symbol/>
  658 + <grouping_symbol/>
  659 + <currency_symbol/>
  660 + <storage_type/>
  661 + </meta> <meta> <name>real_name</name>
  662 + <rename>&#x59d3;&#x540d;</rename>
  663 + <type>String</type>
  664 + <length>-2</length>
  665 + <precision>-2</precision>
  666 + <conversion_mask/>
  667 + <date_format_lenient>false</date_format_lenient>
  668 + <date_format_locale/>
  669 + <date_format_timezone/>
  670 + <lenient_string_to_number>false</lenient_string_to_number>
  671 + <encoding/>
  672 + <decimal_symbol/>
  673 + <grouping_symbol/>
  674 + <currency_symbol/>
  675 + <storage_type/>
  676 + </meta> <meta> <name>log_in_date_time</name>
  677 + <rename>&#x767b;&#x5165;&#x65f6;&#x95f4;</rename>
  678 + <type>String</type>
  679 + <length>-2</length>
  680 + <precision>-2</precision>
  681 + <conversion_mask>yyyy&#x2f;MM&#x2f;dd HH&#x3a;mm&#x3a;ss</conversion_mask>
  682 + <date_format_lenient>false</date_format_lenient>
  683 + <date_format_locale/>
  684 + <date_format_timezone/>
  685 + <lenient_string_to_number>false</lenient_string_to_number>
  686 + <encoding/>
  687 + <decimal_symbol/>
  688 + <grouping_symbol/>
  689 + <currency_symbol/>
  690 + <storage_type/>
  691 + </meta> <meta> <name>log_out_date_time</name>
  692 + <rename>&#x767b;&#x51fa;&#x65f6;&#x95f4;</rename>
  693 + <type>String</type>
  694 + <length>-2</length>
  695 + <precision>-2</precision>
  696 + <conversion_mask>yyyy&#x2f;MM&#x2f;dd HH&#x3a;mm&#x3a;ss</conversion_mask>
  697 + <date_format_lenient>false</date_format_lenient>
  698 + <date_format_locale/>
  699 + <date_format_timezone/>
  700 + <lenient_string_to_number>false</lenient_string_to_number>
  701 + <encoding/>
  702 + <decimal_symbol/>
  703 + <grouping_symbol/>
  704 + <currency_symbol/>
  705 + <storage_type/>
  706 + </meta> </fields> <cluster_schema/>
  707 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  708 + <xloc>631</xloc>
  709 + <yloc>60</yloc>
  710 + <draw>Y</draw>
  711 + </GUI>
  712 + </step>
  713 +
  714 + <step>
  715 + <name>&#x5b57;&#x6bb5;&#x9009;&#x62e9;</name>
  716 + <type>SelectValues</type>
  717 + <description/>
  718 + <distribute>Y</distribute>
  719 + <custom_distribution/>
  720 + <copies>1</copies>
  721 + <partitioning>
  722 + <method>none</method>
  723 + <schema_name/>
  724 + </partitioning>
  725 + <fields> <field> <name>&#x65e5;&#x671f;</name>
  726 + <rename/>
  727 + <length>-2</length>
  728 + <precision>-2</precision>
  729 + </field> <field> <name>&#x8d26;&#x6237;&#x540d;&#x79f0;</name>
  730 + <rename/>
  731 + <length>-2</length>
  732 + <precision>-2</precision>
  733 + </field> <field> <name>&#x59d3;&#x540d;</name>
  734 + <rename/>
  735 + <length>-2</length>
  736 + <precision>-2</precision>
  737 + </field> <field> <name>&#x767b;&#x5165;&#x65f6;&#x95f4;</name>
  738 + <rename/>
  739 + <length>-2</length>
  740 + <precision>-2</precision>
  741 + </field> <field> <name>&#x767b;&#x51fa;&#x65f6;&#x95f4;</name>
  742 + <rename/>
  743 + <length>-2</length>
  744 + <precision>-2</precision>
  745 + </field> <select_unspecified>N</select_unspecified>
  746 + </fields> <cluster_schema/>
  747 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  748 + <xloc>761</xloc>
  749 + <yloc>60</yloc>
  750 + <draw>Y</draw>
  751 + </GUI>
  752 + </step>
  753 +
  754 + <step>
  755 + <name>Excel&#x8f93;&#x51fa;</name>
  756 + <type>ExcelOutput</type>
  757 + <description/>
  758 + <distribute>Y</distribute>
  759 + <custom_distribution/>
  760 + <copies>1</copies>
  761 + <partitioning>
  762 + <method>none</method>
  763 + <schema_name/>
  764 + </partitioning>
  765 + <header>Y</header>
  766 + <footer>N</footer>
  767 + <encoding/>
  768 + <append>N</append>
  769 + <add_to_result_filenames>Y</add_to_result_filenames>
  770 + <file>
  771 + <name>&#x24;&#x7b;filepath&#x7d;</name>
  772 + <extention>xls</extention>
  773 + <do_not_open_newfile_init>N</do_not_open_newfile_init>
  774 + <create_parent_folder>N</create_parent_folder>
  775 + <split>N</split>
  776 + <add_date>N</add_date>
  777 + <add_time>N</add_time>
  778 + <SpecifyFormat>N</SpecifyFormat>
  779 + <date_time_format/>
  780 + <sheetname>Sheet1</sheetname>
  781 + <autosizecolums>N</autosizecolums>
  782 + <nullisblank>N</nullisblank>
  783 + <protect_sheet>N</protect_sheet>
  784 + <password>Encrypted </password>
  785 + <splitevery>0</splitevery>
  786 + <usetempfiles>N</usetempfiles>
  787 + <tempdirectory/>
  788 + </file>
  789 + <template>
  790 + <enabled>N</enabled>
  791 + <append>N</append>
  792 + <filename>template.xls</filename>
  793 + </template>
  794 + <fields>
  795 + <field>
  796 + <name>&#x65e5;&#x671f;</name>
  797 + <type>String</type>
  798 + <format/>
  799 + </field>
  800 + <field>
  801 + <name>&#x8d26;&#x6237;&#x540d;&#x79f0;</name>
  802 + <type>String</type>
  803 + <format/>
  804 + </field>
  805 + <field>
  806 + <name>&#x59d3;&#x540d;</name>
  807 + <type>String</type>
  808 + <format/>
  809 + </field>
  810 + <field>
  811 + <name>&#x767b;&#x5165;&#x65f6;&#x95f4;</name>
  812 + <type>String</type>
  813 + <format/>
  814 + </field>
  815 + <field>
  816 + <name>&#x767b;&#x51fa;&#x65f6;&#x95f4;</name>
  817 + <type>String</type>
  818 + <format/>
  819 + </field>
  820 + </fields>
  821 + <custom>
  822 + <header_font_name>arial</header_font_name>
  823 + <header_font_size>10</header_font_size>
  824 + <header_font_bold>N</header_font_bold>
  825 + <header_font_italic>N</header_font_italic>
  826 + <header_font_underline>no</header_font_underline>
  827 + <header_font_orientation>horizontal</header_font_orientation>
  828 + <header_font_color>black</header_font_color>
  829 + <header_background_color>none</header_background_color>
  830 + <header_row_height>255</header_row_height>
  831 + <header_alignment>left</header_alignment>
  832 + <header_image/>
  833 + <row_font_name>arial</row_font_name>
  834 + <row_font_size>10</row_font_size>
  835 + <row_font_color>black</row_font_color>
  836 + <row_background_color>none</row_background_color>
  837 + </custom>
  838 + <cluster_schema/>
  839 + <remotesteps> <input> </input> <output> </output> </remotesteps> <GUI>
  840 + <xloc>766</xloc>
  841 + <yloc>158</yloc>
  842 + <draw>Y</draw>
  843 + </GUI>
  844 + </step>
  845 +
  846 + <step_error_handling>
  847 + </step_error_handling>
  848 + <slave-step-copy-partition-distribution>
  849 +</slave-step-copy-partition-distribution>
  850 + <slave_transformation>N</slave_transformation>
  851 +
  852 +</transformation>
src/main/resources/static/pages/forms/statement/css/lbStatuAnaly.css 0 → 100644
  1 +
  2 +.table-bordered {
  3 + border: 1px solid; }
  4 +.table-bordered > thead > tr > th,
  5 +.table-bordered > thead > tr > td,
  6 +.table-bordered > tbody > tr > th,
  7 +.table-bordered > tbody > tr > td,
  8 +.table-bordered > tfoot > tr > th,
  9 +.table-bordered > tfoot > tr > td {
  10 + border: 1px solid; }
  11 +.table-bordered > thead > tr > th,
  12 +.table-bordered > thead > tr > td {
  13 + border-bottom-width: 2px; }
  14 +
  15 +.table > tbody + tbody {
  16 + border-top: 1px solid; }
  17 +
  18 +#right_div td{
  19 + min-width: 80px;
  20 + max-width: 80px;
  21 + width: 80px;
  22 +}
  23 +#left_div{
  24 + width:200px;
  25 + float: left;
  26 +}
  27 +#left_div1{
  28 + width: 100%;
  29 +}
  30 +#left_div2{
  31 + width: 100%;
  32 + height: 10px;
  33 + overflow: hidden;
  34 +}
  35 +#right_div{
  36 + width: 100%;
  37 + float: left;
  38 + margin-top: 15px;
  39 +}
  40 +#staticfw{
  41 + width: 100%;
  42 + overflow: hidden;
  43 +}
  44 +#right_divx{
  45 + width:100%;
  46 +}
  47 +#right_div2{
  48 + width:101%;
  49 + overflow: auto;
  50 + margin-top: -20px;
  51 +}
  52 +
  53 +#staticfw::-webkit-scrollbar {
  54 + display:none
  55 +}
  56 +
  57 +#right_divy td{
  58 + min-width: 80px;
  59 + max-width: 80px;
  60 + width: 80px;
  61 +}
  62 +#left_divy{
  63 + width:200px;
  64 + float: left;
  65 +}
  66 +#left_div1y{
  67 + width: 100%;
  68 +}
  69 +#left_div2y{
  70 + width: 100%;
  71 + height: 10px;
  72 + overflow: hidden;
  73 +}
  74 +#right_divy{
  75 + width: 100%;
  76 + float: left;
  77 + margin-top: 15px;
  78 +}
  79 +#staticfwy{
  80 + width: 100%;
  81 + overflow: hidden;
  82 +
  83 +}
  84 +
  85 +#right_divxy{
  86 + width:100%;
  87 +}
  88 +#right_div2y{
  89 + width:101%;
  90 + height:540px;
  91 + overflow: auto;
  92 + margin-top: -65px;
  93 +}
  94 +#right_div2::-webkit-scrollbar {
  95 + display:none
  96 +}
  97 +.tk th{
  98 + min-width: 80px;
  99 + max-width: 80px;
  100 + width:80px;
  101 +}
src/main/resources/static/pages/forms/statement/css/scheduleDaily.css 0 → 100644
  1 +
  2 +.table-bordered {
  3 + border: 1px solid; }
  4 +.table-bordered > thead > tr > th,
  5 +.table-bordered > thead > tr > td,
  6 +.table-bordered > tbody > tr > th,
  7 +.table-bordered > tbody > tr > td,
  8 +.table-bordered > tfoot > tr > th,
  9 +.table-bordered > tfoot > tr > td {
  10 + border: 1px solid; }
  11 +.table-bordered > thead > tr > th,
  12 +.table-bordered > thead > tr > td {
  13 + border-bottom-width: 2px; }
  14 +
  15 +.table > tbody + tbody {
  16 + border-top: 1px solid; }
  17 +
  18 +
  19 +.kfc td{
  20 + min-width: 140px;
  21 + max-width: 140px;
  22 + width: 140px;
  23 +}
  24 +
  25 +#right_div td{
  26 + min-width: 140px;
  27 + max-width: 140px;
  28 + width: 140px;
  29 +}
  30 +#left_div{
  31 + width:200px;
  32 + float: left;
  33 +}
  34 +#left_div1{
  35 + width: 100%;
  36 +}
  37 +#left_div2{
  38 + width: 100%;
  39 + height: 10px;
  40 + overflow: hidden;
  41 +}
  42 +#right_div{
  43 + width: 100%;
  44 + float: left;
  45 + margin-top: 15px;
  46 +}
  47 +#staticfw{
  48 + width: 100%;
  49 + overflow: hidden;
  50 +}
  51 +#right_divx{
  52 + width:100%;
  53 +}
  54 +#right_div2{
  55 + width:101%;
  56 + overflow: auto;
  57 + margin-top: -65px;
  58 +}
  59 +
  60 +#staticfw::-webkit-scrollbar {
  61 + display:none
  62 +}
  63 +
  64 +#right_divy td{
  65 + min-width: 140px;
  66 + max-width: 140px;
  67 + width: 140px;
  68 +}
  69 +#left_divy{
  70 + width:200px;
  71 + float: left;
  72 +}
  73 +#left_div1y{
  74 + width: 100%;
  75 +}
  76 +#left_div2y{
  77 + width: 100%;
  78 + height: 10px;
  79 + overflow: hidden;
  80 +}
  81 +#right_divy{
  82 + width: 100%;
  83 + float: left;
  84 + height: 600px;
  85 + margin-top: 15px;
  86 +}
  87 +#staticfwy{
  88 + width: 100%;
  89 + overflow: hidden;
  90 +
  91 +}
  92 +#right_divxy{
  93 + width:100%;
  94 +}
  95 +#right_div2y{
  96 + width:101%;
  97 + height:500px;
  98 + overflow: auto;
  99 + margin-top: -20px;
  100 +}
  101 +#staticfwy::-webkit-scrollbar {
  102 + display:none
  103 +}
  104 +#ddrbBody tr> td >span{
  105 + word-break: keep-all;white-space:nowrap;
  106 +}
src/main/resources/static/pages/forms/statement/css/statisticsDaily.css 0 → 100644
  1 +
  2 + .table-bordered {
  3 + border: 1px solid; }
  4 +.table-bordered > thead > tr > th,
  5 +.table-bordered > thead > tr > td,
  6 +.table-bordered > tbody > tr > th,
  7 +.table-bordered > tbody > tr > td,
  8 +.table-bordered > tfoot > tr > th,
  9 +.table-bordered > tfoot > tr > td {
  10 + border: 1px solid; }
  11 +.table-bordered > thead > tr > th,
  12 +.table-bordered > thead > tr > td {
  13 + border-bottom-width: 2px; }
  14 +
  15 +.table > tbody + tbody {
  16 + border-top: 1px solid; }
  17 +
  18 +
  19 +
  20 +#right_div td{
  21 + min-width: 80px;
  22 + max-width: 80px;
  23 + width: 80px;
  24 +}
  25 +#left_div{
  26 + width:200px;
  27 + float: left;
  28 +}
  29 +#left_div1{
  30 + width: 100%;
  31 +}
  32 +#left_div2{
  33 + width: 100%;
  34 + height: 10px;
  35 + overflow: hidden;
  36 +}
  37 +#right_div{
  38 + width: 100%;
  39 + float: left;
  40 + margin-top: 15px;
  41 +}
  42 +#staticfw{
  43 + width: 100%;
  44 + overflow: hidden;
  45 +}
  46 +#right_divx{
  47 + width:100%;
  48 +}
  49 +#right_div2{
  50 + width:101%;
  51 + overflow: auto;
  52 + margin-top: -65px;
  53 +}
  54 +
  55 +#staticfw::-webkit-scrollbar {
  56 + display:none
  57 +}
  58 +
  59 +#right_divy td{
  60 + min-width: 80px;
  61 + max-width: 80px;
  62 + width: 80px;
  63 +}
  64 +#left_divy{
  65 + width:200px;
  66 + float: left;
  67 +}
  68 +#left_div1y{
  69 + width: 100%;
  70 +}
  71 +#left_div2y{
  72 + width: 100%;
  73 + height: 10px;
  74 + overflow: hidden;
  75 +}
  76 +#right_divy{
  77 + width: 100%;
  78 + float: left;
  79 + margin-top: 15px;
  80 +}
  81 +#staticfwy{
  82 + width: 100%;
  83 + overflow: hidden;
  84 +
  85 +}
  86 +
  87 +#right_divxy{
  88 + width:100%;
  89 +}
  90 +#right_div2y{
  91 + width:101%;
  92 + height:500px;
  93 + overflow: auto;
  94 + margin-top: -20px;
  95 +}
  96 +#staticfwy::-webkit-scrollbar {
  97 + display:none
  98 +}
src/main/resources/static/pages/forms/statement/firstAndLastBus.html
@@ -15,6 +15,32 @@ @@ -15,6 +15,32 @@
15 15
16 .table > tbody + tbody { 16 .table > tbody + tbody {
17 border-top: 1px solid; } 17 border-top: 1px solid; }
  18 +
  19 + .table-body{width:100%; height:94vh;overflow-y:scroll;}
  20 + .table-head table,.table-body table{width:100%;}
  21 + .table-container{
  22 + overflow-y:scroll;height: 540px; width: 100%;
  23 + }
  24 + .kwy td{
  25 + min-width: 80px;
  26 + max-width: 80px;
  27 + width: 80px;
  28 + }
  29 + .kyt th{
  30 + min-width: 80px;
  31 + max-width: 80px;
  32 + width: 80px;
  33 + }
  34 + .kw{
  35 + width: 98%;
  36 + margin-top: 10px;
  37 + overflow:auto;
  38 + min-width: 600px
  39 + }
  40 + .kwy{
  41 + margin-top:-20px; overflow:auto;min-width: 906px ;width: 99%
  42 + }
  43 +
18 </style> 44 </style>
19 45
20 <div class="page-head"> 46 <div class="page-head">
@@ -60,20 +86,20 @@ @@ -60,20 +86,20 @@
60 </form> 86 </form>
61 </div> 87 </div>
62 <div class="portlet-body"> 88 <div class="portlet-body">
63 - <div class="table-container" style="margin-top: 10px;overflow:auto;min-width: 906px">  
64 - <table class="table table-bordered table-hover table-checkable" id="forms"> 89 + <div class="kw" style="margin-top: 10px;overflow:auto;min-width: 906px">
  90 + <table class="table table-bordered table-hover table-checkable" id="">
65 <thead> 91 <thead>
66 <tr class="hidden"> 92 <tr class="hidden">
67 - <th rowspan="2">日期</th>  
68 - <th rowspan="2">公司</th>  
69 - <th rowspan="2">分公司</th>  
70 - <th rowspan="2">线路</th> 93 + <th rowspan="2" style="min-width: 80px;max-width: 80px;width: 80px">日期</th>
  94 + <th rowspan="2" style="min-width: 80px;max-width: 80px;width: 80px">公司</th>
  95 + <th rowspan="2" style="min-width: 80px;max-width: 80px;width: 80px">分公司</th>
  96 + <th rowspan="2" style="min-width: 80px;max-width: 80px;width: 80px">线路</th>
71 <th colspan="4">上行首发</th> 97 <th colspan="4">上行首发</th>
72 <th colspan="4">上行末发</th> 98 <th colspan="4">上行末发</th>
73 <th colspan="4">下行首发</th> 99 <th colspan="4">下行首发</th>
74 <th colspan="4">下行末发</th> 100 <th colspan="4">下行末发</th>
75 </tr> 101 </tr>
76 - <tr class="hidden"> 102 + <tr class="hidden kyt">
77 <th style="display: none;"></th> 103 <th style="display: none;"></th>
78 <th>站点</th> 104 <th>站点</th>
79 <th>计发</th> 105 <th>计发</th>
@@ -93,6 +119,11 @@ @@ -93,6 +119,11 @@
93 <th>快慢</th> 119 <th>快慢</th>
94 </tr> 120 </tr>
95 </thead> 121 </thead>
  122 +
  123 + </table>
  124 + </div>
  125 + <div class="table-container kwy" >
  126 + <table class="table table-bordered table-hover table-checkable" id="forms">
96 <tbody> 127 <tbody>
97 128
98 </tbody> 129 </tbody>
src/main/resources/static/pages/forms/statement/lbStatuAnaly.html
1 -<style type="text/css">  
2 - .table-bordered {  
3 - border: 1px solid; }  
4 - .table-bordered > thead > tr > th,  
5 - .table-bordered > thead > tr > td,  
6 - .table-bordered > tbody > tr > th,  
7 - .table-bordered > tbody > tr > td,  
8 - .table-bordered > tfoot > tr > th,  
9 - .table-bordered > tfoot > tr > td {  
10 - border: 1px solid; }  
11 - .table-bordered > thead > tr > th,  
12 - .table-bordered > thead > tr > td {  
13 - border-bottom-width: 2px; }  
14 - .table > tbody + tbody {  
15 - border-top: 1px solid; }  
16 - #forms > tbody > tr{  
17 - background-color: #FFFFFF;  
18 - }  
19 -</style> 1 +<link rel="stylesheet" type="text/css" href="css/lbStatuAnaly.css" />
20 2
21 <div class="page-head"> 3 <div class="page-head">
22 <div class="page-title"> 4 <div class="page-title">
@@ -25,7 +7,7 @@ @@ -25,7 +7,7 @@
25 </div> 7 </div>
26 8
27 <div class="row"> 9 <div class="row">
28 - <div class="col-md-12"> 10 + <div class="col-md-12" style="background-color: white">
29 <div class="portlet light porttlet-fit bordered"> 11 <div class="portlet light porttlet-fit bordered">
30 <div class="portlet-title"> 12 <div class="portlet-title">
31 <form id="history" class="form-inline" action=""> 13 <form id="history" class="form-inline" action="">
@@ -101,20 +83,75 @@ @@ -101,20 +83,75 @@
101 </div> 83 </div>
102 </form> 84 </form>
103 </div> 85 </div>
104 - <div class="portlet-body">  
105 - <div class="table-container" id="table" style="margin-top: 0px;overflow:auto;min-width: 906px;">  
106 - <table class="table table-bordered table-hover table-checkable" id="forms">  
107 - <thead>  
108 -  
109 - </thead>  
110 - <tbody> 86 + <!-- <div class="portlet-body">
  87 + <div class="table-container" id="table" style="margin-top: 0px;overflow:auto;min-width: 906px;">
  88 + <table class="table table-bordered table-hover table-checkable" id="forms">
  89 + <thead>
111 90
  91 + </thead>
  92 + <tbody>
  93 +
  94 + </tbody>
  95 + </table>
  96 + <div style="text-align: right;">
  97 + <ul id="pagination" class="pagination"></ul>
  98 + </div>
  99 + </div>
  100 + </div>
  101 +
  102 + -->
  103 +
  104 +
  105 + <div id="left_div">
  106 + <div id="left_div1">
  107 + <table id="left_table1"></table>
  108 + </div>
  109 + <div id="left_div2">
  110 + <table id="left_table2"></table>
  111 + </div>
  112 + </div>
  113 + <div id="right_div">
  114 + <div style="overflow:auto;min-width: 906px;" id="staticfw" >
  115 + <div id="right_divx">
  116 + <table class="table table-bordered table-hover table-checkable" id="forms">
  117 + <tbody class="stx">
  118 + </tbody>
  119 + </table>
  120 + </div>
  121 + </div>
  122 + <div id="right_div2">
  123 + <table class="table table-bordered table-hover table-checkable" id="">
  124 + <tbody class="staticlfwy">
112 </tbody> 125 </tbody>
113 </table> 126 </table>
114 - <div style="text-align: right;">  
115 - <ul id="pagination" class="pagination"></ul> 127 + </div>
  128 + </div>
  129 +
  130 + <div id="left_divy">
  131 + <div id="left_div1y">
  132 + <table id="left_table1y"></table>
  133 + </div>
  134 + <div id="left_div2y">
  135 + <table id="left_table2y"></table>
  136 + </div>
  137 + </div>
  138 +
  139 + <div id="right_divy">
  140 + <div style="overflow:auto;min-width: 906px;" id="staticfwy" >
  141 + <div id="right_divxy">
  142 + <table class="table table-bordered table-hover table-checkable" id="fdx2">
  143 + <tbody class="stx">
  144 + </tbody>
  145 + </table>
116 </div> 146 </div>
117 </div> 147 </div>
  148 + <div class="table-container" style="overflow:auto;min-width: 906px;" id="right_div2y">
  149 + <table class="table table-bordered table-hover table-checkable" id="formsnc">
  150 + <tbody class="staticlfwync">
  151 + </tbody>
  152 + </table>
  153 + </div>
  154 +
118 </div> 155 </div>
119 </div> 156 </div>
120 </div> 157 </div>
@@ -122,6 +159,18 @@ @@ -122,6 +159,18 @@
122 159
123 <script> 160 <script>
124 $(function(){ 161 $(function(){
  162 +
  163 +
  164 +
  165 + var right_div2y = document.getElementById("right_div2y");
  166 + right_div2y.onscroll = function(){
  167 + var right_div2_topy = this.scrollTop;
  168 + var right_div2_lefty = this.scrollLeft;
  169 + document.getElementById("left_div2y").scrollTop = right_div2_topy;
  170 + document.getElementById("staticfw").scrollLeft = right_div2_lefty;
  171 + };
  172 +
  173 +
125 $('#export').attr('disabled', "true"); 174 $('#export').attr('disabled', "true");
126 175
127 // 关闭左侧栏 176 // 关闭左侧栏
@@ -365,6 +414,11 @@ @@ -365,6 +414,11 @@
365 var tbodyHtml = template('list_lbAnaly',{list:result, reason:reason, lb:lb}); 414 var tbodyHtml = template('list_lbAnaly',{list:result, reason:reason, lb:lb});
366 // 把渲染好的模版html文本追加到表格中 415 // 把渲染好的模版html文本追加到表格中
367 $('#forms').html(tbodyHtml); 416 $('#forms').html(tbodyHtml);
  417 + var tbodyHtml = template('list_lbAnaly2',{list:result, reason:reason, lb:lb});
  418 + // 把渲染好的模版html文本追加到表格中
  419 + $('#formsnc').html(tbodyHtml);
  420 +
  421 +
368 layer.close(i); 422 layer.close(i);
369 423
370 _w_table_rowspan("#forms", 1); 424 _w_table_rowspan("#forms", 1);
@@ -552,11 +606,11 @@ @@ -552,11 +606,11 @@
552 <thead> 606 <thead>
553 <tr> 607 <tr>
554 <th class="hidden"></th> 608 <th class="hidden"></th>
555 - <th rowspan="3" style=" width:120px;">日期</th>  
556 - <th rowspan="3">时段</th>  
557 - <th rowspan="3">公司</th>  
558 - <th rowspan="3">分公司</th>  
559 - <th rowspan="3">线路</th> 609 + <th rowspan="3" style="min-width: 80px;max-width: 80px;" width="80px" >日期</th>
  610 + <th rowspan="3" style="min-width: 80px;max-width: 80px;" width="80px">时段</th>
  611 + <th rowspan="3" style="min-width: 80px;max-width: 80px;" width="80px">公司</th>
  612 + <th rowspan="3" style="min-width: 80px;max-width: 80px;" width="80px">分公司</th>
  613 + <th rowspan="3" style="min-width: 80px;max-width: 80px;" width="80px">线路</th>
560 <th rowspan="2" colspan="3">总班次</th> 614 <th rowspan="2" colspan="3">总班次</th>
561 <th rowspan="2" colspan="3">总营运公里</th> 615 <th rowspan="2" colspan="3">总营运公里</th>
562 {{if lb != 0}} 616 {{if lb != 0}}
@@ -579,7 +633,7 @@ @@ -579,7 +633,7 @@
579 {{if reason[11].checked == true}}<th colspan="3">其他</th>{{/if}} 633 {{if reason[11].checked == true}}<th colspan="3">其他</th>{{/if}}
580 634
581 </tr> 635 </tr>
582 - <tr> 636 + <tr class="tk">
583 <th class="hidden"></th> 637 <th class="hidden"></th>
584 <th>计划</th><th>实际</th><th>百分比</th> 638 <th>计划</th><th>实际</th><th>百分比</th>
585 <th>计划</th><th>实际</th><th>百分比</th> 639 <th>计划</th><th>实际</th><th>百分比</th>
@@ -597,6 +651,8 @@ @@ -597,6 +651,8 @@
597 {{if reason[11].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}} 651 {{if reason[11].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
598 </tr> 652 </tr>
599 </thead> 653 </thead>
  654 +
  655 +<script type="text/html" id="list_lbAnaly2">
600 <tbody> 656 <tbody>
601 {{each list as obj i}} 657 {{each list as obj i}}
602 <tr> 658 <tr>
src/main/resources/static/pages/forms/statement/scheduleDaily.html
1 -<style type="text/css">  
2 - .table-bordered {  
3 - border: 1px solid; }  
4 - .table-bordered > thead > tr > th,  
5 - .table-bordered > thead > tr > td,  
6 - .table-bordered > tbody > tr > th,  
7 - .table-bordered > tbody > tr > td,  
8 - .table-bordered > tfoot > tr > th,  
9 - .table-bordered > tfoot > tr > td {  
10 - border: 1px solid;  
11 - text-align: center; }  
12 - .table-bordered > thead > tr > th,  
13 - .table-bordered > thead > tr > td {  
14 - border-bottom-width: 2px; }  
15 -  
16 - .table > tbody + tbody {  
17 - border-top: 1px solid; }  
18 - 1 +<link rel="stylesheet" type="text/css" href="css/scheduleDaily.css" />
19 2
20 -  
21 - #ddrbBody tr> td >span{  
22 - word-break: keep-all;white-space:nowrap;  
23 - }  
24 -</style>  
25 3
26 <div class="page-head" > 4 <div class="page-head" >
27 <div class="page-title"> 5 <div class="page-title">
@@ -58,7 +36,7 @@ @@ -58,7 +36,7 @@
58 </div> 36 </div>
59 </form> 37 </form>
60 </div> 38 </div>
61 - <div class="portlet-body" id="ddrbBody" style="overflow:auto;height: calc(100% - 80px)"> 39 + <div class="portlet-body" id="ddrbBody" style="overflow:auto;height: calc(100% - 40px)">
62 <div class="table-container" style="margin-top: 10px;min-width: 906px"> 40 <div class="table-container" style="margin-top: 10px;min-width: 906px">
63 <label>日期:<span id="rqxs"></span>&nbsp;&nbsp;&nbsp;&nbsp;早高峰:6:31~8:30&nbsp;&nbsp;&nbsp;&nbsp;晚高峰:16:01~18:00</label> 41 <label>日期:<span id="rqxs"></span>&nbsp;&nbsp;&nbsp;&nbsp;早高峰:6:31~8:30&nbsp;&nbsp;&nbsp;&nbsp;晚高峰:16:01~18:00</label>
64 <br/><label>计划+临加-少驶=<span id="jls"></span>&nbsp;&nbsp;计算机实驶:<span id="jsjss"></span></label> 42 <br/><label>计划+临加-少驶=<span id="jls"></span>&nbsp;&nbsp;计算机实驶:<span id="jsjss"></span></label>
@@ -218,56 +196,110 @@ @@ -218,56 +196,110 @@
218 <td colspan="40">&nbsp;</td> 196 <td colspan="40">&nbsp;</td>
219 </tr> 197 </tr>
220 </table> 198 </table>
221 - <table class="table table-bordered table-hover table-checkable" id="forms_2">  
222 - <tr>  
223 - <td rowspan="2">路牌</td>  
224 - <td colspan="2" rowspan="2" style="word-break: keep-all;white-space:nowrap;">起点站</td>  
225 - <td colspan="4">到达时间</td>  
226 - <td colspan="4">发车时间</td>  
227 - <td colspan="2" rowspan="2">备注</td>  
228 - <td rowspan="2">路牌</td>  
229 - <td colspan="2" rowspan="2" style="word-break: keep-all;white-space:nowrap;">起点站</td>  
230 - <td colspan="4">到达时间</td>  
231 - <td colspan="4">发车时间</td>  
232 - <td colspan="2" rowspan="2">备注</td>  
233 - <td rowspan="2">路牌</td>  
234 - <td colspan="2" rowspan="2" style="word-break: keep-all;white-space:nowrap;">起点站</td>  
235 - <td colspan="4">到达时间</td>  
236 - <td colspan="4">发车时间</td>  
237 - <td colspan="2" rowspan="2">备注</td>  
238 - <td>&nbsp;</td>  
239 - </tr>  
240 - <tr>  
241 - <td>应到</td>  
242 - <td>实到</td>  
243 - <td>快</td>  
244 - <td>慢</td>  
245 - <td>应发</td>  
246 - <td>实发</td>  
247 - <td>快</td>  
248 - <td>慢</td>  
249 - <td>应到</td>  
250 - <td>实到</td>  
251 - <td>快</td>  
252 - <td>慢</td>  
253 - <td>应发</td>  
254 - <td>实发</td>  
255 - <td>快</td>  
256 - <td>慢</td>  
257 - <td>应到</td>  
258 - <td>实到</td>  
259 - <td>快</td>  
260 - <td>慢</td>  
261 - <td>应发</td>  
262 - <td>实发</td>  
263 - <td>快</td>  
264 - <td>慢</td>  
265 - <td>&nbsp;</td>  
266 - </tr> 199 + <!-- <table class="table table-bordered table-hover table-checkable" id="forms_2">
  200 +
267 <tbody class="scheduleDaily_3"> 201 <tbody class="scheduleDaily_3">
268 202
269 - </tbody> 203 + </tbody>-->
270 </table> 204 </table>
  205 +
  206 +
  207 + <div id="left_div">
  208 + <div id="left_div1">
  209 + <table id="left_table1"></table>
  210 + </div>
  211 + <div id="left_div2">
  212 + <table id="left_table2"></table>
  213 + </div>
  214 + </div>
  215 + <div id="right_div">
  216 + <div style="overflow:auto;min-width: 906px;" id="staticfw" >
  217 + <div id="right_divx">
  218 + <table class="table table-bordered table-hover table-checkable" >
  219 + <tbody class="stx">
  220 + <tr>
  221 + <td rowspan="2">路牌</td>
  222 + <td colspan="2" rowspan="2" style="word-break: keep-all;white-space:nowrap;">起点站</td>
  223 + <td colspan="4">到达时间</td>
  224 + <td colspan="4">发车时间</td>
  225 + <td colspan="2" rowspan="2">备注</td>
  226 + <td rowspan="2">路牌</td>
  227 + <td colspan="2" rowspan="2" style="word-break: keep-all;white-space:nowrap;">起点站</td>
  228 + <td colspan="4">到达时间</td>
  229 + <td colspan="4">发车时间</td>
  230 + <td colspan="2" rowspan="2">备注</td>
  231 + <td rowspan="2">路牌</td>
  232 + <td colspan="2" rowspan="2" style="word-break: keep-all;white-space:nowrap;">起点站</td>
  233 + <td colspan="4">到达时间</td>
  234 + <td colspan="4">发车时间</td>
  235 + <td colspan="2" rowspan="2">备注</td>
  236 + <td>&nbsp;</td>
  237 + </tr>
  238 + <tr class="kfc">
  239 + <td>应到</td>
  240 + <td>实到</td>
  241 + <td>快</td>
  242 + <td>慢</td>
  243 + <td>应发</td>
  244 + <td>实发</td>
  245 + <td>快</td>
  246 + <td>慢</td>
  247 + <td>应到</td>
  248 + <td>实到</td>
  249 + <td>快</td>
  250 + <td>慢</td>
  251 + <td>应发</td>
  252 + <td>实发</td>
  253 + <td>快</td>
  254 + <td>慢</td>
  255 + <td>应到</td>
  256 + <td>实到</td>
  257 + <td>快</td>
  258 + <td>慢</td>
  259 + <td>应发</td>
  260 + <td>实发</td>
  261 + <td>快</td>
  262 + <td>慢</td>
  263 + <td>&nbsp;</td>
  264 + </tr>
  265 + </tbody>
  266 + </table>
  267 + </div>
  268 + </div>
  269 + <div id="right_div2">
  270 + <table class="table table-bordered table-hover table-checkable" >
  271 + <tbody class="staticlfwy">
  272 + </tbody>
  273 + </table>
  274 + </div>
  275 + </div>
  276 +
  277 + <div id="left_divy">
  278 + <div id="left_div1y">
  279 + <table id="left_table1y"></table>
  280 + </div>
  281 + <div id="left_div2y">
  282 + <table id="left_table2y"></table>
  283 + </div>
  284 + </div>
  285 +
  286 + <div id="right_divy">
  287 + <div style="overflow:auto;min-width: 906px;" id="staticfwy" >
  288 + <div id="right_divxy">
  289 + <table class="table table-bordered table-hover table-checkable" id="">
  290 + <tbody class="">
  291 + </tbody>
  292 + </table>
  293 + </div>
  294 + </div>
  295 + <div class="table-container" style="overflow:auto;min-width: 906px;" id="right_div2y">
  296 + <table class="table table-bordered table-hover table-checkable" id="forms_2">
  297 + <tbody class="scheduleDaily_3">
  298 + </tbody>
  299 + </table>
  300 + </div>
  301 +
  302 + </div>
271 </div> 303 </div>
272 </div> 304 </div>
273 <!-- </div> --> 305 <!-- </div> -->
@@ -276,6 +308,15 @@ @@ -276,6 +308,15 @@
276 308
277 <script> 309 <script>
278 $(function(){ 310 $(function(){
  311 +
  312 + var right_div2y = document.getElementById("right_div2y");
  313 + right_div2y.onscroll = function(){
  314 + var right_div2_topy = this.scrollTop;
  315 + var right_div2_lefty = this.scrollLeft;
  316 + document.getElementById("left_div2y").scrollTop = right_div2_topy;
  317 + document.getElementById("staticfw").scrollLeft = right_div2_lefty;
  318 + };
  319 +
279 // 关闭左侧栏 320 // 关闭左侧栏
280 if (!$('body').hasClass('page-sidebar-closed')) 321 if (!$('body').hasClass('page-sidebar-closed'))
281 $('.menu-toggler.sidebar-toggler').click(); 322 $('.menu-toggler.sidebar-toggler').click();
src/main/resources/static/pages/forms/statement/statisticsDaily.html
1 -<style type="text/css">  
2 - .table-bordered {  
3 - border: 1px solid; }  
4 - .table-bordered > thead > tr > th,  
5 - .table-bordered > thead > tr > td,  
6 - .table-bordered > tbody > tr > th,  
7 - .table-bordered > tbody > tr > td,  
8 - .table-bordered > tfoot > tr > th,  
9 - .table-bordered > tfoot > tr > td {  
10 - border: 1px solid; }  
11 - .table-bordered > thead > tr > th,  
12 - .table-bordered > thead > tr > td {  
13 - border-bottom-width: 2px; }  
14 -  
15 - .table > tbody + tbody {  
16 - border-top: 1px solid; }  
17 -  
18 - #forms > thead > tr> td >span{  
19 - width: 5px;  
20 - word-wrap: break-word;  
21 - letter-spacing: 20px;  
22 - }  
23 -  
24 - #forms > thead > tr> td >label{  
25 - word-break: keep-all;white-space:nowrap;  
26 - }  
27 -</style> 1 +<link rel="stylesheet" type="text/css" href="css/statisticsDaily.css" />
28 2
29 <div class="page-head"> 3 <div class="page-head">
30 <div class="page-title"> 4 <div class="page-title">
@@ -74,86 +48,135 @@ @@ -74,86 +48,135 @@
74 </div> 48 </div>
75 </form> 49 </form>
76 </div> 50 </div>
77 - <div class="portlet-body" id="tjrbBody" style="overflow:auto;height: calc(100% - 80px)">  
78 - <div class="table-container" style="margin-top: 10px;min-width: 906px">  
79 - <label>早高峰:6:31~8:30&nbsp;&nbsp;&nbsp;&nbsp;晚高峰:16:01~18:00</label>  
80 - <table class="table table-bordered table-hover table-checkable" id="forms">  
81 - <thead>  
82 - <tr>  
83 - <th colspan="45"><label id="tjrq"></label> 线路统计日报</th>  
84 - </tr>  
85 - <tr>  
86 - <td rowspan="3"><span >分公司</span></td>  
87 - <td rowspan="3"><span >路线名</span></td>  
88 - <td colspan="21">全日营运里程(公里)(注:实际营运里程、实际空驶里程、实际总里程均已包含临加里程)</td>  
89 - <td colspan="15">全日营运班次</td>  
90 - <td colspan="9">大间隔情况</td>  
91 - </tr>  
92 - <tr>  
93 - <td rowspan="2"><label>计划总</label>  
94 - <label>公里&nbsp;&nbsp;&nbsp;</label></td>  
95 - <td rowspan="2"><label>计划营</label><label>运公里</label></td>  
96 - <td rowspan="2"><label>计划空</label><label>驶公里</label></td>  
97 - <td rowspan="2"><label>实际</label><label>总公里</label></td>  
98 - <td rowspan="2"><label>实际营</label><label>运公里</label></td>  
99 - <td rowspan="2"><label>实际空</label><label>驶公里</label></td>  
100 - <td rowspan="2"><span>少驶公里</span></td>  
101 - <td rowspan="2"><span>少驶班次</span></td>  
102 - <td colspan="11">少驶原因(公里)</td>  
103 - <td colspan="2">临加公里</td>  
104 - <td colspan="3">计划班次</td>  
105 - <td colspan="3">实际班次</td>  
106 - <td colspan="3">临加班次</td>  
107 - <td colspan="3">放站班次</td>  
108 - <td colspan="3">调头班次</td>  
109 - <td colspan="3">发生次数</td>  
110 - <td rowspan="2">最大间隔时间(分)</td>  
111 - <td rowspan="2">原因</td>  
112 - </tr>  
113 - <tr>  
114 - <td><span >路阻</span></td>  
115 - <td><span>吊慢</span></td>  
116 - <td><span >故障</span></td>  
117 - <td><span >纠纷</span></td>  
118 - <td><span >肇事</span></td>  
119 - <td><span>缺人</span></td>  
120 - <td><span>缺车</span></td>  
121 - <td><span >客稀</span></td>  
122 - <td><span>气候</span></td>  
123 - <td><span>援外</span></td>  
124 - <td><span>其他</span></td>  
125 - <td><span>营运</span></td>  
126 - <td><span>空驶</span></td>  
127 - <td><span>全日</span></td>  
128 - <td><span>早高峰</span></td>  
129 - <td><span>晚高峰</span></td>  
130 - <td><span>全日</span></td>  
131 - <td><span>早高峰</span></td>  
132 - <td><span>晚高峰</span></td>  
133 - <td><span>全日</span></td>  
134 - <td><span>早高峰</span></td>  
135 - <td><span>晚高峰</span></td>  
136 - <td><span>全日</span></td>  
137 - <td><span>早高峰</span></td>  
138 - <td><span>晚高峰</span></td>  
139 - <td><span>全日</span></td>  
140 - <td><span>早高峰</span></td>  
141 - <td><span>晚高峰</span></td>  
142 - <td><span>全日</span></td>  
143 - <td><span>早高峰</span></td>  
144 - <td><span>晚高峰</span></td>  
145 - </tr>  
146 - </thead>  
147 - <tbody class="statisticsDaily">  
148 - 51 + <div id="left_div">
  52 + <div id="left_div1">
  53 + <table id="left_table1"></table>
  54 + </div>
  55 + <div id="left_div2">
  56 + <table id="left_table2"></table>
  57 + </div>
  58 + </div>
  59 + <div id="right_div">
  60 + <div style="overflow:auto;min-width: 906px;" id="staticfw" >
  61 + <div id="right_divx">
  62 + <table class="table table-bordered table-hover table-checkable" id="fdx">
  63 + <tbody class="stx">
  64 + <tr>
  65 + <th colspan="45"><label id="tjrq"></label> 线路统计日报</th>
  66 + </tr>
  67 + <tr>
  68 + <td rowspan="3" style="min-width: 80px;max-width: 80px;" width="100px"><span >分公司</span></td>
  69 + <td rowspan="3" style="min-width: 80px;max-width: 80px;" width="100px"><span >路线名</span></td>
  70 + <td colspan="21">全日营运里程(公里)(注:实际营运里程、实际空驶里程、实际总里程均已包含临加里程)</td>
  71 + <td colspan="15">全日营运班次</td>
  72 + <td colspan="9">大间隔情况</td>
  73 + </tr>
  74 + <tr>
  75 + <td rowspan="2" style="min-width: 80px;max-width: 80px;"width="80px"><label>计划总</label>
  76 + <label>公里&nbsp;&nbsp;&nbsp;</label></td>
  77 + <td rowspan="2" style="min-width: 80px;max-width: 80px;" width="80px"><label>计划营</label><label>运公里</label></td>
  78 + <td rowspan="2" style="min-width: 80px;max-width: 80px;" width="80px"><label>计划空</label><label>驶公里</label></td>
  79 + <td rowspan="2" style="min-width: 80px;max-width: 80px;" width="80px"><label>实际</label><label>总公里</label></td>
  80 + <td rowspan="2" style="min-width: 80px;max-width: 80px;" width="80px"><label>实际营</label><label>运公里</label></td>
  81 + <td rowspan="2" style="min-width: 80px;max-width: 80px;" width="80px"><label>实际空</label><label>驶公里</label></td>
  82 + <td rowspan="2" style="min-width: 80px;max-width: 80px;" width="80px"><span>少驶公里</span></td>
  83 + <td rowspan="2" style="min-width: 80px;max-width: 80px;" width="80px"><span>少驶班次</span></td>
  84 + <td colspan="11">少驶原因(公里)</td>
  85 + <td colspan="2">临加公里</td>
  86 + <td colspan="3">计划班次</td>
  87 + <td colspan="3">实际班次</td>
  88 + <td colspan="3">临加班次</td>
  89 + <td colspan="3">放站班次</td>
  90 + <td colspan="3">调头班次</td>
  91 + <td colspan="3">发生次数</td>
  92 + <td rowspan="2">最大间隔时间(分)</td>
  93 + <td rowspan="2">原因</td>
  94 + </tr>
  95 + <tr class="kfc">
  96 + <td style="min-width: 80px;max-width: 80px;"><span>路阻</span></td>
  97 + <td><span>吊慢</span></td>
  98 + <td><span>故障</span></td>
  99 + <td><span>纠纷</span></td>
  100 + <td><span>肇事</span></td>
  101 + <td><span>缺人</span></td>
  102 + <td><span>缺车</span></td>
  103 + <td><span>客稀</span></td>
  104 + <td><span>气候</span></td>
  105 + <td><span>援外</span></td>
  106 + <td><span>其他</span></td>
  107 + <td><span>营运</span></td>
  108 + <td><span>空驶</span></td>
  109 + <td><span>全日</span></td>
  110 + <td><span>早高峰</span></td>
  111 + <td><span>晚高峰</span></td>
  112 + <td><span>全日</span></td>
  113 + <td><span>早高峰</span></td>
  114 + <td><span>晚高峰</span></td>
  115 + <td><span>全日</span></td>
  116 + <td><span>早高峰</span></td>
  117 + <td><span>晚高峰</span></td>
  118 + <td><span>全日</span></td>
  119 + <td><span>早高峰</span></td>
  120 + <td><span>晚高峰</span></td>
  121 + <td><span>全日</span></td>
  122 + <td><span>早高峰</span></td>
  123 + <td><span>晚高峰</span></td>
  124 + <td><span>全日</span></td>
  125 + <td><span>早高峰</span></td>
  126 + <td><span>晚高峰</span></td>
  127 + </tr>
  128 + </tbody>
  129 + </table>
  130 + </div>
  131 + </div>
  132 + <div id="right_div2">
  133 + <table class="table table-bordered table-hover table-checkable" id="">
  134 + <tbody class="staticlfwy">
  135 + </tbody>
  136 + </table>
  137 + </div>
  138 + </div>
  139 +
  140 + <div id="left_divy">
  141 + <div id="left_div1y">
  142 + <table id="left_table1y"></table>
  143 + </div>
  144 + <div id="left_div2y">
  145 + <table id="left_table2y"></table>
  146 + </div>
  147 + </div>
  148 +
  149 + <div id="right_divy">
  150 + <div style="overflow:auto;min-width: 906px;" id="staticfwy" >
  151 + <div id="right_divxy">
  152 + <table class="table table-bordered table-hover table-checkable" id="fdx2">
  153 + <tbody class="stx">
149 </tbody> 154 </tbody>
150 </table> 155 </table>
151 </div> 156 </div>
152 </div> 157 </div>
  158 + <div class="table-container" style="overflow:auto;min-width: 906px;" id="right_div2y">
  159 + <table class="table table-bordered table-hover table-checkable" id="forms">
  160 + <tbody class="statisticsDaily">
  161 + </tbody>
  162 + </table>
  163 + </div>
  164 +
153 </div> 165 </div>
154 166
155 <script> 167 <script>
156 $(function(){ 168 $(function(){
  169 +
  170 +
  171 +
  172 + var right_div2y = document.getElementById("right_div2y");
  173 + right_div2y.onscroll = function(){
  174 + var right_div2_topy = this.scrollTop;
  175 + var right_div2_lefty = this.scrollLeft;
  176 + document.getElementById("left_div2y").scrollTop = right_div2_topy;
  177 + document.getElementById("staticfw").scrollLeft = right_div2_lefty;
  178 + };
  179 +
157 $('#export').attr('disabled', "true"); 180 $('#export').attr('disabled', "true");
158 181
159 // 关闭左侧栏 182 // 关闭左侧栏
src/main/resources/static/pages/forms/statement/waybill.html
1 -<style type="text/css">  
2 - .table-bordered {  
3 - border: 1px solid; }  
4 - .table-bordered > thead > tr > th,  
5 - .table-bordered > thead > tr > td,  
6 - .table-bordered > tbody > tr > th,  
7 - .table-bordered > tbody > tr > td,  
8 - .table-bordered > tfoot > tr > th,  
9 - .table-bordered > tfoot > tr > td {  
10 - border: 1px solid; }  
11 - .table-bordered > thead > tr > th,  
12 - .table-bordered > thead > tr > td {  
13 - border-bottom-width: 2px; }  
14 -  
15 - .table > tbody + tbody {  
16 - border-top: 1px solid; }  
17 -</style> 1 +<link rel="stylesheet" type="text/css" href="css/lbStatuAnaly.css" />
  2 +
18 3
19 <div class="page-head"> 4 <div class="page-head">
20 <div class="page-title"> 5 <div class="page-title">
@@ -71,7 +56,7 @@ @@ -71,7 +56,7 @@
71 </div> 56 </div>
72 </div> 57 </div>
73 <div class="col-md-9" id="printArea"> 58 <div class="col-md-9" id="printArea">
74 - <div class="table-container" id="xcld_height" style="margin-top: 10px;overflow:auto;min-width: 906px;"> 59 + <!-- <div class="table-container" id="xcld_height" style="margin-top: 10px;overflow:auto;min-width: 906px;">
75 <table class="table table-bordered table-checkable" id="forms"> 60 <table class="table table-bordered table-checkable" id="forms">
76 <tbody class="ludan_1"> 61 <tbody class="ludan_1">
77 62
@@ -86,7 +71,69 @@ @@ -86,7 +71,69 @@
86 71
87 </tbody> 72 </tbody>
88 </table> 73 </table>
  74 + </div>-->
  75 +
  76 +
  77 + <div id="left_div">
  78 + <div id="left_div1">
  79 + <table id="left_table1"></table>
  80 + </div>
  81 + <div id="left_div2">
  82 + <table id="left_table2"></table>
  83 + </div>
  84 + </div>
  85 + <div id="right_div">
  86 + <div style="overflow:auto;min-width: 906px;" id="staticfw" >
  87 + <div id="right_divx">
  88 + <table class="table table-bordered table-hover table-checkable" id="forms">
  89 + <tbody class="ludan_1">
  90 +
  91 + </tbody>
  92 + </table>
  93 + </div>
  94 + </div>
  95 + <div id="right_div2">
  96 + <table class="table table-bordered table-hover table-checkable" id="">
  97 + <tbody class="staticlfwy">
  98 + </tbody>
  99 + </table>
  100 + </div>
  101 + </div>
  102 +
  103 + <div id="left_divy">
  104 + <div id="left_div1y">
  105 + <table id="left_table1y"></table>
  106 + </div>
  107 + <div id="left_div2y">
  108 + <table id="left_table2y"></table>
  109 + </div>
  110 + </div>
  111 +
  112 + <div id="right_divy">
  113 + <div style="overflow:auto;min-width: 906px;" id="staticfwy" >
  114 + <div id="right_divxy">
  115 + <table class="table table-bordered table-hover table-checkable" id="fdx2">
  116 + <tbody class="stx">
  117 + </tbody>
  118 + </table>
  119 + </div>
  120 + </div>
  121 + <div class="table-container" style="overflow:auto;min-width: 906px;" id="right_div2y">
  122 + <table class="table table-bordered table-hover table-checkable" id="formsnc">
  123 + <tbody class="ludan_2">
  124 +
  125 + </tbody>
  126 + <tbody class="ludan_3">
  127 +
  128 + </tbody>
  129 + <tbody class="ludan_4">
  130 +
  131 + </tbody>
  132 + </table>
  133 + </div>
  134 +
89 </div> 135 </div>
  136 +
90 </div> 137 </div>
91 </div> 138 </div>
92 </div> 139 </div>
@@ -318,11 +365,11 @@ @@ -318,11 +365,11 @@
318 getTime(result); 365 getTime(result);
319 var ludan_2 = template('ludan_2',{list:result}); 366 var ludan_2 = template('ludan_2',{list:result});
320 // 把渲染好的模版html文本追加到表格中 367 // 把渲染好的模版html文本追加到表格中
321 - $('#forms .ludan_2').html(ludan_2); 368 + $('#formsnc .ludan_2').html(ludan_2);
322 }); 369 });
323 $get('/realSchedule/findKMBC',{jGh:jGh,clZbh:params[1],lpName:params[2],date:date,line:line},function(result){ 370 $get('/realSchedule/findKMBC',{jGh:jGh,clZbh:params[1],lpName:params[2],date:date,line:line},function(result){
324 var ludan_3 = template('ludan_3',result); 371 var ludan_3 = template('ludan_3',result);
325 - $('#forms .ludan_3').html(ludan_3); 372 + $('#formsnc .ludan_3').html(ludan_3);
326 $("#info tbody tr").css('background-color', ''); 373 $("#info tbody tr").css('background-color', '');
327 obj.css('background-color', '#99CCFF'); 374 obj.css('background-color', '#99CCFF');
328 }); 375 });
src/main/resources/static/pages/mforms/singledatas/singledata.html
@@ -15,6 +15,29 @@ @@ -15,6 +15,29 @@
15 15
16 .table > tbody + tbody { 16 .table > tbody + tbody {
17 border-top: 1px solid; } 17 border-top: 1px solid; }
  18 +
  19 + .table-body{width:100%; height:94vh;overflow-y:scroll;}
  20 + .table-head table,.table-body table{width:100%;}
  21 + .table-container{
  22 + overflow-y:scroll;height: 540px; width: 100%;
  23 + }
  24 + .kwy td{
  25 +
  26 + width: 6.6%;
  27 + }
  28 + .kw th{
  29 + width: 6.6%;
  30 + }
  31 + .kw{
  32 + width: 98%;
  33 + margin-top: 10px;
  34 + overflow:auto;
  35 + min-width: 600px
  36 + }
  37 + .kwy{
  38 + margin-top:-20px; overflow:auto;min-width: 906px ;width: 99%
  39 + }
  40 +
18 </style> 41 </style>
19 42
20 <div class="page-head"> 43 <div class="page-head">
@@ -69,8 +92,8 @@ @@ -69,8 +92,8 @@
69 </form> 92 </form>
70 </div> 93 </div>
71 <div class="portlet-body"> 94 <div class="portlet-body">
72 - <div class="table-container" style="margin-top: 10px;overflow:auto;min-width: 906px">  
73 - <table class="table table-bordered table-hover table-checkable" id="forms"> 95 + <div class="kw" style="margin-top: 10px;overflow:auto;min-width: 906px">
  96 + <table class="table table-bordered table-hover table-checkable" id="">
74 <thead> 97 <thead>
75 <tr> 98 <tr>
76 <th>序号</th> 99 <th>序号</th>
@@ -90,10 +113,17 @@ @@ -90,10 +113,17 @@
90 <th>计划公里</th> 113 <th>计划公里</th>
91 </tr> 114 </tr>
92 </thead> 115 </thead>
  116 + </table>
  117 + </div>
  118 + <div class="table-container kwy" >
  119 + <table class="table table-bordered table-hover table-checkable" id="forms">
93 <tbody> 120 <tbody>
94 - 121 +
95 </tbody> 122 </tbody>
96 </table> 123 </table>
  124 + <div style="text-align: right;">
  125 + <ul id="pagination" class="pagination"></ul>
  126 + </div>
97 </div> 127 </div>
98 </div> 128 </div>
99 </div> 129 </div>
src/main/resources/static/pages/scheduleApp/Gruntfile.js
@@ -119,6 +119,7 @@ module.exports = function (grunt) { @@ -119,6 +119,7 @@ module.exports = function (grunt) {
119 'module/core/scheduleRuleManage/route.js', // 排班规则管理模块 119 'module/core/scheduleRuleManage/route.js', // 排班规则管理模块
120 'module/core/ttInfoManage/route.js', // 时刻表管理模块 120 'module/core/ttInfoManage/route.js', // 时刻表管理模块
121 'module/core/ttInfoManage/detailedit/route.js', // 时刻表明细管理模块 121 'module/core/ttInfoManage/detailedit/route.js', // 时刻表明细管理模块
  122 + "module/sys/userSignManage/route.js", // 用户登录日志管理模块
122 'module/core/ttInfoManage2/route.js' // 智能时刻表管理模块 123 'module/core/ttInfoManage2/route.js' // 智能时刻表管理模块
123 ], 124 ],
124 dest: 'module/common/prj-common-ui-route-state.js' 125 dest: 'module/common/prj-common-ui-route-state.js'
@@ -139,6 +140,7 @@ module.exports = function (grunt) { @@ -139,6 +140,7 @@ module.exports = function (grunt) {
139 'module/core/schedulePlanManage/service.js', // 排班计划管理service 140 'module/core/schedulePlanManage/service.js', // 排班计划管理service
140 'module/core/scheduleRuleManage/service.js', // 排班规则管理service 141 'module/core/scheduleRuleManage/service.js', // 排班规则管理service
141 'module/core/ttInfoManage/service.js', // 时刻表管理service 142 'module/core/ttInfoManage/service.js', // 时刻表管理service
  143 + "module/sys/userSignManage/service.js", // 用户登录日志管理service
142 'module/common/prj-common-globalservice-legacy.js' // 其他用service 144 'module/common/prj-common-globalservice-legacy.js' // 其他用service
143 ], 145 ],
144 dest: 'module/common/prj-common-globalservice.js' 146 dest: 'module/common/prj-common-globalservice.js'
src/main/resources/static/pages/scheduleApp/module/common/prj-common-globalservice.js
1 -//所有模块service配置 1 +//所有模块service配置
2 // 车辆信息service 2 // 车辆信息service
3 angular.module('ScheduleApp').factory( 3 angular.module('ScheduleApp').factory(
4 'BusInfoManageService_g', 4 'BusInfoManageService_g',
@@ -79,7 +79,7 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -79,7 +79,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(
79 79
80 } 80 }
81 ] 81 ]
82 -); 82 +);
83 // 车辆设备信息service 83 // 车辆设备信息service
84 angular.module('ScheduleApp').factory('DeviceInfoManageService_g', ['$resource', function($resource) { 84 angular.module('ScheduleApp').factory('DeviceInfoManageService_g', ['$resource', function($resource) {
85 return $resource( 85 return $resource(
@@ -119,7 +119,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;DeviceInfoManageService_g&#39;, [&#39;$resource&#39;, @@ -119,7 +119,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;DeviceInfoManageService_g&#39;, [&#39;$resource&#39;,
119 } 119 }
120 } 120 }
121 ); 121 );
122 -}]); 122 +}]);
123 // 人员信息service 123 // 人员信息service
124 angular.module('ScheduleApp').factory( 124 angular.module('ScheduleApp').factory(
125 'EmployeeInfoManageService_g', 125 'EmployeeInfoManageService_g',
@@ -183,7 +183,7 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -183,7 +183,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(
183 } 183 }
184 ] 184 ]
185 ); 185 );
186 - 186 +
187 // 车辆配置service 187 // 车辆配置service
188 angular.module('ScheduleApp').factory('BusConfigService_g', ['$resource', 'UserPrincipal', function($resource, UserPrincipal) { 188 angular.module('ScheduleApp').factory('BusConfigService_g', ['$resource', 'UserPrincipal', function($resource, UserPrincipal) {
189 return { 189 return {
@@ -238,7 +238,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusConfigService_g&#39;, [&#39;$resource&#39;, &#39;UserP @@ -238,7 +238,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusConfigService_g&#39;, [&#39;$resource&#39;, &#39;UserP
238 } 238 }
239 ) 239 )
240 }; 240 };
241 -}]); 241 +}]);
242 // 线路运营统计service 242 // 线路运营统计service
243 angular.module('ScheduleApp').factory('BusLineInfoStatService_g', ['$resource', function($resource) { 243 angular.module('ScheduleApp').factory('BusLineInfoStatService_g', ['$resource', function($resource) {
244 return $resource( 244 return $resource(
@@ -254,7 +254,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusLineInfoStatService_g&#39;, [&#39;$resource&#39;, @@ -254,7 +254,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;BusLineInfoStatService_g&#39;, [&#39;$resource&#39;,
254 } 254 }
255 ); 255 );
256 }]); 256 }]);
257 - 257 +
258 // 人员配置service 258 // 人员配置service
259 angular.module('ScheduleApp').factory('EmployeeConfigService_g', ['$resource', function($resource) { 259 angular.module('ScheduleApp').factory('EmployeeConfigService_g', ['$resource', function($resource) {
260 return { 260 return {
@@ -338,7 +338,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeConfigService_g&#39;, [&#39;$resource&#39;, f @@ -338,7 +338,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;EmployeeConfigService_g&#39;, [&#39;$resource&#39;, f
338 } 338 }
339 ) 339 )
340 }; 340 };
341 -}]); 341 +}]);
342 // 路牌管理service 342 // 路牌管理service
343 angular.module('ScheduleApp').factory('GuideboardManageService_g', ['$resource', function($resource) { 343 angular.module('ScheduleApp').factory('GuideboardManageService_g', ['$resource', function($resource) {
344 return { 344 return {
@@ -411,7 +411,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;GuideboardManageService_g&#39;, [&#39;$resource&#39;, @@ -411,7 +411,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;GuideboardManageService_g&#39;, [&#39;$resource&#39;,
411 } 411 }
412 ) 412 )
413 }; 413 };
414 -}]); 414 +}]);
415 // 套跑管理service 415 // 套跑管理service
416 angular.module('ScheduleApp').factory('rerunManageService_g', ['$resource', function($resource) { 416 angular.module('ScheduleApp').factory('rerunManageService_g', ['$resource', function($resource) {
417 return { 417 return {
@@ -453,7 +453,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;rerunManageService_g&#39;, [&#39;$resource&#39;, func @@ -453,7 +453,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;rerunManageService_g&#39;, [&#39;$resource&#39;, func
453 } 453 }
454 ) 454 )
455 }; 455 };
456 -}]); 456 +}]);
457 // 排班计划管理service 457 // 排班计划管理service
458 angular.module('ScheduleApp').factory('SchedulePlanManageService_g', ['$resource', function($resource) { 458 angular.module('ScheduleApp').factory('SchedulePlanManageService_g', ['$resource', function($resource) {
459 return { 459 return {
@@ -621,7 +621,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;SchedulePlanInfoManageService_g&#39;, [&#39;$reso @@ -621,7 +621,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;SchedulePlanInfoManageService_g&#39;, [&#39;$reso
621 621
622 622
623 }; 623 };
624 -}]); 624 +}]);
625 // 排班管理service 625 // 排班管理service
626 angular.module('ScheduleApp').factory('ScheduleRuleManageService_g', ['$resource', function($resource) { 626 angular.module('ScheduleApp').factory('ScheduleRuleManageService_g', ['$resource', function($resource) {
627 return { 627 return {
@@ -680,7 +680,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;ScheduleRuleManageService_g&#39;, [&#39;$resource @@ -680,7 +680,7 @@ angular.module(&#39;ScheduleApp&#39;).factory(&#39;ScheduleRuleManageService_g&#39;, [&#39;$resource
680 ) 680 )
681 }; 681 };
682 }]); 682 }]);
683 - 683 +
684 // 时刻表管理service 684 // 时刻表管理service
685 angular.module('ScheduleApp').factory( 685 angular.module('ScheduleApp').factory(
686 'TTInfoManageService_g', 686 'TTInfoManageService_g',
@@ -898,7 +898,57 @@ angular.module(&#39;ScheduleApp&#39;).factory( @@ -898,7 +898,57 @@ angular.module(&#39;ScheduleApp&#39;).factory(
898 } 898 }
899 899
900 ] 900 ]
901 -); 901 +);
  902 +
  903 +// 用户登录日志service
  904 +angular.module('ScheduleApp').factory(
  905 + "UserSignManageService_g",
  906 + [
  907 + '$resource',
  908 + function($resource) {
  909 + return {
  910 + rest: $resource(
  911 + "/logger_user_sign/:id",
  912 + {id: '@id'},
  913 + {
  914 + list: {
  915 + method: 'GET',
  916 + params: {
  917 + page: 0
  918 + },
  919 + transformResponse: function(rs) {
  920 + var dst = angular.fromJson(rs);
  921 + if (dst.status == 'SUCCESS') {
  922 + return dst.data;
  923 + } else {
  924 + return dst; // 业务错误留给控制器处理
  925 + }
  926 + }
  927 + }
  928 + }
  929 + ),
  930 + dataTools: $resource(
  931 + '/logger_user_sign/:type',
  932 + {},
  933 + {
  934 + dataExport: {
  935 + method: 'GET',
  936 + responseType: "arraybuffer",
  937 + params: {
  938 + type: "exportFile"
  939 + },
  940 + transformResponse: function(data, headers){
  941 + return {data : data};
  942 + }
  943 + }
  944 + }
  945 + )
  946 + };
  947 + }
  948 + ]
  949 +);
  950 +
  951 +
902 // 项目通用的全局service服务,供不同的controller使用,自定义指令不使用 952 // 项目通用的全局service服务,供不同的controller使用,自定义指令不使用
903 953
904 // 文件下载服务 954 // 文件下载服务
src/main/resources/static/pages/scheduleApp/module/common/prj-common-ui-route-state.js
@@ -91,7 +91,7 @@ ScheduleApp.config([ @@ -91,7 +91,7 @@ ScheduleApp.config([
91 } 91 }
92 }) 92 })
93 } 93 }
94 -]); 94 +]);
95 // ui route 配置 95 // ui route 配置
96 96
97 /** 车辆设备信息模块配置route */ 97 /** 车辆设备信息模块配置route */
@@ -185,7 +185,7 @@ ScheduleApp.config([ @@ -185,7 +185,7 @@ ScheduleApp.config([
185 }) 185 })
186 186
187 } 187 }
188 -]); 188 +]);
189 // ui route 配置 189 // ui route 配置
190 190
191 /** 人员基础信息模块配置route */ 191 /** 人员基础信息模块配置route */
@@ -279,7 +279,7 @@ ScheduleApp.config([ @@ -279,7 +279,7 @@ ScheduleApp.config([
279 } 279 }
280 }) 280 })
281 281
282 -}]); 282 +}]);
283 // ui route 配置 283 // ui route 配置
284 284
285 /** 车辆配置模块页面route */ 285 /** 车辆配置模块页面route */
@@ -376,7 +376,7 @@ ScheduleApp.config([ @@ -376,7 +376,7 @@ ScheduleApp.config([
376 ]); 376 ]);
377 377
378 378
379 - 379 +
380 // ui route 配置 380 // ui route 配置
381 381
382 /** 线路运营概览配置route */ 382 /** 线路运营概览配置route */
@@ -413,7 +413,7 @@ ScheduleApp.config([ @@ -413,7 +413,7 @@ ScheduleApp.config([
413 }); 413 });
414 414
415 } 415 }
416 -]); 416 +]);
417 // ui route 配置 417 // ui route 配置
418 418
419 /** 人员配置模块页面route */ 419 /** 人员配置模块页面route */
@@ -508,7 +508,7 @@ ScheduleApp.config([ @@ -508,7 +508,7 @@ ScheduleApp.config([
508 }) 508 })
509 509
510 } 510 }
511 -]); 511 +]);
512 // ui route 配置 512 // ui route 配置
513 513
514 /** 路牌管理配置所有模块页面route */ 514 /** 路牌管理配置所有模块页面route */
@@ -603,7 +603,7 @@ ScheduleApp.config([ @@ -603,7 +603,7 @@ ScheduleApp.config([
603 }) 603 })
604 604
605 605
606 -}]); 606 +}]);
607 // ui route 配置 607 // ui route 配置
608 608
609 /** 套跑管理模块配置页面route */ 609 /** 套跑管理模块配置页面route */
@@ -696,7 +696,7 @@ ScheduleApp.config([ @@ -696,7 +696,7 @@ ScheduleApp.config([
696 } 696 }
697 }) 697 })
698 } 698 }
699 -]); 699 +]);
700 // ui route 配置 700 // ui route 配置
701 701
702 /** 排班计划管理配置route */ 702 /** 排班计划管理配置route */
@@ -758,7 +758,7 @@ ScheduleApp.config([ @@ -758,7 +758,7 @@ ScheduleApp.config([
758 758
759 759
760 } 760 }
761 -]); 761 +]);
762 // ui route 配置 762 // ui route 配置
763 763
764 /** 排班计划明细配置route */ 764 /** 排班计划明细配置route */
@@ -814,7 +814,7 @@ ScheduleApp.config([ @@ -814,7 +814,7 @@ ScheduleApp.config([
814 }); 814 });
815 815
816 } 816 }
817 -]); 817 +]);
818 // ui route 配置 818 // ui route 配置
819 819
820 /** 排班调度值勤日报配置route */ 820 /** 排班调度值勤日报配置route */
@@ -876,7 +876,7 @@ ScheduleApp.config([ @@ -876,7 +876,7 @@ ScheduleApp.config([
876 }); 876 });
877 877
878 } 878 }
879 -]); 879 +]);
880 // ui route 配置 880 // ui route 配置
881 881
882 /** 排班调度值勤日报配置route */ 882 /** 排班调度值勤日报配置route */
@@ -934,7 +934,7 @@ ScheduleApp.config([ @@ -934,7 +934,7 @@ ScheduleApp.config([
934 }); 934 });
935 935
936 } 936 }
937 -]); 937 +]);
938 // ui route 配置 938 // ui route 配置
939 939
940 /** 排班规则模块配置route */ 940 /** 排班规则模块配置route */
@@ -1028,7 +1028,7 @@ ScheduleApp.config([ @@ -1028,7 +1028,7 @@ ScheduleApp.config([
1028 } 1028 }
1029 }) 1029 })
1030 } 1030 }
1031 -]); 1031 +]);
1032 // ui route 配置 1032 // ui route 配置
1033 1033
1034 /** 时刻表管理配置route */ 1034 /** 时刻表管理配置route */
@@ -1140,7 +1140,7 @@ ScheduleApp.config([ @@ -1140,7 +1140,7 @@ ScheduleApp.config([
1140 1140
1141 1141
1142 } 1142 }
1143 -]); 1143 +]);
1144 // ui route 配置 1144 // ui route 配置
1145 1145
1146 /** 时刻表编辑管理配置route */ 1146 /** 时刻表编辑管理配置route */
@@ -1287,9 +1287,47 @@ ScheduleApp.config([ @@ -1287,9 +1287,47 @@ ScheduleApp.config([
1287 ; 1287 ;
1288 1288
1289 } 1289 }
1290 -]); 1290 +]);
  1291 +// ui route 配置
  1292 +
  1293 +
  1294 +/** 用户登录日志模块配置route */
  1295 +ScheduleApp.config([
  1296 + '$stateProvider',
  1297 + '$urlRouterProvider',
  1298 + function($stateProvider, $urlRouterProvider) {
  1299 + $stateProvider
  1300 + .state("userSignManage", { // index页面
  1301 + url: "/userSignManage",
  1302 + views: {
  1303 + "": {
  1304 + templateUrl: "pages/scheduleApp/module/sys/userSignManage/index.html"
  1305 + },
  1306 + "userSignManage_list@userSignManage": {
  1307 + templateUrl: "pages/scheduleApp/module/sys/userSignManage/list.html"
  1308 + }
  1309 + },
  1310 +
  1311 + resolve: {
  1312 + deps: ["$ocLazyLoad", function($ocLazyLoad) {
  1313 + return $ocLazyLoad.load({
  1314 + name: 'userSignManage_module',
  1315 + insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置
  1316 + files: [
  1317 + "assets/bower_components/angular-ui-select/dist/select.min.css",
  1318 + "assets/bower_components/angular-ui-select/dist/select.min.js",
  1319 + "assets/bower_components/angular-file-upload/dist/angular-file-upload.min.js",
  1320 + "pages/scheduleApp/module/sys/userSignManage/module.js"
  1321 + ]
  1322 + });
  1323 + }]
  1324 + }
  1325 + })
  1326 + }
  1327 +]);
1291 // ui route 配置 1328 // ui route 配置
1292 1329
  1330 +
1293 /** 时刻表管理配置route */ 1331 /** 时刻表管理配置route */
1294 ScheduleApp.config([ 1332 ScheduleApp.config([
1295 '$stateProvider', 1333 '$stateProvider',
src/main/resources/static/pages/scheduleApp/module/core/schedulePlanManage/newest/list_newest.html
@@ -163,7 +163,6 @@ @@ -163,7 +163,6 @@
163 last: '<li class="last"><a href="javascript:void(0);">尾页<\/a><\/li>', 163 last: '<li class="last"><a href="javascript:void(0);">尾页<\/a><\/li>',
164 page: '<li class="page"><a href="javascript:void(0);">{{page}}<\/a><\/li>', 164 page: '<li class="page"><a href="javascript:void(0);">{{page}}<\/a><\/li>',
165 onPageChange: function (num, type) { 165 onPageChange: function (num, type) {
166 - debugger;  
167 if(initPagination){ 166 if(initPagination){
168 initPagination = false; 167 initPagination = false;
169 return; 168 return;
src/main/resources/static/pages/scheduleApp/module/sys/userSignManage/index.html 0 → 100644
  1 +<div class="page-head">
  2 + <div class="page-title">
  3 + <h1>用户登录日志管理</h1>
  4 + </div>
  5 +</div>
  6 +
  7 +<ul class="page-breadcrumb breadcrumb">
  8 + <li>
  9 + <a href="/pages/home.html" data-pjax>首页</a>
  10 + <i class="fa fa-circle"></i>
  11 + </li>
  12 + <li>
  13 + <span class="active">权限管理</span>
  14 + <i class="fa fa-circle"></i>
  15 + </li>
  16 + <li>
  17 + <span class="active">用户登录日志管理</span>
  18 + </li>
  19 +</ul>
  20 +
  21 +<div class="row">
  22 + <div class="col-md-12" ng-controller="UserSignManageCtrl as ctrl">
  23 + <style>
  24 + .dropdown-menu {
  25 + border-color: #32c5d2;
  26 + }
  27 + .btn-group > .dropdown-menu:before {
  28 + border-bottom-color: #32c5d2;
  29 + }
  30 + </style>
  31 +
  32 + <div class="portlet light bordered">
  33 + <div class="portlet-title">
  34 + <div class="caption font-dark">
  35 + <i class="fa fa-database font-dark"></i>
  36 + <span class="caption-subject bold uppercase">用户登录日志</span>
  37 + </div>
  38 + <div class="actions">
  39 +
  40 + <div class="btn-group">
  41 + <a href="javascript:" class="btn red btn-outline" data-toggle="dropdown">
  42 + <i class="fa fa-share"></i>
  43 + <span>数据工具</span>
  44 + <i class="fa fa-angle-down"></i>
  45 + </a>
  46 + <ul class="dropdown-menu pull-right">
  47 +
  48 + <li>
  49 + <a href="javascript:" class="tool-action" ng-click="ctrl.exportData()">
  50 + <i class="fa fa-file-excel-o"></i>
  51 + 导出excel
  52 + </a>
  53 + </li>
  54 +
  55 + </ul>
  56 + </div>
  57 + </div>
  58 + </div>
  59 +
  60 + <div class="portlet-body">
  61 + <div ui-view="userSignManage_list"></div>
  62 + </div>
  63 + </div>
  64 + </div>
  65 +</div>
0 \ No newline at end of file 66 \ No newline at end of file
src/main/resources/static/pages/scheduleApp/module/sys/userSignManage/list.html 0 → 100644
  1 +<!-- ui-route userLoginManage_list -->
  2 +<div ng-controller="UserSignManageListCtrl as ctrl">
  3 + <div class="fixDiv">
  4 + <table class="table fixTable table-striped table-bordered table-hover table-checkable order-column">
  5 + <thead>
  6 + <tr role="row" class="heading">
  7 + <th style="width:70px;">序号</th>
  8 + <th style="width: 150px;">登录用户名</th>
  9 + <th style="width: 150px;">实际用户名</th>
  10 + <th style="width: 450px;">登入/登出时间</th>
  11 + <th >操作</th>
  12 + </tr>
  13 + <tr role="row" class="filter">
  14 + <td></td>
  15 + <td>
  16 + <input type="text" class="form-control form-filter input-sm" ng-model="ctrl.searchCondition().logName_like" placeholder="输入登录用户名..."/>
  17 + </td>
  18 + <td>
  19 + <input type="text" class="form-control form-filter input-sm" ng-model="ctrl.searchCondition().realName_like" placeholder="输入实际用户名..."/>
  20 + </td>
  21 +
  22 + <td>
  23 + <div class="input-group" style="width:220px;">
  24 + <input type="text" class="form-control input-sm"
  25 + name="statFromDateTime" placeholder="选择日期..."
  26 + uib-datepicker-popup="yyyy-MM-dd"
  27 + is-open="ctrl.statFromDateTime_open"
  28 + ng-model="ctrl.statFromDateWithConditionGetSetFun"
  29 + ng-model-options="{ getterSetter: true }" readonly/>
  30 + <span class="input-group-btn">
  31 + <button type="button" class="btn btn-default btn-sm" ng-click="ctrl.statFromDateTime_open_fun()">
  32 + <i class="glyphicon glyphicon-calendar"></i>
  33 + </button>
  34 + </span>
  35 + </div>
  36 +
  37 + </td>
  38 +
  39 + <td>
  40 + <button class="btn btn-sm green btn-outline filter-submit margin-bottom" style="margin-right: 0;"
  41 + ng-click="ctrl.doPage()">
  42 + <i class="fa fa-search"></i>
  43 + 搜索
  44 + </button>
  45 +
  46 + <button class="btn btn-sm red btn-outline filter-cancel"
  47 + ng-click="ctrl.reset()">
  48 + <i class="fa fa-times"></i>
  49 + 重置
  50 + </button>
  51 +
  52 + </td>
  53 +
  54 + </tr>
  55 + </thead>
  56 + <tbody>
  57 + <tr ng-repeat="info in ctrl.page()['content']" class="odd gradeX">
  58 + <td>
  59 + <div>
  60 + <a href="#">
  61 + <i class="fa fa-list-ol" aria-hidden="true"></i>
  62 + {{$index + ctrl.page().number * 10 + 1}}
  63 + </a>
  64 + </div>
  65 + </td>
  66 + <td>
  67 + <span ng-bind="info.logName"></span>
  68 + </td>
  69 + <td>
  70 + <span ng-bind="info.realName"></span>
  71 + </td>
  72 + <td>
  73 + <div style="float: left; width:200px; padding-right: 20px;">
  74 + <a href="#">
  75 + <i class="fa fa-sign-in" aria-hidden="true"></i>
  76 + 登入&nbsp;<span ng-bind="info.logInDateTime | date: 'yyyy-MM-dd HH:mm:ss'"></span>
  77 + </a>
  78 + </div>
  79 + <div style="float: left;">
  80 + <a href="#">
  81 + <i class="fa fa-sign-out" aria-hidden="true"></i>
  82 + 登出&nbsp;<span ng-bind="info.logOutDateTime | date: 'yyyy-MM-dd HH:mm:ss'"></span>
  83 + </a>
  84 + </div>
  85 + </td>
  86 +
  87 + <td></td>
  88 + </tr>
  89 + </tbody>
  90 + </table>
  91 + </div>
  92 +
  93 + <div class="pageBar">
  94 + <div class="pageBarLeft">
  95 + {{'显示从' + ctrl.page()['uiFromRecord'] + '到' + ctrl.page()['uiToRecord'] + ' 共' + ctrl.page()['totalElements'] + '条' + ' 每页显示10条'}}
  96 + </div>
  97 +
  98 + <div class="pageBarRight">
  99 + <uib-pagination total-items="ctrl.page()['totalElements']"
  100 + ng-model="ctrl.page()['uiNumber']"
  101 + ng-change="ctrl.doPage()"
  102 + rotate="false"
  103 + max-size="10"
  104 + boundary-links="true"
  105 + first-text="首页"
  106 + previous-text="上一页"
  107 + next-text="下一页"
  108 + last-text="尾页">
  109 + </uib-pagination>
  110 + </div>
  111 + </div>
  112 +
  113 +</div>
src/main/resources/static/pages/scheduleApp/module/sys/userSignManage/module.js 0 → 100644
  1 +// 用户登录日志管理
  2 +
  3 +angular.module('ScheduleApp').factory(
  4 + 'UserSignManageService',
  5 + [
  6 + 'UserSignManageService_g',
  7 + function(service) {
  8 + /** 当前的查询条件信息 */
  9 + var currentSearchCondition = {
  10 + page: 0,
  11 + "logName_like" : "",
  12 + "realName_like" : ""
  13 + };
  14 + // 当前查询返回的信息
  15 + var currentPage = { // 后台spring data返回的格式
  16 + totalElements: 0,
  17 + number: 0, // 后台返回的页码,spring返回从0开始
  18 + content: [],
  19 +
  20 + uiNumber: 1, // 页面绑定的页码
  21 + uiFromRecord: 0, // 页面绑定,当前页第几条记录
  22 + uiToRecord: 0 // 页面绑定,当前页到第几条记录
  23 + };
  24 +
  25 + // 查询对象
  26 + var queryClass = service.rest;
  27 +
  28 + return {
  29 + getQueryClass: function() {
  30 + return queryClass;
  31 + },
  32 + /**
  33 + * 获取查询条件信息,
  34 + * 用于给controller用来和页面数据绑定。
  35 + */
  36 + getSearchCondition: function() {
  37 + currentSearchCondition.page = currentPage.uiNumber - 1;
  38 + return currentSearchCondition;
  39 + },
  40 + /**
  41 + * 组装查询参数,返回一个promise查询结果。
  42 + * @param params 查询参数
  43 + * @return 返回一个 promise
  44 + */
  45 + getPage: function(page) {
  46 + if (page) {
  47 + currentPage.totalElements = page.totalElements;
  48 + currentPage.number = page.number;
  49 + currentPage.content = page.content;
  50 +
  51 + // 计算当前页开始记录,结束记录
  52 + if (page.numberOfElements && page.numberOfElements > 0) {
  53 + currentPage.uiFromRecord = page.number * 10 + 1;
  54 + currentPage.uiToRecord = page.number * 10 + page.numberOfElements;
  55 + }
  56 + }
  57 + return currentPage;
  58 + },
  59 + resetStatus: function() {
  60 + currentSearchCondition = {page: 0};
  61 + currentPage = {
  62 + totalElements: 0,
  63 + number: 0,
  64 + content: [],
  65 + uiNumber: 1,
  66 + uiFromRecord: 0,
  67 + uiToRecord: 0
  68 + };
  69 + },
  70 +
  71 + /**
  72 + * 数据导出。
  73 + * @returns {*|Function|promise|n}
  74 + */
  75 + dataExport: function(query) {
  76 + return service.dataTools.dataExport(
  77 + {'QUERY': query}
  78 + ).$promise;
  79 + }
  80 + };
  81 + }
  82 + ]
  83 +);
  84 +
  85 +// index.html控制器
  86 +angular.module('ScheduleApp').controller(
  87 + 'UserSignManageCtrl',
  88 + [
  89 + 'UserSignManageService',
  90 + '$state',
  91 + 'FileDownload_g',
  92 + function(busInfoManageService, $state, fileDownload) {
  93 + var self = this;
  94 +
  95 + // 导出excel
  96 + self.exportData = function() {
  97 + // 组装查询条件(mysql)
  98 + var QUERY = [];
  99 +
  100 + var condition = busInfoManageService.getSearchCondition();
  101 +
  102 + // logName条件
  103 + if (condition["logName_like"]) {
  104 + QUERY.push("(log_name like '%" + condition["logName_like"] + "%'" + ")");
  105 + }
  106 + // realName条件
  107 + if (condition["realName_like"]) {
  108 + QUERY.push("(real_name like '%" + condition["realName_like"] + "%'" + ")");
  109 + }
  110 + // 日期条件
  111 + if (condition["logInDateTime_ge"]) {
  112 + var _date_ = moment(condition["logInDateTime_ge"]);
  113 + var _date_1_ = moment(condition["logInDateTime_le"]);
  114 + var _date_query_ = [];
  115 + _date_query_.push(" ( ");
  116 + _date_query_.push(" ( ");
  117 + _date_query_.push(" log_in_date_time >= '" + _date_.format("YYYY-MM-DD") + "' ");
  118 + _date_query_.push(" and ");
  119 + _date_query_.push(" log_in_date_time <= '" + _date_1_.format("YYYY-MM-DD") + "' ");
  120 + _date_query_.push(" ) ");
  121 + _date_query_.push(" or ");
  122 + _date_query_.push(" ( ");
  123 + _date_query_.push(" log_out_date_time >= '" + _date_.format("YYYY-MM-DD") + "' ");
  124 + _date_query_.push(" and ");
  125 + _date_query_.push(" log_out_date_time <= '" + _date_1_.format("YYYY-MM-DD") + "' ");
  126 + _date_query_.push(" ) ");
  127 + _date_query_.push(" ) ");
  128 + QUERY.push(_date_query_.join(""));
  129 + }
  130 +
  131 + // console.log(QUERY.join(" and "));
  132 +
  133 + if (QUERY.length == 0) {
  134 + QUERY.push(" 1 = 1 ");
  135 + }
  136 +
  137 + var p = busInfoManageService.dataExport(QUERY.join(" and "));
  138 + if (p) {
  139 + p.then(
  140 + function(result) {
  141 + fileDownload.downloadFile(result.data, "application/octet-stream", "用户登录日志.xls");
  142 + },
  143 + function(result) {
  144 + console.log("exportData failed:" + result);
  145 + }
  146 + );
  147 + }
  148 +
  149 + };
  150 + }
  151 + ]
  152 +);
  153 +
  154 +// list.html控制器
  155 +angular.module('ScheduleApp').controller(
  156 + 'UserSignManageListCtrl',
  157 + [
  158 + 'UserSignManageService',
  159 + function(service) {
  160 + var self = this;
  161 +
  162 + // 日期 日期控件开关
  163 + self.statFromDateTime_open = false;
  164 + self.statFromDateTime_open_fun = function() {
  165 + self.statFromDateTime_open = true;
  166 + };
  167 + self.statFromDateTime = null;
  168 + self.statFromDateWithConditionGetSetFun = function(value) {
  169 + if (arguments.length == 0) { // 作为get方法
  170 + return self.statFromDateTime;
  171 + } else {
  172 + self.statFromDateTime = value;
  173 + if (value) {
  174 + // 计算条件,当前日期添加一天组成范围查询
  175 + var _date = moment(self.statFromDateTime);
  176 + var _date_plus_day_1 = moment(self.statFromDateTime).add(1, 'd');
  177 + service.getSearchCondition()['logInDateTime_ge'] = _date.toDate();
  178 + service.getSearchCondition()['logInDateTime_le'] = _date_plus_day_1.toDate();
  179 + } else {
  180 + service.getSearchCondition()['logInDateTime_ge'] = null;
  181 + service.getSearchCondition()['logInDateTime_le'] = null;
  182 + }
  183 +
  184 + }
  185 + };
  186 +
  187 + var UserLogInOut = service.getQueryClass();
  188 +
  189 + self.page = function() {
  190 + return service.getPage();
  191 + };
  192 +
  193 + self.searchCondition = function() {
  194 + return service.getSearchCondition();
  195 + };
  196 +
  197 + self.doPage = function() {
  198 + var result = UserLogInOut.list(self.searchCondition(), function() {
  199 + if (!result.status) {
  200 + service.getPage(result);
  201 + }
  202 + });
  203 + };
  204 + self.reset = function() {
  205 + service.resetStatus();
  206 + self.statFromDateWithConditionGetSetFun(null);
  207 + var result = UserLogInOut.list(self.searchCondition(), function() {
  208 + if (!result.status) {
  209 + service.getPage(result);
  210 + }
  211 + });
  212 + };
  213 +
  214 + self.doPage();
  215 +
  216 + }
  217 + ]
  218 +);
  219 +
  220 +
  221 +
  222 +
  223 +
  224 +
  225 +
  226 +
  227 +
  228 +
src/main/resources/static/pages/scheduleApp/module/sys/userSignManage/route.js 0 → 100644
  1 +// ui route 配置
  2 +
  3 +/** 用户登录日志模块配置route */
  4 +ScheduleApp.config([
  5 + '$stateProvider',
  6 + '$urlRouterProvider',
  7 + function($stateProvider, $urlRouterProvider) {
  8 + $stateProvider
  9 + .state("userSignManage", { // index页面
  10 + url: "/userSignManage",
  11 + views: {
  12 + "": {
  13 + templateUrl: "pages/scheduleApp/module/sys/userSignManage/index.html"
  14 + },
  15 + "userSignManage_list@userSignManage": {
  16 + templateUrl: "pages/scheduleApp/module/sys/userSignManage/list.html"
  17 + }
  18 + },
  19 +
  20 + resolve: {
  21 + deps: ["$ocLazyLoad", function($ocLazyLoad) {
  22 + return $ocLazyLoad.load({
  23 + name: 'userSignManage_module',
  24 + insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置
  25 + files: [
  26 + "assets/bower_components/angular-ui-select/dist/select.min.css",
  27 + "assets/bower_components/angular-ui-select/dist/select.min.js",
  28 + "assets/bower_components/angular-file-upload/dist/angular-file-upload.min.js",
  29 + "pages/scheduleApp/module/sys/userSignManage/module.js"
  30 + ]
  31 + });
  32 + }]
  33 + }
  34 + })
  35 + }
  36 +]);
0 \ No newline at end of file 37 \ No newline at end of file
src/main/resources/static/pages/scheduleApp/module/sys/userSignManage/service.js 0 → 100644
  1 +// 用户登录日志service
  2 +angular.module('ScheduleApp').factory(
  3 + "UserSignManageService_g",
  4 + [
  5 + '$resource',
  6 + function($resource) {
  7 + return {
  8 + rest: $resource(
  9 + "/logger_user_sign/:id",
  10 + {id: '@id'},
  11 + {
  12 + list: {
  13 + method: 'GET',
  14 + params: {
  15 + page: 0
  16 + },
  17 + transformResponse: function(rs) {
  18 + var dst = angular.fromJson(rs);
  19 + if (dst.status == 'SUCCESS') {
  20 + return dst.data;
  21 + } else {
  22 + return dst; // 业务错误留给控制器处理
  23 + }
  24 + }
  25 + }
  26 + }
  27 + ),
  28 + dataTools: $resource(
  29 + '/logger_user_sign/:type',
  30 + {},
  31 + {
  32 + dataExport: {
  33 + method: 'GET',
  34 + responseType: "arraybuffer",
  35 + params: {
  36 + type: "exportFile"
  37 + },
  38 + transformResponse: function(data, headers){
  39 + return {data : data};
  40 + }
  41 + }
  42 + }
  43 + )
  44 + };
  45 + }
  46 + ]
  47 +);
0 \ No newline at end of file 48 \ No newline at end of file