Commit 61461b96de8f5017dcf43f9990b29c65c3ca0644

Authored by 王通
1 parent 104f1118

1.调度人员信息与人事库同步,逻辑变更

src/main/java/com/bsth/handler/personnelUpdateHandler.java
@@ -9,14 +9,20 @@ import com.bsth.util.DBUtils_Personnel; @@ -9,14 +9,20 @@ import com.bsth.util.DBUtils_Personnel;
9 import com.bsth.util.XmlToJson; 9 import com.bsth.util.XmlToJson;
10 import com.bsth.wsdl.PJDataSerivce; 10 import com.bsth.wsdl.PJDataSerivce;
11 import com.bsth.wsdl.PJDataSerivceSoap; 11 import com.bsth.wsdl.PJDataSerivceSoap;
  12 +import com.fasterxml.jackson.databind.ObjectMapper;
12 import org.hibernate.collection.internal.PersistentBag; 13 import org.hibernate.collection.internal.PersistentBag;
13 import org.joda.time.DateTime; 14 import org.joda.time.DateTime;
14 import org.slf4j.Logger; 15 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory; 16 import org.slf4j.LoggerFactory;
16 import org.springframework.beans.factory.annotation.Autowired; 17 import org.springframework.beans.factory.annotation.Autowired;
  18 +import org.springframework.jdbc.core.BatchPreparedStatementSetter;
17 import org.springframework.jdbc.core.BeanPropertyRowMapper; 19 import org.springframework.jdbc.core.BeanPropertyRowMapper;
18 import org.springframework.jdbc.core.JdbcTemplate; 20 import org.springframework.jdbc.core.JdbcTemplate;
  21 +import org.springframework.jdbc.datasource.DataSourceTransactionManager;
19 import org.springframework.stereotype.Component; 22 import org.springframework.stereotype.Component;
  23 +import org.springframework.transaction.TransactionDefinition;
  24 +import org.springframework.transaction.TransactionStatus;
  25 +import org.springframework.transaction.support.DefaultTransactionDefinition;
20 26
21 import javax.xml.namespace.QName; 27 import javax.xml.namespace.QName;
22 import java.net.URL; 28 import java.net.URL;
@@ -47,6 +53,18 @@ public class personnelUpdateHandler { @@ -47,6 +53,18 @@ public class personnelUpdateHandler {
47 53
48 private static final QName SERVICE_NAME = new QName("http://www.pd-transport.com/", "PJDataSerivce"); 54 private static final QName SERVICE_NAME = new QName("http://www.pd-transport.com/", "PJDataSerivce");
49 55
  56 + private static Map<String, String> gzname2code = new HashMap<>();
  57 +
  58 + static {
  59 + gzname2code.put("路线驾驶员","1");
  60 + gzname2code.put("团客车驾驶员","1");
  61 + gzname2code.put("交通车驾驶员","1");
  62 + gzname2code.put("调度员","2");
  63 + gzname2code.put("乘务员","3");
  64 + gzname2code.put("机务员/质检员","3");
  65 + gzname2code.put("其他服务人员","14");
  66 + }
  67 +
50 public void sync() { 68 public void sync() {
51 69
52 URL wsdlURL = PJDataSerivce.WSDL_LOCATION; 70 URL wsdlURL = PJDataSerivce.WSDL_LOCATION;
@@ -80,7 +98,7 @@ public class personnelUpdateHandler { @@ -80,7 +98,7 @@ public class personnelUpdateHandler {
80 // 把所有人员设为停用状态,然后在用金蝶人员数据匹配,匹配上的设为在职 98 // 把所有人员设为停用状态,然后在用金蝶人员数据匹配,匹配上的设为在职
81 conn = DBUtils_Personnel.getConnection(); 99 conn = DBUtils_Personnel.getConnection();
82 // 服务器 100 // 服务器
83 - ps = conn.prepareStatement("UPDATE control.bsth_c_personnel SET destroy = 1"); 101 + ps = conn.prepareStatement("UPDATE pd_control.bsth_c_personnel SET destroy = 1");
84 // 本地 102 // 本地
85 // ps = conn.prepareStatement("UPDATE pd_control.bsth_c_personnel SET destroy = 1"); 103 // ps = conn.prepareStatement("UPDATE pd_control.bsth_c_personnel SET destroy = 1");
86 ps.executeUpdate(); 104 ps.executeUpdate();
@@ -200,4 +218,82 @@ public class personnelUpdateHandler { @@ -200,4 +218,82 @@ public class personnelUpdateHandler {
200 logger.error("", e); 218 logger.error("", e);
201 } 219 }
202 } 220 }
  221 +
  222 + public void sync(String s) {
  223 + final Map<String, String> unit2company = new HashMap<>(4);
  224 + unit2company.put("KD01.0110", "55-上南公司");
  225 + unit2company.put("KD01.0111", "22-金高公司");
  226 + unit2company.put("KD01.0112", "26-南汇公司");
  227 + unit2company.put("KD01.0113", "05-杨高公司");
  228 +
  229 + PJDataSerivce ss = new PJDataSerivce(PJDataSerivce.WSDL_LOCATION, SERVICE_NAME);
  230 + PJDataSerivceSoap port = ss.getPJDataSerivceSoap12();
  231 + //编程式事务
  232 + DataSourceTransactionManager tran = new DataSourceTransactionManager(jdbcTemplate.getDataSource());
  233 + DefaultTransactionDefinition def = new DefaultTransactionDefinition();
  234 + def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  235 + TransactionStatus status = tran.getTransaction(def);
  236 + try {
  237 + logger.info("人事数据同步 开始");
  238 + List<Personnel> personnels = jdbcTemplate.query("select * from bsth_c_personnel", BeanPropertyRowMapper.newInstance(Personnel.class));
  239 + logger.info("personnel 原数据:" + new ObjectMapper().writeValueAsString(personnels));
  240 + // KD01.0110上南 KD01.0111金高 KD01.0112南汇 KD01.0113杨高
  241 + jdbcTemplate.execute("delete from bsth_c_employee");
  242 + for (int i = 0;i < 4;i++) {
  243 + final String unintCode = "KD01.011" + i;
  244 + String employeeXml = port.getEmployee(unintCode, "");
  245 + logger.info(unintCode + ":" + employeeXml);
  246 + JSONObject json = XmlToJson.xml2Json(employeeXml);
  247 + final JSONArray emps = (JSONArray)json.get("Emp");
  248 + jdbcTemplate.batchUpdate("insert into bsth_c_employee values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() {
  249 + @Override
  250 + public void setValues(PreparedStatement ps, int i) throws SQLException {
  251 + JSONObject emp = emps.getJSONObject(i);
  252 + String jobCode = emp.getString("Code"), company = unit2company.get(unintCode), positName = emp.getString("PositName");
  253 + String[] jobCodeSplit = jobCode.split("-"), companySplit = company.split("-");
  254 + ps.setString(1, jobCode);
  255 + ps.setString(2, companySplit[0] + "-" + jobCodeSplit[1]);
  256 + ps.setString(3, jobCodeSplit[1]);
  257 + ps.setString(4, emp.getString("EmployeeName"));
  258 + ps.setString(5, gzname2code.get(positName) == null ? "14" : gzname2code.get(positName));
  259 + ps.setString(6, companySplit[0]);
  260 + ps.setString(7, companySplit[1]);
  261 + ps.setString(8, emp.getString("IDCardID") == null ? "" : emp.getString("IDCardID"));
  262 + ps.setString(9, emp.getString("EnterDeptDate"));
  263 + ps.setString(10, emp.getString("EnterGroupDate"));
  264 + ps.setString(11, emp.getString("InpositionDate"));
  265 + }
  266 +
  267 + @Override
  268 + public int getBatchSize() {
  269 + return emps.size();
  270 + }
  271 + });
  272 + }
  273 + // 根据工号关联更新姓名、公司、工种、身份证号
  274 + int rows = jdbcTemplate.update("update bsth_c_personnel a inner join bsth_c_employee b on a.job_code = b.job_code1 set a.personnel_name = b.employee_name,a.personnel_type = b.job_type,a.company = b.company_name,a.company_code = b.company_code,a.card = b.id_card where a.destroy = 0");
  275 + logger.info(String.format("根据工号关联更新姓名、公司、工种、身份证号,记录数%d",rows));
  276 + // 未匹配上工号的数据 用身份证号关联更新工号、姓名、公司、工种
  277 + rows = jdbcTemplate.update("update bsth_c_personnel a inner join bsth_c_employee b on a.card = b.id_card set a.job_code = b.job_code1,a.personnel_name = b.employee_name,a.personnel_type = b.job_type,a.company = b.company_name,a.company_code = b.company_code where a.destroy = 0 and a.job_code <> b.job_code1");
  278 + logger.info(String.format("根据身份证号关联更新工号、姓名、公司、工种,记录数%d",rows));
  279 + // 可能会出现数据异常情况 如一个是最新的工号无身份证号,一个是老的工号有身份证号,最后更新的结果会造成工号和身份证号重复
  280 + // 将更早创建的人员信息更新为停用
  281 + rows = jdbcTemplate.update("update bsth_c_personnel x INNER JOIN (select card,min(id) id from bsth_c_personnel a where destroy = 0 and LENGTH(a.card) > 1 GROUP BY card having count(*) > 1) y on x.id = y.id set destroy = 1");
  282 + logger.info(String.format("同一个人,将更早创建的人员停用,记录数%d",rows));
  283 + // 仍未匹配上的调度数据作为停用人员
  284 + rows = jdbcTemplate.update("update bsth_c_personnel a left join bsth_c_employee b on a.job_code = b.job_code1 set a.destroy = 1 where a.destroy = 0 and b.job_code1 is null");
  285 + logger.info(String.format("调度系统未匹配数据标记为停用,记录数%d",rows));
  286 + // 仍未匹配上的金蝶数据作为新人员
  287 + rows = jdbcTemplate.update("insert into bsth_c_personnel (job_code,personnel_name,personnel_type,company,company_code,job_codeori) select b.job_code1,b.employee_name,b.job_type,b.company_name,b.company_code,b.job_code2 from bsth_c_employee b left join bsth_c_personnel a on b.job_code1 = a.job_code where a.job_code is null");
  288 + logger.info(String.format("金蝶未匹配数据插入,记录数%d",rows));
  289 + // 赋值分公司编码1 不然无法查询
  290 + rows = jdbcTemplate.update("update bsth_c_personnel set branche_company_code = '1' where branche_company_code is null");
  291 + logger.info(String.format("分公司代码更新为1,记录数%d",rows));
  292 + logger.info("人事数据同步 结束");
  293 + tran.commit(status);
  294 + } catch (Exception e) {
  295 + tran.rollback(status);
  296 + logger.error("", e);
  297 + }
  298 + }
203 } 299 }
src/main/java/com/bsth/thread/PersonnelUpdateThrad.java
@@ -23,7 +23,7 @@ public class PersonnelUpdateThrad extends Thread { @@ -23,7 +23,7 @@ public class PersonnelUpdateThrad extends Thread {
23 @Override 23 @Override
24 public void run() { 24 public void run() {
25 try { 25 try {
26 - personnelUpdateHandler.sync(); 26 + personnelUpdateHandler.sync("");
27 } catch (Exception e) { 27 } catch (Exception e) {
28 logger.error("", e); 28 logger.error("", e);
29 } 29 }
src/main/java/com/bsth/wsdl/PJDataSerivce.java
@@ -15,7 +15,7 @@ import java.net.URL; @@ -15,7 +15,7 @@ import java.net.URL;
15 * 15 *
16 */ 16 */
17 @WebServiceClient(name = "PJDataSerivce", 17 @WebServiceClient(name = "PJDataSerivce",
18 - wsdlLocation = "http://116.236.238.218:31/PJDataInterface/PJDataService.asmx?wsdl", 18 + wsdlLocation = "http://116.228.98.212:31/PJDataInterface/PJDataService.asmx?wsdl",
19 targetNamespace = "http://www.pd-transport.com/") 19 targetNamespace = "http://www.pd-transport.com/")
20 public class PJDataSerivce extends Service { 20 public class PJDataSerivce extends Service {
21 21
@@ -27,11 +27,11 @@ public class PJDataSerivce extends Service { @@ -27,11 +27,11 @@ public class PJDataSerivce extends Service {
27 static { 27 static {
28 URL url = null; 28 URL url = null;
29 try { 29 try {
30 - url = new URL("http://116.236.238.218:31/PJDataInterface/PJDataService.asmx?wsdl"); 30 + url = new URL("http://116.228.98.212:31/PJDataInterface/PJDataService.asmx?wsdl");
31 } catch (MalformedURLException e) { 31 } catch (MalformedURLException e) {
32 java.util.logging.Logger.getLogger(PJDataSerivce.class.getName()) 32 java.util.logging.Logger.getLogger(PJDataSerivce.class.getName())
33 .log(java.util.logging.Level.INFO, 33 .log(java.util.logging.Level.INFO,
34 - "Can not initialize the default wsdl from {0}", "http://116.236.238.218:31/PJDataInterface/PJDataService.asmx?wsdl"); 34 + "Can not initialize the default wsdl from {0}", "http://116.228.98.212:31/PJDataInterface/PJDataService.asmx?wsdl");
35 } 35 }
36 WSDL_LOCATION = url; 36 WSDL_LOCATION = url;
37 } 37 }
src/main/resources/application-dev.properties
@@ -2,15 +2,15 @@ server.port=8776 @@ -2,15 +2,15 @@ server.port=8776
2 management.port= 9001 2 management.port= 9001
3 management.address= 127.0.0.1 3 management.address= 127.0.0.1
4 4
5 -spring.jpa.hibernate.ddl-auto= update 5 +spring.jpa.hibernate.ddl-auto= none
6 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy 6 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
7 #DATABASE 7 #DATABASE
8 spring.jpa.database= MYSQL 8 spring.jpa.database= MYSQL
9 spring.jpa.show-sql= true 9 spring.jpa.show-sql= true
10 spring.datasource.driver-class-name= com.mysql.jdbc.Driver 10 spring.datasource.driver-class-name= com.mysql.jdbc.Driver
11 -spring.datasource.url= jdbc:mysql://localhost:3306/pd_control?useUnicode=true&characterEncoding=utf-8&useSSL=false 11 +spring.datasource.url= jdbc:mysql://192.168.168.241/pd_control?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
12 spring.datasource.username= root 12 spring.datasource.username= root
13 -spring.datasource.password= 13 +spring.datasource.password= root2jsp
14 #DATASOURCE 14 #DATASOURCE
15 spring.datasource.max-active=100 15 spring.datasource.max-active=100
16 spring.datasource.max-idle=8 16 spring.datasource.max-idle=8
src/main/resources/application-prod.properties
@@ -8,9 +8,9 @@ spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy @@ -8,9 +8,9 @@ spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
8 spring.jpa.database= MYSQL 8 spring.jpa.database= MYSQL
9 spring.jpa.show-sql= true 9 spring.jpa.show-sql= true
10 spring.datasource.driver-class-name= com.mysql.jdbc.Driver 10 spring.datasource.driver-class-name= com.mysql.jdbc.Driver
11 -spring.datasource.url= jdbc:mysql://10.10.150.24:3306/control?useUnicode=true&characterEncoding=utf-8&useSSL=false 11 +spring.datasource.url= jdbc:mysql://10.10.200.148/control?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
12 spring.datasource.username= root 12 spring.datasource.username= root
13 -spring.datasource.password= root2jsp 13 +spring.datasource.password= root
14 #DATASOURCE 14 #DATASOURCE
15 spring.datasource.max-active=100 15 spring.datasource.max-active=100
16 spring.datasource.max-idle=8 16 spring.datasource.max-idle=8
src/main/resources/application.properties
1 spring.profiles: dev,prod 1 spring.profiles: dev,prod
2 -spring.profiles.active: prod 2 +spring.profiles.active: dev
3 3
4 spring.view.suffix=.html 4 spring.view.suffix=.html
5 server.session-timeout=-1 5 server.session-timeout=-1
src/main/resources/personnel-jdbc.properties
@@ -4,6 +4,6 @@ @@ -4,6 +4,6 @@
4 #ms.mysql.password= 4 #ms.mysql.password=
5 5
6 ms.mysql.driver= com.mysql.jdbc.Driver 6 ms.mysql.driver= com.mysql.jdbc.Driver
7 -ms.mysql.url= jdbc:mysql://10.10.150.24:3306/personnel?useUnicode=true&characterEncoding=utf-8 7 +ms.mysql.url= jdbc:mysql://192.168.168.240:3306/personnel?useUnicode=true&characterEncoding=utf-8
8 ms.mysql.username= root 8 ms.mysql.username= root
9 ms.mysql.password= root2jsp 9 ms.mysql.password= root2jsp