From 33747ab1326551184b68beb259d38e0b38e83737 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Fri, 28 May 2021 16:08:52 +0800 Subject: [PATCH 01/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- box-bps/pom.xml | 28 +++ box-test/pom.xml | 28 +++ .../ruoyi/test/conrtroller/ApiController.java | 61 ++++++ .../test/conrtroller/BoxTestController.java | 18 ++ .../test/conrtroller/FrForCrController.java | 45 +++++ .../conrtroller/GetJsonReqController.java | 67 +++++++ .../test/conrtroller/OracleDdlController.java | 55 ++++++ .../test/conrtroller/SendJsonController.java | 15 ++ .../conrtroller/SysCustomerController.java | 123 ++++++++++++ .../conrtroller/SysFileInfoController.java | 123 ++++++++++++ .../test/conrtroller/TcUserController.java | 64 ++++++ .../test/conrtroller/TestIndexController.java | 16 ++ .../conrtroller/TestVerifyController.java | 34 ++++ .../java/com/ruoyi/test/domain/Beauty.java | 55 ++++++ .../com/ruoyi/test/domain/SysCustomer.java | 113 +++++++++++ .../com/ruoyi/test/domain/SysFileInfo.java | 65 ++++++ .../java/com/ruoyi/test/domain/SysGoods.java | 124 ++++++++++++ .../java/com/ruoyi/test/domain/TcUser.java | 40 ++++ .../ruoyi/test/mapper/OracleDdlMapper.java | 32 +++ .../ruoyi/test/mapper/SysCustomerMapper.java | 88 +++++++++ .../ruoyi/test/mapper/SysFileInfoMapper.java | 62 ++++++ .../com/ruoyi/test/mapper/TcUserMapper.java | 26 +++ .../ruoyi/test/mapper/TestVerifyMapper.java | 11 ++ .../test/service/ISysCustomerService.java | 62 ++++++ .../test/service/ISysFileInfoService.java | 62 ++++++ .../ruoyi/test/service/OracleDdlService.java | 22 +++ .../com/ruoyi/test/service/TcUserService.java | 22 +++ .../com/ruoyi/test/service/TestService.java | 10 + .../ruoyi/test/service/TestVerifyService.java | 9 + .../service/impl/OracleDdlServiceImpl.java | 45 +++++ .../service/impl/SysCustomerServiceImpl.java | 132 +++++++++++++ .../service/impl/SysFileInfoServiceImpl.java | 95 +++++++++ .../test/service/impl/TcUserServiceImpl.java | 48 +++++ .../service/impl/TestVerifyServiceImpl.java | 19 ++ .../resources/mapper/test/OracleDdlMapper.xml | 29 +++ .../mapper/test/SysCustomerMapper.xml | 111 +++++++++++ .../mapper/test/SysFileInfoMapper.xml | 62 ++++++ .../resources/mapper/test/TcUserMapper.xml | 68 +++++++ .../mapper/test/TestVerifyMapper.xml | 11 ++ .../templates/test/customer/add.html | 167 ++++++++++++++++ .../templates/test/customer/customer.html | 117 +++++++++++ .../templates/test/customer/edit.html | 186 ++++++++++++++++++ .../templates/test/fileinfo/add.html | 37 ++++ .../templates/test/fileinfo/edit.html | 38 ++++ .../templates/test/fileinfo/fileinfo.html | 94 +++++++++ .../main/resources/templates/test/index.html | 33 ++++ .../resources/templates/test/sendJson.html | 99 ++++++++++ .../resources/templates/test/testVerify.html | 65 ++++++ pom.xml | 16 ++ ruoyi-admin/pom.xml | 27 +++ .../src/main/resources/application-druid.yml | 42 +++- .../src/main/resources/application.yml | 6 +- .../ruoyi/common/enums/DataSourceType.java | 17 +- .../ruoyi/framework/config/DruidConfig.java | 38 ++++ .../ruoyi/framework/config/ShiroConfig.java | 2 + 55 files changed, 3073 insertions(+), 11 deletions(-) create mode 100644 box-bps/pom.xml create mode 100644 box-test/pom.xml create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/ApiController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/BoxTestController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/FrForCrController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/GetJsonReqController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/OracleDdlController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/SendJsonController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/SysCustomerController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/SysFileInfoController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/TcUserController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/TestIndexController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/TestVerifyController.java create mode 100644 box-test/src/main/java/com/ruoyi/test/domain/Beauty.java create mode 100644 box-test/src/main/java/com/ruoyi/test/domain/SysCustomer.java create mode 100644 box-test/src/main/java/com/ruoyi/test/domain/SysFileInfo.java create mode 100644 box-test/src/main/java/com/ruoyi/test/domain/SysGoods.java create mode 100644 box-test/src/main/java/com/ruoyi/test/domain/TcUser.java create mode 100644 box-test/src/main/java/com/ruoyi/test/mapper/OracleDdlMapper.java create mode 100644 box-test/src/main/java/com/ruoyi/test/mapper/SysCustomerMapper.java create mode 100644 box-test/src/main/java/com/ruoyi/test/mapper/SysFileInfoMapper.java create mode 100644 box-test/src/main/java/com/ruoyi/test/mapper/TcUserMapper.java create mode 100644 box-test/src/main/java/com/ruoyi/test/mapper/TestVerifyMapper.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/ISysCustomerService.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/ISysFileInfoService.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/OracleDdlService.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/TcUserService.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/TestService.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/TestVerifyService.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/impl/OracleDdlServiceImpl.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/impl/SysCustomerServiceImpl.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/impl/SysFileInfoServiceImpl.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/impl/TcUserServiceImpl.java create mode 100644 box-test/src/main/java/com/ruoyi/test/service/impl/TestVerifyServiceImpl.java create mode 100644 box-test/src/main/resources/mapper/test/OracleDdlMapper.xml create mode 100644 box-test/src/main/resources/mapper/test/SysCustomerMapper.xml create mode 100644 box-test/src/main/resources/mapper/test/SysFileInfoMapper.xml create mode 100644 box-test/src/main/resources/mapper/test/TcUserMapper.xml create mode 100644 box-test/src/main/resources/mapper/test/TestVerifyMapper.xml create mode 100644 box-test/src/main/resources/templates/test/customer/add.html create mode 100644 box-test/src/main/resources/templates/test/customer/customer.html create mode 100644 box-test/src/main/resources/templates/test/customer/edit.html create mode 100644 box-test/src/main/resources/templates/test/fileinfo/add.html create mode 100644 box-test/src/main/resources/templates/test/fileinfo/edit.html create mode 100644 box-test/src/main/resources/templates/test/fileinfo/fileinfo.html create mode 100644 box-test/src/main/resources/templates/test/index.html create mode 100644 box-test/src/main/resources/templates/test/sendJson.html create mode 100644 box-test/src/main/resources/templates/test/testVerify.html diff --git a/box-bps/pom.xml b/box-bps/pom.xml new file mode 100644 index 000000000..7efa32418 --- /dev/null +++ b/box-bps/pom.xml @@ -0,0 +1,28 @@ + + + + ruoyi + com.ruoyi + 4.6.1 + + 4.0.0 + + box-bps + + + bps系统模块 + + + + + + + com.ruoyi + ruoyi-common + + + + + \ No newline at end of file diff --git a/box-test/pom.xml b/box-test/pom.xml new file mode 100644 index 000000000..d606da50d --- /dev/null +++ b/box-test/pom.xml @@ -0,0 +1,28 @@ + + + + ruoyi + com.ruoyi + 4.6.1 + + 4.0.0 + + box-test + + + test系统模块 + + + + + + + com.ruoyi + ruoyi-common + + + + + \ No newline at end of file diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/ApiController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/ApiController.java new file mode 100644 index 000000000..e3a4c9f77 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/ApiController.java @@ -0,0 +1,61 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.common.core.domain.AjaxResult; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * + * 测试权限登录访问请求 + * + * 登录访问(返回token) POST / http://localhost:80/jwt/login?username=ry&password=admin123 + * + * 测试任意权限(header携带token) GET / http://localhost:80/api/list + * + * 测试菜单权限(header携带token) GET / http://localhost:80/api/user/list + * + * 测试角色权限(header携带token) GET / http://localhost:80/api/role/list + * + */ + + + +@RestController +@RequestMapping("/api") +public class ApiController +{ + /** + * 无权限访问 + * + * @return + */ + @GetMapping("/list") + public AjaxResult list() + { + return AjaxResult.success("list success"); + } + + /** + * 菜单权限 system:user:list + */ + @GetMapping("/user/list") + @RequiresPermissions("system:user:list") + public AjaxResult userlist() + { + return AjaxResult.success("user list success"); + } + + /** + * 角色权限 admin + */ + @GetMapping("/role/list") + @RequiresRoles("admin") + public AjaxResult rolelist() + { + return AjaxResult.success("role list success"); + } +} \ No newline at end of file diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/BoxTestController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/BoxTestController.java new file mode 100644 index 000000000..f282d9344 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/BoxTestController.java @@ -0,0 +1,18 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.test.service.TestService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/test") +public class BoxTestController { + @Autowired + private TestService testService; + @RequestMapping("test") + public String test(){ + testService.test(); + return testService.test(); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/FrForCrController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/FrForCrController.java new file mode 100644 index 000000000..29915a5e8 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/FrForCrController.java @@ -0,0 +1,45 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.test.service.OracleDdlService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalTime; +import java.util.Map; + +@RestController +public class FrForCrController { + @Autowired + private OracleDdlService oracleDdlService; + + @CrossOrigin + @RequestMapping("/test/frforcr") + public void frforcr(@RequestBody Map map){ + for(Object value:map.values()){ + String dbName="ds7"; + String tableName=value.toString(); + String tableNameWithDb=dbName+"."+tableName; + int isTableInDb=oracleDdlService.isTableInDb(dbName,tableName); + if(isTableInDb>0){ + try{ + oracleDdlService.dropTable(tableNameWithDb); + System.out.println(LocalTime.now()+"【"+tableNameWithDb+"】已被删除!"); + }catch (Exception e){ + System.out.println(LocalTime.now()+"【"+tableNameWithDb+"】删除异常!"); + } + } + else{ + System.out.println(LocalTime.now()+"【"+tableNameWithDb+"】不存在!"); + } + } + + } + + + +} + + diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetJsonReqController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetJsonReqController.java new file mode 100644 index 000000000..e5ad72c9e --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetJsonReqController.java @@ -0,0 +1,67 @@ +package com.ruoyi.test.conrtroller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.test.domain.Beauty; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/test") +public class GetJsonReqController { + + @CrossOrigin + @RequestMapping(value = "simple") + // json的结构和内部字段名称可以与POJO/DTO/javabean完全对应 + public Map getJsonBean(@RequestBody Beauty beauty) { + Map result = null; + + if (beauty != null) { + System.out.println("姓名:" + beauty.getName()); + System.out.println("年龄:" + beauty.getAge()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + System.out.println("出生日期:" + sdf.format(beauty.getDate())); + + System.out.println("年收入:" + beauty.getSalary()); + result = new HashMap<>(); + result.put("code", "1"); + result.put("msg", "ok"); + } + + return result; + } + + @CrossOrigin + @RequestMapping(value = "complex") + //json的结构较为复杂,不直接与POJO/DTO/javabean对应。 + public Map getJsonComplex(@RequestBody JSONObject param) { + Map result = null; + + if (param != null) { + JSONObject master = param.getJSONObject("master"); + Beauty beauty = (Beauty) JSONObject.toJavaObject(master, Beauty.class); + System.out.println(beauty); + + JSONArray mm = param.getJSONArray("MM"); + for (int i = 0; i < mm.size(); i++) { + // 这里不能使用get(i),因为get(i)只会得到键值对。 + JSONObject json = mm.getJSONObject(i); + Beauty bt = (Beauty) JSONObject.toJavaObject(json, Beauty.class); + System.out.println(bt); + } + + result = new HashMap<>(); + result.put("code", "1"); + result.put("msg", "ok"); + } + + return result; + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/OracleDdlController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/OracleDdlController.java new file mode 100644 index 000000000..5f0b67f56 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/OracleDdlController.java @@ -0,0 +1,55 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.test.service.OracleDdlService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/test") +@DataSource(value = DataSourceType.SLAVE) +public class OracleDdlController { + @Autowired + private OracleDdlService oracleDdlService; + + //查询表录数 + @RequestMapping("getRecordCount") + + public String getRecordCount() { + String tableName = "tc_user"; + int result = oracleDdlService.getRecordCount(tableName); + return result + ""; + } + + //检查表是否存在 + @RequestMapping("isTableInDb") + public String isTableInDb() { + String dbName = "ds7"; + String tableName = "tc_user"; + return (oracleDdlService.isTableInDb(dbName, tableName)>0?"实例ds7中存在表tc_user":"实例ds7中不存在表tc_user"); + } + + //复制表 + @RequestMapping("copyTable") + public String copyTable() { + String originalTalble = "tc_user"; + String newTable = "new_tc_user"; + + if (oracleDdlService.isTableInDb("ds7", originalTalble) > 0) { + try { + oracleDdlService.copyTable(newTable, originalTalble); + return "复制" + originalTalble + "成功!新表名:" + newTable; + } catch (Exception e) { + System.out.println(e); + return "复制" + originalTalble + "失败!"; + } + } else { + return "表"+originalTalble+"不存在"; + + } + + } + +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/SendJsonController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/SendJsonController.java new file mode 100644 index 000000000..689d2ce84 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/SendJsonController.java @@ -0,0 +1,15 @@ +package com.ruoyi.test.conrtroller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Controller +public class SendJsonController { + @RequestMapping("/test/sendjson") + public String ajaxSend(){ + return ("test/sendJson"); + + } + +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/SysCustomerController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/SysCustomerController.java new file mode 100644 index 000000000..9e4b8e568 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/SysCustomerController.java @@ -0,0 +1,123 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.test.domain.SysCustomer; +import com.ruoyi.test.service.ISysCustomerService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 客户Controller + * + * @author box + * @date 2021-02-13 + */ +@Controller +@RequestMapping("/test/customer") +public class SysCustomerController extends BaseController +{ + private String prefix = "test/customer"; + + @Autowired + private ISysCustomerService sysCustomerService; + + @RequiresPermissions("test:customer:view") + @GetMapping() + public String customer() + { + return prefix + "/customer"; + } + + /** + * 查询客户列表 + */ + @RequiresPermissions("test:customer:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(SysCustomer sysCustomer) + { + startPage(); + List list = sysCustomerService.selectSysCustomerList(sysCustomer); + return getDataTable(list); + } + + /** + * 导出客户列表 + */ + @RequiresPermissions("test:customer:export") + @Log(title = "客户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(SysCustomer sysCustomer) + { + List list = sysCustomerService.selectSysCustomerList(sysCustomer); + ExcelUtil util = new ExcelUtil(SysCustomer.class); + return util.exportExcel(list, "customer"); + } + + /** + * 新增客户 + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } + + /** + * 新增保存客户 + */ + @RequiresPermissions("test:customer:add") + @Log(title = "客户", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(SysCustomer sysCustomer) + { + return toAjax(sysCustomerService.insertSysCustomer(sysCustomer)); + } + + /** + * 修改客户 + */ + @GetMapping("/edit/{customerId}") + public String edit(@PathVariable("customerId") Long customerId, ModelMap mmap) + { + SysCustomer sysCustomer = sysCustomerService.selectSysCustomerById(customerId); + mmap.put("sysCustomer", sysCustomer); + return prefix + "/edit"; + } + + /** + * 修改保存客户 + */ + @RequiresPermissions("test:customer:edit") + @Log(title = "客户", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(SysCustomer sysCustomer) + { + return toAjax(sysCustomerService.updateSysCustomer(sysCustomer)); + } + + /** + * 删除客户 + */ + @RequiresPermissions("test:customer:remove") + @Log(title = "客户", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(sysCustomerService.deleteSysCustomerByIds(ids)); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/SysFileInfoController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/SysFileInfoController.java new file mode 100644 index 000000000..e7a610ef5 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/SysFileInfoController.java @@ -0,0 +1,123 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.test.domain.SysFileInfo; +import com.ruoyi.test.service.ISysFileInfoService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 文件信息Controller + * + * @author box + * @date 2021-05-06 + */ +@Controller +@RequestMapping("/test/fileinfo") +public class SysFileInfoController extends BaseController +{ + private String prefix = "test/fileinfo"; + + @Autowired + private ISysFileInfoService sysFileInfoService; + + @RequiresPermissions("test:fileinfo:view") + @GetMapping() + public String fileinfo() + { + return prefix + "/fileinfo"; + } + + /** + * 查询文件信息列表 + */ + @RequiresPermissions("test:fileinfo:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(SysFileInfo sysFileInfo) + { + startPage(); + List list = sysFileInfoService.selectSysFileInfoList(sysFileInfo); + return getDataTable(list); + } + + /** + * 导出文件信息列表 + */ + @RequiresPermissions("test:fileinfo:export") + @Log(title = "文件信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(SysFileInfo sysFileInfo) + { + List list = sysFileInfoService.selectSysFileInfoList(sysFileInfo); + ExcelUtil util = new ExcelUtil(SysFileInfo.class); + return util.exportExcel(list, "文件信息数据"); + } + + /** + * 新增文件信息 + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } + + /** + * 新增保存文件信息 + */ + @RequiresPermissions("test:fileinfo:add") + @Log(title = "文件信息", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(SysFileInfo sysFileInfo) + { + return toAjax(sysFileInfoService.insertSysFileInfo(sysFileInfo)); + } + + /** + * 修改文件信息 + */ + @GetMapping("/edit/{fileId}") + public String edit(@PathVariable("fileId") Long fileId, ModelMap mmap) + { + SysFileInfo sysFileInfo = sysFileInfoService.selectSysFileInfoById(fileId); + mmap.put("sysFileInfo", sysFileInfo); + return prefix + "/edit"; + } + + /** + * 修改保存文件信息 + */ + @RequiresPermissions("test:fileinfo:edit") + @Log(title = "文件信息", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(SysFileInfo sysFileInfo) + { + return toAjax(sysFileInfoService.updateSysFileInfo(sysFileInfo)); + } + + /** + * 删除文件信息 + */ + @RequiresPermissions("test:fileinfo:remove") + @Log(title = "文件信息", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(sysFileInfoService.deleteSysFileInfoByIds(ids)); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/TcUserController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/TcUserController.java new file mode 100644 index 000000000..55953e6fc --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/TcUserController.java @@ -0,0 +1,64 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.test.domain.TcUser; +import com.ruoyi.test.service.TcUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/test") +public class TcUserController { + @Autowired + private TcUserService tcUserService; + + //查询所有 + // http://localhost/test/selectall + @RequestMapping("selectAll") + @ResponseBody + public String selectAll(){ + List users=tcUserService.selectAll(); + users.forEach(System.out::println); + return users.toString()+""; + } + + + //查询 by id + // http://localhost/test/selectById/1(此处1为要获取的id) + @RequestMapping(value = "selectById/{id}", method = RequestMethod.GET) + public String selectById(@PathVariable int id) { + return tcUserService.selectById(id).toString(); + } + + //插入新用户 + // http://localhost/test/insert?id=100&name=张三&password=20 + @RequestMapping(value = "/insert", method = RequestMethod.GET) + public TcUser insert(TcUser tcUser) { + return tcUserService.insert(tcUser); + } + + //通过用户id删除用户 + // http://localhost/test/deleteById?id=1(此处1为要删除的id) + @RequestMapping(value = "/deleteById", method = RequestMethod.GET) + public String delete(int id) { + int result = tcUserService.deleteById(id); + if (result >= 1) { + return "删除成功"; + } else { + return "删除失败"; + } + } + + //更新 by id + // http://localhost/test/updateById?id=2&name=波波&password=12 + @RequestMapping(value = "/updateById", method = RequestMethod.GET) + public String update(TcUser tcUser) { + int result = tcUserService.updateById(tcUser); + if (result >= 1) { + return "修改成功"; + } else { + return "修改失败"; + } + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/TestIndexController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/TestIndexController.java new file mode 100644 index 000000000..4900631cc --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/TestIndexController.java @@ -0,0 +1,16 @@ +package com.ruoyi.test.conrtroller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.time.LocalDateTime; + +@Controller +public class TestIndexController { + @RequestMapping("/test") + public String index(ModelMap modelMap){ + modelMap.put("date", LocalDateTime.now()); + return ("test/index"); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/TestVerifyController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/TestVerifyController.java new file mode 100644 index 000000000..f2d3c63f1 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/TestVerifyController.java @@ -0,0 +1,34 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.test.service.TestVerifyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class TestVerifyController { + @Autowired + private TestVerifyService testVerifyService; + + @RequestMapping("/test/testVerify") + public String testVerify(){ + return "/test/testVerify"; + } + + + + + /** + * 校验用户名 + */ + + @PostMapping("/test/testVerifyName") + @ResponseBody + public int testVerifyName(String name) + { + return testVerifyService.isNameUnique(name); + } + +} diff --git a/box-test/src/main/java/com/ruoyi/test/domain/Beauty.java b/box-test/src/main/java/com/ruoyi/test/domain/Beauty.java new file mode 100644 index 000000000..41c2ec760 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/domain/Beauty.java @@ -0,0 +1,55 @@ +package com.ruoyi.test.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +public class Beauty { + private String name; + private int age; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date date; + private double salary; + + public Beauty() { + + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public double getSalary() { + return salary; + } + + public void setSalary(double salary) { + this.salary = salary; + } + + @Override + public String toString() { + return "Beauty [name=" + name + ", age=" + age + ", date=" + date + ", salary=" + salary + "]"; + } + +} diff --git a/box-test/src/main/java/com/ruoyi/test/domain/SysCustomer.java b/box-test/src/main/java/com/ruoyi/test/domain/SysCustomer.java new file mode 100644 index 000000000..0f34bbe05 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/domain/SysCustomer.java @@ -0,0 +1,113 @@ +package com.ruoyi.test.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; +import java.util.List; + +/** + * 客户对象 sys_customer + * + * @author box + * @date 2021-02-13 + */ +public class SysCustomer extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 客户id */ + private Long customerId; + + /** 客户姓名 */ + @Excel(name = "客户姓名") + private String customerName; + + /** 手机号码 */ + @Excel(name = "手机号码") + private String phonenumber; + + /** 客户性别 */ + @Excel(name = "客户性别") + private String sex; + + /** 客户生日 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "客户生日", width = 30, dateFormat = "yyyy-MM-dd") + private Date birthday; + + /** 商品信息 */ + private List sysGoodsList; + + public void setCustomerId(Long customerId) + { + this.customerId = customerId; + } + + public Long getCustomerId() + { + return customerId; + } + public void setCustomerName(String customerName) + { + this.customerName = customerName; + } + + public String getCustomerName() + { + return customerName; + } + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + public String getPhonenumber() + { + return phonenumber; + } + public void setSex(String sex) + { + this.sex = sex; + } + + public String getSex() + { + return sex; + } + public void setBirthday(Date birthday) + { + this.birthday = birthday; + } + + public Date getBirthday() + { + return birthday; + } + + public List getSysGoodsList() + { + return sysGoodsList; + } + + public void setSysGoodsList(List sysGoodsList) + { + this.sysGoodsList = sysGoodsList; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("customerId", getCustomerId()) + .append("customerName", getCustomerName()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("birthday", getBirthday()) + .append("remark", getRemark()) + .append("sysGoodsList", getSysGoodsList()) + .toString(); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/domain/SysFileInfo.java b/box-test/src/main/java/com/ruoyi/test/domain/SysFileInfo.java new file mode 100644 index 000000000..003c5f57a --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/domain/SysFileInfo.java @@ -0,0 +1,65 @@ +package com.ruoyi.test.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 文件信息对象 sys_file_info + * + * @author box + * @date 2021-05-06 + */ +public class SysFileInfo extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 文件id */ + private Long fileId; + + /** 文件名称 */ + @Excel(name = "文件名称") + private String fileName; + + /** 文件路径 */ + @Excel(name = "文件路径") + private String filePath; + + public void setFileId(Long fileId) + { + this.fileId = fileId; + } + + public Long getFileId() + { + return fileId; + } + public void setFileName(String fileName) + { + this.fileName = fileName; + } + + public String getFileName() + { + return fileName; + } + public void setFilePath(String filePath) + { + this.filePath = filePath; + } + + public String getFilePath() + { + return filePath; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("fileId", getFileId()) + .append("fileName", getFileName()) + .append("filePath", getFilePath()) + .toString(); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/domain/SysGoods.java b/box-test/src/main/java/com/ruoyi/test/domain/SysGoods.java new file mode 100644 index 000000000..85740959a --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/domain/SysGoods.java @@ -0,0 +1,124 @@ +package com.ruoyi.test.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商品对象 sys_goods + * + * @author box + * @date 2021-02-13 + */ +public class SysGoods extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 商品id */ + private Long goodsId; + + /** 客户id */ + @Excel(name = "客户id") + private Long customerId; + + /** 商品名称 */ + @Excel(name = "商品名称") + private String name; + + /** 商品重量 */ + @Excel(name = "商品重量") + private Integer weight; + + /** 商品价格 */ + @Excel(name = "商品价格") + private BigDecimal price; + + /** 商品时间 */ + @Excel(name = "商品时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date date; + + /** 商品种类 */ + @Excel(name = "商品种类") + private String type; + + public void setGoodsId(Long goodsId) + { + this.goodsId = goodsId; + } + + public Long getGoodsId() + { + return goodsId; + } + public void setCustomerId(Long customerId) + { + this.customerId = customerId; + } + + public Long getCustomerId() + { + return customerId; + } + public void setName(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + public void setWeight(Integer weight) + { + this.weight = weight; + } + + public Integer getWeight() + { + return weight; + } + public void setPrice(BigDecimal price) + { + this.price = price; + } + + public BigDecimal getPrice() + { + return price; + } + public void setDate(Date date) + { + this.date = date; + } + + public Date getDate() + { + return date; + } + public void setType(String type) + { + this.type = type; + } + + public String getType() + { + return type; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("goodsId", getGoodsId()) + .append("customerId", getCustomerId()) + .append("name", getName()) + .append("weight", getWeight()) + .append("price", getPrice()) + .append("date", getDate()) + .append("type", getType()) + .toString(); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/domain/TcUser.java b/box-test/src/main/java/com/ruoyi/test/domain/TcUser.java new file mode 100644 index 000000000..da8a2d3cc --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/domain/TcUser.java @@ -0,0 +1,40 @@ +package com.ruoyi.test.domain; + +public class TcUser { + private int id; + private String name; + private String password; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return "TcUser{" + + "id=" + id + + ", name='" + name + '\'' + + ", age='" + password + '\'' + + '}'; + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/mapper/OracleDdlMapper.java b/box-test/src/main/java/com/ruoyi/test/mapper/OracleDdlMapper.java new file mode 100644 index 000000000..e7c2f3a16 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/mapper/OracleDdlMapper.java @@ -0,0 +1,32 @@ +package com.ruoyi.test.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +@Mapper +@Component("OracleDdlMapper") +public interface OracleDdlMapper { + // alter table + int alterTableName(@Param("originalTableName") String originalTableName, + @Param("newTableName") String newTableName); + + //truncate table + int truncateTable(@Param("tableName") String tableName); + + //drop table + int dropTable(@Param("tableName") String tableName); + + //copy table + void copyTable(@Param("newTableName") String newTableName, + @Param("originalTableName") String originalTableName); + + //获取表记录数 + int getRecordCount(@Param("tableName") String tableName); + + + + //查询数据库中表是否存在 + int isTableInDb(@Param("dataBaseName") String dataBaseName, + @Param("tableName") String tableName); +} diff --git a/box-test/src/main/java/com/ruoyi/test/mapper/SysCustomerMapper.java b/box-test/src/main/java/com/ruoyi/test/mapper/SysCustomerMapper.java new file mode 100644 index 000000000..3ae177354 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/mapper/SysCustomerMapper.java @@ -0,0 +1,88 @@ +package com.ruoyi.test.mapper; + +import com.ruoyi.test.domain.SysCustomer; +import com.ruoyi.test.domain.SysGoods; + +import java.util.List; + +/** + * 客户Mapper接口 + * + * @author box + * @date 2021-02-13 + */ +public interface SysCustomerMapper +{ + /** + * 查询客户 + * + * @param customerId 客户ID + * @return 客户 + */ + public SysCustomer selectSysCustomerById(Long customerId); + + /** + * 查询客户列表 + * + * @param sysCustomer 客户 + * @return 客户集合 + */ + public List selectSysCustomerList(SysCustomer sysCustomer); + + /** + * 新增客户 + * + * @param sysCustomer 客户 + * @return 结果 + */ + public int insertSysCustomer(SysCustomer sysCustomer); + + /** + * 修改客户 + * + * @param sysCustomer 客户 + * @return 结果 + */ + public int updateSysCustomer(SysCustomer sysCustomer); + + /** + * 删除客户 + * + * @param customerId 客户ID + * @return 结果 + */ + public int deleteSysCustomerById(Long customerId); + + /** + * 批量删除客户 + * + * @param customerIds 需要删除的数据ID + * @return 结果 + */ + public int deleteSysCustomerByIds(String[] customerIds); + + /** + * 批量删除商品 + * + * @param customerIds 需要删除的数据ID + * @return 结果 + */ + public int deleteSysGoodsByCustomerIds(String[] customerIds); + + /** + * 批量新增商品 + * + * @param sysGoodsList 商品列表 + * @return 结果 + */ + public int batchSysGoods(List sysGoodsList); + + + /** + * 通过客户ID删除商品信息 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteSysGoodsByCustomerId(Long customerId); +} diff --git a/box-test/src/main/java/com/ruoyi/test/mapper/SysFileInfoMapper.java b/box-test/src/main/java/com/ruoyi/test/mapper/SysFileInfoMapper.java new file mode 100644 index 000000000..923f598cf --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/mapper/SysFileInfoMapper.java @@ -0,0 +1,62 @@ +package com.ruoyi.test.mapper; + +import com.ruoyi.test.domain.SysFileInfo; + +import java.util.List; + +/** + * 文件信息Mapper接口 + * + * @author box + * @date 2021-05-06 + */ +public interface SysFileInfoMapper +{ + /** + * 查询文件信息 + * + * @param fileId 文件信息ID + * @return 文件信息 + */ + public SysFileInfo selectSysFileInfoById(Long fileId); + + /** + * 查询文件信息列表 + * + * @param sysFileInfo 文件信息 + * @return 文件信息集合 + */ + public List selectSysFileInfoList(SysFileInfo sysFileInfo); + + /** + * 新增文件信息 + * + * @param sysFileInfo 文件信息 + * @return 结果 + */ + public int insertSysFileInfo(SysFileInfo sysFileInfo); + + /** + * 修改文件信息 + * + * @param sysFileInfo 文件信息 + * @return 结果 + */ + public int updateSysFileInfo(SysFileInfo sysFileInfo); + + /** + * 删除文件信息 + * + * @param fileId 文件信息ID + * @return 结果 + */ + public int deleteSysFileInfoById(Long fileId); + + /** + * 批量删除文件信息 + * + * @param fileIds 需要删除的数据ID + * @return 结果 + */ + public int deleteSysFileInfoByIds(String[] fileIds); +} diff --git a/box-test/src/main/java/com/ruoyi/test/mapper/TcUserMapper.java b/box-test/src/main/java/com/ruoyi/test/mapper/TcUserMapper.java new file mode 100644 index 000000000..39f541866 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/mapper/TcUserMapper.java @@ -0,0 +1,26 @@ +package com.ruoyi.test.mapper; + +import com.ruoyi.test.domain.TcUser; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Mapper +@Component("TCUserMapper") +public interface TcUserMapper { + //查询所有 + List selectAll(); + + //查询 by id + TcUser selectById(int id); + + //增加 + int insert(TcUser tcUser); + + //删除 by id + int deleteById(int id); + + //更新 by id + int updateById(TcUser tcUser); +} diff --git a/box-test/src/main/java/com/ruoyi/test/mapper/TestVerifyMapper.java b/box-test/src/main/java/com/ruoyi/test/mapper/TestVerifyMapper.java new file mode 100644 index 000000000..36327dd82 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/mapper/TestVerifyMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.test.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Component; + +@Mapper +@Component("TestVerifyMapper") +public interface TestVerifyMapper { + //检查姓名是否唯一 + int isNameUnique(String name); +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/ISysCustomerService.java b/box-test/src/main/java/com/ruoyi/test/service/ISysCustomerService.java new file mode 100644 index 000000000..4a3aafa4d --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/ISysCustomerService.java @@ -0,0 +1,62 @@ +package com.ruoyi.test.service; + +import com.ruoyi.test.domain.SysCustomer; + +import java.util.List; + +/** + * 客户Service接口 + * + * @author box + * @date 2021-02-13 + */ +public interface ISysCustomerService +{ + /** + * 查询客户 + * + * @param customerId 客户ID + * @return 客户 + */ + public SysCustomer selectSysCustomerById(Long customerId); + + /** + * 查询客户列表 + * + * @param sysCustomer 客户 + * @return 客户集合 + */ + public List selectSysCustomerList(SysCustomer sysCustomer); + + /** + * 新增客户 + * + * @param sysCustomer 客户 + * @return 结果 + */ + public int insertSysCustomer(SysCustomer sysCustomer); + + /** + * 修改客户 + * + * @param sysCustomer 客户 + * @return 结果 + */ + public int updateSysCustomer(SysCustomer sysCustomer); + + /** + * 批量删除客户 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteSysCustomerByIds(String ids); + + /** + * 删除客户信息 + * + * @param customerId 客户ID + * @return 结果 + */ + public int deleteSysCustomerById(Long customerId); +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/ISysFileInfoService.java b/box-test/src/main/java/com/ruoyi/test/service/ISysFileInfoService.java new file mode 100644 index 000000000..7df14d3ac --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/ISysFileInfoService.java @@ -0,0 +1,62 @@ +package com.ruoyi.test.service; + +import com.ruoyi.test.domain.SysFileInfo; + +import java.util.List; + +/** + * 文件信息Service接口 + * + * @author box + * @date 2021-05-06 + */ +public interface ISysFileInfoService +{ + /** + * 查询文件信息 + * + * @param fileId 文件信息ID + * @return 文件信息 + */ + public SysFileInfo selectSysFileInfoById(Long fileId); + + /** + * 查询文件信息列表 + * + * @param sysFileInfo 文件信息 + * @return 文件信息集合 + */ + public List selectSysFileInfoList(SysFileInfo sysFileInfo); + + /** + * 新增文件信息 + * + * @param sysFileInfo 文件信息 + * @return 结果 + */ + public int insertSysFileInfo(SysFileInfo sysFileInfo); + + /** + * 修改文件信息 + * + * @param sysFileInfo 文件信息 + * @return 结果 + */ + public int updateSysFileInfo(SysFileInfo sysFileInfo); + + /** + * 批量删除文件信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteSysFileInfoByIds(String ids); + + /** + * 删除文件信息信息 + * + * @param fileId 文件信息ID + * @return 结果 + */ + public int deleteSysFileInfoById(Long fileId); +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/OracleDdlService.java b/box-test/src/main/java/com/ruoyi/test/service/OracleDdlService.java new file mode 100644 index 000000000..e6b5b6200 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/OracleDdlService.java @@ -0,0 +1,22 @@ +package com.ruoyi.test.service; + +public interface OracleDdlService { + //修改表名 + int alterTableName(String originalTableName, String newTableName); + + // truncate指定数据库表的数据 + int truncateTable(String tableName); + + //drop 指定定数据库表 + int dropTable(String tableName); + + + //根据传入的表明,创建新的表并且将原表的数据插入到新的Occur表中 + void copyTable(String newTableName,String originalTableName); + + //统计某张表中的总数据条数 + int getRecordCount(String tableName); + + //从指定数据库中,查询是否存在某张表 + int isTableInDb(String dataBaseName, String tableName); +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/TcUserService.java b/box-test/src/main/java/com/ruoyi/test/service/TcUserService.java new file mode 100644 index 000000000..2f32e20cd --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/TcUserService.java @@ -0,0 +1,22 @@ +package com.ruoyi.test.service; + +import com.ruoyi.test.domain.TcUser; + +import java.util.List; + +public interface TcUserService { + //查询所有用户 + List selectAll(); + + //根据id查询用户信息 + TcUser selectById(int id); + + //新增用户 + TcUser insert (TcUser tcUser); + + // 根据id删除 + int deleteById (int id); + + //更新用户信息 + int updateById(TcUser tcUser); +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/TestService.java b/box-test/src/main/java/com/ruoyi/test/service/TestService.java new file mode 100644 index 000000000..8b6b40b97 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/TestService.java @@ -0,0 +1,10 @@ +package com.ruoyi.test.service; + +import org.springframework.stereotype.Service; + +@Service +public class TestService { + public String test(){ + return "hello,box-test.test"; + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/TestVerifyService.java b/box-test/src/main/java/com/ruoyi/test/service/TestVerifyService.java new file mode 100644 index 000000000..6f6e9b0b4 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/TestVerifyService.java @@ -0,0 +1,9 @@ +package com.ruoyi.test.service; + +import org.springframework.stereotype.Service; + +@Service +public interface TestVerifyService { + //检查姓名是否唯一 + int isNameUnique(String name); +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/impl/OracleDdlServiceImpl.java b/box-test/src/main/java/com/ruoyi/test/service/impl/OracleDdlServiceImpl.java new file mode 100644 index 000000000..1ebf0b930 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/impl/OracleDdlServiceImpl.java @@ -0,0 +1,45 @@ +package com.ruoyi.test.service.impl; + +import com.ruoyi.test.mapper.OracleDdlMapper; +import com.ruoyi.test.service.OracleDdlService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +//@DataSource(value = DataSourceType.SLAVE) +public class OracleDdlServiceImpl implements OracleDdlService { + @Autowired + private OracleDdlMapper oracleDdlMapper; + + //修改表名 + public int alterTableName(String originalTableName, String newTableName) + { + return oracleDdlMapper.alterTableName(originalTableName,newTableName); + } + + // truncate指定数据库表的数据 + public int truncateTable(String tableName){ + return oracleDdlMapper.truncateTable(tableName); + } + + //drop 指定定数据库表 + public int dropTable(String tableName){ + return oracleDdlMapper.dropTable(tableName); + } + + + //根据传入的表明,创建新的表并且将原表的数据插入到新的Occur表中 + public void copyTable(String newTableName,String originalTableName){ + return ; + } + + //统计某张表中的总数据条数 + public int getRecordCount(String tableName){ + return oracleDdlMapper.getRecordCount(tableName); + } + + //从指定数据库中,查询是否存在某张表 + public int isTableInDb(String dataBaseName, String tableName){ + return oracleDdlMapper.isTableInDb(dataBaseName,tableName); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/impl/SysCustomerServiceImpl.java b/box-test/src/main/java/com/ruoyi/test/service/impl/SysCustomerServiceImpl.java new file mode 100644 index 000000000..a7d13ef6b --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/impl/SysCustomerServiceImpl.java @@ -0,0 +1,132 @@ +package com.ruoyi.test.service.impl; + +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.test.domain.SysCustomer; +import com.ruoyi.test.domain.SysGoods; +import com.ruoyi.test.mapper.SysCustomerMapper; +import com.ruoyi.test.service.ISysCustomerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 客户Service业务层处理 + * + * @author box + * @date 2021-02-13 + */ +@Service +public class SysCustomerServiceImpl implements ISysCustomerService +{ + @Autowired + private SysCustomerMapper sysCustomerMapper; + + /** + * 查询客户 + * + * @param customerId 客户ID + * @return 客户 + */ + @Override + public SysCustomer selectSysCustomerById(Long customerId) + { + return sysCustomerMapper.selectSysCustomerById(customerId); + } + + /** + * 查询客户列表 + * + * @param sysCustomer 客户 + * @return 客户 + */ + @Override + public List selectSysCustomerList(SysCustomer sysCustomer) + { + return sysCustomerMapper.selectSysCustomerList(sysCustomer); + } + + /** + * 新增客户 + * + * @param sysCustomer 客户 + * @return 结果 + */ + @Transactional + @Override + public int insertSysCustomer(SysCustomer sysCustomer) + { + int rows = sysCustomerMapper.insertSysCustomer(sysCustomer); + insertSysGoods(sysCustomer); + return rows; + } + + /** + * 修改客户 + * + * @param sysCustomer 客户 + * @return 结果 + */ + @Transactional + @Override + public int updateSysCustomer(SysCustomer sysCustomer) + { + sysCustomerMapper.deleteSysGoodsByCustomerId(sysCustomer.getCustomerId()); + insertSysGoods(sysCustomer); + return sysCustomerMapper.updateSysCustomer(sysCustomer); + } + + /** + * 删除客户对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Transactional + @Override + public int deleteSysCustomerByIds(String ids) + { + sysCustomerMapper.deleteSysGoodsByCustomerIds(Convert.toStrArray(ids)); + return sysCustomerMapper.deleteSysCustomerByIds(Convert.toStrArray(ids)); + } + + /** + * 删除客户信息 + * + * @param customerId 客户ID + * @return 结果 + */ + @Override + public int deleteSysCustomerById(Long customerId) + { + sysCustomerMapper.deleteSysGoodsByCustomerId(customerId); + return sysCustomerMapper.deleteSysCustomerById(customerId); + } + + /** + * 新增商品信息 + * + * @param sysCustomer 客户对象 + */ + public void insertSysGoods(SysCustomer sysCustomer) + { + List sysGoodsList = sysCustomer.getSysGoodsList(); + Long customerId = sysCustomer.getCustomerId(); + if (StringUtils.isNotNull(sysGoodsList)) + { + List list = new ArrayList(); + for (SysGoods sysGoods : sysGoodsList) + { + sysGoods.setCustomerId(customerId); + list.add(sysGoods); + } + if (list.size() > 0) + { + sysCustomerMapper.batchSysGoods(list); + } + } + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/impl/SysFileInfoServiceImpl.java b/box-test/src/main/java/com/ruoyi/test/service/impl/SysFileInfoServiceImpl.java new file mode 100644 index 000000000..a7407bbce --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/impl/SysFileInfoServiceImpl.java @@ -0,0 +1,95 @@ +package com.ruoyi.test.service.impl; + +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.test.domain.SysFileInfo; +import com.ruoyi.test.mapper.SysFileInfoMapper; +import com.ruoyi.test.service.ISysFileInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 文件信息Service业务层处理 + * + * @author box + * @date 2021-05-06 + */ +@Service +public class SysFileInfoServiceImpl implements ISysFileInfoService +{ + @Autowired + private SysFileInfoMapper sysFileInfoMapper; + + /** + * 查询文件信息 + * + * @param fileId 文件信息ID + * @return 文件信息 + */ + @Override + public SysFileInfo selectSysFileInfoById(Long fileId) + { + return sysFileInfoMapper.selectSysFileInfoById(fileId); + } + + /** + * 查询文件信息列表 + * + * @param sysFileInfo 文件信息 + * @return 文件信息 + */ + @Override + public List selectSysFileInfoList(SysFileInfo sysFileInfo) + { + return sysFileInfoMapper.selectSysFileInfoList(sysFileInfo); + } + + /** + * 新增文件信息 + * + * @param sysFileInfo 文件信息 + * @return 结果 + */ + @Override + public int insertSysFileInfo(SysFileInfo sysFileInfo) + { + return sysFileInfoMapper.insertSysFileInfo(sysFileInfo); + } + + /** + * 修改文件信息 + * + * @param sysFileInfo 文件信息 + * @return 结果 + */ + @Override + public int updateSysFileInfo(SysFileInfo sysFileInfo) + { + return sysFileInfoMapper.updateSysFileInfo(sysFileInfo); + } + + /** + * 删除文件信息对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteSysFileInfoByIds(String ids) + { + return sysFileInfoMapper.deleteSysFileInfoByIds(Convert.toStrArray(ids)); + } + + /** + * 删除文件信息信息 + * + * @param fileId 文件信息ID + * @return 结果 + */ + @Override + public int deleteSysFileInfoById(Long fileId) + { + return sysFileInfoMapper.deleteSysFileInfoById(fileId); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/impl/TcUserServiceImpl.java b/box-test/src/main/java/com/ruoyi/test/service/impl/TcUserServiceImpl.java new file mode 100644 index 000000000..ca691ce98 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/impl/TcUserServiceImpl.java @@ -0,0 +1,48 @@ +package com.ruoyi.test.service.impl; + +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.test.domain.TcUser; +import com.ruoyi.test.mapper.TcUserMapper; +import com.ruoyi.test.service.TcUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@DataSource(value = DataSourceType.SQLSVR) +public class TcUserServiceImpl implements TcUserService { + @Autowired + private TcUserMapper tcUserMapper; + + //查询所有用户 + @Override + public List selectAll() { + return tcUserMapper.selectAll(); + } + + //查询 by id + @Override + public TcUser selectById(int id) { + return tcUserMapper.selectById(id); + } + + //新增 + @Override + public TcUser insert(TcUser tcUser) { + int user=tcUserMapper.insert(tcUser); + return tcUser; + } + + //删除by id + @Override + public int deleteById(int id) { + return tcUserMapper.deleteById(id); + } + //更新 by id + @Override + public int updateById(TcUser tcUser) { + return tcUserMapper.updateById(tcUser); + } +} diff --git a/box-test/src/main/java/com/ruoyi/test/service/impl/TestVerifyServiceImpl.java b/box-test/src/main/java/com/ruoyi/test/service/impl/TestVerifyServiceImpl.java new file mode 100644 index 000000000..0293b1c6d --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/service/impl/TestVerifyServiceImpl.java @@ -0,0 +1,19 @@ +package com.ruoyi.test.service.impl; + +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.test.mapper.TestVerifyMapper; +import com.ruoyi.test.service.TestVerifyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +@DataSource(value = DataSourceType.SQLSVR) +public class TestVerifyServiceImpl implements TestVerifyService { + @Autowired + private TestVerifyMapper testVerifyMapper; + @Override + public int isNameUnique(String name) { + return testVerifyMapper.isNameUnique(name); + } +} diff --git a/box-test/src/main/resources/mapper/test/OracleDdlMapper.xml b/box-test/src/main/resources/mapper/test/OracleDdlMapper.xml new file mode 100644 index 000000000..08cb35d57 --- /dev/null +++ b/box-test/src/main/resources/mapper/test/OracleDdlMapper.xml @@ -0,0 +1,29 @@ + + + + + + alter table ${originalTableName} rename ${newTableName} + + + + truncate table ${tableName} + + + + drop table ${tableName} + + + + create table ${newTableName} as select * from ${originalTableName} + + + + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/mapper/test/SysCustomerMapper.xml b/box-test/src/main/resources/mapper/test/SysCustomerMapper.xml new file mode 100644 index 000000000..d4e97c0b1 --- /dev/null +++ b/box-test/src/main/resources/mapper/test/SysCustomerMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select customer_id, customer_name, phonenumber, sex, birthday, remark from sys_customer + + + + + + + + insert into sys_customer + + customer_name, + phonenumber, + sex, + birthday, + remark, + + + #{customerName}, + #{phonenumber}, + #{sex}, + #{birthday}, + #{remark}, + + + + + update sys_customer + + customer_name = #{customerName}, + phonenumber = #{phonenumber}, + sex = #{sex}, + birthday = #{birthday}, + remark = #{remark}, + + where customer_id = #{customerId} + + + + delete from sys_customer where customer_id = #{customerId} + + + + delete from sys_customer where customer_id in + + #{customerId} + + + + + delete from sys_goods where customer_id in + + #{customerId} + + + + + delete from sys_goods where customer_id = #{customerId} + + + + insert into sys_goods( goods_id, customer_id, name, weight, price, date, type) values + + ( #{item.goodsId}, #{item.customerId}, #{item.name}, #{item.weight}, #{item.price}, #{item.date}, #{item.type}) + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/mapper/test/SysFileInfoMapper.xml b/box-test/src/main/resources/mapper/test/SysFileInfoMapper.xml new file mode 100644 index 000000000..1fa4beeac --- /dev/null +++ b/box-test/src/main/resources/mapper/test/SysFileInfoMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + select file_id, file_name, file_path from sys_file_info + + + + + + + + insert into sys_file_info + + file_name, + file_path, + + + #{fileName}, + #{filePath}, + + + + + update sys_file_info + + file_name = #{fileName}, + file_path = #{filePath}, + + where file_id = #{fileId} + + + + delete from sys_file_info where file_id = #{fileId} + + + + delete from sys_file_info where file_id in + + #{fileId} + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/mapper/test/TcUserMapper.xml b/box-test/src/main/resources/mapper/test/TcUserMapper.xml new file mode 100644 index 000000000..ee5f415f7 --- /dev/null +++ b/box-test/src/main/resources/mapper/test/TcUserMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + insert into tc_user + + + id, + + + name, + + + password, + + + + + #{id,jdbcType=INTEGER}, + + + #{name,jdbcType=VARCHAR}, + + + #{password,jdbcType=VARCHAR}, + + + + + + + delete from tc_user where id=#{id} + + + + + update tc_user + + + name = #{name,jdbcType=VARCHAR}, + + + password = #{password,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/mapper/test/TestVerifyMapper.xml b/box-test/src/main/resources/mapper/test/TestVerifyMapper.xml new file mode 100644 index 000000000..9995edb00 --- /dev/null +++ b/box-test/src/main/resources/mapper/test/TestVerifyMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/customer/add.html b/box-test/src/main/resources/templates/test/customer/add.html new file mode 100644 index 000000000..c22d83716 --- /dev/null +++ b/box-test/src/main/resources/templates/test/customer/add.html @@ -0,0 +1,167 @@ + + + + + + + +
+
+

客户信息

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + 代码生成请选择字典属性 +
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+

商品信息

+
+
+ + +
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/customer/customer.html b/box-test/src/main/resources/templates/test/customer/customer.html new file mode 100644 index 000000000..484e01d18 --- /dev/null +++ b/box-test/src/main/resources/templates/test/customer/customer.html @@ -0,0 +1,117 @@ + + + + + + +
+
+
+
+
+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • +  搜索 +  重置 +
  • +
+
+
+
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/customer/edit.html b/box-test/src/main/resources/templates/test/customer/edit.html new file mode 100644 index 000000000..41c5e9093 --- /dev/null +++ b/box-test/src/main/resources/templates/test/customer/edit.html @@ -0,0 +1,186 @@ + + + + + + + + +
+
+

客户信息

+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + 代码生成请选择字典属性 +
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+

商品信息

+
+
+ + +
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/fileinfo/add.html b/box-test/src/main/resources/templates/test/fileinfo/add.html new file mode 100644 index 000000000..a3a91273a --- /dev/null +++ b/box-test/src/main/resources/templates/test/fileinfo/add.html @@ -0,0 +1,37 @@ + + + + + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/fileinfo/edit.html b/box-test/src/main/resources/templates/test/fileinfo/edit.html new file mode 100644 index 000000000..3d7f13c34 --- /dev/null +++ b/box-test/src/main/resources/templates/test/fileinfo/edit.html @@ -0,0 +1,38 @@ + + + + + + +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/fileinfo/fileinfo.html b/box-test/src/main/resources/templates/test/fileinfo/fileinfo.html new file mode 100644 index 000000000..a4b81a52c --- /dev/null +++ b/box-test/src/main/resources/templates/test/fileinfo/fileinfo.html @@ -0,0 +1,94 @@ + + + + + + +
+
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/index.html b/box-test/src/main/resources/templates/test/index.html new file mode 100644 index 000000000..4b05e873e --- /dev/null +++ b/box-test/src/main/resources/templates/test/index.html @@ -0,0 +1,33 @@ + + + + + BPS后台管理系统-测试首页 + + +

BPS后台管理系统-测试首页



+一、Mybaits配置DML测试-Oracle(第二数据源) +
  • 查询所有用户
  • +
  • 新增ID为1000的用户
  • +
  • 根据ID查询用户,查询id=1000的用户
  • +
  • 修改用户为1000的用户姓名为Xia
  • +
  • 删除ID为1000的用户
  • + +

    +二、Mybaits配置DDL测试-Oracle +
  • 查询表中的记录数
  • +
  • 查询tc_user是否存在
  • +

    +Ajax发送获取Json配置测试 +

    +二、输入后验证测试 + +

  • 验证数据表中是否有记录
  • +

    + + +三、当前系统时间 + + + + \ No newline at end of file diff --git a/box-test/src/main/resources/templates/test/sendJson.html b/box-test/src/main/resources/templates/test/sendJson.html new file mode 100644 index 000000000..9c01a77e4 --- /dev/null +++ b/box-test/src/main/resources/templates/test/sendJson.html @@ -0,0 +1,99 @@ + + + + + 发送json + + + + + + +
    +


    + +
    +
    + + + diff --git a/box-test/src/main/resources/templates/test/testVerify.html b/box-test/src/main/resources/templates/test/testVerify.html new file mode 100644 index 000000000..b58ae6111 --- /dev/null +++ b/box-test/src/main/resources/templates/test/testVerify.html @@ -0,0 +1,65 @@ + + + + + + +
    +
    +
    +
    用户名: + + +
    + +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 39b46e9ec..403d891cf 100644 --- a/pom.xml +++ b/pom.xml @@ -229,6 +229,20 @@ ${ruoyi.version} + + + com.ruoyi + box-test + ${ruoyi.version} + + + + + com.ruoyi + box-bps + ${ruoyi.version} + + @@ -239,6 +253,8 @@ ruoyi-quartz ruoyi-generator ruoyi-common + box-test + box-bps pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index bec326bca..a45b2253c 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -61,6 +61,21 @@ mysql-connector-java + + + + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 + + + + + com.microsoft.sqlserver + mssql-jdbc + 8.4.1.jre8 + + com.ruoyi @@ -79,6 +94,18 @@ ruoyi-generator + + + com.ruoyi + box-test + + + + + com.ruoyi + box-bps + + diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 3c46fd50b..0c7535d6b 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -2,20 +2,48 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver + #driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: - url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://192.168.2.18:3306/bps?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: password + password: abc.123 # 从库数据源 slave: # 从数据源开关/默认关闭 - enabled: false - url: - username: - password: + enabled: true + url: jdbc:oracle:thin:@192.168.2.91:1521/toptest + username: ds7 + password: ds7 + driverClassName: oracle.jdbc.driver.OracleDriver + #SQlServer数据源 + sqlsvr: + # 从数据源开关/默认关闭 + enabled: true + url: jdbc:sqlserver://192.168.2.84:1433;SelectMethod=cursor;DatabaseName=ITDemo + username: sa + password: abc.123 + driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver + + # Topprod_ds_report + topproddsreport: + # 从数据源开关/默认关闭 + enabled: true + url: jdbc:oracle:thin:@192.168.2.91:1521/topprod + username: ds_report + password: ds_report + driverClassName: oracle.jdbc.driver.OracleDriver + + # Toptest_ds_report + toptestdsreport: + # 从数据源开关/默认关闭 + enabled: true + url: jdbc:oracle:thin:@192.168.2.91:1521/toptest + username: ds_report + password: ds_report + driverClassName: oracle.jdbc.driver.OracleDriver + # 初始连接数 initialSize: 5 # 最小连接池数量 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 764a13fd2..8c26d5c40 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -9,7 +9,7 @@ ruoyi: # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) - profile: D:/ruoyi/uploadPath + profile: C:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false @@ -19,7 +19,7 @@ server: port: 80 servlet: # 应用的访问路径 - context-path: / + context-path: /it_war tomcat: # tomcat的URI编码 uri-encoding: UTF-8 @@ -96,7 +96,7 @@ shiro: # 首页地址 indexUrl: /index # 验证码开关 - captchaEnabled: true + captchaEnabled: false # 验证码类型 math 数组计算 char 字符 captchaType: math cookie: diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java index 4b5341d19..ef66ad86b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java @@ -15,5 +15,20 @@ public enum DataSourceType /** * 从库 */ - SLAVE + SLAVE, + + /** + * SQLSERVER数据库 + */ + SQLSVR, + + /** + * TOPPROD_DS_REPORT数据库 + */ + TOPPRODDSREPORT, + + /** + * TOPTEST_DS_REPORT数据库 + */ + TOPTESTDSREPORT } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java index b4c356bb0..3a6d1f99f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -49,6 +49,39 @@ public class DruidConfig return druidProperties.dataSource(dataSource); } + //add yangbo 新增SQLSERVER数据源 --Begin + @Bean + @ConfigurationProperties("spring.datasource.druid.sqlsvr") + @ConditionalOnProperty(prefix = "spring.datasource.druid.sqlsvr", name = "enabled", havingValue = "true") + public DataSource sqlsvrDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + //add yangbo 新增SQLSERVER数据源 --End + + //add yangbo 新增topprod ds_report数据源 --Begin + @Bean + @ConfigurationProperties("spring.datasource.druid.topproddsreport") + @ConditionalOnProperty(prefix = "spring.datasource.druid.topproddsreport", name = "enabled", havingValue = "true") + public DataSource topproddsreportDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + //add yangbo 新增topprod ds_report数据源 --End + + //add yangbo 新增toptest ds_report数据源 --Begin + @Bean + @ConfigurationProperties("spring.datasource.druid.toptestdsreport") + @ConditionalOnProperty(prefix = "spring.datasource.druid.toptestdsreport", name = "enabled", havingValue = "true") + public DataSource toptestdsreportDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + //add yangbo 新增toptest ds_report数据源 --End + @Bean(name = "dynamicDataSource") @Primary public DynamicDataSource dataSource(DataSource masterDataSource) @@ -56,6 +89,11 @@ public class DruidConfig Map targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + //add yangbo 新增SQLSERVER、topproddsreport、toptestdsreport数据源 --Begin + setDataSource(targetDataSources, DataSourceType.SQLSVR.name(), "sqlsvrDataSource"); + setDataSource(targetDataSources, DataSourceType.TOPPRODDSREPORT.name(), "topproddsreportDataSource"); + setDataSource(targetDataSources, DataSourceType.TOPTESTDSREPORT.name(), "toptestdsreportDataSource"); + //add yangbo 新增SQLSERVER、topproddsreport、toptestdsreport数据源 --End return new DynamicDataSource(masterDataSource, targetDataSources); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java index d69672785..a3a233584 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java @@ -274,6 +274,8 @@ public class ShiroConfig filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/ruoyi/**", "anon"); filterChainDefinitionMap.put("/captcha/captchaImage**", "anon"); + filterChainDefinitionMap.put("/test/**", "anon"); //为防便测试,配置test路径可以匿名访问 + filterChainDefinitionMap.put("/anon/**", "anon"); //为防便测试,配置anon路径可以匿名访问 // 退出 logout地址,shiro去清除session filterChainDefinitionMap.put("/logout", "logout"); // 不需要拦截的访问 From 89eac0a1b69132b8a5d113046c55e44e7f670a5d Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Fri, 28 May 2021 17:28:33 +0800 Subject: [PATCH 02/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B8=86=E8=BD=AF?= =?UTF-8?q?=E5=88=A0=E8=A1=A8=20=E5=A2=9E=E5=8A=A0=E5=BF=AB=E9=80=92?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- box-bps/pom.xml | 19 + .../controller/ExpSubsPushApiController.java | 46 +++ .../controller/ExpSubsPushRespController.java | 123 +++++++ .../controller/ExpSubscribeController.java | 139 +++++++ .../bps/controller/ExpressInfoController.java | 124 +++++++ .../bps/controller/ExpressTestController.java | 50 +++ .../controller/FrForCrTopgpController.java | 102 ++++++ .../controller/QueryExpressController.java | 103 ++++++ .../com/ruoyi/bps/domain/ExpSubsPushResp.java | 345 ++++++++++++++++++ .../com/ruoyi/bps/domain/ExpSubscribe.java | 149 ++++++++ .../com/ruoyi/bps/domain/ExpressInfo.java | 192 ++++++++++ .../bps/mapper/ExpSubsPushRespMapper.java | 64 ++++ .../ruoyi/bps/mapper/ExpSubscribeMapper.java | 64 ++++ .../ruoyi/bps/mapper/ExpressInfoMapper.java | 64 ++++ .../com/ruoyi/bps/mapper/TopgpDdlMapper.java | 32 ++ .../bps/service/IExpSubsPushApiService.java | 22 ++ .../bps/service/IExpSubsPushRespService.java | 63 ++++ .../bps/service/IExpSubscribeService.java | 62 ++++ .../bps/service/IExpressInfoService.java | 62 ++++ .../ruoyi/bps/service/IExpressService.java | 33 ++ .../ruoyi/bps/service/TopgpDdlService.java | 22 ++ .../bps/service/TopgpDdlServiceImpl.java | 45 +++ .../impl/ExpSubsPushApiServiceImpl.java | 249 +++++++++++++ .../impl/ExpSubsPushRespServiceImpl.java | 95 +++++ .../service/impl/ExpSubscribeServiceImpl.java | 95 +++++ .../service/impl/ExpressInfoServiceImpl.java | 259 +++++++++++++ .../bps/service/impl/ExpressServiceImpl.java | 199 ++++++++++ box-bps/src/main/resources/account.properties | 25 ++ .../mapper/bps/ExpSubsPushRespMapper.xml | 149 ++++++++ .../mapper/bps/ExpSubscribeMapper.xml | 90 +++++ .../mapper/bps/ExpressInfoMapper.xml | 101 +++++ .../resources/mapper/bps/TopgpDdlMapper.xml | 29 ++ .../templates/bps/expressInfo/add.html | 97 +++++ .../templates/bps/expressInfo/edit.html | 98 +++++ .../bps/expressInfo/expressInfo.html | 145 ++++++++ .../templates/bps/expsubspushresp/add.html | 169 +++++++++ .../templates/bps/expsubspushresp/edit.html | 170 +++++++++ .../bps/expsubspushresp/expsubspushresp.html | 205 +++++++++++ .../templates/bps/subscribe/add.html | 75 ++++ .../templates/bps/subscribe/edit.html | 76 ++++ .../templates/bps/subscribe/subscribe.html | 169 +++++++++ .../templates/express/queryExpress.html | 98 +++++ .../com/ruoyi/common/enums/BusinessType.java | 5 + 43 files changed, 4523 insertions(+) create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/ExpressTestController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/QueryExpressController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubsPushResp.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubscribe.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubsPushRespMapper.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubscribeMapper.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/mapper/TopgpDdlMapper.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushRespService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IExpSubscribeService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IExpressService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlServiceImpl.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushRespServiceImpl.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubscribeServiceImpl.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java create mode 100644 box-bps/src/main/resources/account.properties create mode 100644 box-bps/src/main/resources/mapper/bps/ExpSubsPushRespMapper.xml create mode 100644 box-bps/src/main/resources/mapper/bps/ExpSubscribeMapper.xml create mode 100644 box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml create mode 100644 box-bps/src/main/resources/mapper/bps/TopgpDdlMapper.xml create mode 100644 box-bps/src/main/resources/templates/bps/expressInfo/add.html create mode 100644 box-bps/src/main/resources/templates/bps/expressInfo/edit.html create mode 100644 box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html create mode 100644 box-bps/src/main/resources/templates/bps/expsubspushresp/add.html create mode 100644 box-bps/src/main/resources/templates/bps/expsubspushresp/edit.html create mode 100644 box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html create mode 100644 box-bps/src/main/resources/templates/bps/subscribe/add.html create mode 100644 box-bps/src/main/resources/templates/bps/subscribe/edit.html create mode 100644 box-bps/src/main/resources/templates/bps/subscribe/subscribe.html create mode 100644 box-bps/src/main/resources/templates/express/queryExpress.html diff --git a/box-bps/pom.xml b/box-bps/pom.xml index 7efa32418..729e8ff11 100644 --- a/box-bps/pom.xml +++ b/box-bps/pom.xml @@ -23,6 +23,25 @@ ruoyi-common + + org.json + json + 20160810 + + + + io.swagger + swagger-annotations + 1.5.21 + compile + + + + com.github.kuaidi100-api + sdk + 1.0.2 + + \ No newline at end of file diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java new file mode 100644 index 000000000..02e7cc63e --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java @@ -0,0 +1,46 @@ +package com.ruoyi.bps.controller; + +import com.kuaidi100.sdk.response.SubscribeResp; +import com.ruoyi.bps.domain.ExpSubscribe; +import com.ruoyi.bps.service.IExpSubsPushApiService; +import com.ruoyi.common.core.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * 接受快递推送信息的API接口Controller + * + * @author box + * @date 2021-05-13 + */ +@Api("快递信息订阅推送") +@RestController +@RequestMapping("/anon") +public class ExpSubsPushApiController extends BaseController { + @Autowired + IExpSubsPushApiService expSubsPushApiService; + + //推送 + @CrossOrigin + @PostMapping("/subscribeCallBackUrl") + @ApiOperation("快递信息订阅推送接受") + public SubscribeResp SubscribeCallBackUrl(HttpServletRequest request) { + return expSubsPushApiService.ExpressSubscribeCallBackUrl(request); + } + + //订阅 + @CrossOrigin + @PostMapping("/subscribe") + public SubscribeResp Subscribe(ExpSubscribe expSubscribe){ + return expSubsPushApiService.ExpressSubscribe(expSubscribe); + } + +} + diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java new file mode 100644 index 000000000..3b8792816 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java @@ -0,0 +1,123 @@ +package com.ruoyi.bps.controller; + +import com.ruoyi.bps.domain.ExpSubsPushResp; +import com.ruoyi.bps.service.IExpSubsPushRespService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 快递订阅推送信息增删改查Controller + * + * @author box + * @date 2021-05-13 + */ +@Controller +@RequestMapping("/bps/expsubspushresp") +public class ExpSubsPushRespController extends BaseController +{ + private String prefix = "bps/expsubspushresp"; + + @Autowired + private IExpSubsPushRespService expSubsPushRespService; + + @RequiresPermissions("bps:expsubspushresp:view") + @GetMapping() + public String expsubspushresp() + { + return prefix + "/expsubspushresp"; + } + + /** + * 查询快递订阅推送信息列表 + */ + @RequiresPermissions("bps:expsubspushresp:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(ExpSubsPushResp expSubsPushResp) + { + startPage(); + List list = expSubsPushRespService.selectExpSubsPushRespList(expSubsPushResp); + return getDataTable(list); + } + + /** + * 导出快递订阅推送信息列表 + */ + @RequiresPermissions("bps:expsubspushresp:export") + @Log(title = "快递订阅推送信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(ExpSubsPushResp expSubsPushResp) + { + List list = expSubsPushRespService.selectExpSubsPushRespList(expSubsPushResp); + ExcelUtil util = new ExcelUtil(ExpSubsPushResp.class); + return util.exportExcel(list, "快递订阅推送信息数据"); + } + + /** + * 新增快递订阅推送信息 + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } + + /** + * 新增保存快递订阅推送信息 + */ + @RequiresPermissions("bps:expsubspushresp:add") + @Log(title = "快递订阅推送信息", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(ExpSubsPushResp expSubsPushResp) + { + return toAjax(expSubsPushRespService.insertExpSubsPushResp(expSubsPushResp)); + } + + /** + * 修改快递订阅推送信息 + */ + @GetMapping("/edit/{sid}") + public String edit(@PathVariable("sid") Long sid, ModelMap mmap) + { + ExpSubsPushResp expSubsPushResp = expSubsPushRespService.selectExpSubsPushRespById(sid); + mmap.put("expSubsPushResp", expSubsPushResp); + return prefix + "/edit"; + } + + /** + * 修改保存快递订阅推送信息 + */ + @RequiresPermissions("bps:expsubspushresp:edit") + @Log(title = "快递订阅推送信息", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(ExpSubsPushResp expSubsPushResp) + { + return toAjax(expSubsPushRespService.updateExpSubsPushResp(expSubsPushResp)); + } + + /** + * 删除快递订阅推送信息 + */ + @RequiresPermissions("bps:expsubspushresp:remove") + @Log(title = "快递订阅推送信息", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(expSubsPushRespService.deleteExpSubsPushRespByIds(ids)); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java new file mode 100644 index 000000000..7ff195311 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java @@ -0,0 +1,139 @@ +package com.ruoyi.bps.controller; + +import com.ruoyi.bps.domain.ExpSubscribe; +import com.ruoyi.bps.service.IExpSubsPushApiService; +import com.ruoyi.bps.service.IExpSubscribeService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.kuaidi100.sdk.response.SubscribeResp; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 快递订阅Controller + * + * @author box + * @date 2021-05-20 + */ +@Controller +@RequestMapping("/bps/subscribe") +public class ExpSubscribeController extends BaseController +{ + private String prefix = "bps/subscribe"; + + @Autowired + private IExpSubscribeService expSubscribeService; + + @Autowired + private IExpSubsPushApiService iExpSubsPushApiService; + + @RequiresPermissions("bps:subscribe:view") + @GetMapping() + public String subscribe() + { + return prefix + "/subscribe"; + } + + /** + * 订阅快递 + */ + @CrossOrigin + @RequestMapping("/subscribe") + @ResponseBody + public SubscribeResp ExpressSubscribe(@RequestBody ExpSubscribe expSubscribe) { + return iExpSubsPushApiService.ExpressSubscribe(expSubscribe); + } + + + /** + * 查询快递订阅列表 + */ + @RequiresPermissions("bps:subscribe:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(ExpSubscribe expSubscribe) + { + startPage(); + List list = expSubscribeService.selectExpSubscribeList(expSubscribe); + return getDataTable(list); + } + + /** + * 导出快递订阅列表 + */ + @RequiresPermissions("bps:subscribe:export") + @Log(title = "快递订阅", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(ExpSubscribe expSubscribe) + { + List list = expSubscribeService.selectExpSubscribeList(expSubscribe); + ExcelUtil util = new ExcelUtil(ExpSubscribe.class); + return util.exportExcel(list, "快递订阅数据"); + } + + /** + * 新增快递订阅 + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } + + /** + * 新增保存快递订阅 + */ + @RequiresPermissions("bps:subscribe:add") + @Log(title = "快递订阅", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(ExpSubscribe expSubscribe) + { + return toAjax(expSubscribeService.insertExpSubscribe(expSubscribe)); + } + + /** + * 修改快递订阅 + */ + @GetMapping("/edit/{sid}") + public String edit(@PathVariable("sid") Long sid, ModelMap mmap) + { + ExpSubscribe expSubscribe = expSubscribeService.selectExpSubscribeById(sid); + mmap.put("expSubscribe", expSubscribe); + return prefix + "/edit"; + } + + /** + * 修改保存快递订阅 + */ + @RequiresPermissions("bps:subscribe:edit") + @Log(title = "快递订阅", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(ExpSubscribe expSubscribe) + { + return toAjax(expSubscribeService.updateExpSubscribe(expSubscribe)); + } + + /** + * 删除快递订阅 + */ + @RequiresPermissions("bps:subscribe:remove") + @Log(title = "快递订阅", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(expSubscribeService.deleteExpSubscribeByIds(ids)); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java new file mode 100644 index 000000000..ae09c6b0b --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java @@ -0,0 +1,124 @@ +package com.ruoyi.bps.controller; + +import com.ruoyi.bps.domain.ExpressInfo; +import com.ruoyi.bps.service.IExpressInfoService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.controller.BaseController; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 快递信息Controller + * + * @author box + * @date 2021-05-06 + */ +@Controller +@RequestMapping("/bps/expressInfo") +public class ExpressInfoController extends BaseController +{ + private String prefix = "bps/expressInfo"; + + @Autowired + private IExpressInfoService expressInfoService; + + @RequiresPermissions("bps:expressInfo:view") + @GetMapping() + public String expressInfo() + { + return prefix + "/expressInfo"; + } + + /** + * 查询快递信息列表 + */ + @RequiresPermissions("bps:expressInfo:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(ExpressInfo expressInfo) + { + startPage(); + List list = expressInfoService.selectExpressInfoList(expressInfo); + return getDataTable(list); + } + + /** + * 导出快递信息列表 + */ + @RequiresPermissions("bps:expressInfo:export") + @Log(title = "快递信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(ExpressInfo expressInfo) + { + List list = expressInfoService.selectExpressInfoList(expressInfo); + ExcelUtil util = new ExcelUtil(ExpressInfo.class); + return util.exportExcel(list, "快递信息数据"); + } + + /** + * 新增快递信息 + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } + + /** + * 新增保存快递信息 + */ + @RequiresPermissions("bps:expressInfo:add") + @Log(title = "快递信息", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(ExpressInfo expressInfo) + { + return toAjax(expressInfoService.insertExpressInfo(expressInfo)); + } + + /** + * 修改快递信息 + */ + @GetMapping("/edit/{message}") + public String edit(@PathVariable("message") String message, ModelMap mmap) + { + ExpressInfo expressInfo = expressInfoService.selectExpressInfoById(message); + mmap.put("expressInfo", expressInfo); + return prefix + "/edit"; + } + + /** + * 修改保存快递信息 + */ + @RequiresPermissions("bps:expressInfo:edit") + @Log(title = "快递信息", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(ExpressInfo expressInfo) + { + return toAjax(expressInfoService.updateExpressInfo(expressInfo)); + } + + /** + * 删除快递信息 + */ + @RequiresPermissions("bps:expressInfo:remove") + @Log(title = "快递信息", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(expressInfoService.deleteExpressInfoByIds(ids)); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressTestController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressTestController.java new file mode 100644 index 000000000..c248bc8e6 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressTestController.java @@ -0,0 +1,50 @@ +package com.ruoyi.bps.controller; + + +//import com.ruoyi.bps.express.contant.CompanyConstant; +//import com.ruoyi.bps.express.request.QueryTrackParam; + +import com.ruoyi.bps.service.IExpressService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.page.TableDataInfo; +import com.kuaidi100.sdk.request.QueryTrackParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ExpressTestController extends BaseController { + @Autowired + private IExpressService expressService; + + @RequestMapping("/anon/bps/express/test/queryTrackMultiList") + public TableDataInfo QueryTrackMultiList(){ + //return expressService.QueryTrackExpressMultiList(expressService.GetTestQueryTrackParam()).toString(); + return getDataTable(expressService.QueryTrackExpressMultiList(expressService.GetTestQueryTrackParam())); + } + + @RequestMapping("/anon/bps/express/test/queryTrackMulti") + public String QueryTrackMulti(){ + return expressService.QueryTrackExpressMulti(expressService.GetTestQueryTrackParam()); + } + + @RequestMapping("/anon/bps/express/test/queryTrack") + public String QueryTrack(){ + QueryTrackParam queryTrackParam = new QueryTrackParam(); + queryTrackParam.setCom("annengwuliu"); + queryTrackParam.setNum("3004459671351"); + queryTrackParam.setPhone("17725390266"); + + return expressService.QueryTrackExpress(queryTrackParam); + + + } + @RequestMapping("/anon/bps/express/test/subscribe") + public String Subscribe(){ + return expressService.SubscribeExpress(); + } + + + + +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java new file mode 100644 index 000000000..c0d8f02a3 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java @@ -0,0 +1,102 @@ +package com.ruoyi.bps.controller; + +import com.ruoyi.bps.service.TopgpDdlService; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@RestController +public class FrForCrTopgpController { + @Autowired + private TopgpDdlService topgpDdlService; + + //访问 ../anon/bps/frforcr/topprod时,使用topprod + @CrossOrigin + @Log(title = "CSFR412_CR报表_TOPPROD", businessType = BusinessType.DROP) + @RequestMapping("/anon/bps/frforcr/topprod") + @DataSource(value = DataSourceType.TOPPRODDSREPORT) + public AjaxResult frforcrtopprod(@RequestBody Map map){ + return frforcrtoppgp(map); + } + + //访问../anon/bps/frforcr/topprod时,使用toptest实例 + @CrossOrigin + @Log(title = "CSFR412_CR报表_TOPTEST", businessType = BusinessType.DROP) + @RequestMapping("/anon/bps/frforcr/toptest") + @DataSource(value = DataSourceType.TOPTESTDSREPORT) + public AjaxResult frforcrtoptest(@RequestBody Map map){ + return frforcrtoppgp(map); + } + + private AjaxResult frforcrtoppgp(Map map){ + /* 多此一举,在@RequestBody时取不到值是,已经会报500错误了,并不会执行到这一段。 + if(map.isEmpty()){ //如果传过来的值为空,返回未取到表名 + // System.out.println(LocalTime.now()+"未获取到表名!"); + return AjaxResult.error("未取到表名传参!"); + } + */ + StringBuilder droppedTable = new StringBuilder(); + StringBuilder errorDroppedTable = new StringBuilder(); + StringBuilder notExistsTable = new StringBuilder(); + + for (String tableName : getTableName(map)) { + if(topgpDdlService.isTableInDb("ds_report",tableName) <=0){ + //表名在数据库中不存在 + //System.out.println(LocalTime.now() + "【" + tableName + "】不存在!"); + notExistsTable.append(tableName+","); + continue; + } + + try { + topgpDdlService.dropTable("ds_report." + tableName); + //System.out.println(LocalTime.now() + "【" + tableName + "】已被删除!"); + droppedTable.append(tableName+","); + } catch (Exception e) { + //System.out.println(LocalTime.now() + "【" + tableName + "】删除异常!"); + errorDroppedTable.append(tableName+","); + } + } + + //删除异常写入日志 + if (StringUtils.isNotEmpty(errorDroppedTable)){ + return AjaxResult.error(errorDroppedTable+"删除异常!"); + } + //表不存在写入日志 + if(StringUtils.isNotEmpty(notExistsTable)){ + return AjaxResult.warn(notExistsTable+"表不存在!"); + } + //被删除的表写入日志 + if(StringUtils.isNotEmpty(droppedTable)){ + return AjaxResult.success(droppedTable + "删除成功!"); + } + //以上三种情况都不存在,说明发生了不明异常,写入日志 + return AjaxResult.warn("发生不明异常!"); + } + + //防止意手抖把SID也当成表传过来 + //排除sid的key值 + private List getTableName(Map map){ + List list=new ArrayList(); + for(String key:map.keySet()){ + if(key !="sid") + { + list.add(map.get(key).toString()); + } + } + return list; + } +} + + diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/QueryExpressController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/QueryExpressController.java new file mode 100644 index 000000000..faa2d2510 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/QueryExpressController.java @@ -0,0 +1,103 @@ +package com.ruoyi.bps.controller; + + +//import com.ruoyi.bps.express.contant.CompanyConstant; +//import com.ruoyi.bps.express.request.QueryTrackParam; +//import com.ruoyi.bps.express.response.QueryTrackResp; + +import com.ruoyi.bps.service.IExpressService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.page.TableDataInfo; +import com.google.gson.Gson; +import com.kuaidi100.sdk.request.QueryTrackParam; +import com.kuaidi100.sdk.response.QueryTrackResp; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.HashMap; +import java.util.Map; + +@Controller +public class QueryExpressController extends BaseController { + @Autowired + private IExpressService expressService; + @RequiresPermissions("bps:express:view") + @RequestMapping("/bps/express/queryExpress") + public String queryExpress() + { + //return "express/queryExpress"; + //说明:此处不能用绝对路径,否则,当application.yml中,设定context-path: /it_war后,打Jar包时,会找不到thymeleaf对应的文件。 + return "express/queryExpress"; + } + + @CrossOrigin + @RequestMapping("/bps/express/queryExpress/list") + @ResponseBody + public Map queryExpressList(@RequestBody QueryTrackParam queryTrackParam){ + Map result = null; + if (queryTrackParam != null) { + System.out.println("运单号码:" + queryTrackParam.getNum()); + System.out.println("快递公司:" + queryTrackParam.getCom()); + System.out.println("电话:" + queryTrackParam.getPhone()); + result = new HashMap<>(); + result.put("code", "1"); + result.put("msg", "ok"); + result.put("info",expressService.QueryTrackExpress(queryTrackParam)); + } + return result; + } + + @CrossOrigin + @RequestMapping("/bps/express/queryExpress/list1") + @ResponseBody + public Map queryExpressList1(@RequestBody QueryTrackParam queryTrackParam){ + Map result = null; + if (queryTrackParam != null) { + System.out.println("运单号码:" + queryTrackParam.getNum()); + System.out.println("快递公司:" + queryTrackParam.getCom()); + System.out.println("电话:" + queryTrackParam.getPhone()); + String info=expressService.QueryTrackExpress(queryTrackParam); + QueryTrackResp queryTrackResp = new Gson().fromJson(info,QueryTrackResp.class); + result = new HashMap<>(); + result.put("code", "1"); + result.put("msg", "ok"); + result.put("nu",queryTrackResp.getNu()); + result.put("com",queryTrackResp.getCom()); + result.put("state",queryTrackResp.getState()); + result.put("info",queryTrackResp.getData()); + } + return result; + } + + @RequestMapping("/anon/bps/express/queryTrackMultiList") + public TableDataInfo QueryTrackMultiList(@RequestBody QueryTrackParam queryTrackParam){ + + return getDataTable(expressService.QueryTrackExpressMultiList(expressService.GetTestQueryTrackParam())); + } + + @RequestMapping("/anon/bps/express/queryTrackMulti") + public String QueryTrackMulti(){ + return expressService.QueryTrackExpressMulti(expressService.GetTestQueryTrackParam()); + } + + @RequestMapping("/anon/bps/express/queryTrack") + public String QueryTrack(){ + QueryTrackParam queryTrackParam = new QueryTrackParam(); + queryTrackParam.setCom("annengwuliu"); + queryTrackParam.setNum("3004459671351"); + queryTrackParam.setPhone("17725390266"); + + return expressService.QueryTrackExpress(queryTrackParam); + + + } + @RequestMapping("/anon/bps/express/subscribe") + public String Subscribe(){ + return expressService.SubscribeExpress(); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubsPushResp.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubsPushResp.java new file mode 100644 index 000000000..d9e9a4fcc --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubsPushResp.java @@ -0,0 +1,345 @@ +package com.ruoyi.bps.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 快递订阅推送信息对象 exp_subs_push_resp + * + * @author box + * @date 2021-05-13 + */ +public class ExpSubsPushResp extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** SID */ + private Long sid; + + /** 监控状态 */ + @Excel(name = "监控状态") + private String status; + + /** 状态 */ + @Excel(name = "状态") + private String billStatus; + + /** 监控状态消息 */ + @Excel(name = "监控状态消息") + private String message; + + /** 快递公司编码是否出错 */ + @Excel(name = "快递公司编码是否出错") + private String autoCheck; + + /** 原始快递公司编码 */ + @Excel(name = "原始快递公司编码") + private String comOld; + + /** 修正快递公司编码 */ + @Excel(name = "修正快递公司编码") + private String comNew; + + /** 当前快递消息 */ + @Excel(name = "当前快递消息") + private String lastResultMessage; + + /** 当前快递单状态 */ + @Excel(name = "当前快递单状态") + private String lastResultState; + + /** 通讯状态 */ + @Excel(name = "通讯状态") + private String lastResulStatus; + + /** 快递单明细状态 */ + @Excel(name = "快递单明细状态") + private String lastResultCondition; + + /** 是否签收 */ + @Excel(name = "是否签收") + private String lastResultIsCheck; + + /** 快递公司编码 */ + @Excel(name = "快递公司编码") + private String lastResultCom; + + /** 快递单号 */ + @Excel(name = "快递单号") + private String lastResultNu; + + /** 快递流转信息 */ + @Excel(name = "快递流转信息") + private String lastResultData; + + /** 目的国快递消息 */ + @Excel(name = "目的国快递消息") + private String destResultMessage; + + /** 目的国快递单状态 */ + @Excel(name = "目的国快递单状态") + private String destResultState; + + /** 目的国通讯状态 */ + @Excel(name = "目的国通讯状态") + private String destResultStatus; + + /** 目的国快递单明细状态 */ + @Excel(name = "目的国快递单明细状态") + private String destResultCondition; + + /** 目的国是否签收 */ + @Excel(name = "目的国是否签收") + private String destResultIsCheck; + + /** 目的国快递公司编码 */ + @Excel(name = "目的国快递公司编码") + private String destResultCom; + + /** 目的国快递单号 */ + @Excel(name = "目的国快递单号") + private String destResultNu; + + /** 目的国快递流转信息 */ + @Excel(name = "目的国快递流转信息") + private String destResultData; + + public void setSid(Long sid) + { + this.sid = sid; + } + + public Long getSid() + { + return sid; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + public void setBillStatus(String billStatus) + { + this.billStatus = billStatus; + } + + public String getBillStatus() + { + return billStatus; + } + public void setMessage(String message) + { + this.message = message; + } + + public String getMessage() + { + return message; + } + public void setAutoCheck(String autoCheck) + { + this.autoCheck = autoCheck; + } + + public String getAutoCheck() + { + return autoCheck; + } + public void setComOld(String comOld) + { + this.comOld = comOld; + } + + public String getComOld() + { + return comOld; + } + public void setComNew(String comNew) + { + this.comNew = comNew; + } + + public String getComNew() + { + return comNew; + } + public void setLastResultMessage(String lastResultMessage) + { + this.lastResultMessage = lastResultMessage; + } + + public String getLastResultMessage() + { + return lastResultMessage; + } + public void setLastResultState(String lastResultState) + { + this.lastResultState = lastResultState; + } + + public String getLastResultState() + { + return lastResultState; + } + public void setLastResulStatus(String lastResulStatus) + { + this.lastResulStatus = lastResulStatus; + } + + public String getLastResulStatus() + { + return lastResulStatus; + } + public void setLastResultCondition(String lastResultCondition) + { + this.lastResultCondition = lastResultCondition; + } + + public String getLastResultCondition() + { + return lastResultCondition; + } + public void setLastResultIsCheck(String lastResultIsCheck) + { + this.lastResultIsCheck = lastResultIsCheck; + } + + public String getLastResultIsCheck() + { + return lastResultIsCheck; + } + public void setLastResultCom(String lastResultCom) + { + this.lastResultCom = lastResultCom; + } + + public String getLastResultCom() + { + return lastResultCom; + } + public void setLastResultNu(String lastResultNu) + { + this.lastResultNu = lastResultNu; + } + + public String getLastResultNu() + { + return lastResultNu; + } + public void setLastResultData(String lastResultData) + { + this.lastResultData = lastResultData; + } + + public String getLastResultData() + { + return lastResultData; + } + public void setDestResultMessage(String destResultMessage) + { + this.destResultMessage = destResultMessage; + } + + public String getDestResultMessage() + { + return destResultMessage; + } + public void setDestResultState(String destResultState) + { + this.destResultState = destResultState; + } + + public String getDestResultState() + { + return destResultState; + } + public void setDestResultStatus(String destResultStatus) + { + this.destResultStatus = destResultStatus; + } + + public String getDestResultStatus() + { + return destResultStatus; + } + public void setDestResultCondition(String destResultCondition) + { + this.destResultCondition = destResultCondition; + } + + public String getDestResultCondition() + { + return destResultCondition; + } + public void setDestResultIsCheck(String destResultIsCheck) + { + this.destResultIsCheck = destResultIsCheck; + } + + public String getDestResultIsCheck() + { + return destResultIsCheck; + } + public void setDestResultCom(String destResultCom) + { + this.destResultCom = destResultCom; + } + + public String getDestResultCom() + { + return destResultCom; + } + public void setDestResultNu(String destResultNu) + { + this.destResultNu = destResultNu; + } + + public String getDestResultNu() + { + return destResultNu; + } + public void setDestResultData(String destResultData) + { + this.destResultData = destResultData; + } + + public String getDestResultData() + { + return destResultData; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("sid", getSid()) + .append("status", getStatus()) + .append("billStatus", getBillStatus()) + .append("message", getMessage()) + .append("autoCheck", getAutoCheck()) + .append("comOld", getComOld()) + .append("comNew", getComNew()) + .append("lastResultMessage", getLastResultMessage()) + .append("lastResultState", getLastResultState()) + .append("lastResulStatus", getLastResulStatus()) + .append("lastResultCondition", getLastResultCondition()) + .append("lastResultIsCheck", getLastResultIsCheck()) + .append("lastResultCom", getLastResultCom()) + .append("lastResultNu", getLastResultNu()) + .append("lastResultData", getLastResultData()) + .append("destResultMessage", getDestResultMessage()) + .append("destResultState", getDestResultState()) + .append("destResultStatus", getDestResultStatus()) + .append("destResultCondition", getDestResultCondition()) + .append("destResultIsCheck", getDestResultIsCheck()) + .append("destResultCom", getDestResultCom()) + .append("destResultNu", getDestResultNu()) + .append("destResultData", getDestResultData()) + .toString(); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubscribe.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubscribe.java new file mode 100644 index 000000000..2ef48209f --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpSubscribe.java @@ -0,0 +1,149 @@ +package com.ruoyi.bps.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 快递订阅对象 exp_subscribe + * + * @author box + * @date 2021-05-20 + */ +public class ExpSubscribe extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** SID */ + private Long sid; + + /** 快递公司编码 */ + @Excel(name = "快递公司编码") + private String company; + + /** 快递单号 */ + @Excel(name = "快递单号") + private String number; + + /** 收/寄件人电话 */ + @Excel(name = "收/寄件人电话") + private String phone; + + /** 盐 */ + @Excel(name = "盐") + private String salt; + + /** 订阅时间 */ + @Excel(name = "订阅时间") + private String subscribeTime; + + /** 订阅结果 */ + @Excel(name = "订阅结果") + private String result; + + /** 返回码 */ + @Excel(name = "返回码") + private String returnCode; + + /** 返回消息 */ + @Excel(name = "返回消息") + private String message; + + public void setSid(Long sid) + { + this.sid = sid; + } + + public Long getSid() + { + return sid; + } + public void setCompany(String company) + { + this.company = company; + } + + public String getCompany() + { + return company; + } + public void setNumber(String number) + { + this.number = number; + } + + public String getNumber() + { + return number; + } + public void setPhone(String phone) + { + this.phone = phone; + } + + public String getPhone() + { + return phone; + } + public void setSalt(String salt) + { + this.salt = salt; + } + + public String getSalt() + { + return salt; + } + public void setSubscribeTime(String subscribeTime) + { + this.subscribeTime = subscribeTime; + } + + public String getSubscribeTime() + { + return subscribeTime; + } + public void setResult(String result) + { + this.result = result; + } + + public String getResult() + { + return result; + } + public void setReturnCode(String returnCode) + { + this.returnCode = returnCode; + } + + public String getReturnCode() + { + return returnCode; + } + public void setMessage(String message) + { + this.message = message; + } + + public String getMessage() + { + return message; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("sid", getSid()) + .append("company", getCompany()) + .append("number", getNumber()) + .append("phone", getPhone()) + .append("salt", getSalt()) + .append("subscribeTime", getSubscribeTime()) + .append("result", getResult()) + .append("returnCode", getReturnCode()) + .append("message", getMessage()) + .toString(); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java new file mode 100644 index 000000000..72b2d967e --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java @@ -0,0 +1,192 @@ +package com.ruoyi.bps.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 快递信息对象 expressInfo + * + * @author box + * @date 2021-05-06 + */ +public class ExpressInfo extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 消息 */ + @Excel(name = "消息") + private String message; + + /** 快递单号 */ + @Excel(name = "快递单号") + private String nu; + + /** 签收状态 */ + @Excel(name = "签收状态") + private String ischeck; + + /** 快递公司 */ + @Excel(name = "快递公司") + private String com; + + /** 通信状态 */ + @Excel(name = "通信状态") + private String status; + + /** 运单详情 */ + @Excel(name = "运单详情") + private String data; + + /** 当前状态 */ + @Excel(name = "当前状态") + private String state; + + /** 状态标志 */ + @Excel(name = "状态标志") + private String condition; + + /** 路由信息 */ + @Excel(name = "路由信息") + private String routeInfo; + + /** 返回码 */ + @Excel(name = "返回码") + private String returnCode; + + /** 返回结果 */ + @Excel(name = "返回结果") + private String result; + + /** 电话号码 */ + @Excel(name = "电话号码") + private String phone; + + public void setMessage(String message) + { + this.message = message; + } + + public String getMessage() + { + return message; + } + public void setNu(String nu) + { + this.nu = nu; + } + + public String getNu() + { + return nu; + } + public void setIscheck(String ischeck) + { + this.ischeck = ischeck; + } + + public String getIscheck() + { + return ischeck; + } + public void setCom(String com) + { + this.com = com; + } + + public String getCom() + { + return com; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + public void setData(String data) + { + this.data = data; + } + + public String getData() + { + return data; + } + public void setState(String state) + { + this.state = state; + } + + public String getState() + { + return state; + } + public void setCondition(String condition) + { + this.condition = condition; + } + + public String getCondition() + { + return condition; + } + public void setRouteInfo(String routeInfo) + { + this.routeInfo = routeInfo; + } + + public String getRouteInfo() + { + return routeInfo; + } + public void setReturnCode(String returnCode) + { + this.returnCode = returnCode; + } + + public String getReturnCode() + { + return returnCode; + } + public void setResult(String result) + { + this.result = result; + } + + public String getResult() + { + return result; + } + public void setPhone(String phone) + { + this.phone = phone; + } + + public String getPhone() + { + return phone; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("message", getMessage()) + .append("nu", getNu()) + .append("ischeck", getIscheck()) + .append("com", getCom()) + .append("status", getStatus()) + .append("data", getData()) + .append("state", getState()) + .append("condition", getCondition()) + .append("routeInfo", getRouteInfo()) + .append("returnCode", getReturnCode()) + .append("result", getResult()) + .append("phone", getPhone()) + .toString(); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubsPushRespMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubsPushRespMapper.java new file mode 100644 index 000000000..f1a0bac8b --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubsPushRespMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.bps.mapper; + +import com.ruoyi.bps.domain.ExpSubsPushResp; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +/** + * 快递订阅推送信息Mapper接口 + * + * @author box + * @date 2021-05-13 + */ +public interface ExpSubsPushRespMapper +{ + /** + * 查询快递订阅推送信息 + * + * @param sid 快递订阅推送信息ID + * @return 快递订阅推送信息 + */ + public ExpSubsPushResp selectExpSubsPushRespById(Long sid); + + /** + * 查询快递订阅推送信息列表 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 快递订阅推送信息集合 + */ + public List selectExpSubsPushRespList(ExpSubsPushResp expSubsPushResp); + + /** + * 新增快递订阅推送信息 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 结果 + */ + public int insertExpSubsPushResp(ExpSubsPushResp expSubsPushResp); + + /** + * 修改快递订阅推送信息 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 结果 + */ + public int updateExpSubsPushResp(ExpSubsPushResp expSubsPushResp); + + /** + * 删除快递订阅推送信息 + * + * @param sid 快递订阅推送信息ID + * @return 结果 + */ + public int deleteExpSubsPushRespById(Long sid); + + /** + * 批量删除快递订阅推送信息 + * + * @param sids 需要删除的数据ID + * @return 结果 + */ + public int deleteExpSubsPushRespByIds(String[] sids); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubscribeMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubscribeMapper.java new file mode 100644 index 000000000..04a74c70c --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpSubscribeMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.bps.mapper; + +import com.ruoyi.bps.domain.ExpSubscribe; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +/** + * 快递订阅Mapper接口 + * + * @author box + * @date 2021-05-20 + */ +public interface ExpSubscribeMapper +{ + /** + * 查询快递订阅 + * + * @param sid 快递订阅ID + * @return 快递订阅 + */ + public ExpSubscribe selectExpSubscribeById(Long sid); + + /** + * 查询快递订阅列表 + * + * @param expSubscribe 快递订阅 + * @return 快递订阅集合 + */ + public List selectExpSubscribeList(ExpSubscribe expSubscribe); + + /** + * 新增快递订阅 + * + * @param expSubscribe 快递订阅 + * @return 结果 + */ + public int insertExpSubscribe(ExpSubscribe expSubscribe); + + /** + * 修改快递订阅 + * + * @param expSubscribe 快递订阅 + * @return 结果 + */ + public int updateExpSubscribe(ExpSubscribe expSubscribe); + + /** + * 删除快递订阅 + * + * @param sid 快递订阅ID + * @return 结果 + */ + public int deleteExpSubscribeById(Long sid); + + /** + * 批量删除快递订阅 + * + * @param sids 需要删除的数据ID + * @return 结果 + */ + public int deleteExpSubscribeByIds(String[] sids); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java new file mode 100644 index 000000000..4dede87d7 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.bps.mapper; + +import com.ruoyi.bps.domain.ExpressInfo; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +/** + * 快递信息Mapper接口 + * + * @author box + * @date 2021-05-06 + */ +public interface ExpressInfoMapper +{ + /** + * 查询快递信息 + * + * @param message 快递信息ID + * @return 快递信息 + */ + public ExpressInfo selectExpressInfoById(String message); + + /** + * 查询快递信息列表 + * + * @param expressInfo 快递信息 + * @return 快递信息集合 + */ + public List selectExpressInfoList(ExpressInfo expressInfo); + + /** + * 新增快递信息 + * + * @param expressInfo 快递信息 + * @return 结果 + */ + public int insertExpressInfo(ExpressInfo expressInfo); + + /** + * 修改快递信息 + * + * @param expressInfo 快递信息 + * @return 结果 + */ + public int updateExpressInfo(ExpressInfo expressInfo); + + /** + * 删除快递信息 + * + * @param message 快递信息ID + * @return 结果 + */ + public int deleteExpressInfoById(String message); + + /** + * 批量删除快递信息 + * + * @param messages 需要删除的数据ID + * @return 结果 + */ + public int deleteExpressInfoByIds(String[] messages); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/TopgpDdlMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/TopgpDdlMapper.java new file mode 100644 index 000000000..ad06f7d89 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/TopgpDdlMapper.java @@ -0,0 +1,32 @@ +package com.ruoyi.bps.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +@Mapper +@Component("TopgpDdlMapper") +public interface TopgpDdlMapper { + // alter table + int alterTableName(@Param("originalTableName") String originalTableName, + @Param("newTableName") String newTableName); + + //truncate table + int truncateTable(@Param("tableName") String tableName); + + //drop table + int dropTable(@Param("tableName") String tableName); + + //copy table + void copyTable(@Param("newTableName") String newTableName, + @Param("originalTableName") String originalTableName); + + //获取表记录数 + int getRecordCount(@Param("tableName") String tableName); + + + + //查询数据库中表是否存在 + int isTableInDb(@Param("dataBaseName") String dataBaseName, + @Param("tableName") String tableName); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java new file mode 100644 index 000000000..5867116de --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java @@ -0,0 +1,22 @@ +package com.ruoyi.bps.service; + +import com.ruoyi.bps.domain.ExpSubscribe; +import com.kuaidi100.sdk.response.SubscribeResp; + +import javax.servlet.http.HttpServletRequest; + +public interface IExpSubsPushApiService { + public SubscribeResp ExpressSubscribe(ExpSubscribe expSubscribe); + + /** + * 快递100订阅推送处理 + * + * 回调接口支持自定义参数,比如订阅时回调地址填写的是 http://www.xxx.com?orderId=1233333 + * 可以通过下面这种方式获取到orderId: String orderId = request.getParameter("orderId"); + * + * 返回值必须是下面这样的格式,否则快递100将认为该推送失败,快递100将会重试3次该推送,时间间隔35分钟; + * 成功结果返回例子: {"result":true,"returnCode":"200","message":"提交成功"} + * + */ + public SubscribeResp ExpressSubscribeCallBackUrl(HttpServletRequest request); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushRespService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushRespService.java new file mode 100644 index 000000000..61a6f4aba --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushRespService.java @@ -0,0 +1,63 @@ +package com.ruoyi.bps.service; + +import com.ruoyi.bps.domain.ExpSubsPushResp; + +import java.util.List; + +/** + * 快递订阅推送信息Service接口 + * + * @author box + * @date 2021-05-13 + */ +public interface IExpSubsPushRespService +{ + /** + * 查询快递订阅推送信息 + * + * @param sid 快递订阅推送信息ID + * @return 快递订阅推送信息 + */ + public ExpSubsPushResp selectExpSubsPushRespById(Long sid); + + /** + * 查询快递订阅推送信息列表 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 快递订阅推送信息集合 + */ + public List selectExpSubsPushRespList(ExpSubsPushResp expSubsPushResp); + + /** + * 新增快递订阅推送信息 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 结果 + */ + public int insertExpSubsPushResp(ExpSubsPushResp expSubsPushResp); + + /** + * 修改快递订阅推送信息 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 结果 + */ + public int updateExpSubsPushResp(ExpSubsPushResp expSubsPushResp); + + /** + * 批量删除快递订阅推送信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteExpSubsPushRespByIds(String ids); + + /** + * 删除快递订阅推送信息信息 + * + * @param sid 快递订阅推送信息ID + * @return 结果 + */ + public int deleteExpSubsPushRespById(Long sid); + +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubscribeService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubscribeService.java new file mode 100644 index 000000000..32079053b --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubscribeService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bps.service; + +import com.ruoyi.bps.domain.ExpSubscribe; + +import java.util.List; + +/** + * 快递订阅Service接口 + * + * @author box + * @date 2021-05-20 + */ +public interface IExpSubscribeService +{ + /** + * 查询快递订阅 + * + * @param sid 快递订阅ID + * @return 快递订阅 + */ + public ExpSubscribe selectExpSubscribeById(Long sid); + + /** + * 查询快递订阅列表 + * + * @param expSubscribe 快递订阅 + * @return 快递订阅集合 + */ + public List selectExpSubscribeList(ExpSubscribe expSubscribe); + + /** + * 新增快递订阅 + * + * @param expSubscribe 快递订阅 + * @return 结果 + */ + public int insertExpSubscribe(ExpSubscribe expSubscribe); + + /** + * 修改快递订阅 + * + * @param expSubscribe 快递订阅 + * @return 结果 + */ + public int updateExpSubscribe(ExpSubscribe expSubscribe); + + /** + * 批量删除快递订阅 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteExpSubscribeByIds(String ids); + + /** + * 删除快递订阅信息 + * + * @param sid 快递订阅ID + * @return 结果 + */ + public int deleteExpSubscribeById(Long sid); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java new file mode 100644 index 000000000..90c079f32 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java @@ -0,0 +1,62 @@ +package com.ruoyi.bps.service; + +import com.ruoyi.bps.domain.ExpressInfo; + +import java.util.List; + +/** + * 快递信息Service接口 + * + * @author box + * @date 2021-05-06 + */ +public interface IExpressInfoService +{ + /** + * 查询快递信息 + * + * @param message 快递信息ID + * @return 快递信息 + */ + public ExpressInfo selectExpressInfoById(String message); + + /** + * 查询快递信息列表 + * + * @param expressInfo 快递信息 + * @return 快递信息集合 + */ + public List selectExpressInfoList(ExpressInfo expressInfo); + + /** + * 新增快递信息 + * + * @param expressInfo 快递信息 + * @return 结果 + */ + public int insertExpressInfo(ExpressInfo expressInfo); + + /** + * 修改快递信息 + * + * @param expressInfo 快递信息 + * @return 结果 + */ + public int updateExpressInfo(ExpressInfo expressInfo); + + /** + * 批量删除快递信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteExpressInfoByIds(String ids); + + /** + * 删除快递信息信息 + * + * @param message 快递信息ID + * @return 结果 + */ + public int deleteExpressInfoById(String message); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpressService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressService.java new file mode 100644 index 000000000..b3adfa8da --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressService.java @@ -0,0 +1,33 @@ +package com.ruoyi.bps.service; + +//import com.ruoyi.bps.express.request.QueryTrackParam; +//import com.ruoyi.bps.express.response.QueryTrackResp; + +import com.kuaidi100.sdk.request.QueryTrackParam; +import com.kuaidi100.sdk.response.QueryTrackResp; + +import java.util.List; + +public interface IExpressService { + + public List QueryTrackExpressMultiList(List list); + /** + * 查询多条物流轨迹 + */ + public String QueryTrackExpressMulti(List list); + + /** + * 查询物流轨迹 + */ + public String QueryTrackExpress(QueryTrackParam qt); + + /** + * 订阅 + */ + public String SubscribeExpress(); + + /** + * 测试快递单号合集 + */ + public List GetTestQueryTrackParam(); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlService.java b/box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlService.java new file mode 100644 index 000000000..e2d2b4e6a --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlService.java @@ -0,0 +1,22 @@ +package com.ruoyi.bps.service; + +public interface TopgpDdlService { + //修改表名 + int alterTableName(String originalTableName, String newTableName); + + // truncate指定数据库表的数据 + int truncateTable(String tableName); + + //drop 指定定数据库表 + int dropTable(String tableName); + + + //根据传入的表明,创建新的表并且将原表的数据插入到新的Occur表中 + void copyTable(String newTableName,String originalTableName); + + //统计某张表中的总数据条数 + int getRecordCount(String tableName); + + //从指定数据库中,查询是否存在某张表 + int isTableInDb(String dataBaseName, String tableName); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlServiceImpl.java new file mode 100644 index 000000000..f2808e873 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/TopgpDdlServiceImpl.java @@ -0,0 +1,45 @@ +package com.ruoyi.bps.service; + +import com.ruoyi.bps.mapper.TopgpDdlMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +//@DataSource(value = DataSourceType.SLAVE) +//@DataSource(value = DataSourceType.TOPTESTDSREPORT) +public class TopgpDdlServiceImpl implements TopgpDdlService { + @Autowired + private TopgpDdlMapper topgpDdlMapper; + + //修改表名 + public int alterTableName(String originalTableName, String newTableName) + { + return topgpDdlMapper.alterTableName(originalTableName,newTableName); + } + + // truncate指定数据库表的数据 + public int truncateTable(String tableName){ + return topgpDdlMapper.truncateTable(tableName); + } + + //drop 指定定数据库表 + public int dropTable(String tableName){ + return topgpDdlMapper.dropTable(tableName); + } + + + //根据传入的表明,创建新的表并且将原表的数据插入到新的Occur表中 + public void copyTable(String newTableName,String originalTableName){ + return ; + } + + //统计某张表中的总数据条数 + public int getRecordCount(String tableName){ + return topgpDdlMapper.getRecordCount(tableName); + } + + //从指定数据库中,查询是否存在某张表 + public int isTableInDb(String dataBaseName, String tableName){ + return topgpDdlMapper.isTableInDb(dataBaseName,tableName); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java new file mode 100644 index 000000000..b2e8ab444 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java @@ -0,0 +1,249 @@ +package com.ruoyi.bps.service.impl; + +import com.ruoyi.bps.domain.ExpSubsPushResp; +import com.ruoyi.bps.domain.ExpSubscribe; +import com.ruoyi.bps.service.IExpSubsPushApiService; +import com.ruoyi.bps.service.IExpSubsPushRespService; +import com.ruoyi.bps.service.IExpSubscribeService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.google.gson.Gson; +import com.kuaidi100.sdk.api.Subscribe; +import com.kuaidi100.sdk.contant.ApiInfoConstant; +import com.kuaidi100.sdk.core.IBaseClient; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.SubscribeParam; +import com.kuaidi100.sdk.request.SubscribeParameters; +import com.kuaidi100.sdk.request.SubscribeReq; +import com.kuaidi100.sdk.response.SubscribePushData; +import com.kuaidi100.sdk.response.SubscribePushParamResp; +import com.kuaidi100.sdk.response.SubscribePushResult; +import com.kuaidi100.sdk.response.SubscribeResp; +import com.kuaidi100.sdk.utils.PropertiesReader; +import com.kuaidi100.sdk.utils.SignUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +@Service +public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { + String key = PropertiesReader.get("key"); + String customer = PropertiesReader.get("customer"); + String secret = PropertiesReader.get("secret"); + String siid = PropertiesReader.get("siid"); + String userid = PropertiesReader.get("userid"); + String tid = PropertiesReader.get("tid"); + String secret_key = PropertiesReader.get("secret_key"); + String secret_secret = PropertiesReader.get("secret_secret"); + + @Autowired + private IExpSubsPushRespService expSubsPushRespService; + + @Autowired + IExpSubscribeService expSubscribeService; + + /** + * 订阅快递 + * @throws Exception + */ + @Override + public SubscribeResp ExpressSubscribe(ExpSubscribe expSubscribe) { + SubscribeParameters subscribeParameters = new SubscribeParameters(); + SubscribeResp subscribeResp = new SubscribeResp(); + subscribeParameters.setCallbackurl("http://report.bpsemi.cn:8081/box-admin/anon/subscribeCallBackUrl"); + subscribeParameters.setPhone(expSubscribe.getPhone()); + subscribeParameters.setSalt("bpsemi"); + SubscribeParam subscribeParam = new SubscribeParam(); + subscribeParam.setParameters(subscribeParameters); + subscribeParam.setCompany(expSubscribe.getCompany()); + subscribeParam.setNumber(expSubscribe.getNumber()); + subscribeParam.setKey(key); + + SubscribeReq subscribeReq = new SubscribeReq(); + subscribeReq.setSchema(ApiInfoConstant.SUBSCRIBE_SCHEMA); + subscribeReq.setParam(new Gson().toJson(subscribeParam)); + + IBaseClient subscribe = new Subscribe(); + try{ + System.out.println(subscribe.execute(subscribeReq)); + HttpResult httpResult= subscribe.execute(subscribeReq); + subscribeResp= new Gson().fromJson(httpResult.getBody(),SubscribeResp.class); + }catch (Exception e) + { + return subscribeResp; + } + //如果快递公司或快递单号为空,则直接返回订阅结果 + if(StringUtils.isEmpty(expSubscribe.getCompany()) || StringUtils.isEmpty(expSubscribe.getNumber())) + { + return subscribeResp; + } + + //订阅记录写入数据库 + ExpSubscribe newExpSubscribe = new ExpSubscribe(); + newExpSubscribe.setCompany(expSubscribe.getCompany()); + newExpSubscribe.setNumber(expSubscribe.getNumber()); + newExpSubscribe.setPhone(expSubscribe.getPhone()); + newExpSubscribe.setSalt("bpsemi"); + newExpSubscribe.setSubscribeTime(DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); + newExpSubscribe.setResult((subscribeResp.isResult())?"ture":"false"); + newExpSubscribe.setReturnCode(subscribeResp.getReturnCode()); + newExpSubscribe.setMessage(subscribeResp.getMessage()); + + ExpSubscribe queryExpSubscribe = new ExpSubscribe(); + queryExpSubscribe.setCompany(expSubscribe.getCompany()); + queryExpSubscribe.setNumber(expSubscribe.getNumber()); + queryExpSubscribe.setResult(expSubscribe.getResult()); + queryExpSubscribe.setReturnCode(expSubscribe.getReturnCode()); + List list=expSubscribeService.selectExpSubscribeList(queryExpSubscribe); + if(list.size()>0){ + //如果数据库中存在快递单号+快递公司编码+结果+返回码相同,则更新记录 + for(ExpSubscribe es:list){ + queryExpSubscribe= newExpSubscribe; + queryExpSubscribe.setSid(es.getSid()); + expSubscribeService.updateExpSubscribe(queryExpSubscribe); + } + }else { + //如果数据库中没有快递单号+快递公司编码,则更插入新记录 + expSubscribeService.insertExpSubscribe(newExpSubscribe); + } + + //返回订阅结果 + return subscribeResp; + } + + /** + * 获取从快递100订阅的快递推送信息,并返回响应结果 + * + * @param request 快递100推送的订阅信息 + * @return 结果 + */ + @Override + public SubscribeResp ExpressSubscribeCallBackUrl(HttpServletRequest request) { + //如果推送信息中没有包含 + if(StringUtils.isEmpty(request.getParameter("param")) + || StringUtils.isEmpty(request.getParameter("sign"))) { + SubscribeResp subscribeResp= new SubscribeResp(); + subscribeResp.setResult(Boolean.FALSE); + subscribeResp.setReturnCode("701"); + subscribeResp.setMessage("推送的信息不合法!"); + return subscribeResp; + } + + String param= request.getParameter("param"); + String sign = request.getParameter("sign"); + //log.debug("快递100订阅推送回调结果|{}|{}",param,sign); + //订阅时传的salt + String salt = "bpsemi"; + String ourSign = SignUtils.sign(param + salt); + SubscribeResp subscribeResp = new SubscribeResp(); + subscribeResp.setResult(Boolean.TRUE); + subscribeResp.setReturnCode("200"); + //加密如果不等,则不属于快递100推送,忽略掉当前请求 + if (!ourSign.equals(sign)){ + subscribeResp.setMessage("接受成功!但加密验证不通过!【sign】"+sign+"【ourSign】"+ourSign); + return subscribeResp; + } + //加密相等,继续处理业务逻辑 + subscribeResp.setMessage("接受成功!加密验证通过!【sign】"+sign+"【ourSign】"+ourSign); + + SubscribePushParamResp subscribePushParamResp = new Gson().fromJson(param, SubscribePushParamResp.class); + SubscribePushResult subscribePushResult = subscribePushParamResp.getLastResult(); + //快递单号 + String nu = subscribePushResult.getNu(); + //监控状态 (polling:监控中,shutdown:结束,abort:中止,updateall:重新推送。其中当快递单为已签收时status=shutdown) + String status= subscribePushParamResp.getStatus(); + if(status.equals("abort")){ + //todo + //当message为“3天查询无记录”或“60天无变化时”status= abort ,对于status=abort的状态的处理逻辑 + //将Abort信息存档。然后预警 + + } + //快递单当前状态 (0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转单,10待清关,11清关中,12已清关,13清关异常,14收件人拒签) + String state = subscribePushResult.getState(); + if(state.equals("3")){ + //处理签收逻辑 + //将快递流转状态存入数据库 + ExpSubsPushResp expSubsPushResp=new ExpSubsPushResp(); + expSubsPushResp.setLastResultNu(subscribePushResult.getNu()); + expSubsPushResp.setLastResultCom(subscribePushResult.getCom()); + List list=expSubsPushRespService.selectExpSubsPushRespList(expSubsPushResp); + if(list.size()>0){ + //如果数据库中存在快递单号+快递公司编码,则更新记录 + ExpSubsPushResp newExpSubsPushResp= ToExpSubsPushResp(subscribePushParamResp); + for(ExpSubsPushResp expr:list){ + newExpSubsPushResp.setSid(expr.getSid()); + expSubsPushRespService.updateExpSubsPushResp(newExpSubsPushResp); + newExpSubsPushResp.setSid(null); + } + }else { + //如果数据库中没有快递单号+快递公司编码,则更插入新记录 + expSubsPushRespService.insertExpSubsPushResp(ToExpSubsPushResp(subscribePushParamResp)); + } + } + + return subscribeResp; + } + + /** + * 将快递100推送的信息转换为ExpSubsPushResp + * @param subscribePushParamResp + * @return ExpSubsPushResp + */ + private ExpSubsPushResp ToExpSubsPushResp(SubscribePushParamResp subscribePushParamResp){ + ExpSubsPushResp expSubsPushResp=new ExpSubsPushResp(); + + SubscribePushResult subscribePushLastResult = subscribePushParamResp.getLastResult(); + SubscribePushResult subscribePushDestResult = subscribePushParamResp.getDestResult(); + + expSubsPushResp.setStatus(subscribePushParamResp.getStatus()); + expSubsPushResp.setBillStatus(subscribePushParamResp.getBillstatus()); + expSubsPushResp.setMessage(subscribePushParamResp.getMessage()); + expSubsPushResp.setAutoCheck(subscribePushParamResp.getAutoCheck()); + expSubsPushResp.setComOld(subscribePushParamResp.getComOld()); + expSubsPushResp.setComNew(subscribePushParamResp.getComNew()); + + expSubsPushResp.setLastResultMessage(subscribePushLastResult.getMessage()); + expSubsPushResp.setLastResultState(subscribePushLastResult.getState()); + expSubsPushResp.setLastResulStatus(subscribePushLastResult.getStatus()); + expSubsPushResp.setLastResultCondition(subscribePushLastResult.getCondition()); + expSubsPushResp.setLastResultIsCheck(subscribePushLastResult.getIscheck()); + expSubsPushResp.setLastResultCom(subscribePushLastResult.getCom()); + expSubsPushResp.setLastResultNu(subscribePushLastResult.getNu()); + expSubsPushResp.setLastResultData(SubscribePushDataToString(subscribePushLastResult.getData())); + + expSubsPushResp.setDestResultMessage(subscribePushDestResult.getMessage()); + expSubsPushResp.setDestResultState(subscribePushDestResult.getState()); + expSubsPushResp.setDestResultStatus(subscribePushDestResult.getStatus()); + expSubsPushResp.setDestResultCondition(subscribePushDestResult.getCondition()); + expSubsPushResp.setDestResultIsCheck(subscribePushDestResult.getIscheck()); + expSubsPushResp.setDestResultCom(subscribePushDestResult.getCom()); + expSubsPushResp.setDestResultNu(subscribePushDestResult.getNu()); + expSubsPushResp.setDestResultData(SubscribePushDataToString(subscribePushDestResult.getData())); + + return expSubsPushResp; + } + + /** + * + * @param list 将List转化为字符串 + * @return + */ + private String SubscribePushDataToString(List list){ + String str=""; + for(SubscribePushData subscribePushData:list){ + str+="【"+subscribePushData.getTime()+"】 "; + str+=subscribePushData.getAreaName()+"/"+subscribePushData.getContext(); + if(list.size()-1>list.indexOf(subscribePushData)){ + str+="\r"; + } + } + System.out.println(str); + return str; + } + + + + +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushRespServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushRespServiceImpl.java new file mode 100644 index 000000000..777b2568d --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushRespServiceImpl.java @@ -0,0 +1,95 @@ +package com.ruoyi.bps.service.impl; + +import com.ruoyi.bps.domain.ExpSubsPushResp; +import com.ruoyi.bps.mapper.ExpSubsPushRespMapper; +import com.ruoyi.bps.service.IExpSubsPushRespService; +import com.ruoyi.common.core.text.Convert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 快递订阅推送信息Service业务层处理 + * + * @author box + * @date 2021-05-13 + */ +@Service +public class ExpSubsPushRespServiceImpl implements IExpSubsPushRespService +{ + @Autowired + private ExpSubsPushRespMapper expSubsPushRespMapper; + + /** + * 查询快递订阅推送信息 + * + * @param sid 快递订阅推送信息ID + * @return 快递订阅推送信息 + */ + @Override + public ExpSubsPushResp selectExpSubsPushRespById(Long sid) + { + return expSubsPushRespMapper.selectExpSubsPushRespById(sid); + } + + /** + * 查询快递订阅推送信息列表 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 快递订阅推送信息 + */ + @Override + public List selectExpSubsPushRespList(ExpSubsPushResp expSubsPushResp) + { + return expSubsPushRespMapper.selectExpSubsPushRespList(expSubsPushResp); + } + + /** + * 新增快递订阅推送信息 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 结果 + */ + @Override + public int insertExpSubsPushResp(ExpSubsPushResp expSubsPushResp) + { + return expSubsPushRespMapper.insertExpSubsPushResp(expSubsPushResp); + } + + /** + * 修改快递订阅推送信息 + * + * @param expSubsPushResp 快递订阅推送信息 + * @return 结果 + */ + @Override + public int updateExpSubsPushResp(ExpSubsPushResp expSubsPushResp) + { + return expSubsPushRespMapper.updateExpSubsPushResp(expSubsPushResp); + } + + /** + * 删除快递订阅推送信息对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteExpSubsPushRespByIds(String ids) + { + return expSubsPushRespMapper.deleteExpSubsPushRespByIds(Convert.toStrArray(ids)); + } + + /** + * 删除快递订阅推送信息信息 + * + * @param sid 快递订阅推送信息ID + * @return 结果 + */ + @Override + public int deleteExpSubsPushRespById(Long sid) + { + return expSubsPushRespMapper.deleteExpSubsPushRespById(sid); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubscribeServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubscribeServiceImpl.java new file mode 100644 index 000000000..5ff9d2dcd --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubscribeServiceImpl.java @@ -0,0 +1,95 @@ +package com.ruoyi.bps.service.impl; + +import com.ruoyi.bps.domain.ExpSubscribe; +import com.ruoyi.bps.mapper.ExpSubscribeMapper; +import com.ruoyi.bps.service.IExpSubscribeService; +import com.ruoyi.common.core.text.Convert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 快递订阅Service业务层处理 + * + * @author box + * @date 2021-05-20 + */ +@Service +public class ExpSubscribeServiceImpl implements IExpSubscribeService +{ + @Autowired + private ExpSubscribeMapper expSubscribeMapper; + + /** + * 查询快递订阅 + * + * @param sid 快递订阅ID + * @return 快递订阅 + */ + @Override + public ExpSubscribe selectExpSubscribeById(Long sid) + { + return expSubscribeMapper.selectExpSubscribeById(sid); + } + + /** + * 查询快递订阅列表 + * + * @param expSubscribe 快递订阅 + * @return 快递订阅 + */ + @Override + public List selectExpSubscribeList(ExpSubscribe expSubscribe) + { + return expSubscribeMapper.selectExpSubscribeList(expSubscribe); + } + + /** + * 新增快递订阅 + * + * @param expSubscribe 快递订阅 + * @return 结果 + */ + @Override + public int insertExpSubscribe(ExpSubscribe expSubscribe) + { + return expSubscribeMapper.insertExpSubscribe(expSubscribe); + } + + /** + * 修改快递订阅 + * + * @param expSubscribe 快递订阅 + * @return 结果 + */ + @Override + public int updateExpSubscribe(ExpSubscribe expSubscribe) + { + return expSubscribeMapper.updateExpSubscribe(expSubscribe); + } + + /** + * 删除快递订阅对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteExpSubscribeByIds(String ids) + { + return expSubscribeMapper.deleteExpSubscribeByIds(Convert.toStrArray(ids)); + } + + /** + * 删除快递订阅信息 + * + * @param sid 快递订阅ID + * @return 结果 + */ + @Override + public int deleteExpSubscribeById(Long sid) + { + return expSubscribeMapper.deleteExpSubscribeById(sid); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java new file mode 100644 index 000000000..0f7163412 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java @@ -0,0 +1,259 @@ +package com.ruoyi.bps.service.impl; + +import com.ruoyi.bps.domain.ExpressInfo; +import com.ruoyi.bps.mapper.ExpressInfoMapper; +import com.ruoyi.bps.service.IExpressInfoService; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.StringUtils; +import com.google.gson.Gson; +import com.kuaidi100.sdk.api.AutoNum; +import com.kuaidi100.sdk.api.QueryTrack; +import com.kuaidi100.sdk.core.IBaseClient; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.AutoNumReq; +import com.kuaidi100.sdk.request.QueryTrackParam; +import com.kuaidi100.sdk.request.QueryTrackReq; +import com.kuaidi100.sdk.response.AutoNumResp; +import com.kuaidi100.sdk.response.QueryTrackData; +import com.kuaidi100.sdk.response.QueryTrackResp; +import com.kuaidi100.sdk.utils.PropertiesReader; +import com.kuaidi100.sdk.utils.SignUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 快递信息Service业务层处理 + * + * @author box + * @date 2021-05-06 + */ +@Service +public class ExpressInfoServiceImpl implements IExpressInfoService +{ + /* + String key = "Jydbrxsm2311"; + String customer = "2DD48B3469B82F2B7700569093AB792B"; + String secret = "8781ed9b35a7438499eb02fee915915a"; + String userid = "2a62da2192c24d17a943ff78ee64f8c6"; + + */ + + String key = PropertiesReader.get("key"); + String customer = PropertiesReader.get("customer"); + String secret = PropertiesReader.get("secret"); + String siid = PropertiesReader.get("siid"); + String userid = PropertiesReader.get("userid"); + String tid = PropertiesReader.get("tid"); + String secret_key = PropertiesReader.get("secret_key"); + String secret_secret = PropertiesReader.get("secret_secret"); + + + + String msg=""; + + @Autowired + private ExpressInfoMapper expressInfoMapper; + + /** + * 查询快递信息 + * + * @param message 快递信息ID + * @return 快递信息 + */ + @Override + public ExpressInfo selectExpressInfoById(String message) + { + return expressInfoMapper.selectExpressInfoById(message); + } + + /** + * 查询快递信息列表 + * + * @param expressInfo 快递信息 + * @return 快递信息列表 + */ + @Override + public List selectExpressInfoList(ExpressInfo expressInfo) + { + List expressInfoList=new ArrayList<>(); + //如果没有输入订单号,则返回空信息 + String nuStr=expressInfo.getNu(); + if(StringUtils.isEmpty(nuStr)){ + expressInfo.setData("请输入订单号进行查询!"); + expressInfoList.add(expressInfo); + return expressInfoList; + } + //如果是顺丰,则必须要输入电话号码 + if( StringUtils.isEmpty(expressInfo.getPhone()) + && (expressInfo.getCom().equals("nsf") || expressInfo.getCom().contains("shunfeng"))){ + expressInfo.setData("查询顺丰快递信息,必须要提供收/寄人电话号码"); + expressInfoList.add(expressInfo); + return expressInfoList; + } + + List stringList= Arrays.asList(nuStr.split(",")); + ExpressInfo newExpressInfo= expressInfo; + for(String str:stringList){ + newExpressInfo.setNu(str); + expressInfoList.add(SelectExpressInfo(newExpressInfo)); + } + return expressInfoList; + //return expressInfoMapper.selectExpressInfoList(expressInfo); + } + + private ExpressInfo SelectExpressInfo(ExpressInfo expressInfo){ + String nu=expressInfo.getNu(); //快递单号 + String com=expressInfo.getCom(); //快递公司 + String phone=expressInfo.getPhone(); //收、寄件人电话号码 + ExpressInfo callbackExpressInfo=new ExpressInfo(); + + callbackExpressInfo.setNu(nu); + callbackExpressInfo.setPhone(phone); + //如果没有输入快递公司编号,则查询快递公司编号 + if(StringUtils.isEmpty(com)){ + if(AutoGetExpressCom(nu)==null){ + callbackExpressInfo.setData("根据快递单号查询不到快递公司,请确认快递单号是否正确!"); + return callbackExpressInfo; + } + com=AutoGetExpressCom(nu).getComCode(); + } + callbackExpressInfo.setCom(com); + + //return callbackExpressInfo; + return QueryExpressInfo(callbackExpressInfo); + } + + private ExpressInfo QueryExpressInfo(ExpressInfo expressInfo){ + //从expressInfo中获取快递单号、物流信息、电话,生成快递请求参数 + QueryTrackParam queryTrackParam= new QueryTrackParam(); + queryTrackParam.setNum(expressInfo.getNu()); + queryTrackParam.setCom(expressInfo.getCom()); + queryTrackParam.setPhone(expressInfo.getPhone()); + + //获取快递信息 + String param = new Gson().toJson(queryTrackParam); + QueryTrackReq queryTrackReq=new QueryTrackReq(); + queryTrackReq.setParam(param); + queryTrackReq.setCustomer(customer); + queryTrackReq.setSign(SignUtils.querySign(param ,key,customer)); + HttpResult httpResult =new HttpResult(); + IBaseClient baseClient = new QueryTrack(); + try { + httpResult = baseClient.execute(queryTrackReq); + msg=httpResult.getBody(); + } + catch (Exception e) { + msg=e.toString(); + } + + //将快递信息转化为QueryTrackResp对象 + QueryTrackResp queryTrackResp = new Gson().fromJson(msg,QueryTrackResp.class); + + //如果没有查到物流信息,则返回错误信息 + if(StringUtils.isEmpty(queryTrackResp.getStatus()) || !queryTrackResp.getStatus().equals("200")){ + expressInfo.setData(queryTrackResp.getMessage()); + return expressInfo; + } + + //将快递信息中的Context转化为字符 + String dataStr=""; + for(QueryTrackData queryTrackData :queryTrackResp.getData()){ + dataStr+="【"+queryTrackData.getTime()+"】 "; + dataStr+=queryTrackData.getContext(); + if(queryTrackResp.getData().size()-1>queryTrackResp.getData().indexOf(queryTrackData)){ + dataStr+="\r"; + } + } + ExpressInfo callbackExpressInfo=new ExpressInfo(); + callbackExpressInfo.setMessage(queryTrackResp.getMessage()); + callbackExpressInfo.setNu(queryTrackResp.getNu()); + callbackExpressInfo.setIscheck(queryTrackResp.getIscheck()); + callbackExpressInfo.setCom(queryTrackResp.getCom()); + callbackExpressInfo.setStatus(queryTrackResp.getStatus()); + callbackExpressInfo.setData(dataStr); + callbackExpressInfo.setState(queryTrackResp.getState()); + callbackExpressInfo.setCondition(queryTrackResp.getCondition()); + callbackExpressInfo.setRouteInfo(""); //出发位置,当前位置,到达位置,暂无信息 + callbackExpressInfo.setReturnCode(queryTrackResp.getReturnCode()); + callbackExpressInfo.setResult(queryTrackResp.isResult()?"Y":"N"); + callbackExpressInfo.setPhone(expressInfo.getPhone()); + + return callbackExpressInfo; + } + + /** + * 根据快递单号,查询快递公司编码 + * @param num 快递单号 + * @return 快递公司编码 + */ + + private AutoNumResp AutoGetExpressCom(String num){ + AutoNumReq autoNumReq = new AutoNumReq(); + autoNumReq.setKey(key); + autoNumReq.setNum(num); + + IBaseClient baseClient = new AutoNum(); + AutoNumResp autoNumResp=new AutoNumResp(); + try { + String str= baseClient.execute(autoNumReq).getBody().replace("[","").replace("]",""); + autoNumResp = new Gson().fromJson(str,AutoNumResp.class); + + } catch (Exception e) { + e.printStackTrace(); + } + return autoNumResp; + } + + /** + * 新增快递信息 + * + * @param expressInfo 快递信息 + * @return 结果 + */ + @Override + public int insertExpressInfo(ExpressInfo expressInfo) + { + return expressInfoMapper.insertExpressInfo(expressInfo); + } + + /** + * 修改快递信息 + * + * @param expressInfo 快递信息 + * @return 结果 + */ + @Override + public int updateExpressInfo(ExpressInfo expressInfo) + { + return expressInfoMapper.updateExpressInfo(expressInfo); + } + + /** + * 删除快递信息对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteExpressInfoByIds(String ids) + { + return expressInfoMapper.deleteExpressInfoByIds(Convert.toStrArray(ids)); + } + + /** + * 删除快递信息信息 + * + * @param message 快递信息ID + * @return 结果 + */ + @Override + public int deleteExpressInfoById(String message) + { + return expressInfoMapper.deleteExpressInfoById(message); + } + +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java new file mode 100644 index 000000000..05f8c7f7c --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java @@ -0,0 +1,199 @@ +package com.ruoyi.bps.service.impl; + +//import com.ruoyi.bps.express.api.QueryTrack; +//import com.ruoyi.bps.express.api.Subscribe; +//import com.ruoyi.bps.express.contant.ApiInfoConstant; +//import com.ruoyi.bps.express.contant.CompanyConstant; +//import com.ruoyi.bps.express.core.IBaseClient; +//import com.ruoyi.bps.express.pojo.HttpResult; +//import com.ruoyi.bps.express.request.*; + +//import com.ruoyi.bps.express.response.QueryTrackResp; +//import com.ruoyi.bps.express.utils.PropertiesReader; +//import com.ruoyi.bps.express.utils.SignUtils; + +import com.google.gson.Gson; +import com.kuaidi100.sdk.api.QueryTrack; +import com.kuaidi100.sdk.api.Subscribe; +import com.kuaidi100.sdk.contant.ApiInfoConstant; +import com.kuaidi100.sdk.core.IBaseClient; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.*; +import com.kuaidi100.sdk.response.QueryTrackResp; +import com.kuaidi100.sdk.utils.PropertiesReader; +import com.kuaidi100.sdk.utils.SignUtils; +import com.ruoyi.bps.service.IExpressService; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ExpressServiceImpl implements IExpressService { + /* + String key = "Jydbrxsm2311"; + String customer = "2DD48B3469B82F2B7700569093AB792B"; + String secret = "8781ed9b35a7438499eb02fee915915a"; + String userid = "2a62da2192c24d17a943ff78ee64f8c6"; + */ + String key = PropertiesReader.get("key"); + String customer = PropertiesReader.get("customer"); + String secret = PropertiesReader.get("secret"); + String siid = PropertiesReader.get("siid"); + String userid = PropertiesReader.get("userid"); + String tid = PropertiesReader.get("tid"); + String secret_key = PropertiesReader.get("secret_key"); + String secret_secret = PropertiesReader.get("secret_secret"); + String msg=""; + @Autowired + IExpressService expressService; + + @Override + public List QueryTrackExpressMultiList(List list) { + List qtList=new ArrayList<>(); + + for(QueryTrackParam queryTrackParam:list) + { + QueryTrackResp queryTrackResp = new Gson().fromJson(expressService.QueryTrackExpress(queryTrackParam),QueryTrackResp.class); + qtList.add(queryTrackResp); + } + return qtList; + } + + /** + *查询多个物流轨迹 + */ + @Override + public String QueryTrackExpressMulti(List list) { + String str=""; + for(QueryTrackParam qt:list){ + str += QueryTrackExpress(qt); + } + return str; + } + + /** + * 查询单个物流轨迹 + */ + @Override + public String QueryTrackExpress(QueryTrackParam queryTrackParam) { + String str=""; + QueryTrackReq queryTrackReq = new QueryTrackReq(); + String param = new Gson().toJson(queryTrackParam); + + queryTrackReq.setParam(param); + queryTrackReq.setCustomer(customer); + queryTrackReq.setSign(SignUtils.querySign(param ,key,customer)); + HttpResult httpResult=new HttpResult(); + IBaseClient baseClient = new QueryTrack(); + try { + httpResult = baseClient.execute(queryTrackReq); + msg=httpResult.getBody(); + } + catch (Exception e) { + msg=e.toString(); + } + + JSONObject jsonObject = new JSONObject(msg); + if (jsonObject.has("returnCode")){ + QueryTrackResp queryTrackResp= new Gson().fromJson(msg,QueryTrackResp.class); + queryTrackResp.setStatus(queryTrackResp.getReturnCode()); + queryTrackResp.setNu(queryTrackParam.getNum()); + msg= new Gson().toJson(queryTrackResp); + } + /* else { + QueryTrackResp queryTrackResp=new Gson().fromJson(msg,QueryTrackResp.class); + for(int i=0;i GetTestQueryTrackParam() { + QueryTrackParam queryTrackParam = new QueryTrackParam(); + List list=new ArrayList(); + queryTrackParam.setCom("annengwuliu"); + queryTrackParam.setNum("300445967949"); + queryTrackParam.setPhone("17725390266"); + list.add(queryTrackParam); + + QueryTrackParam queryTrackParam1 = new QueryTrackParam(); + queryTrackParam1.setCom("annengwuliu"); + queryTrackParam1.setNum("300445967135"); + queryTrackParam1.setPhone("17725390266"); + list.add(queryTrackParam1); + + + QueryTrackParam queryTrackParam2 = new QueryTrackParam(); + queryTrackParam2.setCom("annengwuliu"); + queryTrackParam2.setNum("3004459670971"); + queryTrackParam2.setPhone("17725390266"); + list.add(queryTrackParam2); +/* + QueryTrackParam queryTrackParam3 = new QueryTrackParam(); + queryTrackParam3.setCom(CompanyConstant.AN); + queryTrackParam3.setNum("300445967045"); + queryTrackParam3.setPhone("17725390266"); + list.add(queryTrackParam3); + + QueryTrackParam queryTrackParam4 = new QueryTrackParam(); + queryTrackParam4.setCom(CompanyConstant.AN); + queryTrackParam4.setNum("300443569920"); + queryTrackParam4.setPhone("17725390266"); + list.add(queryTrackParam4); + + QueryTrackParam queryTrackParam5 = new QueryTrackParam(); + queryTrackParam5.setCom(CompanyConstant.AN); + queryTrackParam5.setNum("300443569878"); + queryTrackParam5.setPhone("17725390266"); + list.add(queryTrackParam5); + + QueryTrackParam queryTrackParam6 = new QueryTrackParam(); + queryTrackParam6.setCom(CompanyConstant.AN); + queryTrackParam6.setNum("300443569880"); + queryTrackParam6.setPhone("17725390266"); + list.add(queryTrackParam6); + */ + return list; + } + + +} diff --git a/box-bps/src/main/resources/account.properties b/box-bps/src/main/resources/account.properties new file mode 100644 index 000000000..c7f7dc6a0 --- /dev/null +++ b/box-bps/src/main/resources/account.properties @@ -0,0 +1,25 @@ +#快递100的基础账号信息,可以在这里获取 +# https://poll.kuaidi100.com/manager/page/myinfo/enterprise +key = Jydbrxsm2311 +customer = 2DD48B3469B82F2B7700569093AB792B +secret = 8781ed9b35a7438499eb02fee915915a +userid = 2a62da2192c24d17a943ff78ee64f8c6 + +#电子面单快递公司账号信息(非必填) +partnerId = +partnerKey = +net = +siid = + +#短信模板id(非必填) +tid = + +#云平台相关(非必填) +#登录云平台 https://cloud.kuaidi100.com/buyer/user/info +secret_key = +secret_secret = + +#是否记录快递100接口返回结果,建议记录日志或者入库,方便后期有问题双方排查(true:启用 false: 关闭 ) +log.return.record = true +#日志记录位置,建议根据自身情况配置 +logPath = logs \ No newline at end of file diff --git a/box-bps/src/main/resources/mapper/bps/ExpSubsPushRespMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpSubsPushRespMapper.xml new file mode 100644 index 000000000..0c10253a7 --- /dev/null +++ b/box-bps/src/main/resources/mapper/bps/ExpSubsPushRespMapper.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select sid, status, billStatus, message, autoCheck, comOld, comNew, lastResultMessage, lastResultState, lastResulStatus, lastResultCondition, lastResultIsCheck, lastResultCom, lastResultNu, lastResultData, destResultMessage, destResultState, destResultStatus, destResultCondition, destResultIsCheck, destResultCom, destResultNu, destResultData from exp_subs_push_resp + + + + + + + + insert into exp_subs_push_resp + + status, + billStatus, + message, + autoCheck, + comOld, + comNew, + lastResultMessage, + lastResultState, + lastResulStatus, + lastResultCondition, + lastResultIsCheck, + lastResultCom, + lastResultNu, + lastResultData, + destResultMessage, + destResultState, + destResultStatus, + destResultCondition, + destResultIsCheck, + destResultCom, + destResultNu, + destResultData, + + + #{status}, + #{billStatus}, + #{message}, + #{autoCheck}, + #{comOld}, + #{comNew}, + #{lastResultMessage}, + #{lastResultState}, + #{lastResulStatus}, + #{lastResultCondition}, + #{lastResultIsCheck}, + #{lastResultCom}, + #{lastResultNu}, + #{lastResultData}, + #{destResultMessage}, + #{destResultState}, + #{destResultStatus}, + #{destResultCondition}, + #{destResultIsCheck}, + #{destResultCom}, + #{destResultNu}, + #{destResultData}, + + + + + update exp_subs_push_resp + + status = #{status}, + billStatus = #{billStatus}, + message = #{message}, + autoCheck = #{autoCheck}, + comOld = #{comOld}, + comNew = #{comNew}, + lastResultMessage = #{lastResultMessage}, + lastResultState = #{lastResultState}, + lastResulStatus = #{lastResulStatus}, + lastResultCondition = #{lastResultCondition}, + lastResultIsCheck = #{lastResultIsCheck}, + lastResultCom = #{lastResultCom}, + lastResultNu = #{lastResultNu}, + lastResultData = #{lastResultData}, + destResultMessage = #{destResultMessage}, + destResultState = #{destResultState}, + destResultStatus = #{destResultStatus}, + destResultCondition = #{destResultCondition}, + destResultIsCheck = #{destResultIsCheck}, + destResultCom = #{destResultCom}, + destResultNu = #{destResultNu}, + destResultData = #{destResultData}, + + where sid = #{sid} + + + + delete from exp_subs_push_resp where sid = #{sid} + + + + delete from exp_subs_push_resp where sid in + + #{sid} + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/mapper/bps/ExpSubscribeMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpSubscribeMapper.xml new file mode 100644 index 000000000..a6c166466 --- /dev/null +++ b/box-bps/src/main/resources/mapper/bps/ExpSubscribeMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + select sid, company, number, phone, salt, subscribeTime, result, returnCode, message from exp_subscribe + + + + + + + + insert into exp_subscribe + + company, + number, + phone, + salt, + subscribeTime, + result, + returnCode, + message, + + + #{company}, + #{number}, + #{phone}, + #{salt}, + #{subscribeTime}, + #{result}, + #{returnCode}, + #{message}, + + + + + update exp_subscribe + + company = #{company}, + number = #{number}, + phone = #{phone}, + salt = #{salt}, + subscribeTime = #{subscribeTime}, + result = #{result}, + returnCode = #{returnCode}, + message = #{message}, + + where sid = #{sid} + + + + delete from exp_subscribe where sid = #{sid} + + + + delete from exp_subscribe where sid in + + #{sid} + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml new file mode 100644 index 000000000..57682de91 --- /dev/null +++ b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + select message, nu, ischeck, com, status, data, state, condition, routeInfo, returnCode, result, phone from expressInfo + + + + + + + + insert into expressInfo + + message, + nu, + ischeck, + com, + status, + data, + state, + condition, + routeInfo, + returnCode, + result, + phone, + + + #{message}, + #{nu}, + #{ischeck}, + #{com}, + #{status}, + #{data}, + #{state}, + #{condition}, + #{routeInfo}, + #{returnCode}, + #{result}, + #{phone}, + + + + + update expressInfo + + nu = #{nu}, + ischeck = #{ischeck}, + com = #{com}, + status = #{status}, + data = #{data}, + state = #{state}, + condition = #{condition}, + routeInfo = #{routeInfo}, + returnCode = #{returnCode}, + result = #{result}, + phone = #{phone}, + + where message = #{message} + + + + delete from expressInfo where message = #{message} + + + + delete from expressInfo where message in + + #{message} + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/mapper/bps/TopgpDdlMapper.xml b/box-bps/src/main/resources/mapper/bps/TopgpDdlMapper.xml new file mode 100644 index 000000000..553117013 --- /dev/null +++ b/box-bps/src/main/resources/mapper/bps/TopgpDdlMapper.xml @@ -0,0 +1,29 @@ + + + + + + alter table ${originalTableName} rename ${newTableName} + + + + truncate table ${tableName} + + + + drop table ${tableName} + + + + create table ${newTableName} as select * from ${originalTableName} + + + + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expressInfo/add.html b/box-bps/src/main/resources/templates/bps/expressInfo/add.html new file mode 100644 index 000000000..7a2c96f55 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expressInfo/add.html @@ -0,0 +1,97 @@ + + + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expressInfo/edit.html b/box-bps/src/main/resources/templates/bps/expressInfo/edit.html new file mode 100644 index 000000000..909109769 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expressInfo/edit.html @@ -0,0 +1,98 @@ + + + + + + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html new file mode 100644 index 000000000..183543dfd --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html @@ -0,0 +1,145 @@ + + + + + + +
    +
    +
    +
    +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • +  搜索 +  重置 +
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expsubspushresp/add.html b/box-bps/src/main/resources/templates/bps/expsubspushresp/add.html new file mode 100644 index 000000000..111562c1d --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expsubspushresp/add.html @@ -0,0 +1,169 @@ + + + + + + +
    +
    +
    + +
    +
    + + +
    + 代码生成请选择字典属性 +
    +
    +
    + +
    +
    + + +
    + 代码生成请选择字典属性 +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    + 代码生成请选择字典属性 +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expsubspushresp/edit.html b/box-bps/src/main/resources/templates/bps/expsubspushresp/edit.html new file mode 100644 index 000000000..b4a69065b --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expsubspushresp/edit.html @@ -0,0 +1,170 @@ + + + + + + +
    +
    + +
    + +
    +
    + + +
    + 代码生成请选择字典属性 +
    +
    +
    + +
    +
    + + +
    + 代码生成请选择字典属性 +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + +
    + 代码生成请选择字典属性 +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html new file mode 100644 index 000000000..da0668e32 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html @@ -0,0 +1,205 @@ + + + + + + +
    +
    +
    +
    +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • +  搜索 +  重置 +
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/subscribe/add.html b/box-bps/src/main/resources/templates/bps/subscribe/add.html new file mode 100644 index 000000000..602e167c3 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/subscribe/add.html @@ -0,0 +1,75 @@ + + + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/subscribe/edit.html b/box-bps/src/main/resources/templates/bps/subscribe/edit.html new file mode 100644 index 000000000..035677c9d --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/subscribe/edit.html @@ -0,0 +1,76 @@ + + + + + + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html new file mode 100644 index 000000000..d7252dad0 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html @@ -0,0 +1,169 @@ + + + + + + + +
    +
    +
    +
    +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • +  搜索 +  重置 +
    • +
    • +  订阅 +
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/express/queryExpress.html b/box-bps/src/main/resources/templates/express/queryExpress.html new file mode 100644 index 000000000..2b6bb25ca --- /dev/null +++ b/box-bps/src/main/resources/templates/express/queryExpress.html @@ -0,0 +1,98 @@ + + + + + + +
    +
    +
    +
    +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • +  搜索 +  重置 +
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java index d22bccbd3..b771ff4a9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java @@ -56,4 +56,9 @@ public enum BusinessType * 清空 */ CLEAN, + + /** + * 清空 + */ + DROP, } From 470e95c5a71382ac93297d32fae7bdc3cec59bcf Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Fri, 28 May 2021 17:51:01 +0800 Subject: [PATCH 03/90] =?UTF-8?q?=E4=BF=AE=E6=94=B9logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/templates/index-topnav.html | 2 +- .../src/main/resources/templates/index.html | 4 +- .../src/main/resources/templates/login.html | 4 +- .../src/main/resources/templates/main.html | 1335 ++--------------- 4 files changed, 99 insertions(+), 1246 deletions(-) diff --git a/ruoyi-admin/src/main/resources/templates/index-topnav.html b/ruoyi-admin/src/main/resources/templates/index-topnav.html index 0e85cab7e..792b34b93 100644 --- a/ruoyi-admin/src/main/resources/templates/index-topnav.html +++ b/ruoyi-admin/src/main/resources/templates/index-topnav.html @@ -4,7 +4,7 @@ - 若依系统首页 + BPS管理系统首页 diff --git a/ruoyi-admin/src/main/resources/templates/index.html b/ruoyi-admin/src/main/resources/templates/index.html index b684e9b67..950527f06 100644 --- a/ruoyi-admin/src/main/resources/templates/index.html +++ b/ruoyi-admin/src/main/resources/templates/index.html @@ -4,7 +4,7 @@ - 若依系统首页 + BPS管理系统首页 @@ -26,7 +26,7 @@ diff --git a/ruoyi-admin/src/main/resources/templates/login.html b/ruoyi-admin/src/main/resources/templates/login.html index 38981a9e2..fbd68f398 100644 --- a/ruoyi-admin/src/main/resources/templates/login.html +++ b/ruoyi-admin/src/main/resources/templates/login.html @@ -65,7 +65,7 @@ diff --git a/ruoyi-admin/src/main/resources/templates/main.html b/ruoyi-admin/src/main/resources/templates/main.html index 51da49571..ef324c721 100644 --- a/ruoyi-admin/src/main/resources/templates/main.html +++ b/ruoyi-admin/src/main/resources/templates/main.html @@ -16,7 +16,7 @@

    BPS后台管理系统

    - 当前版本:若依 v[[${version}]] + 版本:若依 v[[${version}]]

    diff --git a/ruoyi-admin/src/main/resources/templates/register.html b/ruoyi-admin/src/main/resources/templates/register.html index 0566e9ac4..51d7a5928 100644 --- a/ruoyi-admin/src/main/resources/templates/register.html +++ b/ruoyi-admin/src/main/resources/templates/register.html @@ -23,10 +23,10 @@
    From 8ad69bf57a03ce14eda28ef4ef78554206370b26 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Fri, 25 Jun 2021 18:19:19 +0800 Subject: [PATCH 16/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BF=AB=E9=80=92?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E6=8E=A8=E9=80=81=E8=AF=A6=E7=BB=86=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpSubsPushRespController.java | 12 + .../templates/bps/expsubspushresp/detail.html | 223 ++++++++++++++++++ .../bps/expsubspushresp/expsubspushresp.html | 17 +- 3 files changed, 246 insertions(+), 6 deletions(-) create mode 100644 box-bps/src/main/resources/templates/bps/expsubspushresp/detail.html diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java index 3b8792816..561d0a174 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushRespController.java @@ -120,4 +120,16 @@ public class ExpSubsPushRespController extends BaseController { return toAjax(expSubsPushRespService.deleteExpSubsPushRespByIds(ids)); } + + /** + * 快递订阅推送详细信息 + */ + @RequiresPermissions("bps:expsubspushresp:detail") + @GetMapping("/detail/{sid}") + public String detail(@PathVariable("sid") Long sid, ModelMap mmap) + { + ExpSubsPushResp expSubsPushResp = expSubsPushRespService.selectExpSubsPushRespById(sid); + mmap.put("expSubsPushResp", expSubsPushResp); + return prefix + "/detail"; + } } diff --git a/box-bps/src/main/resources/templates/bps/expsubspushresp/detail.html b/box-bps/src/main/resources/templates/bps/expsubspushresp/detail.html new file mode 100644 index 000000000..b9ec7d9f2 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expsubspushresp/detail.html @@ -0,0 +1,223 @@ + + + + + + +
    + + +
    + + +
    + +
    +
    + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html index b3a0eb07f..b437c8e0d 100644 --- a/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html +++ b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html @@ -70,6 +70,7 @@ \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html index d7252dad0..5e0160a0d 100644 --- a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html +++ b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html @@ -5,6 +5,7 @@ +
    @@ -20,7 +21,7 @@
  • - +
  • @@ -39,12 +40,12 @@
  • -  搜索 +  搜索  重置
  • -
  • +
  • @@ -142,12 +143,15 @@ $.table.init(options); }); - function sendForm() { - var formObject = {}; +/* function sendForm() { + /!* var formObject = {}; var formArray =$("#formId").serializeArray(); $.each(formArray,function(i,item){ formObject[item.name] = item.value; - }); + });*!/ + var formObject={}; + $("#formId").serializeArray().map(function(val,key){formObject[val.name]=val.value;}) + $.ajax({ url:ctx+"/bps/subscribe/subscribe", type:"POST", @@ -163,7 +167,7 @@ } }); - }; + };*/ \ No newline at end of file From 889e491f7b794a116a4164fcb99ebeba0094b02b Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Thu, 1 Jul 2021 10:10:40 +0800 Subject: [PATCH 18/90] =?UTF-8?q?=E5=BF=AB=E9=80=92=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=20=E4=BF=AE=E6=AD=A3=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8=E5=90=8E=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E8=AE=A2=E9=98=85=EF=BC=8C=E8=BF=94=E5=9B=9Ecanceled=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E6=89=A7=E8=A1=8Csuccess=E4=BB=BB=E5=8A=A1=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/bps/controller/ExpSubscribeController.java | 2 +- box-bps/src/main/resources/templates/bps/subscribe/add.html | 4 ++-- .../src/main/resources/templates/bps/subscribe/subscribe.html | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java index 5f6583990..ee8753a04 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubscribeController.java @@ -65,7 +65,7 @@ public class ExpSubscribeController extends BaseController public TableDataInfo list(ExpSubscribe expSubscribe) { startPage(); - List list = new ArrayList<>(); + List list; if(expSubscribe.getNumber().contains(",")){ List number= Arrays.asList(expSubscribe.getNumber().split(",")); list=expSubscribeService.selectExpSubsPushRespByNumber(number); diff --git a/box-bps/src/main/resources/templates/bps/subscribe/add.html b/box-bps/src/main/resources/templates/bps/subscribe/add.html index 221d4e3fc..bf4238ba8 100644 --- a/box-bps/src/main/resources/templates/bps/subscribe/add.html +++ b/box-bps/src/main/resources/templates/bps/subscribe/add.html @@ -80,11 +80,12 @@ $("#form-subscribe-add").serializeArray().map(function(val,key){formObject[val.name]=val.value;}) $.ajax({ - url:ctx+"/bps/subscribe/subscribe", + url:ctx+"bps/subscribe/subscribe", type:"POST", contentType: "application/json", data: JSON.stringify(formObject), dataType: "json", + async:false, //如果不加async:false参数,ajax请求默认是异步的,会出现工程启动后第一次订阅,返回canceled,不执行success任务的问题 success:function(data){ alert(JSON.stringify(data)); parent.$("#number").val($("#number").val()); @@ -94,7 +95,6 @@ alert("错误!!"); } }); - }; diff --git a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html index 5e0160a0d..7cd1a621b 100644 --- a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html +++ b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html @@ -75,6 +75,7 @@ \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/EcologyDept.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/EcologyDept.java new file mode 100644 index 000000000..fa66ba26d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/EcologyDept.java @@ -0,0 +1,110 @@ +package com.ruoyi.system.domain; + +public class EcologyDept { + String Canceled; + String supdepid; + String departmentmark; + String departmentname; + String created; + String departmentcode; + String modified; + String id; + String subcompanyid1; + String showorder; + + public String getCanceled() { + return Canceled; + } + + public void setCanceled(String canceled) { + Canceled = canceled; + } + + public String getSupdepid() { + return supdepid; + } + + public void setSupdepid(String supdepid) { + this.supdepid = supdepid; + } + + public String getDepartmentmark() { + return departmentmark; + } + + public void setDepartmentmark(String departmentmark) { + this.departmentmark = departmentmark; + } + + public String getDepartmentname() { + return departmentname; + } + + public void setDepartmentname(String departmentname) { + this.departmentname = departmentname; + } + + public String getCreated() { + return created; + } + + public void setCreated(String created) { + this.created = created; + } + + public String getDepartmentcode() { + return departmentcode; + } + + public void setDepartmentcode(String departmentcode) { + this.departmentcode = departmentcode; + } + + public String getModified() { + return modified; + } + + public void setModified(String modified) { + this.modified = modified; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSubcompanyid1() { + return subcompanyid1; + } + + public void setSubcompanyid1(String subcompanyid1) { + this.subcompanyid1 = subcompanyid1; + } + + public String getShoworder() { + return showorder; + } + + public void setShoworder(String showorder) { + this.showorder = showorder; + } + + @Override + public String toString() { + return "EcologyDept{" + + "Canceled='" + Canceled + '\'' + + ", supdepid='" + supdepid + '\'' + + ", departmentmark='" + departmentmark + '\'' + + ", departmentname='" + departmentname + '\'' + + ", created='" + created + '\'' + + ", departmentcode='" + departmentcode + '\'' + + ", modified='" + modified + '\'' + + ", id='" + id + '\'' + + ", subcompanyid1='" + subcompanyid1 + '\'' + + ", showorder='" + showorder + '\'' + + '}'; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java index b8158b359..c64f02c5e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -114,4 +114,9 @@ public interface SysDeptMapper * @return 子部门数 */ public int selectNormalChildrenDeptById(Long deptId); + + /** + * Truncate部门表,用于与Ecology部门同步 + */ + public void truncateDept(); } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 0ea5f81b1..ba493fd03 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -152,4 +152,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + truncate table sys_dept + + \ No newline at end of file From 6da42f4b1102a62a415a0aec7f1b0909c56a05e4 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Tue, 13 Jul 2021 17:49:12 +0800 Subject: [PATCH 24/90] =?UTF-8?q?=E5=90=8C=E6=AD=A5Ecology=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysDeptController.java | 18 ++++ .../resources/templates/system/dept/dept.html | 36 +++++--- .../ruoyi/system/service/ISysDeptService.java | 5 ++ .../service/impl/SysDeptServiceImpl.java | 85 ++++++++++++++++++- 4 files changed, 130 insertions(+), 14 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index 00e6f7ea0..85315576f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -204,4 +204,22 @@ public class SysDeptController extends BaseController List ztrees = deptService.roleDeptTreeData(role); return ztrees; } + + /** + * Ecology部门信息同步 + */ + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @RequiresPermissions("system:dept:edit") + @PostMapping("/syncDept") + @ResponseBody + public AjaxResult syncDept() + { + String url="http://192.168.2.85:90/api/hrm/resful/getHrmdepartmentWithPage"; + String params="{\"params\":{\"pagesize\":1000}}"; + int result = deptService.syncEcologyDept(url,params); + if(result==200){ + return AjaxResult.success("部门同步成功,返回状态码:"+result); + } + return AjaxResult.error("同步失败,返回状态码:"+result); + } } diff --git a/ruoyi-admin/src/main/resources/templates/system/dept/dept.html b/ruoyi-admin/src/main/resources/templates/system/dept/dept.html index 952941bd7..566ba20a8 100644 --- a/ruoyi-admin/src/main/resources/templates/system/dept/dept.html +++ b/ruoyi-admin/src/main/resources/templates/system/dept/dept.html @@ -32,7 +32,7 @@ 同步 - + 新增 @@ -53,6 +53,7 @@ var editFlag = [[${@permission.hasPermi('system:dept:edit')}]]; var removeFlag = [[${@permission.hasPermi('system:dept:remove')}]]; var datas = [[${@dict.getType('sys_normal_disable')}]]; + var deptSyncType = [[${#strings.defaultString(@config.getKey('sys.dept.sync'), 0)}]]; var prefix = ctx + "system/dept" $(function() { @@ -111,17 +112,30 @@ $.treeTable.init(options); }); + + function addDept(){ + + if(deptSyncType =="0") { + $.operate.add(999999); + }else { + alert("系统参数已启用同步Ecology部门信息,禁止手动新增部门!") + } + } function syncDept() { - $.ajax({ - type: 'POST', - url: ctx+"system/dept/syncDept", - data: JSON.stringify(""), //beauty是字符串 - contentType: "application/json", - dataType: "json", - success: function(message) { - //alert(JSON.stringify(message)); //将JSON对象转换为字符串 - } - }); + if(deptSyncType =="1") { + $.ajax({ + type: 'POST', + url: ctx + "system/dept/syncDept", + data: JSON.stringify(""), //beauty是字符串 + contentType: "application/json", + dataType: "json", + success: function (message) { + alert(JSON.stringify(message)); //将JSON对象转换为字符串 + } + }); + }else { + alert("系统参数未启用同步Ecology部门!") + } }; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java index 7c8b8c966..7deaf4055 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -107,4 +107,9 @@ public interface ISysDeptService * @return 结果 */ public String checkDeptNameUnique(SysDept dept); + + /** + * Ecology部门信息同步 + */ + public int syncEcologyDept(String url,String params); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index e7035fc8d..8bd6034fe 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -1,10 +1,13 @@ package com.ruoyi.system.service.impl; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.*; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.ruoyi.system.domain.EcologyDept; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.common.annotation.DataScope; @@ -17,6 +20,8 @@ import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.service.ISysDeptService; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; /** * 部门管理 服务实现 @@ -308,4 +313,78 @@ public class SysDeptServiceImpl implements ISysDeptService } return UserConstants.DEPT_NAME_UNIQUE; } + + /** + * Ecology部门信息同步 + */ + @Override + public int syncEcologyDept(String url,String params) { + int result= deptSync(sendPostWithRest(url,params)); + return result; + + } + public Map sendPostWithRest(String url, String params){ + RestTemplate restTemplate=new RestTemplate(); + ResponseEntity result=null; + int statusCode=0; + try{ + result=restTemplate.postForEntity(url,params,String.class); + statusCode=result.getStatusCode().value(); + }catch (RestClientException e){ + System.out.println("POST Request uri: "+url+", params:"+params+" error:"+e.getMessage()); + } + Map map=new HashMap<>(); + map.put("statusCode",String.valueOf(statusCode)); + if(statusCode== 200){ + map.put("result",result.getBody()); + } else{ + map.put("result",String.valueOf(statusCode)); + } + + return map; + } + + + public int deptSync(Map mapResult){ + //如果接口返回状态码不为200,则不做同步处理 + String statusCode=mapResult.get("statusCode"); + String result= mapResult.get("result"); + if(!statusCode.equals("200")) + { + //return mapResult.get("result"); + return 0; + } + //取Ecology返回信息中的部门信息 + Map map = (Map) JSON.parse(result); + Map o= (Map) map.get("data"); + JSONArray json = (JSONArray) o.get("dataList"); + List depts = JSONArray.parseArray(json.toJSONString(), EcologyDept.class); + //清空部门表 + deptMapper.truncateDept(); + //插入最顶层部门 + SysDept dept =new SysDept(); + dept.setDeptId(Long.parseLong("999999")); + dept.setParentId(Long.parseLong("0")); + dept.setDeptName("BPS"); + dept.setOrderNum("0"); + dept.setStatus("0"); + dept.setCreateBy("Admin"); + deptMapper.insertDept(dept); + //同步Ecology部门信息 + for(EcologyDept ecologyDept:depts){ + //System.out.println(ecologyDept.getDepartmentname()); + //String subCompanyid=ecologyDept.getSubcompanyid1(); + if(ecologyDept.getSubcompanyid1().equals("1")) { //只取分部ID为“1”的部门,排除代理商 + dept.setDeptId(Long.parseLong(ecologyDept.getId())); + dept.setParentId(Long.parseLong(ecologyDept.getSupdepid()) == 0 ? 999999 : Long.parseLong(ecologyDept.getSupdepid())); + dept.setDeptName(ecologyDept.getDepartmentname()); + dept.setOrderNum("0"); + dept.setStatus("0"); + dept.setCreateBy("Admin"); + deptMapper.insertDept(dept); + } + } + return 200; + } + } From 917b74d79554c9621ab3fa394a01fad3b428c7fa Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 14 Jul 2021 14:42:10 +0800 Subject: [PATCH 25/90] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=90=8C=E6=AD=A5Ecolo?= =?UTF-8?q?gy=E4=BA=BA=E5=91=98=E4=BF=A1=E6=81=AF=E3=80=82=20=E5=B0=86sys?= =?UTF-8?q?=5Fuser=E8=A1=A8=E8=87=AA=E5=A2=9E=E9=95=BF=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E4=BB=8E10000000=E5=BC=80=E5=A7=8B=20ALTER=20TABLE=20sys=5Fuse?= =?UTF-8?q?r=20AUTO=5FINCREMENT=20=3D=2010000000?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetEcologyInfoTestController.java | 29 +++-- .../controller/system/SysDeptController.java | 6 +- .../controller/system/SysUserController.java | 18 +++ .../resources/templates/system/user/user.html | 16 +++ .../ruoyi/common/utils/http/HttpUtils.java | 33 ++++++ .../com/ruoyi/system/domain/EcologyUser.java | 110 ++++++++++++++++++ .../ruoyi/system/mapper/SysUserMapper.java | 5 + .../ruoyi/system/service/ISysUserService.java | 5 + .../service/impl/SysDeptServiceImpl.java | 11 +- .../service/impl/SysUserServiceImpl.java | 75 +++++++++--- .../resources/mapper/system/SysUserMapper.xml | 4 + 11 files changed, 283 insertions(+), 29 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/EcologyUser.java diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java index 2f5336231..f43d1a844 100644 --- a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java @@ -4,17 +4,16 @@ package com.ruoyi.test.conrtroller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.system.domain.EcologyDept; +import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,16 +21,30 @@ import java.util.Map; public class GetEcologyInfoTestController extends BaseController { @Autowired private SysDeptMapper deptMapper; + @Autowired + private ISysUserService userService; @RequestMapping("/anon/getEcologyDept") public String getEcologyDept() throws Exception { String url="http://192.168.2.85:90/api/hrm/resful/getHrmdepartmentWithPage"; String params="{\"params\":{\"pagesize\":1000}}"; //return sendPost(url,params); - return deptSync(sendPostWithRest(url,params)); + return deptSync(HttpUtils.sendPostWithRest(url,params)); + } - public Map sendPostWithRest(String url,String params){ + @RequestMapping("/anon/getEcologyUser") + public String getEcologyUser(){ + String url="http://192.168.2.85:90/api/hrm/resful/getHrmUserInfoWithPage"; + String params="{\"params\":{\"pagesize\":999999}}"; + int result = userService.syncEcologyUser(url,params); + if(result==200){ + return "同步成功"; + } + return "同步失败"; + } + + /*public Map sendPostWithRest(String url,String params){ RestTemplate restTemplate=new RestTemplate(); ResponseEntity result=null; int statusCode=0; @@ -50,7 +63,7 @@ public class GetEcologyInfoTestController extends BaseController { } return map; - } + }*/ public String deptSync(Map mapResult){ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index 85315576f..a9976adfa 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -209,7 +209,7 @@ public class SysDeptController extends BaseController * Ecology部门信息同步 */ @Log(title = "部门管理", businessType = BusinessType.UPDATE) - @RequiresPermissions("system:dept:edit") + @RequiresPermissions("system:dept:sync") @PostMapping("/syncDept") @ResponseBody public AjaxResult syncDept() @@ -218,8 +218,8 @@ public class SysDeptController extends BaseController String params="{\"params\":{\"pagesize\":1000}}"; int result = deptService.syncEcologyDept(url,params); if(result==200){ - return AjaxResult.success("部门同步成功,返回状态码:"+result); + return AjaxResult.success("同步Ecology部门成功,返回状态码:"+result); } - return AjaxResult.error("同步失败,返回状态码:"+result); + return AjaxResult.error("同步Ecology部门失败,返回状态码:"+result); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 9934afb22..f5ae08dd1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -285,4 +285,22 @@ public class SysUserController extends BaseController userService.checkUserAllowed(user); return toAjax(userService.changeStatus(user)); } + + /** + * Ecology部门信息同步 + */ + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @RequiresPermissions("system:user:sync") + @PostMapping("/syncUser") + @ResponseBody + public AjaxResult syncDept() + { + String url="http://192.168.2.85:90/api/hrm/resful/getHrmUserInfoWithPage"; + String params="{\"params\":{\"pagesize\":999999}}"; + int result = userService.syncEcologyUser(url,params); + if(result==200){ + return AjaxResult.success("Ecology人员同步成功,返回状态码:"+result); + } + return AjaxResult.error("Ecology人员同步失败,返回状态码:"+result); + } } \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/system/user/user.html b/ruoyi-admin/src/main/resources/templates/system/user/user.html index 94930329a..f7a58d70d 100644 --- a/ruoyi-admin/src/main/resources/templates/system/user/user.html +++ b/ruoyi-admin/src/main/resources/templates/system/user/user.html @@ -62,6 +62,9 @@
    + + 同步 + 新增 @@ -262,6 +265,19 @@ $.operate.post(prefix + "/changeStatus", { "userId": userId, "status": 0 }); }) } + + function syncUser() { + $.ajax({ + type: 'POST', + url: ctx + "system/user/syncUser", + data: JSON.stringify(""), + contentType: "application/json", + dataType: "json", + success: function (message) { + alert(JSON.stringify(message)); //将JSON对象转换为字符串 + } + }); + }; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java index 5e92cde8f..8093b0a7f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -10,6 +10,8 @@ import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; import java.security.cert.X509Certificate; +import java.util.HashMap; +import java.util.Map; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; @@ -19,6 +21,9 @@ import javax.net.ssl.X509TrustManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ruoyi.common.constant.Constants; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; /** * 通用http发送方法 @@ -259,4 +264,32 @@ public class HttpUtils return true; } } + + /** + * 向指定 Restful接口 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param params 请求参数,请求参数为json的形式。例:params="{\"params\":{\"pagesize\":1000}}" + * @return 返回Map, Key="statusCode",接口访问返回状态, key="result":接口返回接果 + */ + public static Map sendPostWithRest(String url, String params){ + RestTemplate restTemplate=new RestTemplate(); + ResponseEntity result=null; + int statusCode=0; + try{ + result=restTemplate.postForEntity(url,params,String.class); + statusCode=result.getStatusCode().value(); + }catch (RestClientException e){ + System.out.println("POST Request uri: "+url+", params:"+params+" error:"+e.getMessage()); + } + Map map=new HashMap<>(); + map.put("statusCode",String.valueOf(statusCode)); + if(statusCode== 200){ + map.put("result",result.getBody()); + } else{ + map.put("result",String.valueOf(statusCode)); + } + + return map; + } } \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/EcologyUser.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/EcologyUser.java new file mode 100644 index 000000000..cf763af3f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/EcologyUser.java @@ -0,0 +1,110 @@ +package com.ruoyi.system.domain; + +public class EcologyUser { + String subcompanyid1; + String password; + String id; + String loginid; + String lastname; + String departmentid; + String mobile; + String email; + String sex; + String Status; + + public String getSubcompanyid1() { + return subcompanyid1; + } + + public void setSubcompanyid1(String subcompanyid1) { + this.subcompanyid1 = subcompanyid1; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoginid() { + return loginid; + } + + public void setLoginid(String loginid) { + this.loginid = loginid; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getDepartmentid() { + return departmentid; + } + + public void setDepartmentid(String departmentid) { + this.departmentid = departmentid; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getStatus() { + return Status; + } + + public void setStatus(String status) { + Status = status; + } + + @Override + public String toString() { + return "EcologyUser{" + + "subcompanyid1='" + subcompanyid1 + '\'' + + ", password='" + password + '\'' + + ", id='" + id + '\'' + + ", loginid='" + loginid + '\'' + + ", lastname='" + lastname + '\'' + + ", departmentid='" + departmentid + '\'' + + ", mobile='" + mobile + '\'' + + ", email='" + email + '\'' + + ", sex='" + sex + '\'' + + ", Status='" + Status + '\'' + + '}'; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 177d04263..22fb5cbf6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -121,4 +121,9 @@ public interface SysUserMapper * @return 结果 */ public SysUser checkEmailUnique(String email); + + /** + * 删除Ecology同步过来的用户 + */ + public void deleteEcologySyncUser(); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 16625e1c2..40ebb36bb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -204,4 +204,9 @@ public interface ISysUserService * @return 结果 */ public int changeStatus(SysUser user); + + /** + * Ecology人员信息同步 + */ + public int syncEcologyUser(String url,String params); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 8bd6034fe..d14dbd709 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -4,10 +4,12 @@ import java.util.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.system.domain.EcologyDept; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.common.annotation.DataScope; @@ -28,7 +30,7 @@ import org.springframework.web.client.RestTemplate; * * @author ruoyi */ -@Service +@Service("sysDeptServiceImpl") public class SysDeptServiceImpl implements ISysDeptService { @Autowired @@ -319,11 +321,11 @@ public class SysDeptServiceImpl implements ISysDeptService */ @Override public int syncEcologyDept(String url,String params) { - int result= deptSync(sendPostWithRest(url,params)); + int result= deptSync(HttpUtils.sendPostWithRest(url,params)); return result; } - public Map sendPostWithRest(String url, String params){ +/* public Map sendPostWithRest(String url, String params){ RestTemplate restTemplate=new RestTemplate(); ResponseEntity result=null; int statusCode=0; @@ -342,8 +344,7 @@ public class SysDeptServiceImpl implements ISysDeptService } return map; - } - + }*/ public int deptSync(Map mapResult){ //如果接口返回状态码不为200,则不做同步处理 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 884b7d0f5..c4f7a7d30 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -1,12 +1,7 @@ package com.ruoyi.system.service.impl; -import java.util.ArrayList; -import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; @@ -14,24 +9,31 @@ import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.security.Md5Utils; +import com.ruoyi.system.domain.EcologyUser; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.domain.SysUserRole; -import com.ruoyi.system.mapper.SysPostMapper; -import com.ruoyi.system.mapper.SysRoleMapper; -import com.ruoyi.system.mapper.SysUserMapper; -import com.ruoyi.system.mapper.SysUserPostMapper; -import com.ruoyi.system.mapper.SysUserRoleMapper; +import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * 用户 业务层处理 * * @author ruoyi */ -@Service +@Service("sysUserServiceImpl") public class SysUserServiceImpl implements ISysUserService { private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @@ -525,4 +527,51 @@ public class SysUserServiceImpl implements ISysUserService { return userMapper.updateUser(user); } + + /** + * Ecology人员信息同步 + * + * @param url + * @param params + */ + @Override + public int syncEcologyUser(String url, String params) { + int result= userSync(HttpUtils.sendPostWithRest(url,params)); + return result; + } + + public int userSync(Map mapResult){ + //如果接口返回状态码不为200,则不做同步处理 + String statusCode=mapResult.get("statusCode"); + String result= mapResult.get("result"); + if(!statusCode.equals("200")) + { + return 0; + } + //取Ecology返回信息中的部门信息 + Map map = (Map) JSON.parse(result); + Map o= (Map) map.get("data"); + JSONArray json = (JSONArray) o.get("dataList"); + List ecologyUserList = JSONArray.parseArray(json.toJSONString(), EcologyUser.class); + + userMapper.deleteEcologySyncUser(); + SysUser user = new SysUser(); + //同步Ecology部门信息 + for(EcologyUser ecologyuser:ecologyUserList){ + if(ecologyuser.getSubcompanyid1().equals("1") && StringUtils.isNotEmpty(ecologyuser.getLoginid())) { //只取分部ID为“1”的员工 + user.setUserId(Long.parseLong(ecologyuser.getId())); + user.setDeptId(Long.parseLong(ecologyuser.getDepartmentid())); + user.setLoginName(ecologyuser.getLoginid()); + user.setUserName(ecologyuser.getLastname()); + user.setUserType("02"); + user.setEmail(ecologyuser.getEmail()); + user.setSex(ecologyuser.getSex()); + user.setPhonenumber(ecologyuser.getMobile()); + user.setStatus(ecologyuser.getStatus().equals("5")?"1":"0"); //Ecology为离职状态5,则无效 + user.setDelFlag("0"); + userMapper.insertUser(user); + } + } + return 200; + } } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 1ee58e8fa..36acbf155 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -223,5 +223,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sysdate() ) + + + delete from sys_user where user_type ='02' + \ No newline at end of file From c9b127eb28a1a0da8dacabfb15e202b5ead6976f Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 14 Jul 2021 15:30:22 +0800 Subject: [PATCH 26/90] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=90=8C=E6=AD=A5Ecolo?= =?UTF-8?q?gy=E4=BA=BA=E5=91=98=E4=BF=A1=E6=81=AF=E3=80=82=20=E5=B0=86sys?= =?UTF-8?q?=5Fuser=E8=A1=A8=E8=87=AA=E5=A2=9E=E9=95=BF=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E4=BB=8E10000000=E5=BC=80=E5=A7=8B=20ALTER=20TABLE=20sys=5Fuse?= =?UTF-8?q?r=20AUTO=5FINCREMENT=20=3D=2010000000?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/web/controller/system/SysDeptController.java | 4 ++-- .../com/ruoyi/web/controller/system/SysUserController.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index a9976adfa..e123bee99 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -208,14 +208,14 @@ public class SysDeptController extends BaseController /** * Ecology部门信息同步 */ - @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @Log(title = "部门同步", businessType = BusinessType.UPDATE) @RequiresPermissions("system:dept:sync") @PostMapping("/syncDept") @ResponseBody public AjaxResult syncDept() { String url="http://192.168.2.85:90/api/hrm/resful/getHrmdepartmentWithPage"; - String params="{\"params\":{\"pagesize\":1000}}"; + String params="{\"params\":{\"pagesize\":999999}}"; int result = deptService.syncEcologyDept(url,params); if(result==200){ return AjaxResult.success("同步Ecology部门成功,返回状态码:"+result); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index f5ae08dd1..1a6a487fc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -287,9 +287,9 @@ public class SysUserController extends BaseController } /** - * Ecology部门信息同步 + * Ecology人员信息同步 */ - @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @Log(title = "人员同步", businessType = BusinessType.UPDATE) @RequiresPermissions("system:user:sync") @PostMapping("/syncUser") @ResponseBody From 123dcd95e56e7440278a5205c1904e1e978c887e Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 14 Jul 2021 18:20:10 +0800 Subject: [PATCH 27/90] =?UTF-8?q?=E4=BF=AE=E6=AD=A3Ecology=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=97=B6=E6=B2=A1=E6=9C=89=E6=9B=B4=E6=96=B0=E7=A5=96?= =?UTF-8?q?=E7=BA=A7=E5=88=97=E8=A1=A8=E4=BF=A1=E6=81=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetEcologyInfoTestController.java | 70 ++++++++++----- .../service/impl/SysDeptServiceImpl.java | 89 ++++++++++--------- 2 files changed, 96 insertions(+), 63 deletions(-) diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java index f43d1a844..8952c1a9b 100644 --- a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONArray; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.system.domain.EcologyDept; import com.ruoyi.system.mapper.SysDeptMapper; @@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -65,6 +67,39 @@ public class GetEcologyInfoTestController extends BaseController { return map; }*/ + public SysDept insertEcologyDept(EcologyDept ecologyDept){ + SysDept dept=new SysDept(); + dept.setDeptId(Long.parseLong(ecologyDept.getId())); + dept.setParentId(Long.parseLong(ecologyDept.getSupdepid()) == 0 ? 999999 : Long.parseLong(ecologyDept.getSupdepid())); + dept.setDeptName(ecologyDept.getDepartmentname()); + //dept.setAncestors(pAncestors); + dept.setOrderNum("0"); + dept.setStatus("0"); + dept.setCreateBy("Admin"); + deptMapper.insertDept(dept); + return dept; + } + + public void updateAncestors(List sysDeptList) + { + if(sysDeptList.isEmpty()) + { + return; + } + List list =new ArrayList<>(); + for(SysDept dept:sysDeptList){ + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + if(StringUtils.isNotEmpty(info.getAncestors())) { + dept.setAncestors(info.getAncestors()+","+dept.getParentId()); + deptMapper.updateDept(dept); + }else{ + list.add(dept); + } + } + updateAncestors(list); + } + + public String deptSync(Map mapResult){ //如果接口返回状态码不为200,则不做同步处理 @@ -79,31 +114,26 @@ public class GetEcologyInfoTestController extends BaseController { Map o= (Map) map.get("data"); JSONArray json = (JSONArray) o.get("dataList"); List depts = JSONArray.parseArray(json.toJSONString(), EcologyDept.class); - //清空部门表 + + //清空部门表,并插入顶级部门 + SysDept sysDept=deptMapper.selectDeptById(Long.parseLong("999999")); deptMapper.truncateDept(); - //插入最顶层部门 - SysDept dept =new SysDept(); - dept.setDeptId(Long.parseLong("999999")); - dept.setParentId(Long.parseLong("0")); - dept.setDeptName("BPS"); - dept.setOrderNum("0"); - dept.setStatus("0"); - dept.setCreateBy("Admin"); - deptMapper.insertDept(dept); + deptMapper.insertDept(sysDept); + List list=new ArrayList<>(); //同步Ecology部门信息 - for(EcologyDept ecologyDept:depts){ - //System.out.println(ecologyDept.getDepartmentname()); - //String subCompanyid=ecologyDept.getSubcompanyid1(); + for(EcologyDept ecologyDept:depts){ if(ecologyDept.getSubcompanyid1().equals("1")) { //只取分部ID为“1”的部门,排除代理商 - dept.setDeptId(Long.parseLong(ecologyDept.getId())); - dept.setParentId(Long.parseLong(ecologyDept.getSupdepid()) == 0 ? 999999 : Long.parseLong(ecologyDept.getSupdepid())); - dept.setDeptName(ecologyDept.getDepartmentname()); - dept.setOrderNum("0"); - dept.setStatus("0"); - dept.setCreateBy("Admin"); - deptMapper.insertDept(dept); + /* String pAncestors=null; + if(ecologyDept.getSupdepid().equals("0")){ //如果Ecology部门为一级部门,则设定ancestors="0,999999" + pAncestors="0,999999"; + }*/ + SysDept dept= insertEcologyDept(ecologyDept); + list.add(dept); } } + //更新祖级信息 + updateAncestors(list); + return result; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index d14dbd709..87c650e19 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -323,28 +323,7 @@ public class SysDeptServiceImpl implements ISysDeptService public int syncEcologyDept(String url,String params) { int result= deptSync(HttpUtils.sendPostWithRest(url,params)); return result; - } -/* public Map sendPostWithRest(String url, String params){ - RestTemplate restTemplate=new RestTemplate(); - ResponseEntity result=null; - int statusCode=0; - try{ - result=restTemplate.postForEntity(url,params,String.class); - statusCode=result.getStatusCode().value(); - }catch (RestClientException e){ - System.out.println("POST Request uri: "+url+", params:"+params+" error:"+e.getMessage()); - } - Map map=new HashMap<>(); - map.put("statusCode",String.valueOf(statusCode)); - if(statusCode== 200){ - map.put("result",result.getBody()); - } else{ - map.put("result",String.valueOf(statusCode)); - } - - return map; - }*/ public int deptSync(Map mapResult){ //如果接口返回状态码不为200,则不做同步处理 @@ -352,7 +331,6 @@ public class SysDeptServiceImpl implements ISysDeptService String result= mapResult.get("result"); if(!statusCode.equals("200")) { - //return mapResult.get("result"); return 0; } //取Ecology返回信息中的部门信息 @@ -360,32 +338,57 @@ public class SysDeptServiceImpl implements ISysDeptService Map o= (Map) map.get("data"); JSONArray json = (JSONArray) o.get("dataList"); List depts = JSONArray.parseArray(json.toJSONString(), EcologyDept.class); - //清空部门表 + //清空部门表,并插入顶级部门 + SysDept sysDept=deptMapper.selectDeptById(Long.parseLong("999999")); deptMapper.truncateDept(); - //插入最顶层部门 - SysDept dept =new SysDept(); - dept.setDeptId(Long.parseLong("999999")); - dept.setParentId(Long.parseLong("0")); - dept.setDeptName("BPS"); + deptMapper.insertDept(sysDept); + List list=new ArrayList<>(); + //同步Ecology部门信息 + for(EcologyDept ecologyDept:depts){ + if(ecologyDept.getSubcompanyid1().equals("1")) { //只取分部ID为“1”的部门,排除代理商 + SysDept dept= insertEcologyDept(ecologyDept); + list.add(dept); + } + } + //更新祖级列表信息 + updateAncestors(list); + + return 200; + } + + //将Ecology部门转化为系统部门,并更新到部门表sys_dept + public SysDept insertEcologyDept(EcologyDept ecologyDept){ + SysDept dept=new SysDept(); + dept.setDeptId(Long.parseLong(ecologyDept.getId())); + dept.setParentId(Long.parseLong(ecologyDept.getSupdepid()) == 0 ? 999999 : Long.parseLong(ecologyDept.getSupdepid())); + dept.setDeptName(ecologyDept.getDepartmentname()); dept.setOrderNum("0"); dept.setStatus("0"); dept.setCreateBy("Admin"); deptMapper.insertDept(dept); - //同步Ecology部门信息 - for(EcologyDept ecologyDept:depts){ - //System.out.println(ecologyDept.getDepartmentname()); - //String subCompanyid=ecologyDept.getSubcompanyid1(); - if(ecologyDept.getSubcompanyid1().equals("1")) { //只取分部ID为“1”的部门,排除代理商 - dept.setDeptId(Long.parseLong(ecologyDept.getId())); - dept.setParentId(Long.parseLong(ecologyDept.getSupdepid()) == 0 ? 999999 : Long.parseLong(ecologyDept.getSupdepid())); - dept.setDeptName(ecologyDept.getDepartmentname()); - dept.setOrderNum("0"); - dept.setStatus("0"); - dept.setCreateBy("Admin"); - deptMapper.insertDept(dept); - } - } - return 200; + return dept; } + //更新祖级列表信息 + public void updateAncestors(List sysDeptList) + { + if(sysDeptList.isEmpty()) + { + return; + } + List list =new ArrayList<>(); + for(SysDept dept:sysDeptList){ + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + if(StringUtils.isNotEmpty(info.getAncestors())) { + dept.setAncestors(info.getAncestors()+","+dept.getParentId()); + deptMapper.updateDept(dept); + }else{ + list.add(dept); + } + } + updateAncestors(list); + } + + + } From 54696ed7a0e2c0c4e07a17a4f3cca3112c12f7aa Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Thu, 15 Jul 2021 12:02:59 +0800 Subject: [PATCH 28/90] =?UTF-8?q?=E4=BF=AE=E6=AD=A3Ecology=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=90=8C=E6=AD=A5=EF=BC=8C=E6=80=A7=E5=88=AB=E6=9C=AA?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/system/service/impl/SysUserServiceImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index c4f7a7d30..93a8c2d01 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -559,13 +559,21 @@ public class SysUserServiceImpl implements ISysUserService //同步Ecology部门信息 for(EcologyUser ecologyuser:ecologyUserList){ if(ecologyuser.getSubcompanyid1().equals("1") && StringUtils.isNotEmpty(ecologyuser.getLoginid())) { //只取分部ID为“1”的员工 + String sex=ecologyuser.getSex(); + if(sex.equals("男")){ + sex="0"; + }else if(sex.equals("女")){ + sex="1"; + }else{ + sex="2"; + }; user.setUserId(Long.parseLong(ecologyuser.getId())); user.setDeptId(Long.parseLong(ecologyuser.getDepartmentid())); user.setLoginName(ecologyuser.getLoginid()); user.setUserName(ecologyuser.getLastname()); user.setUserType("02"); user.setEmail(ecologyuser.getEmail()); - user.setSex(ecologyuser.getSex()); + user.setSex(sex); user.setPhonenumber(ecologyuser.getMobile()); user.setStatus(ecologyuser.getStatus().equals("5")?"1":"0"); //Ecology为离职状态5,则无效 user.setDelFlag("0"); From 14c18c38e9e9eff33de4ccf6a7cc21813c6b0daa Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Thu, 15 Jul 2021 13:32:42 +0800 Subject: [PATCH 29/90] kettle1 --- bps-kettle/pom.xml | 138 ++++++++++ .../controller/KettleTransController.java | 142 ++++++++++ .../controller/XRepositoryController.java | 126 +++++++++ .../com/ruoyi/kettle/domain/KettleTrans.java | 220 +++++++++++++++ .../com/ruoyi/kettle/domain/XRepository.java | 256 ++++++++++++++++++ .../kettle/mapper/KettleTransMapper.java | 63 +++++ .../kettle/mapper/XRepositoryMapper.java | 61 +++++ .../kettle/service/IKettleTransService.java | 61 +++++ .../kettle/service/IXRepositoryService.java | 61 +++++ .../service/impl/KettleTransServiceImpl.java | 124 +++++++++ .../service/impl/XRepositoryServiceImpl.java | 104 +++++++ .../com/ruoyi/kettle/tools/KettleUtils.java | 73 +++++ .../mapper/kettle/KettleTransMapper.xml | 132 +++++++++ .../mapper/kettle/XRepositoryMapper.xml | 140 ++++++++++ .../templates/kettle/repository/add.html | 135 +++++++++ .../templates/kettle/repository/edit.html | 132 +++++++++ .../kettle/repository/repository.html | 122 +++++++++ .../resources/templates/kettle/trans/add.html | 112 ++++++++ .../templates/kettle/trans/edit.html | 104 +++++++ .../templates/kettle/trans/trans.html | 146 ++++++++++ 20 files changed, 2452 insertions(+) create mode 100644 bps-kettle/pom.xml create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleTrans.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/domain/XRepository.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java create mode 100644 bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml create mode 100644 bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml create mode 100644 bps-kettle/src/main/resources/templates/kettle/repository/add.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/repository/edit.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/repository/repository.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/trans/add.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/trans/edit.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/trans/trans.html diff --git a/bps-kettle/pom.xml b/bps-kettle/pom.xml new file mode 100644 index 000000000..8b251fbee --- /dev/null +++ b/bps-kettle/pom.xml @@ -0,0 +1,138 @@ + + + + ruoyi + com.ruoyi + 4.6.2 + + 4.0.0 + + bps-kettle + + 9.0.0.0-423 + 2.5.16 + 1.7.2 + 2.6.12 + + + + + + com.ruoyi + ruoyi-common + + + com.ruoyi + ruoyi-system + + + org.json + json + 20160810 + + + + io.swagger + swagger-annotations + 1.5.21 + compile + + + + + pentaho-kettle + kettle-core + ${kettle-version} + + + pentaho-kettle + kettle-engine + ${kettle-version} + + + pentaho-kettle + kettle-dbdialog + ${kettle-version} + + + org.pentaho.di.plugins + kettle-sap-plugin-core + ${kettle-version} + + + pentaho-kettle + kettle-ui-swt + ${kettle-version} + + + + org.codehaus.janino + janino + ${janino-version} + + + org.eclipse.birt.runtime.3_7_1 + org.mozilla.javascript + ${javascript-version} + + + + net.sourceforge.jexcelapi + jxl + ${jxl-version} + + + + + mysql + mysql-connector-java + 5.1.48 + + + + com.microsoft.sqlserver + sqljdbc4 + 4.0 + + + + net.sourceforge.jtds + jtds + 1.2.4 + + + + org.apache.poi + poi + 3.17 + + + org.apache.poi + poi-ooxml + 3.17 + + + org.apache.poi + poi-ooxml-schemas + 3.17 + + + junit + junit + test + + + + + pentaho + https://nexus.pentaho.org/content/groups/omni/ + + + + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java new file mode 100644 index 000000000..ed8f10416 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java @@ -0,0 +1,142 @@ +package com.ruoyi.kettle.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.system.service.ISysRoleService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.kettle.domain.KettleTrans; +import com.ruoyi.kettle.service.IKettleTransService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 转换Controller + * + * @author kone + * @date 2021-07-14 + */ +@Controller +@RequestMapping("/kettle/trans") +public class KettleTransController extends BaseController +{ + private String prefix = "kettle/trans"; + + @Autowired + private IKettleTransService kettleTransService; + @Autowired + private ISysRoleService roleService; + + @RequiresPermissions("kettle:trans:view") + @GetMapping() + public String trans() + { + return prefix + "/trans"; + } + + /** + * 查询转换列表 + */ + @RequiresPermissions("kettle:trans:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(KettleTrans kettleTrans) + { + startPage(); + List list = kettleTransService.selectKettleTransList(kettleTrans); + return getDataTable(list); + } + + /** + * 导出转换列表 + */ + @RequiresPermissions("kettle:trans:export") + @Log(title = "转换", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(KettleTrans kettleTrans) + { + List list = kettleTransService.selectKettleTransList(kettleTrans); + ExcelUtil util = new ExcelUtil(KettleTrans.class); + return util.exportExcel(list, "转换数据"); + } + + /** + * 新增转换 + */ + @GetMapping("/add") + public String add(ModelMap mmap) + { + List roleKeys=roleService.selectRoleAll().stream().map(SysRole::getRoleKey).collect(Collectors.toList()); + mmap.put("allRoles",roleKeys); + return prefix + "/add"; + } + + /** + * 新增保存转换 + */ + @RequiresPermissions("kettle:trans:add") + @Log(title = "转换", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(KettleTrans kettleTrans) + { + return toAjax(kettleTransService.insertKettleTrans(kettleTrans)); + } + + /** + * 修改转换 + */ + @GetMapping("/edit/{id}") + public String edit(@PathVariable("id") Long id, ModelMap mmap) + { + KettleTrans kettleTrans = kettleTransService.selectKettleTransById(id); + List roleKeys=roleService.selectRoleAll().stream().map(SysRole::getRoleKey).collect(Collectors.toList()); + String rks=""; + if(kettleTrans!=null && kettleTrans.getRoleKey()!=null){ + rks=kettleTrans.getRoleKey(); + } + String[] rkArray=rks.split(","); + mmap.put("allRoles",roleKeys); + mmap.put("kettleTrans", kettleTrans); + mmap.put("rkArray",rkArray); + return prefix + "/edit"; + } + + /** + * 修改保存转换 + */ + @RequiresPermissions("kettle:trans:edit") + @Log(title = "转换", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(KettleTrans kettleTrans) + { + return toAjax(kettleTransService.updateKettleTrans(kettleTrans)); + } + + /** + * 删除转换 + */ + @RequiresPermissions("kettle:trans:remove") + @Log(title = "转换", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(kettleTransService.deleteKettleTransByIds(ids)); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java new file mode 100644 index 000000000..80cf5fa18 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java @@ -0,0 +1,126 @@ +package com.ruoyi.kettle.controller; + +import java.util.List; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.kettle.domain.XRepository; +import com.ruoyi.kettle.service.IXRepositoryService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 资源库Controller + * + * @author kone + * @date 2021-07-12 + */ +@Controller +@RequestMapping("/kettle/repository") +public class XRepositoryController extends BaseController +{ + private String prefix = "kettle/repository"; + + @Autowired + private IXRepositoryService xRepositoryService; + + @RequiresPermissions("kettle:repository:view") + @GetMapping() + public String repository() + { + return prefix + "/repository"; + } + + /** + * 查询资源库列表 + */ + @RequiresPermissions("kettle:repository:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(XRepository xRepository) + { + startPage(); + List list = xRepositoryService.selectXRepositoryList(xRepository); + return getDataTable(list); + } + + /** + * 导出资源库列表 + */ + @RequiresPermissions("kettle:repository:export") + @Log(title = "资源库", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(XRepository xRepository) + { + List list = xRepositoryService.selectXRepositoryList(xRepository); + ExcelUtil util = new ExcelUtil(XRepository.class); + return util.exportExcel(list, "资源库数据"); + } + + /** + * 新增资源库 + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } + + /** + * 新增保存资源库 + */ + @RequiresPermissions("kettle:repository:add") + @Log(title = "资源库", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(XRepository xRepository) + { + return toAjax(xRepositoryService.insertXRepository(xRepository)); + } + + /** + * 修改资源库 + */ + @GetMapping("/edit/{id}") + public String edit(@PathVariable("id") Long id, ModelMap mmap) + { + XRepository xRepository = xRepositoryService.selectXRepositoryById(id); + mmap.put("xRepository", xRepository); + return prefix + "/edit"; + } + + /** + * 修改保存资源库 + */ + @RequiresPermissions("kettle:repository:edit") + @Log(title = "资源库", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(XRepository xRepository) + { + return toAjax(xRepositoryService.updateXRepository(xRepository)); + } + + /** + * 删除资源库 + */ + @RequiresPermissions("kettle:repository:remove") + @Log(title = "资源库", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(xRepositoryService.deleteXRepositoryByIds(ids)); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleTrans.java b/bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleTrans.java new file mode 100644 index 000000000..79d6248fe --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleTrans.java @@ -0,0 +1,220 @@ +package com.ruoyi.kettle.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 转换对象 kettle_trans + * + * @author kone + * @date 2021-07-14 + */ +public class KettleTrans extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 转换名称 */ + @Excel(name = "转换名称") + private String transName; + + /** 转换描述 */ + @Excel(name = "转换描述") + private String transDescription; + + /** */ + private Date createdTime; + + /** */ + private String createdBy; + + /** 转换类型(file,ftp,sf) */ + private String transType; + + /** 路径 */ + @Excel(name = "路径") + private String transPath; + + /** 所属资源库id */ + @Excel(name = "所属资源库id") + private Long transRepositoryId; + + /** 日志级别 */ + @Excel(name = "日志级别") + private String transLogLevel; + + /** 状态 */ + @Excel(name = "状态") + private String transStatus; + + /** 是否删除 */ + @Excel(name = "是否删除") + private Integer isDel; + + /** 是否启用 */ + @Excel(name = "是否启用") + private Integer isMonitorEnabled; + + /** 保留备用 */ + private String tplKey; + + /** 可执行角色key,用+号拼接 */ + @Excel(name = "可执行角色key") + private String roleKey; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setTransName(String transName) + { + this.transName = transName; + } + + public String getTransName() + { + return transName; + } + public void setTransDescription(String transDescription) + { + this.transDescription = transDescription; + } + + public String getTransDescription() + { + return transDescription; + } + public void setCreatedTime(Date createdTime) + { + this.createdTime = createdTime; + } + + public Date getCreatedTime() + { + return createdTime; + } + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + + public String getCreatedBy() + { + return createdBy; + } + public void setTransType(String transType) + { + this.transType = transType; + } + + public String getTransType() + { + return transType; + } + public void setTransPath(String transPath) + { + this.transPath = transPath; + } + + public String getTransPath() + { + return transPath; + } + public void setTransRepositoryId(Long transRepositoryId) + { + this.transRepositoryId = transRepositoryId; + } + + public Long getTransRepositoryId() + { + return transRepositoryId; + } + public void setTransLogLevel(String transLogLevel) + { + this.transLogLevel = transLogLevel; + } + + public String getTransLogLevel() + { + return transLogLevel; + } + public void setTransStatus(String transStatus) + { + this.transStatus = transStatus; + } + + public String getTransStatus() + { + return transStatus; + } + public void setIsDel(Integer isDel) + { + this.isDel = isDel; + } + + public Integer getIsDel() + { + return isDel; + } + public void setIsMonitorEnabled(Integer isMonitorEnabled) + { + this.isMonitorEnabled = isMonitorEnabled; + } + + public Integer getIsMonitorEnabled() + { + return isMonitorEnabled; + } + public void setTplKey(String tplKey) + { + this.tplKey = tplKey; + } + + public String getTplKey() + { + return tplKey; + } + public void setRoleKey(String roleKey) + { + this.roleKey = roleKey; + } + + public String getRoleKey() + { + return roleKey; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("transName", getTransName()) + .append("transDescription", getTransDescription()) + .append("createdTime", getCreatedTime()) + .append("updateTime", getUpdateTime()) + .append("createdBy", getCreatedBy()) + .append("updateBy", getUpdateBy()) + .append("transType", getTransType()) + .append("transPath", getTransPath()) + .append("transRepositoryId", getTransRepositoryId()) + .append("transLogLevel", getTransLogLevel()) + .append("transStatus", getTransStatus()) + .append("isDel", getIsDel()) + .append("isMonitorEnabled", getIsMonitorEnabled()) + .append("tplKey", getTplKey()) + .append("roleKey", getRoleKey()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/domain/XRepository.java b/bps-kettle/src/main/java/com/ruoyi/kettle/domain/XRepository.java new file mode 100644 index 000000000..769576acf --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/domain/XRepository.java @@ -0,0 +1,256 @@ +package com.ruoyi.kettle.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 资源库对象 kettle_repository + * + * @author kone + * @date 2021-07-12 + */ +public class XRepository extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** */ + @Excel(name = "") + private String repoId; + + /** 资源库名称 */ + @Excel(name = "资源库名称") + private String repoName; + + /** 当资源库类型是db时候的用户名 */ + private String repoUsername; + + /** 当资源库类型是db时候的密码 */ + private String repoPassword; + + /** db类型 */ + private String repoType; + + /** 当资源库类型是db时候的连接类型 */ + private String dbAccess; + + /** 当资源库类型是db时候的ip */ + private String dbHost; + + /** 当资源库类型是db时候的端口 */ + private String dbPort; + + /** 当资源库类型是db时候的db库名 */ + private String dbName; + + /** 当资源库类型是db时候的db用户名 */ + private String dbUsername; + + /** 当资源库类型是db时候的db用户密码 */ + private String dbPassword; + + /** 软删除 */ + private int isDel; + + /** */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "", width = 30, dateFormat = "yyyy-MM-dd") + private Date createdTime; + + /** */ + @Excel(name = "") + private String createdBy; + + /** 资源库类型 */ + @Excel(name = "资源库类型") + private String type; + + /** 基础路径 */ + @Excel(name = "基础路径") + private String baseDir; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setRepoId(String repoId) + { + this.repoId = repoId; + } + + public String getRepoId() + { + return repoId; + } + public void setRepoName(String repoName) + { + this.repoName = repoName; + } + + public String getRepoName() + { + return repoName; + } + public void setRepoUsername(String repoUsername) + { + this.repoUsername = repoUsername; + } + + public String getRepoUsername() + { + return repoUsername; + } + public void setRepoPassword(String repoPassword) + { + this.repoPassword = repoPassword; + } + + public String getRepoPassword() + { + return repoPassword; + } + public void setRepoType(String repoType) + { + this.repoType = repoType; + } + + public String getRepoType() + { + return repoType; + } + public void setDbAccess(String dbAccess) + { + this.dbAccess = dbAccess; + } + + public String getDbAccess() + { + return dbAccess; + } + public void setDbHost(String dbHost) + { + this.dbHost = dbHost; + } + + public String getDbHost() + { + return dbHost; + } + public void setDbPort(String dbPort) + { + this.dbPort = dbPort; + } + + public String getDbPort() + { + return dbPort; + } + public void setDbName(String dbName) + { + this.dbName = dbName; + } + + public String getDbName() + { + return dbName; + } + public void setDbUsername(String dbUsername) + { + this.dbUsername = dbUsername; + } + + public String getDbUsername() + { + return dbUsername; + } + public void setDbPassword(String dbPassword) + { + this.dbPassword = dbPassword; + } + + public String getDbPassword() + { + return dbPassword; + } + public void setIsDel(int isDel) + { + this.isDel = isDel; + } + + public int getIsDel() + { + return isDel; + } + public void setCreatedTime(Date createdTime) + { + this.createdTime = createdTime; + } + + public Date getCreatedTime() + { + return createdTime; + } + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + + public String getCreatedBy() + { + return createdBy; + } + public void setType(String type) + { + this.type = type; + } + + public String getType() + { + return type; + } + public void setBaseDir(String baseDir) + { + this.baseDir = baseDir; + } + + public String getBaseDir() + { + return baseDir; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("repoId", getRepoId()) + .append("repoName", getRepoName()) + .append("repoUsername", getRepoUsername()) + .append("repoPassword", getRepoPassword()) + .append("repoType", getRepoType()) + .append("dbAccess", getDbAccess()) + .append("dbHost", getDbHost()) + .append("dbPort", getDbPort()) + .append("dbName", getDbName()) + .append("dbUsername", getDbUsername()) + .append("dbPassword", getDbPassword()) + .append("isDel", getIsDel()) + .append("createdTime", getCreatedTime()) + .append("updateTime", getUpdateTime()) + .append("createdBy", getCreatedBy()) + .append("updateBy", getUpdateBy()) + .append("type", getType()) + .append("baseDir", getBaseDir()) + .toString(); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java new file mode 100644 index 000000000..fc095d5de --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java @@ -0,0 +1,63 @@ +package com.ruoyi.kettle.mapper; + +import java.util.List; +import com.ruoyi.kettle.domain.KettleTrans; +import org.apache.ibatis.annotations.Param; + +/** + * 转换Mapper接口 + * + * @author kone + * @date 2021-07-14 + */ +public interface KettleTransMapper +{ + /** + * 查询转换 + * + * @param id 转换ID + * @return 转换 + */ + public KettleTrans selectKettleTransById(Long id); + + /** + * 查询转换列表 + * + * @param kettleTrans 转换 + * @param roleKey + * @return 转换集合 + */ + public List selectKettleTransList(@Param("KettleTrans") KettleTrans kettleTrans,@Param("roleKey") List roleKey); + + /** + * 新增转换 + * + * @param kettleTrans 转换 + * @return 结果 + */ + public int insertKettleTrans(KettleTrans kettleTrans); + + /** + * 修改转换 + * + * @param kettleTrans 转换 + * @return 结果 + */ + public int updateKettleTrans(KettleTrans kettleTrans); + + /** + * 删除转换 + * + * @param id 转换ID + * @return 结果 + */ + public int deleteKettleTransById(Long id); + + /** + * 批量删除转换 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteKettleTransByIds(String[] ids); +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java new file mode 100644 index 000000000..56d3e00e4 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.kettle.mapper; + +import java.util.List; +import com.ruoyi.kettle.domain.XRepository; + +/** + * 资源库Mapper接口 + * + * @author kone + * @date 2021-07-12 + */ +public interface XRepositoryMapper +{ + /** + * 查询资源库 + * + * @param id 资源库ID + * @return 资源库 + */ + public XRepository selectXRepositoryById(Long id); + + /** + * 查询资源库列表 + * + * @param xRepository 资源库 + * @return 资源库集合 + */ + public List selectXRepositoryList(XRepository xRepository); + + /** + * 新增资源库 + * + * @param xRepository 资源库 + * @return 结果 + */ + public int insertXRepository(XRepository xRepository); + + /** + * 修改资源库 + * + * @param xRepository 资源库 + * @return 结果 + */ + public int updateXRepository(XRepository xRepository); + + /** + * 删除资源库 + * + * @param id 资源库ID + * @return 结果 + */ + public int deleteXRepositoryById(Long id); + + /** + * 批量删除资源库 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteXRepositoryByIds(String[] ids); +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java new file mode 100644 index 000000000..45035f694 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java @@ -0,0 +1,61 @@ +package com.ruoyi.kettle.service; + +import java.util.List; +import com.ruoyi.kettle.domain.KettleTrans; + +/** + * 转换Service接口 + * + * @author kone + * @date 2021-07-14 + */ +public interface IKettleTransService +{ + /** + * 查询转换 + * + * @param id 转换ID + * @return 转换 + */ + public KettleTrans selectKettleTransById(Long id); + + /** + * 查询转换列表 + * + * @param kettleTrans 转换 + * @return 转换集合 + */ + public List selectKettleTransList(KettleTrans kettleTrans); + + /** + * 新增转换 + * + * @param kettleTrans 转换 + * @return 结果 + */ + public int insertKettleTrans(KettleTrans kettleTrans); + + /** + * 修改转换 + * + * @param kettleTrans 转换 + * @return 结果 + */ + public int updateKettleTrans(KettleTrans kettleTrans); + + /** + * 批量删除转换 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteKettleTransByIds(String ids); + + /** + * 删除转换信息 + * + * @param id 转换ID + * @return 结果 + */ + public int deleteKettleTransById(Long id); +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java new file mode 100644 index 000000000..cf77a0625 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java @@ -0,0 +1,61 @@ +package com.ruoyi.kettle.service; + +import java.util.List; +import com.ruoyi.kettle.domain.XRepository; + +/** + * 资源库Service接口 + * + * @author kone + * @date 2021-07-12 + */ +public interface IXRepositoryService +{ + /** + * 查询资源库 + * + * @param id 资源库ID + * @return 资源库 + */ + public XRepository selectXRepositoryById(Long id); + + /** + * 查询资源库列表 + * + * @param xRepository 资源库 + * @return 资源库集合 + */ + public List selectXRepositoryList(XRepository xRepository); + + /** + * 新增资源库 + * + * @param xRepository 资源库 + * @return 结果 + */ + public int insertXRepository(XRepository xRepository); + + /** + * 修改资源库 + * + * @param xRepository 资源库 + * @return 结果 + */ + public int updateXRepository(XRepository xRepository); + + /** + * 批量删除资源库 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteXRepositoryByIds(String ids); + + /** + * 删除资源库信息 + * + * @param id 资源库ID + * @return 结果 + */ + public int deleteXRepositoryById(Long id); +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java new file mode 100644 index 000000000..8fc114576 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java @@ -0,0 +1,124 @@ +package com.ruoyi.kettle.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.security.PermissionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.kettle.mapper.KettleTransMapper; +import com.ruoyi.kettle.domain.KettleTrans; +import com.ruoyi.kettle.service.IKettleTransService; +import com.ruoyi.common.core.text.Convert; + +/** + * 转换Service业务层处理 + * + * @author kone + * @date 2021-07-14 + */ +@Service +public class KettleTransServiceImpl implements IKettleTransService +{ + @Autowired + private KettleTransMapper kettleTransMapper; + + /** + * 查询转换 + * + * @param id 转换ID + * @return 转换 + */ + @Override + public KettleTrans selectKettleTransById(Long id) + { + return kettleTransMapper.selectKettleTransById(id); + } + + /** + * 查询转换列表 + * + * @param kettleTrans 转换 + * @return 转换 + */ + @Override + public List selectKettleTransList(KettleTrans kettleTrans) + { + List roleList = (List) PermissionUtils.getPrincipalProperty("roles"); + //当前用户的roleKey + List roleKeys=roleList.stream().map(SysRole::getRoleKey).collect(Collectors.toList()); + + return kettleTransMapper.selectKettleTransList(kettleTrans,roleKeys); + } + + /** + * 新增转换 + * + * @param kettleTrans 转换 + * @return 结果 + */ + @Override + public int insertKettleTrans(KettleTrans kettleTrans) + { + String userName = (String) PermissionUtils.getPrincipalProperty("userName"); + if(kettleTrans.getRoleKey()==null){ + kettleTrans.setRoleKey("admin"); + }else{ + if(!kettleTrans.getRoleKey().contains("admin")){ + kettleTrans.setRoleKey(kettleTrans.getRoleKey().concat(",admin")); + } + } + kettleTrans.setCreatedBy(userName); + kettleTrans.setUpdateBy(userName); + kettleTrans.setTransType("File"); + return kettleTransMapper.insertKettleTrans(kettleTrans); + } + + /** + * 修改转换 + * + * @param kettleTrans 转换 + * @return 结果 + */ + @Override + public int updateKettleTrans(KettleTrans kettleTrans) + { + String userName = (String) PermissionUtils.getPrincipalProperty("userName"); + kettleTrans.setUpdateBy(userName); + kettleTrans.setUpdateTime(DateUtils.getNowDate()); + kettleTrans.setTransType("File"); + if(kettleTrans.getRoleKey()==null){ + kettleTrans.setRoleKey("admin"); + }else{ + if(!kettleTrans.getRoleKey().contains("admin")){ + kettleTrans.setRoleKey(kettleTrans.getRoleKey().concat(",admin")); + } + } return kettleTransMapper.updateKettleTrans(kettleTrans); + } + + /** + * 删除转换对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteKettleTransByIds(String ids) + { + return kettleTransMapper.deleteKettleTransByIds(Convert.toStrArray(ids)); + } + + /** + * 删除转换信息 + * + * @param id 转换ID + * @return 结果 + */ + @Override + public int deleteKettleTransById(Long id) + { + return kettleTransMapper.deleteKettleTransById(id); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java new file mode 100644 index 000000000..d9d5b5068 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java @@ -0,0 +1,104 @@ +package com.ruoyi.kettle.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.security.PermissionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.kettle.mapper.XRepositoryMapper; +import com.ruoyi.kettle.domain.XRepository; +import com.ruoyi.kettle.service.IXRepositoryService; +import com.ruoyi.common.core.text.Convert; + +/** + * 资源库Service业务层处理 + * + * @author kone + * @date 2021-07-12 + */ +@Service +public class XRepositoryServiceImpl implements IXRepositoryService +{ + @Autowired + private XRepositoryMapper xRepositoryMapper; + + /** + * 查询资源库 + * + * @param id 资源库ID + * @return 资源库 + */ + @Override + public XRepository selectXRepositoryById(Long id) + { + return xRepositoryMapper.selectXRepositoryById(id); + } + + /** + * 查询资源库列表 + * + * @param xRepository 资源库 + * @return 资源库 + */ + @Override + public List selectXRepositoryList(XRepository xRepository) + { + return xRepositoryMapper.selectXRepositoryList(xRepository); + } + + /** + * 新增资源库 + * + * @param xRepository 资源库 + * @return 结果 + */ + @Override + public int insertXRepository(XRepository xRepository) + { + String userName = (String) PermissionUtils.getPrincipalProperty("userName"); + xRepository.setCreatedBy(userName); + xRepository.setUpdateBy(userName); + xRepository.setType("File"); + return xRepositoryMapper.insertXRepository(xRepository); + } + + /** + * 修改资源库 + * + * @param xRepository 资源库 + * @return 结果 + */ + @Override + public int updateXRepository(XRepository xRepository) + { + String userName = (String) PermissionUtils.getPrincipalProperty("userName"); + xRepository.setUpdateTime(DateUtils.getNowDate()); + xRepository.setUpdateBy(userName); + + return xRepositoryMapper.updateXRepository(xRepository); + } + + /** + * 删除资源库对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteXRepositoryByIds(String ids) + { + return xRepositoryMapper.deleteXRepositoryByIds(Convert.toStrArray(ids)); + } + + /** + * 删除资源库信息 + * + * @param id 资源库ID + * @return 结果 + */ + @Override + public int deleteXRepositoryById(Long id) + { + return xRepositoryMapper.deleteXRepositoryById(id); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java new file mode 100644 index 000000000..11b6231cb --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java @@ -0,0 +1,73 @@ +package com.ruoyi.kettle.tools; + +import org.pentaho.di.core.KettleEnvironment; +import org.pentaho.di.job.Job; +import org.pentaho.di.job.JobMeta; +import org.pentaho.di.trans.Trans; +import org.pentaho.di.trans.TransMeta; +import org.springframework.core.io.ClassPathResource; + +import java.io.File; +import java.util.Iterator; +import java.util.Map; + +public class KettleUtils { + + /** + * 执行ktr文件 + * + * @param filename + * @param params + * @return + */ + public static void runKtr(String filename, Map params, String dirPath) { + try { + KettleEnvironment.init(); + TransMeta tm = new TransMeta(dirPath + File.separator + filename); + Trans trans = new Trans(tm); + if (params != null) { + Iterator> entries = params.entrySet().iterator(); + while (entries.hasNext()) { + Map.Entry entry = entries.next(); + trans.setParameterValue(entry.getKey(), entry.getValue()); + } + } + trans.execute(null); + trans.waitUntilFinished(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 执行kjb文件 + * + * @param filename + * @param params + * @return + */ + public static void runKjb(String filename, Map params, String dirPath) { + try { + KettleEnvironment.init(); + JobMeta jm = new JobMeta(dirPath + File.separator + filename, null); + Job job = new Job(null, jm); + if (params != null) { + Iterator> entries = params.entrySet().iterator(); + while (entries.hasNext()) { + Map.Entry entry = entries.next(); + job.setVariable(entry.getKey(), entry.getValue()); + } + } + job.start(); + job.waitUntilFinished(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws Exception { + ClassPathResource classPathResource = new ClassPathResource("kettle"); + System.out.println("classPathResource:" + classPathResource.getFile().getPath()); + runKtr("D:\\etl\\kone.ktr", null, classPathResource.getFile().getPath()); + } +} \ No newline at end of file diff --git a/bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml b/bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml new file mode 100644 index 000000000..09824a03f --- /dev/null +++ b/bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, trans_name, trans_description, created_time, update_time, created_by, update_by, trans_type, trans_path, trans_repository_id, trans_log_level, trans_status, is_del, is_monitor_enabled, tpl_key, role_key, remark from kettle_trans + + + + + + + + insert into kettle_trans + + trans_name, + trans_description, + created_time, + update_time, + created_by, + update_by, + trans_type, + trans_path, + trans_repository_id, + trans_log_level, + trans_status, + is_del, + is_monitor_enabled, + tpl_key, + role_key, + remark, + + + #{transName}, + #{transDescription}, + #{createdTime}, + #{updateTime}, + #{createdBy}, + #{updateBy}, + #{transType}, + #{transPath}, + #{transRepositoryId}, + #{transLogLevel}, + #{transStatus}, + #{isDel}, + #{isMonitorEnabled}, + #{tplKey}, + #{roleKey}, + #{remark}, + + + + + update kettle_trans + + trans_name = #{transName}, + trans_description = #{transDescription}, + created_time = #{createdTime}, + update_time = #{updateTime}, + created_by = #{createdBy}, + update_by = #{updateBy}, + trans_type = #{transType}, + trans_path = #{transPath}, + trans_repository_id = #{transRepositoryId}, + trans_log_level = #{transLogLevel}, + trans_status = #{transStatus}, + is_del = #{isDel}, + is_monitor_enabled = #{isMonitorEnabled}, + tpl_key = #{tplKey}, + role_key = #{roleKey}, + remark = #{remark}, + + where id = #{id} + + + + delete from kettle_trans where id = #{id} + + + + delete from kettle_trans where id in + + #{id} + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml b/bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml new file mode 100644 index 000000000..9e7517b22 --- /dev/null +++ b/bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, repo_id, repo_name, repo_username, repo_password, repo_type, db_access, db_host, db_port, db_name, db_username, db_password, is_del, created_time, update_time, created_by, update_by, type, base_dir from kettle_repository + + + + + + + + insert into kettle_repository + + repo_id, + repo_name, + repo_username, + repo_password, + repo_type, + db_access, + db_host, + db_port, + db_name, + db_username, + db_password, + is_del, + created_time, + update_time, + created_by, + update_by, + type, + base_dir, + + + #{repoId}, + #{repoName}, + #{repoUsername}, + #{repoPassword}, + #{repoType}, + #{dbAccess}, + #{dbHost}, + #{dbPort}, + #{dbName}, + #{dbUsername}, + #{dbPassword}, + #{isDel}, + #{createdTime}, + #{updateTime}, + #{createdBy}, + #{updateBy}, + #{type}, + #{baseDir}, + + + + + update kettle_repository + + repo_id = #{repoId}, + repo_name = #{repoName}, + repo_username = #{repoUsername}, + repo_password = #{repoPassword}, + repo_type = #{repoType}, + db_access = #{dbAccess}, + db_host = #{dbHost}, + db_port = #{dbPort}, + db_name = #{dbName}, + db_username = #{dbUsername}, + db_password = #{dbPassword}, + is_del = #{isDel}, + created_time = #{createdTime}, + update_time = #{updateTime}, + created_by = #{createdBy}, + update_by = #{updateBy}, + type = #{type}, + base_dir = #{baseDir}, + + where id = #{id} + + + + delete from kettle_repository where id = #{id} + + + + delete from kettle_repository where id in + + #{id} + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/repository/add.html b/bps-kettle/src/main/resources/templates/kettle/repository/add.html new file mode 100644 index 000000000..e75ef192a --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/repository/add.html @@ -0,0 +1,135 @@ + + + + + + + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/repository/edit.html b/bps-kettle/src/main/resources/templates/kettle/repository/edit.html new file mode 100644 index 000000000..b175b3bf9 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/repository/edit.html @@ -0,0 +1,132 @@ + + + + + + + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/repository/repository.html b/bps-kettle/src/main/resources/templates/kettle/repository/repository.html new file mode 100644 index 000000000..725ae2136 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/repository/repository.html @@ -0,0 +1,122 @@ + + + + + + +
    +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/trans/add.html b/bps-kettle/src/main/resources/templates/kettle/trans/add.html new file mode 100644 index 000000000..3a06f95c6 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/trans/add.html @@ -0,0 +1,112 @@ + + + + + + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    + + + + + + + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/trans/edit.html b/bps-kettle/src/main/resources/templates/kettle/trans/edit.html new file mode 100644 index 000000000..a001ad59c --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/trans/edit.html @@ -0,0 +1,104 @@ + + + + + + + + + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + + + +
    +
    +
    + +
    + +
    +
    + + +
    +
    + + + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/trans/trans.html b/bps-kettle/src/main/resources/templates/kettle/trans/trans.html new file mode 100644 index 000000000..26ff2b8ac --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/trans/trans.html @@ -0,0 +1,146 @@ + + + + + + +
    +
    +
    +
    +
    +
      +
    • + + +
    • + +
    • + + +
    • +
    • +  搜索 +  重置 +
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + \ No newline at end of file From 41cfa4720eb5366581638ed9fa2facd1b9d52793 Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Thu, 15 Jul 2021 13:33:39 +0800 Subject: [PATCH 30/90] e --- pom.xml | 6 ++++++ ruoyi-admin/pom.xml | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a57842c9..1aac32454 100644 --- a/pom.xml +++ b/pom.xml @@ -232,6 +232,11 @@ ${ruoyi.version} + + com.ruoyi + bps-kettle + ${ruoyi.version} + @@ -244,6 +249,7 @@ ruoyi-common box-test box-bps + bps-kettle pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 8c2956445..de11488db 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -93,7 +93,10 @@ com.ruoyi box-bps - + + com.ruoyi + bps-kettle + From c49935cb6ce641fb25ce7f6a202443769f38e676 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Thu, 15 Jul 2021 17:06:41 +0800 Subject: [PATCH 31/90] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetEcologyInfoTestController.java | 37 ++++++++----------- ruoyi-system/pom.xml | 4 ++ .../service/impl/SysDeptServiceImpl.java | 29 +++++++++++---- .../service/impl/SysUserServiceImpl.java | 14 +++---- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java index 8952c1a9b..faf741d0d 100644 --- a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java @@ -1,37 +1,30 @@ package com.ruoyi.test.conrtroller; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.http.HttpUtils; -import com.ruoyi.system.domain.EcologyDept; -import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - @RestController public class GetEcologyInfoTestController extends BaseController { @Autowired - private SysDeptMapper deptMapper; + private ISysDeptService deptService; @Autowired private ISysUserService userService; @RequestMapping("/anon/getEcologyDept") public String getEcologyDept() throws Exception { String url="http://192.168.2.85:90/api/hrm/resful/getHrmdepartmentWithPage"; - String params="{\"params\":{\"pagesize\":1000}}"; + String params="{\"params\":{\"pagesize\":999999}}"; //return sendPost(url,params); - return deptSync(HttpUtils.sendPostWithRest(url,params)); + int result = deptService.syncEcologyDept(url,params); + if(result==200){ + return "同步成功"; + } + return "同步失败"; } @@ -46,7 +39,7 @@ public class GetEcologyInfoTestController extends BaseController { return "同步失败"; } - /*public Map sendPostWithRest(String url,String params){ + /* *//*public Map sendPostWithRest(String url,String params){ RestTemplate restTemplate=new RestTemplate(); ResponseEntity result=null; int statusCode=0; @@ -65,7 +58,7 @@ public class GetEcologyInfoTestController extends BaseController { } return map; - }*/ + }*//* public SysDept insertEcologyDept(EcologyDept ecologyDept){ SysDept dept=new SysDept(); @@ -123,10 +116,10 @@ public class GetEcologyInfoTestController extends BaseController { //同步Ecology部门信息 for(EcologyDept ecologyDept:depts){ if(ecologyDept.getSubcompanyid1().equals("1")) { //只取分部ID为“1”的部门,排除代理商 - /* String pAncestors=null; + *//* String pAncestors=null; if(ecologyDept.getSupdepid().equals("0")){ //如果Ecology部门为一级部门,则设定ancestors="0,999999" pAncestors="0,999999"; - }*/ + }*//* SysDept dept= insertEcologyDept(ecologyDept); list.add(dept); } @@ -137,7 +130,7 @@ public class GetEcologyInfoTestController extends BaseController { return result; } - /* public String sendPost(String url,String params) throws Exception { + *//* public String sendPost(String url,String params) throws Exception { RestTemplate restTemplate=new RestTemplate(); ResponseEntity result = null; int statusCode = 0; @@ -158,8 +151,8 @@ public class GetEcologyInfoTestController extends BaseController { return result.getStatusCode().toString(); } +*//* + */ - - } diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index 77c2764df..7eb8a88eb 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -22,6 +22,10 @@ com.ruoyi ruoyi-common + + com.google.code.gson + gson + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 87c650e19..6e0d34157 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -4,6 +4,8 @@ import java.util.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.system.domain.EcologyDept; import org.apache.commons.lang3.ArrayUtils; @@ -333,17 +335,30 @@ public class SysDeptServiceImpl implements ISysDeptService { return 0; } + //取Ecology返回信息中的部门信息 Map map = (Map) JSON.parse(result); - Map o= (Map) map.get("data"); - JSONArray json = (JSONArray) o.get("dataList"); - List depts = JSONArray.parseArray(json.toJSONString(), EcologyDept.class); - //清空部门表,并插入顶级部门 - SysDept sysDept=deptMapper.selectDeptById(Long.parseLong("999999")); + Map dataMap= (Map) map.get("data"); + //JSONArray json = (JSONArray) o.get("dataList"); + //List depts = JSONArray.parseArray(json.toJSONString(), EcologyDept.class); + List depts= new Gson().fromJson(dataMap.get("dataList").toString(), new TypeToken>(){}.getType()); + + //清空部门表 deptMapper.truncateDept(); - deptMapper.insertDept(sysDept); - List list=new ArrayList<>(); + + //插入顶级部门 + SysDept topDept= new SysDept();//deptMapper.selectDeptById(Long.parseLong("999999")); + topDept.setDeptId(Long.parseLong("999999")); + topDept.setParentId(Long.parseLong("0")); + topDept.setDeptName("BPS"); + topDept.setAncestors("0"); + topDept.setOrderNum("0"); + topDept.setStatus("0"); + topDept.setCreateBy("Admin"); + deptMapper.insertDept(topDept); + //同步Ecology部门信息 + List list=new ArrayList<>(); for(EcologyDept ecologyDept:depts){ if(ecologyDept.getSubcompanyid1().equals("1")) { //只取分部ID为“1”的部门,排除代理商 SysDept dept= insertEcologyDept(ecologyDept); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 93a8c2d01..b1484d2f0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -2,6 +2,8 @@ package com.ruoyi.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; @@ -11,10 +13,7 @@ import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.security.Md5Utils; -import com.ruoyi.system.domain.EcologyUser; -import com.ruoyi.system.domain.SysPost; -import com.ruoyi.system.domain.SysUserPost; -import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.domain.*; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; @@ -550,9 +549,10 @@ public class SysUserServiceImpl implements ISysUserService } //取Ecology返回信息中的部门信息 Map map = (Map) JSON.parse(result); - Map o= (Map) map.get("data"); - JSONArray json = (JSONArray) o.get("dataList"); - List ecologyUserList = JSONArray.parseArray(json.toJSONString(), EcologyUser.class); + Map dataMap= (Map) map.get("data"); + /*JSONArray json = (JSONArray) dataMap.get("dataList"); + List ecologyUserList = JSONArray.parseArray(json.toJSONString(), EcologyUser.class);*/ + List ecologyUserList= new Gson().fromJson(dataMap.get("dataList").toString(), new TypeToken>(){}.getType()); userMapper.deleteEcologySyncUser(); SysUser user = new SysUser(); From 396dffefac654405a67ff5ba45154fb7668730c1 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Thu, 15 Jul 2021 17:37:55 +0800 Subject: [PATCH 32/90] =?UTF-8?q?=E5=BF=AB=E9=80=92=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E7=82=B9=E5=87=BB=E9=87=8D=E7=BD=AE=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=A4=9A=E9=80=89=E4=B8=8B=E6=8B=89=E6=A1=86=E4=B8=8D=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/bps/expsubspushresp/expsubspushresp.html | 6 +++--- .../main/resources/templates/bps/subscribe/subscribe.html | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html index 3326a905b..2c752a129 100644 --- a/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html +++ b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html @@ -13,14 +13,14 @@
    • -
    • - @@ -28,7 +28,7 @@
    • - diff --git a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html index be3e4f9c8..1520a1125 100644 --- a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html +++ b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html @@ -13,8 +13,8 @@
      • - - @@ -33,7 +33,7 @@
      • - From cb68414e83a2aeaf3a540eac6ad6b19e6c0fcde5 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Thu, 15 Jul 2021 17:42:54 +0800 Subject: [PATCH 33/90] =?UTF-8?q?=E5=BF=AB=E9=80=92=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E7=82=B9=E5=87=BB=E9=87=8D=E7=BD=AE=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=A4=9A=E9=80=89=E4=B8=8B=E6=8B=89=E6=A1=86=E4=B8=8D=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/bps/expsubspushresp/expsubspushresp.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html index 2c752a129..a3c79046e 100644 --- a/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html +++ b/box-bps/src/main/resources/templates/bps/expsubspushresp/expsubspushresp.html @@ -12,14 +12,14 @@
        • - +
        • - +
        • - +
        • +
        • + + +
        •  搜索  重置 @@ -41,6 +45,9 @@ 删除 --> + + 导入 + 导出 @@ -66,6 +73,8 @@ updateUrl: prefix + "/edit/{id}", removeUrl: prefix + "/remove", exportUrl: prefix + "/export", + importUrl: prefix + "/importData", + importTemplateUrl: prefix + "/importTemplate", modalName: "快递信息", columns: [{ checkbox: false @@ -75,6 +84,10 @@ field: 'message', title: '消息' },*/ + { + field: 'deliveryNum', + title: '出货单号' + }, { field: 'nu', title: '快递单号' @@ -126,10 +139,32 @@ field: 'result', title: '返回结果' },*/ + { field: 'phone', title: '电话号码' - }/*, + }, + { + field: 'singedTime', + title: '签收时间' + }, + { + field: 'collectTime', + title: '揽收时间' + }, + { + field: 'lastUpdateTime', + title: '最后更新时间' + }, + { + field: 'queryTime', + title: '查询时间' + }, + { + field: 'queryUser', + title: '查询人' + } + /* { title: '操作', align: 'center', @@ -144,5 +179,19 @@ $.table.init(options); }); + + \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index e8cebe16e..d665df5df 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.system.service.impl; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.Ztree; @@ -19,7 +19,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; /** * 部门管理 服务实现 @@ -330,13 +333,13 @@ public class SysDeptServiceImpl implements ISysDeptService } //取Ecology返回信息中的部门信息 - /*Map mapTest = (Map) JSON.parse(mapResult.get("result")); + Map map = (Map) JSON.parse(mapResult.get("result")); Map dataMap= (Map) map.get("data"); - JSONArray json = (JSONArray) o.get("dataList"); - List deptList = JSONArray.parseArray(json.toJSONString(), EcologyDept.class);*/ - Map map = new Gson().fromJson(new Gson().toJson(mapResult.get("result")), HashMap.class); + JSONArray json = (JSONArray) dataMap.get("dataList"); + List deptList = JSONArray.parseArray(json.toJSONString(), EcologyDept.class); + /*Map map = new Gson().fromJson(new Gson().toJson(mapResult.get("result")), HashMap.class); Map dataMap= new Gson().fromJson(new Gson().toJson(map.get("data")),HashMap.class); - List deptList= new Gson().fromJson(new Gson().toJson(dataMap.get("dataList")), new TypeToken>(){}.getType()); + List deptList= new Gson().fromJson(new Gson().toJson(dataMap.get("dataList")), new TypeToken>(){}.getType());*/ //清空部门表 deptMapper.truncateDept(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index baa2c5769..6b6cdf99e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -1,5 +1,7 @@ package com.ruoyi.system.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.ruoyi.common.annotation.DataScope; @@ -547,14 +549,14 @@ public class SysUserServiceImpl implements ISysUserService } //取Ecology返回信息中的部门信息 - /*Map map = (Map) JSON.parse(mapResult.get("result")); + Map map = (Map) JSON.parse(mapResult.get("result")); Map dataMap= (Map) map.get("data"); JSONArray json = (JSONArray) dataMap.get("dataList"); - List ecologyUserList = JSONArray.parseArray(json.toJSONString(), EcologyUser.class);*/ - Map map = new Gson().fromJson(new Gson().toJson(mapResult.get("result")), HashMap.class); + List ecologyUserList = JSONArray.parseArray(json.toJSONString(), EcologyUser.class); + /*Map map = new Gson().fromJson(new Gson().toJson(mapResult.get("result")), HashMap.class); Map dataMap= new Gson().fromJson(new Gson().toJson(map.get("data")),HashMap.class); List ecologyUserList= new Gson().fromJson(dataMap.get("dataList").toString(), new TypeToken>(){}.getType()); - + */ //删除从Ecology同步过来(用户类型为02)的用户 userMapper.deleteEcologySyncUser(); From 0ef342010f7ad92dfad8ee9a028daad2f024bc5c Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 21 Jul 2021 10:11:30 +0800 Subject: [PATCH 40/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Excel=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=EF=BC=88=E6=A1=86=E6=9E=B6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpImportQueryController.java | 126 ++++++++++++++++ .../com/ruoyi/bps/domain/ExpImportQuery.java | 135 ++++++++++++++++++ .../bps/mapper/ExpImportQueryMapper.java | 61 ++++++++ .../bps/service/IExpImportQueryService.java | 61 ++++++++ .../impl/ExpImportQueryServiceImpl.java | 94 ++++++++++++ .../mapper/bps/ExpImportQueryMapper.xml | 84 +++++++++++ .../templates/bps/expImportQuery/add.html | 69 +++++++++ .../templates/bps/expImportQuery/edit.html | 70 +++++++++ .../bps/expImportQuery/expImportQuery.html | 129 +++++++++++++++++ 9 files changed, 829 insertions(+) create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/mapper/ExpImportQueryMapper.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java create mode 100644 box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml create mode 100644 box-bps/src/main/resources/templates/bps/expImportQuery/add.html create mode 100644 box-bps/src/main/resources/templates/bps/expImportQuery/edit.html create mode 100644 box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java new file mode 100644 index 000000000..ab3e1b576 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java @@ -0,0 +1,126 @@ +package com.ruoyi.bps.controller; + +import java.util.List; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.bps.domain.ExpImportQuery; +import com.ruoyi.bps.service.IExpImportQueryService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * Excel批量快递查询Controller + * + * @author Bo + * @date 2021-07-21 + */ +@Controller +@RequestMapping("/bps/expImportQuery") +public class ExpImportQueryController extends BaseController +{ + private String prefix = "bps/expImportQuery"; + + @Autowired + private IExpImportQueryService expImportQueryService; + + @RequiresPermissions("bps:expImportQuery:view") + @GetMapping() + public String expImportQuery() + { + return prefix + "/expImportQuery"; + } + + /** + * 查询Excel批量快递查询列表 + */ + @RequiresPermissions("bps:expImportQuery:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(ExpImportQuery expImportQuery) + { + startPage(); + List list = expImportQueryService.selectExpImportQueryList(expImportQuery); + return getDataTable(list); + } + + /** + * 导出Excel批量快递查询列表 + */ + @RequiresPermissions("bps:expImportQuery:export") + @Log(title = "Excel批量快递查询", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(ExpImportQuery expImportQuery) + { + List list = expImportQueryService.selectExpImportQueryList(expImportQuery); + ExcelUtil util = new ExcelUtil(ExpImportQuery.class); + return util.exportExcel(list, "Excel批量快递查询数据"); + } + + /** + * 新增Excel批量快递查询 + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } + + /** + * 新增保存Excel批量快递查询 + */ + @RequiresPermissions("bps:expImportQuery:add") + @Log(title = "Excel批量快递查询", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(ExpImportQuery expImportQuery) + { + return toAjax(expImportQueryService.insertExpImportQuery(expImportQuery)); + } + + /** + * 修改Excel批量快递查询 + */ + @GetMapping("/edit/{sid}") + public String edit(@PathVariable("sid") Long sid, ModelMap mmap) + { + ExpImportQuery expImportQuery = expImportQueryService.selectExpImportQueryById(sid); + mmap.put("expImportQuery", expImportQuery); + return prefix + "/edit"; + } + + /** + * 修改保存Excel批量快递查询 + */ + @RequiresPermissions("bps:expImportQuery:edit") + @Log(title = "Excel批量快递查询", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(ExpImportQuery expImportQuery) + { + return toAjax(expImportQueryService.updateExpImportQuery(expImportQuery)); + } + + /** + * 删除Excel批量快递查询 + */ + @RequiresPermissions("bps:expImportQuery:remove") + @Log(title = "Excel批量快递查询", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(expImportQueryService.deleteExpImportQueryByIds(ids)); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java new file mode 100644 index 000000000..3ac9fad28 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java @@ -0,0 +1,135 @@ +package com.ruoyi.bps.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * Excel批量快递查询对象 exp_import_query + * + * @author Bo + * @date 2021-07-21 + */ +public class ExpImportQuery extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** sid */ + private Long sid; + + /** 查询时间 */ + @Excel(name = "查询时间") + private String queryTime; + + /** 用户ID */ + @Excel(name = "用户ID") + private String queryUserId; + + /** 用户名 */ + @Excel(name = "用户名") + private String queryUserName; + + /** 查询IP */ + @Excel(name = "查询IP") + private String queryIp; + + /** 完成时间 */ + @Excel(name = "完成时间") + private String finishTime; + + /** 完成状态 */ + @Excel(name = "完成状态") + private String status; + + /** 运单总量 */ + @Excel(name = "运单总量") + private String queryQty; + + public void setSid(Long sid) + { + this.sid = sid; + } + + public Long getSid() + { + return sid; + } + public void setQueryTime(String queryTime) + { + this.queryTime = queryTime; + } + + public String getQueryTime() + { + return queryTime; + } + public void setQueryUserId(String queryUserId) + { + this.queryUserId = queryUserId; + } + + public String getQueryUserId() + { + return queryUserId; + } + public void setQueryUserName(String queryUserName) + { + this.queryUserName = queryUserName; + } + + public String getQueryUserName() + { + return queryUserName; + } + public void setQueryIp(String queryIp) + { + this.queryIp = queryIp; + } + + public String getQueryIp() + { + return queryIp; + } + public void setFinishTime(String finishTime) + { + this.finishTime = finishTime; + } + + public String getFinishTime() + { + return finishTime; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + public void setQueryQty(String queryQty) + { + this.queryQty = queryQty; + } + + public String getQueryQty() + { + return queryQty; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("sid", getSid()) + .append("queryTime", getQueryTime()) + .append("queryUserId", getQueryUserId()) + .append("queryUserName", getQueryUserName()) + .append("queryIp", getQueryIp()) + .append("finishTime", getFinishTime()) + .append("status", getStatus()) + .append("queryQty", getQueryQty()) + .toString(); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpImportQueryMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpImportQueryMapper.java new file mode 100644 index 000000000..a5f968462 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpImportQueryMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.bps.mapper; + +import java.util.List; +import com.ruoyi.bps.domain.ExpImportQuery; + +/** + * Excel批量快递查询Mapper接口 + * + * @author Bo + * @date 2021-07-21 + */ +public interface ExpImportQueryMapper +{ + /** + * 查询Excel批量快递查询 + * + * @param sid Excel批量快递查询ID + * @return Excel批量快递查询 + */ + public ExpImportQuery selectExpImportQueryById(Long sid); + + /** + * 查询Excel批量快递查询列表 + * + * @param expImportQuery Excel批量快递查询 + * @return Excel批量快递查询集合 + */ + public List selectExpImportQueryList(ExpImportQuery expImportQuery); + + /** + * 新增Excel批量快递查询 + * + * @param expImportQuery Excel批量快递查询 + * @return 结果 + */ + public int insertExpImportQuery(ExpImportQuery expImportQuery); + + /** + * 修改Excel批量快递查询 + * + * @param expImportQuery Excel批量快递查询 + * @return 结果 + */ + public int updateExpImportQuery(ExpImportQuery expImportQuery); + + /** + * 删除Excel批量快递查询 + * + * @param sid Excel批量快递查询ID + * @return 结果 + */ + public int deleteExpImportQueryById(Long sid); + + /** + * 批量删除Excel批量快递查询 + * + * @param sids 需要删除的数据ID + * @return 结果 + */ + public int deleteExpImportQueryByIds(String[] sids); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java new file mode 100644 index 000000000..761cc11fa --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java @@ -0,0 +1,61 @@ +package com.ruoyi.bps.service; + +import java.util.List; +import com.ruoyi.bps.domain.ExpImportQuery; + +/** + * Excel批量快递查询Service接口 + * + * @author Bo + * @date 2021-07-21 + */ +public interface IExpImportQueryService +{ + /** + * 查询Excel批量快递查询 + * + * @param sid Excel批量快递查询ID + * @return Excel批量快递查询 + */ + public ExpImportQuery selectExpImportQueryById(Long sid); + + /** + * 查询Excel批量快递查询列表 + * + * @param expImportQuery Excel批量快递查询 + * @return Excel批量快递查询集合 + */ + public List selectExpImportQueryList(ExpImportQuery expImportQuery); + + /** + * 新增Excel批量快递查询 + * + * @param expImportQuery Excel批量快递查询 + * @return 结果 + */ + public int insertExpImportQuery(ExpImportQuery expImportQuery); + + /** + * 修改Excel批量快递查询 + * + * @param expImportQuery Excel批量快递查询 + * @return 结果 + */ + public int updateExpImportQuery(ExpImportQuery expImportQuery); + + /** + * 批量删除Excel批量快递查询 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteExpImportQueryByIds(String ids); + + /** + * 删除Excel批量快递查询信息 + * + * @param sid Excel批量快递查询ID + * @return 结果 + */ + public int deleteExpImportQueryById(Long sid); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java new file mode 100644 index 000000000..5467c390f --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java @@ -0,0 +1,94 @@ +package com.ruoyi.bps.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bps.mapper.ExpImportQueryMapper; +import com.ruoyi.bps.domain.ExpImportQuery; +import com.ruoyi.bps.service.IExpImportQueryService; +import com.ruoyi.common.core.text.Convert; + +/** + * Excel批量快递查询Service业务层处理 + * + * @author Bo + * @date 2021-07-21 + */ +@Service +public class ExpImportQueryServiceImpl implements IExpImportQueryService +{ + @Autowired + private ExpImportQueryMapper expImportQueryMapper; + + /** + * 查询Excel批量快递查询 + * + * @param sid Excel批量快递查询ID + * @return Excel批量快递查询 + */ + @Override + public ExpImportQuery selectExpImportQueryById(Long sid) + { + return expImportQueryMapper.selectExpImportQueryById(sid); + } + + /** + * 查询Excel批量快递查询列表 + * + * @param expImportQuery Excel批量快递查询 + * @return Excel批量快递查询 + */ + @Override + public List selectExpImportQueryList(ExpImportQuery expImportQuery) + { + return expImportQueryMapper.selectExpImportQueryList(expImportQuery); + } + + /** + * 新增Excel批量快递查询 + * + * @param expImportQuery Excel批量快递查询 + * @return 结果 + */ + @Override + public int insertExpImportQuery(ExpImportQuery expImportQuery) + { + return expImportQueryMapper.insertExpImportQuery(expImportQuery); + } + + /** + * 修改Excel批量快递查询 + * + * @param expImportQuery Excel批量快递查询 + * @return 结果 + */ + @Override + public int updateExpImportQuery(ExpImportQuery expImportQuery) + { + return expImportQueryMapper.updateExpImportQuery(expImportQuery); + } + + /** + * 删除Excel批量快递查询对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteExpImportQueryByIds(String ids) + { + return expImportQueryMapper.deleteExpImportQueryByIds(Convert.toStrArray(ids)); + } + + /** + * 删除Excel批量快递查询信息 + * + * @param sid Excel批量快递查询ID + * @return 结果 + */ + @Override + public int deleteExpImportQueryById(Long sid) + { + return expImportQueryMapper.deleteExpImportQueryById(sid); + } +} diff --git a/box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml new file mode 100644 index 000000000..9cd140c00 --- /dev/null +++ b/box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + select sid, queryTime, queryUserId, queryUserName, queryIp, finishTime, status, queryQty from exp_import_query + + + + + + + + insert into exp_import_query + + queryTime, + queryUserId, + queryUserName, + queryIp, + finishTime, + status, + queryQty, + + + #{queryTime}, + #{queryUserId}, + #{queryUserName}, + #{queryIp}, + #{finishTime}, + #{status}, + #{queryQty}, + + + + + update exp_import_query + + queryTime = #{queryTime}, + queryUserId = #{queryUserId}, + queryUserName = #{queryUserName}, + queryIp = #{queryIp}, + finishTime = #{finishTime}, + status = #{status}, + queryQty = #{queryQty}, + + where sid = #{sid} + + + + delete from exp_import_query where sid = #{sid} + + + + delete from exp_import_query where sid in + + #{sid} + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/add.html b/box-bps/src/main/resources/templates/bps/expImportQuery/add.html new file mode 100644 index 000000000..cea2ae111 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/add.html @@ -0,0 +1,69 @@ + + + + + + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/edit.html b/box-bps/src/main/resources/templates/bps/expImportQuery/edit.html new file mode 100644 index 000000000..a4db55aa5 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/edit.html @@ -0,0 +1,70 @@ + + + + + + +
          +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html new file mode 100644 index 000000000..d4e9221e4 --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html @@ -0,0 +1,129 @@ + + + + + + +
          +
          +
          +
          +
          +
            +
          • + + +
          • +
          • + + +
          • +
          • + + +
          • +
          • + + +
          • +
          • +  搜索 +  重置 +
          • +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + + + + \ No newline at end of file From 95729e2ef1f71138ffd532cfbd0c0eb1b85b6314 Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Thu, 22 Jul 2021 17:21:40 +0800 Subject: [PATCH 41/90] =?UTF-8?q?kettle=E7=AC=AC=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bps-kettle/pom.xml | 17 +- .../com/ruoyi/kettle/cons/XJobStatus.java | 43 + .../com/ruoyi/kettle/cons/XTransStatus.java | 46 ++ .../controller/KettleJobController.java | 186 +++++ .../controller/KettleTransController.java | 58 +- .../controller/XRepositoryController.java | 29 +- .../com/ruoyi/kettle/domain/KettleJob.java | 224 ++++++ .../ruoyi/kettle/mapper/KettleJobMapper.java | 69 ++ .../kettle/mapper/KettleTransMapper.java | 6 + .../kettle/mapper/XRepositoryMapper.java | 16 + .../java/com/ruoyi/kettle/repo/RepoTree.java | 96 +++ .../com/ruoyi/kettle/repo/RepositoryTree.java | 94 +++ .../com/ruoyi/kettle/repo/XRepoManager.java | 262 +++++++ .../kettle/service/IKettleJobService.java | 71 ++ .../kettle/service/IKettleTransService.java | 25 +- .../kettle/service/IXRepositoryService.java | 8 + .../service/impl/KettleJobServiceImpl.java | 169 ++++ .../service/impl/KettleTransServiceImpl.java | 107 ++- .../service/impl/XRepositoryServiceImpl.java | 150 +++- .../java/com/ruoyi/kettle/tools/Constant.java | 151 ++++ .../com/ruoyi/kettle/tools/DateHelper.java | 16 + .../com/ruoyi/kettle/tools/GenCodeUtil.java | 108 +++ .../com/ruoyi/kettle/tools/KettleUtil.java | 332 ++++++++ .../com/ruoyi/kettle/tools/KettleUtil_2.java | 735 ++++++++++++++++++ .../com/ruoyi/kettle/tools/KettleUtils.java | 73 -- .../ruoyi/kettle/tools/SpringContextUtil.java | 85 ++ .../mapper/kettle/KettleJobMapper.xml | 141 ++++ .../mapper/kettle/KettleTransMapper.xml | 14 +- .../mapper/kettle/XRepositoryMapper.xml | 12 +- .../kettle/common/repository_tree.html | 89 +++ .../resources/templates/kettle/job/add.html | 110 +++ .../templates/kettle/job/detail.html | 36 + .../resources/templates/kettle/job/edit.html | 90 +++ .../resources/templates/kettle/job/job.html | 160 ++++ .../templates/kettle/quartz/addquartz.html | 107 +++ .../templates/kettle/quartz/editquartz.html | 108 +++ .../kettle/repository/repository.html | 4 +- .../resources/templates/kettle/trans/add.html | 47 +- .../templates/kettle/trans/detail.html | 36 + .../templates/kettle/trans/edit.html | 9 +- .../templates/kettle/trans/trans.html | 27 +- .../src/test/java/com/kone/Testsetset.java | 15 + .../service/impl/SysJobServiceImpl.java | 2 +- 43 files changed, 4070 insertions(+), 113 deletions(-) create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/cons/XJobStatus.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/cons/XTransStatus.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleJobController.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleJob.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleJobMapper.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepoTree.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepositoryTree.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/DateHelper.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/GenCodeUtil.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java delete mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java create mode 100644 bps-kettle/src/main/resources/mapper/kettle/KettleJobMapper.xml create mode 100644 bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/job/add.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/job/detail.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/job/edit.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/job/job.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/quartz/addquartz.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/quartz/editquartz.html create mode 100644 bps-kettle/src/main/resources/templates/kettle/trans/detail.html create mode 100644 bps-kettle/src/test/java/com/kone/Testsetset.java diff --git a/bps-kettle/pom.xml b/bps-kettle/pom.xml index 8b251fbee..3a8b0043c 100644 --- a/bps-kettle/pom.xml +++ b/bps-kettle/pom.xml @@ -27,6 +27,10 @@ com.ruoyi ruoyi-system + + com.ruoyi + ruoyi-quartz + org.json json @@ -88,8 +92,15 @@ mysql mysql-connector-java - 5.1.48 + 8.0.11 + + + mm.mysql + mm.mysql + 2.0.7 + + com.microsoft.sqlserver @@ -123,6 +134,10 @@ junit test + + org.projectlombok + lombok + diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/cons/XJobStatus.java b/bps-kettle/src/main/java/com/ruoyi/kettle/cons/XJobStatus.java new file mode 100644 index 000000000..a95e5101d --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/cons/XJobStatus.java @@ -0,0 +1,43 @@ +package com.ruoyi.kettle.cons; + +public enum XJobStatus { + UNKNOWN("-1", "未知状态"), + PENDING("10", "等待中"), + RUNNING("20", "运行中"), + HALTING("21", "终止中"), + STOPPED("30", "已中断"), + FINISHED("40", "已完成"), + SUCCESS("88", "运行成功"), + FAILED("99", "异常停止"); + + private String status; + private String description; + + private XJobStatus(String status, String description) { + this.status = status; + this.description = description; + } + + public String value() { + return this.status; + } + + public String description() { + return this.description; + } + + public static XJobStatus forName(Integer value) { + XJobStatus[] statuses = values(); + XJobStatus[] var2 = statuses; + int var3 = statuses.length; + + for(int var4 = 0; var4 < var3; ++var4) { + XJobStatus status = var2[var4]; + if (status.value().equals(value)) { + return status; + } + } + + return UNKNOWN; + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/cons/XTransStatus.java b/bps-kettle/src/main/java/com/ruoyi/kettle/cons/XTransStatus.java new file mode 100644 index 000000000..7017e4fc5 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/cons/XTransStatus.java @@ -0,0 +1,46 @@ +package com.ruoyi.kettle.cons; + +public enum XTransStatus { + UNKNOWN("-1", "未知状态"), + WAITING("10", "等待中"), + INITIALIZING("20", "转换初始化"), + PREPARING("21", "转换准备执行"), + STOPPED("30", "已终止"), + FINISHED("40", "已结束"), + RUNNING("50", "转换运行中"), + PAUSED("60", "转换已被暂停"), + HALTING("70", "转换被挂起"), + SUCCESS("88", "转换运行成功"), + FAILED("99", "异常停止"); + + private String status; + private String description; + + private XTransStatus(String status, String description) { + this.status = status; + this.description = description; + } + + public String value() { + return this.status; + } + + public String description() { + return this.description; + } + + public static XTransStatus forName(Integer value) { + XTransStatus[] statuses = values(); + XTransStatus[] var2 = statuses; + int var3 = statuses.length; + + for(int var4 = 0; var4 < var3; ++var4) { + XTransStatus status = var2[var4]; + if (status.value().equals(value)) { + return status; + } + } + + return UNKNOWN; + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleJobController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleJobController.java new file mode 100644 index 000000000..88507ee22 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleJobController.java @@ -0,0 +1,186 @@ +package com.ruoyi.kettle.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.kettle.domain.KettleTrans; +import com.ruoyi.quartz.service.ISysJobService; +import com.ruoyi.system.service.ISysRoleService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.kettle.domain.KettleJob; +import com.ruoyi.kettle.service.IKettleJobService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 作业调度Controller + * + * @author kone + * @date 2021-07-22 + */ +@Controller +@RequestMapping("/kettle/job") +public class KettleJobController extends BaseController +{ + private String prefix = "kettle/job"; + + @Autowired + private IKettleJobService kettleJobService; + @Autowired + private ISysRoleService roleService; + @Autowired + private ISysJobService jobService; + @RequiresPermissions("kettle:job:view") + @GetMapping() + public String job() + { + return prefix + "/job"; + } + + /** + * 查询作业调度列表 + */ + @RequiresPermissions("kettle:job:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(KettleJob kettleJob) + { + startPage(); + List list = kettleJobService.selectKettleJobList(kettleJob); + return getDataTable(list); + } + + /** + * 导出作业调度列表 + */ + @RequiresPermissions("kettle:job:export") + @Log(title = "作业调度", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(KettleJob kettleJob) + { + List list = kettleJobService.selectKettleJobList(kettleJob); + ExcelUtil util = new ExcelUtil(KettleJob.class); + return util.exportExcel(list, "作业调度数据"); + } + + /** + * 新增作业调度 + */ + @GetMapping("/add") + public String add(ModelMap mmap) + { + List roleKeys=roleService.selectRoleAll().stream().map(SysRole::getRoleKey).collect(Collectors.toList()); + mmap.put("allRoles",roleKeys); + return prefix + "/add"; + } + + /** + * 新增保存作业调度 + */ + @RequiresPermissions("kettle:job:add") + @Log(title = "作业调度", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(KettleJob kettleJob) + { + return kettleJobService.insertKettleJob(kettleJob); + } + + /** + * 修改作业调度 + */ + @GetMapping("/edit/{id}") + public String edit(@PathVariable("id") Long id, ModelMap mmap) + { + KettleJob kettleJob = kettleJobService.selectKettleJobById(id); + List roleKeys=roleService.selectRoleAll().stream().map(SysRole::getRoleKey).collect(Collectors.toList()); + String rks=""; + if(kettleJob!=null && kettleJob.getRoleKey()!=null){ + rks=kettleJob.getRoleKey(); + } + String[] rkArray=rks.split(","); + mmap.put("allRoles",roleKeys); + mmap.put("rkArray",rkArray); + mmap.put("kettleJob", kettleJob); + return prefix + "/edit"; + } + + /** + * 修改保存作业调度 + */ + @RequiresPermissions("kettle:job:edit") + @Log(title = "作业调度", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(KettleJob kettleJob) + { + return toAjax(kettleJobService.updateKettleJob(kettleJob)); + } + + /** + * 删除作业调度 + */ + @RequiresPermissions("kettle:job:remove") + @Log(title = "作业调度", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(kettleJobService.deleteKettleJobByIds(ids)); + } + + + @Log(title = "立即执行作业", businessType = BusinessType.UPDATE) + @RequiresPermissions("kettle:job:run") + @PostMapping("/run") + @ResponseBody + public AjaxResult run(KettleJob job) + { + AjaxResult result = kettleJobService.run(job); + return result; + } + @RequiresPermissions("kettle:job:log") + @GetMapping("/detail/{id}") + public String detail(@PathVariable("id") Long id, ModelMap mmap) + { + KettleJob kettleJob = kettleJobService.selectKettleJobById(id); + List jobLog= kettleJobService.queryJobLog(kettleJob); + mmap.put("kettleJob", kettleJob); + mmap.put("jobLog",jobLog); + return prefix + "/detail"; + } + /** + * 跳转到新增调度定时任务页面 + */ + @RequiresPermissions("kettle:job:setquartz") + @GetMapping("/jobQuartz/{id}") + public String jobQuartz(@PathVariable("id") Long id,ModelMap mmap) + { + KettleJob kettleJob = kettleJobService.selectKettleJobById(id); + //kettleTransServiceImpl.runTransQuartz('12','text') + String checkStr="kettleJobServiceImpl.runJobQuartz('"+kettleJob.getId()+"','"+kettleJob.getJobName()+"')"; + Long jobId = kettleJobService.checkQuartzExist(checkStr); + if(jobId != null){ + mmap.put("job", jobService.selectJobById(Long.valueOf(jobId))); + return "kettle/quartz/editquartz"; + }else{ + mmap.put("invokeTarget", checkStr); + //mmap.put("job", kettleJob); + return "kettle/quartz/addquartz"; + } + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java index ed8f10416..dfe56dae6 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.stream.Collectors; import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.quartz.service.ISysJobService; import com.ruoyi.system.service.ISysRoleService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; @@ -39,7 +40,8 @@ public class KettleTransController extends BaseController private IKettleTransService kettleTransService; @Autowired private ISysRoleService roleService; - + @Autowired + private ISysJobService jobService; @RequiresPermissions("kettle:trans:view") @GetMapping() public String trans() @@ -94,7 +96,7 @@ public class KettleTransController extends BaseController @ResponseBody public AjaxResult addSave(KettleTrans kettleTrans) { - return toAjax(kettleTransService.insertKettleTrans(kettleTrans)); + return kettleTransService.insertKettleTrans(kettleTrans) ; } /** @@ -139,4 +141,56 @@ public class KettleTransController extends BaseController { return toAjax(kettleTransService.deleteKettleTransByIds(ids)); } + + /** + * 转换执行得日志 + */ + @RequiresPermissions("kettle:trans:log") + @GetMapping("/detail/{id}") + public String detail(@PathVariable("id") Long id, ModelMap mmap) + { + KettleTrans kettleTrans = kettleTransService.selectKettleTransById(id); + List transLog= kettleTransService.queryTransLog(kettleTrans); + mmap.put("kettleTrans", kettleTrans); + mmap.put("transLog",transLog); + return prefix + "/detail"; + } + /** + * 转换立即执行一次 + */ + @Log(title = "立即执行转换", businessType = BusinessType.UPDATE) + @RequiresPermissions("kettle:trans:run") + @PostMapping("/run") + @ResponseBody + public AjaxResult run(KettleTrans trans) + { + AjaxResult result = kettleTransService.run(trans); + return result; + } + + + /** + * 跳转到新增调度定时任务页面 + */ + @RequiresPermissions("kettle:trans:setquartz") + @GetMapping("/transQuartz/{id}") + public String transQuartz(@PathVariable("id") Long id,ModelMap mmap) + { + KettleTrans trans = kettleTransService.selectKettleTransById(id); + //kettleTransServiceImpl.runTransQuartz('12','text') + String checkStr="kettleTransServiceImpl.runTransQuartz('"+trans.getId()+"','"+trans.getTransName()+"')"; + Long jobId = kettleTransService.checkQuartzExist(checkStr); + if(jobId != null){ + mmap.put("job", jobService.selectJobById(Long.valueOf(jobId))); + return "kettle/quartz/editquartz"; + }else{ + + mmap.put("invokeTarget", checkStr); + //mmap.put("trans", trans); + return "kettle/quartz/addquartz"; + } + } + + + } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java index 80cf5fa18..56be3d8c6 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java @@ -1,6 +1,10 @@ package com.ruoyi.kettle.controller; import java.util.List; + +import com.ruoyi.common.core.domain.Ztree; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.kettle.repo.RepoTree; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -53,7 +57,30 @@ public class XRepositoryController extends BaseController List list = xRepositoryService.selectXRepositoryList(xRepository); return getDataTable(list); } - + @GetMapping(value = { "/selectRepositoryTree", "/selectRepositoryTree/{excludeId}" }) + public String selectRepositoryTree( @PathVariable(value = "excludeId", required = false) String excludeId, ModelMap mmap) + { + XRepository r=new XRepository(); + List repoTree = xRepositoryService.selectXRepositoryList(r); + XRepository repository=xRepositoryService.selectXRepositoryById(2L); + mmap.put("repository", repository); + mmap.put("repoTree", repoTree); + mmap.put("excludeId", excludeId); + return "kettle/common/repository_tree"; + } + @GetMapping("/repositoryRoot") + @ResponseBody + public List repositoryRoot() + { + List ztrees = xRepositoryService.selectRepoRoot(new XRepository()); + return ztrees; + } + @PostMapping("/qryRepoSubTree/{id}") + @ResponseBody + public List qryRepoSubTree(@PathVariable("id") Long id, ModelMap mmapy) { + List ztrees = xRepositoryService.selectRepoTree(id); + return ztrees; + } /** * 导出资源库列表 */ diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleJob.java b/bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleJob.java new file mode 100644 index 000000000..3238c3238 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/domain/KettleJob.java @@ -0,0 +1,224 @@ +package com.ruoyi.kettle.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 作业调度对象 kettle_job + * + * @author kone + * @date 2021-07-22 + */ +public class KettleJob extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "", width = 30, dateFormat = "yyyy-MM-dd") + private Date createdTime; + + /** */ + @Excel(name = "") + private String createdBy; + + /** 作业名称 */ + @Excel(name = "作业名称") + private String jobName; + + /** 描述 */ + @Excel(name = "描述") + private String jobDescription; + + /** 作业类型(file,ftp,sf) */ + @Excel(name = "作业类型(file,ftp,sf)") + private String jobType; + + /** 路径 */ + @Excel(name = "路径") + private String jobPath; + + /** 资源库id */ + @Excel(name = "资源库id") + private Long jobRepositoryId; + + /** 日志级别 */ + @Excel(name = "日志级别") + private String jobLogLevel; + + /** 状态 */ + @Excel(name = "状态") + private String jobStatus; + + /** 是否删除 */ + @Excel(name = "是否删除") + private Integer isDel; + + /** 是否监控 */ + @Excel(name = "是否监控") + private Integer isMonitorEnabled; + + /** 可执行角色key,用+号拼接 */ + @Excel(name = "可执行角色key,用+号拼接") + private String roleKey; + + /** */ + @Excel(name = "") + private String tplKey; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setCreatedTime(Date createdTime) + { + this.createdTime = createdTime; + } + + public Date getCreatedTime() + { + return createdTime; + } + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + + public String getCreatedBy() + { + return createdBy; + } + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobName() + { + return jobName; + } + public void setJobDescription(String jobDescription) + { + this.jobDescription = jobDescription; + } + + public String getJobDescription() + { + return jobDescription; + } + public void setJobType(String jobType) + { + this.jobType = jobType; + } + + public String getJobType() + { + return jobType; + } + public void setJobPath(String jobPath) + { + this.jobPath = jobPath; + } + + public String getJobPath() + { + return jobPath; + } + public void setJobRepositoryId(Long jobRepositoryId) + { + this.jobRepositoryId = jobRepositoryId; + } + + public Long getJobRepositoryId() + { + return jobRepositoryId; + } + public void setJobLogLevel(String jobLogLevel) + { + this.jobLogLevel = jobLogLevel; + } + + public String getJobLogLevel() + { + return jobLogLevel; + } + public void setJobStatus(String jobStatus) + { + this.jobStatus = jobStatus; + } + + public String getJobStatus() + { + return jobStatus; + } + public void setIsDel(Integer isDel) + { + this.isDel = isDel; + } + + public Integer getIsDel() + { + return isDel; + } + public void setIsMonitorEnabled(Integer isMonitorEnabled) + { + this.isMonitorEnabled = isMonitorEnabled; + } + + public Integer getIsMonitorEnabled() + { + return isMonitorEnabled; + } + public void setRoleKey(String roleKey) + { + this.roleKey = roleKey; + } + + public String getRoleKey() + { + return roleKey; + } + public void setTplKey(String tplKey) + { + this.tplKey = tplKey; + } + + public String getTplKey() + { + return tplKey; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("createdTime", getCreatedTime()) + .append("updateTime", getUpdateTime()) + .append("createdBy", getCreatedBy()) + .append("updateBy", getUpdateBy()) + .append("jobName", getJobName()) + .append("jobDescription", getJobDescription()) + .append("jobType", getJobType()) + .append("jobPath", getJobPath()) + .append("jobRepositoryId", getJobRepositoryId()) + .append("jobLogLevel", getJobLogLevel()) + .append("jobStatus", getJobStatus()) + .append("isDel", getIsDel()) + .append("isMonitorEnabled", getIsMonitorEnabled()) + .append("roleKey", getRoleKey()) + .append("tplKey", getTplKey()) + .toString(); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleJobMapper.java b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleJobMapper.java new file mode 100644 index 000000000..05d31bb1c --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleJobMapper.java @@ -0,0 +1,69 @@ +package com.ruoyi.kettle.mapper; + +import java.util.List; +import com.ruoyi.kettle.domain.KettleJob; +import org.apache.ibatis.annotations.Param; + +/** + * 作业调度Mapper接口 + * + * @author kone + * @date 2021-07-22 + */ +public interface KettleJobMapper +{ + /** + * 查询作业调度 + * + * @param id 作业调度ID + * @return 作业调度 + */ + public KettleJob selectKettleJobById(Long id); + + /** + * 查询作业调度列表 + * + * @param kettleJob 作业调度 + * @param roleKeys + * @return 作业调度集合 + */ + public List selectKettleJobList(@Param("kettleJob") KettleJob kettleJob,@Param("roleKey") List roleKeys); + + /** + * 新增作业调度 + * + * @param kettleJob 作业调度 + * @return 结果 + */ + public int insertKettleJob(KettleJob kettleJob); + + /** + * 修改作业调度 + * + * @param kettleJob 作业调度 + * @return 结果 + */ + public int updateKettleJob(KettleJob kettleJob); + + /** + * 删除作业调度 + * + * @param id 作业调度ID + * @return 结果 + */ + public int deleteKettleJobById(Long id); + + /** + * 批量删除作业调度 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteKettleJobByIds(String[] ids); + + int selectJobByNameAndRepoId(@Param("jobName")String jobName, @Param("jobRepositoryId")Long jobRepositoryId); + + List queryJobLog(String jobName); + + Long checkQuartzExist(String checkStr); +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java index fc095d5de..2152fe8f2 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/KettleTransMapper.java @@ -60,4 +60,10 @@ public interface KettleTransMapper * @return 结果 */ public int deleteKettleTransByIds(String[] ids); + + int selectKettleTransByTransName(String transName); + + List queryTransLog(String transName); + + Long checkQuartzExist(String checkStr); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java index 56d3e00e4..b3893f0f3 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/mapper/XRepositoryMapper.java @@ -58,4 +58,20 @@ public interface XRepositoryMapper * @return 结果 */ public int deleteXRepositoryByIds(String[] ids); + /** + * @Description:软删除 + * @Author: Kone.wang + * @Date: 14:07 + * @param id: + * @return: int + **/ + int updateIsDel(Long id); + /** + * @Description:批量软删除 + * @Author: Kone.wang + * @Date: 2021/7/19 14:07 + * @param ids: + * @return: int + **/ + public int updateIsDelBatch(String[] ids); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepoTree.java b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepoTree.java new file mode 100644 index 000000000..1f2f5baa2 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepoTree.java @@ -0,0 +1,96 @@ +package com.ruoyi.kettle.repo; + +public class RepoTree { + private static final long serialVersionUID = 1L; + + /** 节点ID */ + private String id; + + /** 节点父ID */ + private String pId; + + /** 节点名称 */ + private String name; + + /** 节点标题 */ + private String title; + + /** 是否勾选 */ + private boolean checked = false; + + /** 是否展开 */ + private boolean open = false; + + /** 是否能勾选 */ + private boolean nocheck = false; + + public String getId() + { + return id; + } + + public void setId(String id) + { + this.id = id; + } + + public String getpId() + { + return pId; + } + + public void setpId(String pId) + { + this.pId = pId; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public boolean isChecked() + { + return checked; + } + + public void setChecked(boolean checked) + { + this.checked = checked; + } + + public boolean isOpen() + { + return open; + } + + public void setOpen(boolean open) + { + this.open = open; + } + + public boolean isNocheck() + { + return nocheck; + } + + public void setNocheck(boolean nocheck) + { + this.nocheck = nocheck; + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepositoryTree.java b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepositoryTree.java new file mode 100644 index 000000000..cbb747bb2 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/RepositoryTree.java @@ -0,0 +1,94 @@ +package com.ruoyi.kettle.repo; + +public class RepositoryTree { + private String id; + private String parent; + private String text; + private String icon; + private Object state; + private String type; + private boolean isLasted; + private String path; + + public String getType() { + return this.type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPath() { + return this.path; + } + + public void setPath(String path) { + this.path = path; + } + + public boolean isLasted() { + return this.isLasted; + } + + public void setLasted(boolean isLasted) { + this.isLasted = isLasted; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParent() { + return this.parent; + } + + public void setParent(String parent) { + this.parent = parent; + } + + public String getText() { + return this.text; + } + + public void setText(String text) { + this.text = text; + } + + public String getIcon() { + return this.icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public Object getState() { + return this.state; + } + + public void setState(Object state) { + this.state = state; + } + + public RepositoryTree(String id, String parent, String text, String icon, Object state, String type, boolean isLasted, String path) { + this.id = id; + this.parent = parent; + this.text = text; + this.icon = icon; + this.state = state; + this.type = type; + this.isLasted = isLasted; + this.path = path; + } + + public RepositoryTree() { + } + + public String toString() { + return "RepositoryTree [id=" + this.id + ", parent=" + this.parent + ", text=" + this.text + ", icon=" + this.icon + ", state=" + this.state + ", type=" + this.type + ", isLasted=" + this.isLasted + ", path=" + this.path + "]"; + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java new file mode 100644 index 000000000..de38be223 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java @@ -0,0 +1,262 @@ +package com.ruoyi.kettle.repo; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.pentaho.di.core.KettleEnvironment; +import org.pentaho.di.core.ProgressMonitorListener; +import org.pentaho.di.core.database.DatabaseMeta; +import org.pentaho.di.core.exception.KettleException; +import org.pentaho.di.repository.*; +import org.pentaho.di.repository.filerep.KettleFileRepository; +import org.pentaho.di.repository.filerep.KettleFileRepositoryMeta; +import org.pentaho.di.repository.kdr.KettleDatabaseRepository; +import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class XRepoManager { + private static final Logger log = LoggerFactory.getLogger(XRepoManager.class); + public static Map repositoryCache = new HashMap(); + public static Map databaseMeta = new ConcurrentHashMap(); + + public XRepoManager() { + } + + public static String[] getDataBaseAccess() { + String[] dataBaseAccess = DatabaseMeta.dbAccessTypeCode; + return dataBaseAccess; + } + + public static DatabaseMeta createDatabaseMeta(String name, String type, String access, String host, String db, String port, String user, String pass, Map params, boolean replace, Repository repository) { + DatabaseMeta dm = null; + if (repository != null) { + try { + ObjectId dbId = repository.getDatabaseID(name); + if (dbId != null && !replace) { + dm = repository.loadDatabaseMeta(dbId, (String)null); + } else if (dbId != null && replace) { + repository.deleteDatabaseMeta(name); + } + } catch (KettleException var15) { + log.error("创建数据库元数据失败", var15); + } + } + + if (dm == null) { + dm = new DatabaseMeta(name, type, access, host, db, port, user, pass); + if (params != null) { + Iterator var13 = params.entrySet().iterator(); + + while(var13.hasNext()) { + Map.Entry ent = (Map.Entry)var13.next(); + dm.addExtraOption(type, (String)ent.getKey(), "" + ent.getValue()); + } + } + + dm.setForcingIdentifiersToLowerCase(true); + if (repository != null) { + try { + repository.save(dm, (String)null, (ProgressMonitorListener)null, true); + } catch (KettleException var14) { + log.error("保存数据库元数据失败", var14); + } + } + } + + if (!StringUtils.isEmpty(dm)) { + databaseMeta.put("databaseMeta", dm); + log.info("第一次连接,获取到资源库数据库信息,{}", JSON.toJSON(dm)); + } + + return dm; + } + + private static Repository get(String repoId) { + return (Repository)repositoryCache.get(repoId); + } + + public static Repository createRep(BaseRepositoryMeta baseRepositoryMeta, String id) throws KettleException { + if (get(id) != null) { + return get(id); + } else { + Repository repo = null; + if (baseRepositoryMeta instanceof KettleDatabaseRepositoryMeta) { + repo = new KettleDatabaseRepository(); + ((Repository)repo).init((KettleDatabaseRepositoryMeta)baseRepositoryMeta); + } else { + repo = new KettleFileRepository(); + ((Repository)repo).init((KettleFileRepositoryMeta)baseRepositoryMeta); + } + + repositoryCache.put(id, repo); + log.info(((Repository)repo).getName() + "资源库初始化成功"); + return (Repository)repo; + } + } + + public static Repository createFileRep(String repoId, String repName, String description, String baseDirectory) throws KettleException { + if (!KettleEnvironment.isInitialized()) { + KettleEnvironment.init(); + } + + KettleFileRepositoryMeta fileRepMeta = new KettleFileRepositoryMeta(repoId, repName, description, baseDirectory); + return createRep(fileRepMeta, repoId); + } + + public static Repository createDBRepByJndi(String repoId, String name, String type, String db) throws KettleException { + return createBaseMetaRep(repoId, (String)null, (String)null, (JSONObject)null, name, type, DatabaseMeta.dbAccessTypeCode[4], (String)null, db, (String)null, (String)null, (String)null); + } + + public static Repository createDBRepByParams(String repoId, String repoName, JSONObject params, String databaseMetaName, String type, String access, String host, String db, String port, String user, String pass) throws KettleException { + return createBaseMetaRep(repoId, repoName, repoName, params, databaseMetaName, type, access, host, db, port, user, pass); + } + + public static Repository createDBRepByDesc(String repoId, String repoName, String description, String databaseMetaName, String type, String access, String host, String db, String port, String user, String pass) throws KettleException { + return createBaseMetaRep(repoId, repoName, description, (JSONObject)null, databaseMetaName, type, access, host, db, port, user, pass); + } + + public static Repository createBaseMetaRep(String repoId, String repoName, String description, JSONObject params, String databaseMetaName, String type, String access, String host, String db, String port, String user, String pass) throws KettleException { + DatabaseMeta dataMeta = createDatabaseMeta(databaseMetaName, type, access, host, db, port, user, pass, params, false, (Repository)null); + return createBaseRep(dataMeta, repoId, repoName, description); + } + + public static Repository createBaseRep(DatabaseMeta dataMeta, String repoId, String repoName, String description) throws KettleException { + KettleDatabaseRepositoryMeta kettleDatabaseMeta = new KettleDatabaseRepositoryMeta(repoId, repoName, description, dataMeta); + return createRep(kettleDatabaseMeta, repoId); + } + + public static KettleFileRepository createKFR(String id, String repName, String description, String baseDirectory) throws KettleException { + KettleFileRepositoryMeta kettleFileRepositoryMeta = (KettleFileRepositoryMeta)createFileRep(id, repName, repName + "文件资源库", baseDirectory); + KettleFileRepository kettleFileRepository = new KettleFileRepository(); + kettleFileRepository.init(kettleFileRepositoryMeta); + return kettleFileRepository; + } + + public static KettleDatabaseRepository createKDR(String name, String repoType, String dbAccess, String dbHost, String dbName, String dbPort, String dbUserName, String dbPass, String repoName, String repoId) throws KettleException { + createDatabaseMeta(name, repoType, dbAccess, dbHost, dbName, dbPort, dbUserName, dbPass, (Map)null, false, (Repository)null); + KettleDatabaseRepositoryMeta kettleDatabaseRepositoryMeta = (KettleDatabaseRepositoryMeta)createDBRepByDesc(repoId, repoName, repoName, name, repoType, dbAccess, dbHost, dbName, dbPort, dbUserName, dbPass); + KettleDatabaseRepository kettleDatabaseRepository = new KettleDatabaseRepository(); + kettleDatabaseRepository.init(kettleDatabaseRepositoryMeta); + return kettleDatabaseRepository; + } + + public static void disConnectionRepository(String id) { + if (repositoryCache.containsKey(id)) { + Repository repository = (Repository)repositoryCache.get(id); + repository.disconnect(); + repository.clearSharedObjectCache(); + repositoryCache.remove(id); + } + + } + + public static void destroyAll() { + repositoryCache.forEach((id, repository) -> { + repository.disconnect(); + repository.clearSharedObjectCache(); + }); + repositoryCache.clear(); + } + + public static List getAllDirectoryTreeList(String repoId, Repository repository, String path, List allRepositoryTreeList) throws KettleException { + List repositoryTreeList = getJobAndTrans(repoId, repository, path); + if (repositoryTreeList.size() != 0) { + Iterator var5 = repositoryTreeList.iterator(); + + while(var5.hasNext()) { + RepositoryTree repositoryTree = (RepositoryTree)var5.next(); + if (!repositoryTree.isLasted()) { + getAllDirectoryTreeList(repoId, repository, repositoryTree.getPath(), allRepositoryTreeList); + allRepositoryTreeList.add(repositoryTree); + } else { + allRepositoryTreeList.add(repositoryTree); + } + } + } + + return allRepositoryTreeList; + } + + public static List getJobAndTrans(String repoId, Repository repository, String path) throws KettleException { + RepositoryDirectoryInterface rDirectory = repository.loadRepositoryDirectoryTree().findDirectory(path); + List repositoryTreeList = getDirectory(repoId, repository, rDirectory); + List li = repository.getJobAndTransformationObjects(rDirectory.getObjectId(), false); + if (null != li) { + Iterator var6 = li.iterator(); + + while(var6.hasNext()) { + RepositoryElementMetaInterface repel = (RepositoryElementMetaInterface)var6.next(); + RepositoryTree repositoryTree; + StringBuilder stringBuilder; + if ("job".equals(repel.getObjectType().toString())) { + repositoryTree = new RepositoryTree(); + stringBuilder = new StringBuilder(); + stringBuilder.append("job").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); + repositoryTree.setId(stringBuilder.toString()); + repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); + repositoryTree.setText(repel.getName()); + if (repository instanceof KettleDatabaseRepository) { + repositoryTree.setType(repoId + "@db@" + "job"); + } else if (repository instanceof KettleFileRepository) { + repositoryTree.setType(repoId + "@file@" + "job"); + } + + repositoryTree.setLasted(true); + repositoryTree.setPath(repel.getRepositoryDirectory().getPath()); + repositoryTreeList.add(repositoryTree); + } else if ("transformation".equals(repel.getObjectType().toString())) { + repositoryTree = new RepositoryTree(); + stringBuilder = new StringBuilder(); + stringBuilder.append("transformation").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); + repositoryTree.setId(stringBuilder.toString()); + repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); + repositoryTree.setText(repel.getName()); + if (repository instanceof KettleDatabaseRepository) { + repositoryTree.setType(repoId + "@db@" + "transformation"); + } else if (repository instanceof KettleFileRepository) { + repositoryTree.setType(repoId + "@file@" + "transformation"); + } + + repositoryTree.setLasted(true); + repositoryTree.setPath(repel.getRepositoryDirectory().getPath()); + repositoryTreeList.add(repositoryTree); + } + } + } + + return repositoryTreeList; + } + + private static List getDirectory(String repoId, Repository repository, RepositoryDirectoryInterface rDirectory) throws KettleException { + List repositoryTreeList = new ArrayList(); + if (null != repository && null != rDirectory) { + RepositoryDirectoryInterface tree = repository.loadRepositoryDirectoryTree().findDirectory(rDirectory.getObjectId()); + if (rDirectory.getNrSubdirectories() > 0) { + for(int i = 0; i < rDirectory.getNrSubdirectories(); ++i) { + RepositoryDirectory subTree = tree.getSubdirectory(i); + RepositoryTree repositoryTree = new RepositoryTree(); + repositoryTree.setId(repoId + "@" + subTree.getObjectId().toString()); + repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); + repositoryTree.setText(subTree.getName()); + repositoryTree.setPath(subTree.getPath()); + repositoryTree.setType("subTree"); + List RepositoryElementMetaInterfaceList = repository.getJobAndTransformationObjects(subTree.getObjectId(), false); + if (subTree.getNrSubdirectories() <= 0 && RepositoryElementMetaInterfaceList.size() <= 0) { + repositoryTree.setLasted(true); + } else { + repositoryTree.setLasted(false); + } + + repositoryTreeList.add(repositoryTree); + } + } + } + + return repositoryTreeList; + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java new file mode 100644 index 000000000..a9a6b69a0 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java @@ -0,0 +1,71 @@ +package com.ruoyi.kettle.service; + +import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.kettle.domain.KettleJob; + +/** + * 作业调度Service接口 + * + * @author kone + * @date 2021-07-22 + */ +public interface IKettleJobService +{ + /** + * 查询作业调度 + * + * @param id 作业调度ID + * @return 作业调度 + */ + public KettleJob selectKettleJobById(Long id); + + /** + * 查询作业调度列表 + * + * @param kettleJob 作业调度 + * @return 作业调度集合 + */ + public List selectKettleJobList(KettleJob kettleJob); + + /** + * 新增作业调度 + * + * @param kettleJob 作业调度 + * @return 结果 + */ + public AjaxResult insertKettleJob(KettleJob kettleJob); + + /** + * 修改作业调度 + * + * @param kettleJob 作业调度 + * @return 结果 + */ + public int updateKettleJob(KettleJob kettleJob); + + /** + * 批量删除作业调度 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteKettleJobByIds(String ids); + + /** + * 删除作业调度信息 + * + * @param id 作业调度ID + * @return 结果 + */ + public int deleteKettleJobById(Long id); + + AjaxResult run(KettleJob job); + + List queryJobLog(KettleJob kettleJob); + + Long checkQuartzExist(String checkStr); + + public AjaxResult runJobQuartz(String id, String jobName); +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java index 45035f694..37629babe 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java @@ -1,6 +1,8 @@ package com.ruoyi.kettle.service; import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.kettle.domain.KettleTrans; /** @@ -33,7 +35,7 @@ public interface IKettleTransService * @param kettleTrans 转换 * @return 结果 */ - public int insertKettleTrans(KettleTrans kettleTrans); + public AjaxResult insertKettleTrans(KettleTrans kettleTrans); /** * 修改转换 @@ -58,4 +60,25 @@ public interface IKettleTransService * @return 结果 */ public int deleteKettleTransById(Long id); + /** + * @Description:立即执行一次转换 + * @Author: Kone.wang + * @Date: 2021/7/15 14:31 + * @param trans : + * @return: void + **/ + AjaxResult run(KettleTrans trans); + + List queryTransLog(KettleTrans trans) ; + /** + * @Description:设置定时执行转换 + * @Author: Kone.wang + * @Date: 2021/7/21 14:59 + * @param id: + * @param transName: + * @return: com.ruoyi.common.core.domain.AjaxResult + **/ + public AjaxResult runTransQuartz(String id,String transName); + + Long checkQuartzExist(String checkStr); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java index cf77a0625..f8d8289f9 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java @@ -1,7 +1,11 @@ package com.ruoyi.kettle.service; import java.util.List; + +import com.ruoyi.common.core.domain.Ztree; +import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.kettle.domain.XRepository; +import com.ruoyi.kettle.repo.RepoTree; /** * 资源库Service接口 @@ -58,4 +62,8 @@ public interface IXRepositoryService * @return 结果 */ public int deleteXRepositoryById(Long id); + + List selectRepoTree(Long id); + + List selectRepoRoot(XRepository repository); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java new file mode 100644 index 000000000..cd7d71f53 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java @@ -0,0 +1,169 @@ +package com.ruoyi.kettle.service.impl; + +import java.util.List; +import java.util.stream.Collectors; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.security.PermissionUtils; +import com.ruoyi.kettle.domain.KettleTrans; +import com.ruoyi.kettle.domain.XRepository; +import com.ruoyi.kettle.mapper.XRepositoryMapper; +import com.ruoyi.kettle.tools.KettleUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.kettle.mapper.KettleJobMapper; +import com.ruoyi.kettle.domain.KettleJob; +import com.ruoyi.kettle.service.IKettleJobService; +import com.ruoyi.common.core.text.Convert; + +/** + * 作业调度Service业务层处理 + * + * @author kone + * @date 2021-07-22 + */ +@Service("kettleJobServiceImpl") +public class KettleJobServiceImpl implements IKettleJobService +{ + @Autowired + private KettleJobMapper kettleJobMapper; + @Autowired + private XRepositoryMapper repositoryMapper; + + + @Autowired + private KettleUtil kettleUtil; + /** + * 查询作业调度 + * + * @param id 作业调度ID + * @return 作业调度 + */ + @Override + public KettleJob selectKettleJobById(Long id) + { + return kettleJobMapper.selectKettleJobById(id); + } + + /** + * 查询作业调度列表 + * + * @param kettleJob 作业调度 + * @return 作业调度 + */ + @Override + public List selectKettleJobList(KettleJob kettleJob) + { + List roleList = (List) PermissionUtils.getPrincipalProperty("roles"); + //当前用户的roleKey + List roleKeys=roleList.stream().map(SysRole::getRoleKey).collect(Collectors.toList()); + return kettleJobMapper.selectKettleJobList(kettleJob,roleKeys); + } + + /** + * 新增作业调度 + * + * @param kettleJob 作业调度 + * @return 结果 + */ + @Override + public AjaxResult insertKettleJob(KettleJob kettleJob) + { + String jobName=kettleJob.getJobName(); + if(kettleJobMapper.selectJobByNameAndRepoId(jobName,kettleJob.getJobRepositoryId())>0){ + return AjaxResult.error("已存在同名作业"); + } + String userName = (String) PermissionUtils.getPrincipalProperty("userName"); + if(kettleJob.getRoleKey()==null){ + kettleJob.setRoleKey("admin"); + }else{ + if(!kettleJob.getRoleKey().contains("admin")){ + kettleJob.setRoleKey(kettleJob.getRoleKey().concat(",admin")); + } + } + kettleJob.setCreatedBy(userName); + kettleJob.setUpdateBy(userName); + kettleJob.setJobType("File"); + return AjaxResult.success(kettleJobMapper.insertKettleJob(kettleJob)); + } + + /** + * 修改作业调度 + * + * @param kettleJob 作业调度 + * @return 结果 + */ + @Override + public int updateKettleJob(KettleJob kettleJob) + { + kettleJob.setUpdateTime(DateUtils.getNowDate()); + return kettleJobMapper.updateKettleJob(kettleJob); + } + + /** + * 删除作业调度对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteKettleJobByIds(String ids) + { + return kettleJobMapper.deleteKettleJobByIds(Convert.toStrArray(ids)); + } + + /** + * 删除作业调度信息 + * + * @param id 作业调度ID + * @return 结果 + */ + @Override + public int deleteKettleJobById(Long id) + { + return kettleJobMapper.deleteKettleJobById(id); + } + + @Override + public AjaxResult run(KettleJob job) { + Long id = job.getId(); + KettleJob kettleJob = kettleJobMapper.selectKettleJobById(id); + if(kettleJob ==null){ + return AjaxResult.error("作业不存在!"); + } + XRepository repository=repositoryMapper.selectXRepositoryById(kettleJob.getJobRepositoryId()); + if(repository==null){ + return AjaxResult.error("资源库不存在!"); + } + String path = kettleJob.getJobPath(); + try { + kettleUtil.KETTLE_LOG_LEVEL=kettleJob.getJobLogLevel(); + kettleUtil.KETTLE_REPO_ID=String.valueOf(kettleJob.getJobRepositoryId()); + kettleUtil.KETTLE_REPO_NAME=repository.getRepoName(); + kettleUtil.KETTLE_REPO_PATH=repository.getBaseDir(); + kettleUtil.callJob(path,kettleJob.getJobName(),null,null); + } catch (Exception e) { + e.printStackTrace(); + } + + + return AjaxResult.success("执行成功!"); } + + @Override + public List queryJobLog(KettleJob kettleJob) { + List logs=kettleJobMapper.queryJobLog(kettleJob.getJobName()); + return logs; + } + + @Override + public Long checkQuartzExist(String checkStr) { + return kettleJobMapper.checkQuartzExist(checkStr); + } + @Override + public AjaxResult runJobQuartz(String id, String jobName) { + KettleJob kettleJob = kettleJobMapper.selectKettleJobById(Long.valueOf(id)); + return run(kettleJob); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java index 8fc114576..377c2fd5c 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java @@ -1,16 +1,26 @@ package com.ruoyi.kettle.service.impl; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.security.PermissionUtils; +import com.ruoyi.kettle.domain.XRepository; +import com.ruoyi.kettle.mapper.XRepositoryMapper; +import com.ruoyi.kettle.service.IKettleTransService; +import com.ruoyi.kettle.tools.KettleUtil; +import lombok.extern.slf4j.Slf4j; +import org.pentaho.di.repository.Repository; +import org.pentaho.di.trans.Trans; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.ruoyi.kettle.mapper.KettleTransMapper; import com.ruoyi.kettle.domain.KettleTrans; -import com.ruoyi.kettle.service.IKettleTransService; import com.ruoyi.common.core.text.Convert; /** @@ -19,15 +29,21 @@ import com.ruoyi.common.core.text.Convert; * @author kone * @date 2021-07-14 */ -@Service -public class KettleTransServiceImpl implements IKettleTransService +@Service("kettleTransServiceImpl") +@Slf4j +public class KettleTransServiceImpl implements IKettleTransService { @Autowired private KettleTransMapper kettleTransMapper; + @Autowired + private XRepositoryMapper repositoryMapper; + + @Autowired + private KettleUtil kettleUtil; /** * 查询转换 - * + * * @param id 转换ID * @return 转换 */ @@ -39,7 +55,7 @@ public class KettleTransServiceImpl implements IKettleTransService /** * 查询转换列表 - * + * * @param kettleTrans 转换 * @return 转换 */ @@ -55,13 +71,17 @@ public class KettleTransServiceImpl implements IKettleTransService /** * 新增转换 - * + * * @param kettleTrans 转换 * @return 结果 */ @Override - public int insertKettleTrans(KettleTrans kettleTrans) + public AjaxResult insertKettleTrans(KettleTrans kettleTrans) { + String transName=kettleTrans.getTransName(); + if(kettleTransMapper.selectKettleTransByTransName(transName)>0){ + return AjaxResult.error("已存在同名转换"); + } String userName = (String) PermissionUtils.getPrincipalProperty("userName"); if(kettleTrans.getRoleKey()==null){ kettleTrans.setRoleKey("admin"); @@ -73,12 +93,12 @@ public class KettleTransServiceImpl implements IKettleTransService kettleTrans.setCreatedBy(userName); kettleTrans.setUpdateBy(userName); kettleTrans.setTransType("File"); - return kettleTransMapper.insertKettleTrans(kettleTrans); + return AjaxResult.success(kettleTransMapper.insertKettleTrans(kettleTrans)); } /** * 修改转换 - * + * * @param kettleTrans 转换 * @return 结果 */ @@ -100,7 +120,7 @@ public class KettleTransServiceImpl implements IKettleTransService /** * 删除转换对象 - * + * * @param ids 需要删除的数据ID * @return 结果 */ @@ -112,7 +132,7 @@ public class KettleTransServiceImpl implements IKettleTransService /** * 删除转换信息 - * + * * @param id 转换ID * @return 结果 */ @@ -121,4 +141,69 @@ public class KettleTransServiceImpl implements IKettleTransService { return kettleTransMapper.deleteKettleTransById(id); } + + + /** + * @Description:立即执行一次转换 + * @Author: Kone.wang + * @Date: 2021/7/15 14:31 + * @param trans : + * @return: void + **/ + @Override + public AjaxResult run(KettleTrans trans) { + Long id = trans.getId(); + KettleTrans kettleTrans = kettleTransMapper.selectKettleTransById(id); + if(kettleTrans ==null){ + return AjaxResult.error("转换不存在!"); + } + XRepository repository=repositoryMapper.selectXRepositoryById(kettleTrans.getTransRepositoryId()); + if(repository==null){ + return AjaxResult.error("资源库不存在!"); + } + String path = kettleTrans.getTransPath(); + try { + kettleUtil.KETTLE_LOG_LEVEL=kettleTrans.getTransLogLevel(); + kettleUtil.KETTLE_REPO_ID=String.valueOf(kettleTrans.getTransRepositoryId()); + kettleUtil.KETTLE_REPO_NAME=repository.getRepoName(); + kettleUtil.KETTLE_REPO_PATH=repository.getBaseDir(); + kettleUtil.callTrans(path,kettleTrans.getTransName(),null,null); + } catch (Exception e) { + e.printStackTrace(); + } + + + return AjaxResult.success("执行成功!"); + } + + @Override + public List queryTransLog(KettleTrans kettleTrans) { + List transLogs=kettleTransMapper.queryTransLog(kettleTrans.getTransName()); + return transLogs; + } + /** + * @Description:设置定时执行转换 + * @Author: Kone.wang + * @Date: 2021/7/21 14:59 + * @param id: + * @param transName: + * @return: com.ruoyi.common.core.domain.AjaxResult + **/ + @Override + public AjaxResult runTransQuartz(String id, String transName) { + KettleTrans kettleTrans = kettleTransMapper.selectKettleTransById(Long.valueOf(id)); + return run(kettleTrans); + } + /** + * @Description:检查该转换是否设置了定时任务 + * @Author: Kone.wang + * @Date: 2021/7/21 16:37 + * @param checkStr: + * @return: int + **/ + @Override + public Long checkQuartzExist(String checkStr) { + + return kettleTransMapper.checkQuartzExist(checkStr); + } } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java index d9d5b5068..28478b3c3 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java @@ -1,14 +1,26 @@ package com.ruoyi.kettle.service.impl; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; import java.util.List; + import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.security.PermissionUtils; +import com.ruoyi.kettle.repo.RepoTree; +import com.ruoyi.kettle.repo.RepositoryTree; +import com.ruoyi.kettle.repo.XRepoManager; +import com.ruoyi.kettle.tools.KettleUtil_2; +import org.pentaho.di.core.exception.KettleException; +import org.pentaho.di.repository.RepositoryDirectoryInterface; +import org.pentaho.di.repository.filerep.KettleFileRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.kettle.mapper.XRepositoryMapper; import com.ruoyi.kettle.domain.XRepository; import com.ruoyi.kettle.service.IXRepositoryService; import com.ruoyi.common.core.text.Convert; +import org.springframework.util.CollectionUtils; /** * 资源库Service业务层处理 @@ -87,7 +99,8 @@ public class XRepositoryServiceImpl implements IXRepositoryService @Override public int deleteXRepositoryByIds(String ids) { - return xRepositoryMapper.deleteXRepositoryByIds(Convert.toStrArray(ids)); + return xRepositoryMapper.updateIsDelBatch(Convert.toStrArray(ids)); + // return xRepositoryMapper.deleteXRepositoryByIds(Convert.toStrArray(ids)); } /** @@ -99,6 +112,139 @@ public class XRepositoryServiceImpl implements IXRepositoryService @Override public int deleteXRepositoryById(Long id) { - return xRepositoryMapper.deleteXRepositoryById(id); + return xRepositoryMapper.updateIsDel(id); + //return xRepositoryMapper.deleteXRepositoryById(id); } + + @Override + public List selectRepoRoot(XRepository repository) { + List repositoryList = xRepositoryMapper.selectXRepositoryList(repository); + List ztrees = initZtree2(repositoryList); + return ztrees; + } + + @Override + public List selectRepoTree(Long id) { + XRepository xrs = xRepositoryMapper.selectXRepositoryById(id); + List repositoryTrees = getRepoTress(xrs); + List subTrees = new ArrayList<>(); + String type=null; + String pId=String.valueOf(xrs.getId()); +// try +// { + +// repositoryTrees.forEach(item -> { +// if (item.getParent().equals(pId)) { +// if (item.isLasted()) { +// if (!StringUtils.isEmpty(type)) { +// if (item.getType().indexOf(type) != -1) { +// subTrees.add(item); +// } +// } else { +// subTrees.add(item); +// } +// +// } else { +// subTrees.add(item); +// } +// }}); +// }catch (Exception e) +// { +// StringWriter sw = new StringWriter(); +// e.printStackTrace(new PrintWriter(sw)); +// //throw new UserDefinedException(BaseResultConstant.UNKNOW_EXCEPTION, sw.toString().substring(0, 800)); +// } + + List ztrees = initZtree(repositoryTrees,String.valueOf(id)); + return ztrees; + } + + + public List initZtree(List repositoryList ,String parentId) + { + + List ztrees = new ArrayList(); + for (RepositoryTree rt : repositoryList) { + if(rt.getId().equals(parentId) || rt.getText().equals("/")){ + continue; + } + RepoTree ztree = new RepoTree(); + ztree.setId(rt.getId()); + ztree.setpId(rt.getParent()); + ztree.setName(rt.getText()); + ztree.setTitle(rt.getPath()); + ztrees.add(ztree); + } + return ztrees; + } + public List initZtree2(List repositoryList ) + { + + List ztrees = new ArrayList(); + for (XRepository rt : repositoryList) + { + RepoTree ztree = new RepoTree(); + ztree.setId(String.valueOf(rt.getId())); + ztree.setpId(" "); + ztree.setName(rt.getRepoName()); + ztree.setTitle(rt.getBaseDir()); + ztrees.add(ztree); + } + return ztrees; + } + private List getRepoTress(XRepository xr) { + List repositoryTrees = new ArrayList<>(); + List xRepositoryList =xRepositoryMapper.selectXRepositoryList(xr); + + if (!CollectionUtils.isEmpty(xRepositoryList)) { + xRepositoryList.forEach(item -> { + List tmpRepositoryList = new ArrayList<>(); + String type = item.getType(); + + if (type.equalsIgnoreCase("File")) { + // 文件库 + String baseDir = item.getBaseDir(); + + try { + KettleFileRepository repository = (KettleFileRepository) KettleUtil_2. + conFileRep(String.valueOf(item.getId()), item.getRepoName(), baseDir); + XRepoManager.getAllDirectoryTreeList(String.valueOf(item.getId()), repository, "/", tmpRepositoryList); + if (tmpRepositoryList.size() > 0) { + RepositoryDirectoryInterface rDirectory = repository.loadRepositoryDirectoryTree().findDirectory("/"); + RepositoryTree repositoryTree = new RepositoryTree(); + repositoryTree.setParent(String.valueOf(item.getId())); + repositoryTree.setId(item.getRepoId() + "@" + rDirectory.getObjectId().toString()); + //repositoryTree.setId(String.valueOf(item.getId())); + + repositoryTree.setText(rDirectory.getName().equals("\\/") ? "基础路径" : rDirectory.getName()); + repositoryTree.setLasted(false); + repositoryTree.setType("tree"); + repositoryTree.setPath("file"); + tmpRepositoryList.add(repositoryTree); + } + + } catch (KettleException e) { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + // throw new UserDefinedException(BaseResultConstant.UNKNOW_EXCEPTION, sw.toString().substring(0, 800)); + } + } + + +// RepositoryTree repositoryTree; +// repositoryTree = new RepositoryTree(); +// repositoryTree.setParent("99"); +// repositoryTree.setId(String.valueOf(item.getId())); +// repositoryTree.setText(item.getRepoName()); +// repositoryTree.setLasted(false); +// repositoryTree.setType(type); +// repositoryTree.setPath("repo"); +// tmpRepositoryList.add(repositoryTree); + repositoryTrees.addAll(tmpRepositoryList); + }); + } + + return repositoryTrees; + } + } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java new file mode 100644 index 000000000..660d4e261 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java @@ -0,0 +1,151 @@ +package com.ruoyi.kettle.tools; + + +import org.apache.commons.lang.StringUtils; +import org.pentaho.di.core.Const; +import org.pentaho.di.core.logging.LogLevel; + +import java.io.FileInputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class Constant extends Const { + public static final String VERSION = "7.1.0.0-12"; + public static final String DEFAULT_ENCODING = "UTF-8"; + public static final String DEFAULT_TIMEZONE = "GMT+8"; + public static final String UKETTLE = "resource/xtl.properties"; + public static final String VARIABLE_JOB_ID = "GLOBAL_JOB_ID"; + public static final String VARIABLE_TRANS_ID = "GLOBAL_TRANS_ID"; + public static final String VARIABLE_JOB_MONITOR_ID = "GLOBAL_JOB_MONITOR_ID"; + public static final String VARIABLE_TRANS_MONITOR_ID = "GLOBAL_TRANS_MONITOR_ID"; + public static final String DEFAULT_REPO_ID = "1326379690046259200"; + public static final String TYPE_JOB = "job"; + public static final String TYPE_TRANS = "transformation"; + public static final String JOB_FILE_TYPE = "file"; + public static final String JOB_REPO_TYPE = "db"; + public static final String TRANS_FILE_TYPE = "file"; + public static final String TRANS_REPO_TYPE = "db"; + public static final String TYPE_JOB_SUFFIX = ".kjb"; + public static final String TYPE_TRANS_SUFFIX = ".ktr"; + public static final String STARTS_WITH_USD = "$"; + public static final String STARTS_WITH_PARAM = "-param:"; + public static final String SPLIT_PARAM = "-param:"; + public static final String SPLIT_EQUAL = "="; + public static final String SPLIT_USD = "$"; + public static final String KETTLE_REPO = "repo"; + public static final String JOB_PREFIX = "JOB"; + public static final String JOB_GROUP_PREFIX = "JOB_GROUP"; + public static final String TRIGGER_PREFIX = "TRIGGER"; + public static final String TRIGGER_GROUP_PREFIX = "TRIGGER_GROUP"; + public static final String QUARTZ_SEPARATE = "@"; + public static final String RUNSTATUS_SEPARATE = "-"; + public static String KETTLE_HOME; + public static String KETTLE_PLUGIN; + public static String KETTLE_SCRIPT; + public static LogLevel KETTLE_LOGLEVEL; + public static Properties props; + + public Constant() { + } + + public static String get(String key) { + return props.getProperty(key); + } + + public static void set(Properties p) { + props = p; + } + + public static Properties readProperties() { + Properties p = new Properties(); + + try { + p.load(new FileInputStream(Constant.class.getResource("/").getPath().replace("%20", " ") + "resource/xtl.properties")); + } catch (Exception var2) { + var2.printStackTrace(); + } + + return p; + } + + public static LogLevel logger(int level) { + LogLevel logLevel = null; + if ("3".equals(level + "")) { + logLevel = LogLevel.BASIC; + } else if ("4".equals(level + "")) { + logLevel = LogLevel.DETAILED; + } else if ("1".equals(level + "")) { + logLevel = LogLevel.ERROR; + } else if ("5".equals(level + "")) { + logLevel = LogLevel.DEBUG; + } else if ("2".equals(level + "")) { + logLevel = LogLevel.MINIMAL; + } else if ("6".equals(level + "")) { + logLevel = LogLevel.ROWLEVEL; + } else if ("0".endsWith(level + "")) { + logLevel = LogLevel.NOTHING; + } else { + logLevel = KETTLE_LOGLEVEL; + } + + return logLevel; + } + + public static LogLevel logger(String code) { + LogLevel logLevel = null; + if ("Basic".equalsIgnoreCase(code)) { + logLevel = LogLevel.BASIC; + } else if ("Detail".equalsIgnoreCase(code)) { + logLevel = LogLevel.DETAILED; + } else if ("Error".equalsIgnoreCase(code)) { + logLevel = LogLevel.ERROR; + } else if ("Debug".equalsIgnoreCase(code)) { + logLevel = LogLevel.DEBUG; + } else if ("Minimal".equalsIgnoreCase(code)) { + logLevel = LogLevel.MINIMAL; + } else if ("Rowlevel".equalsIgnoreCase(code)) { + logLevel = LogLevel.ROWLEVEL; + } else if ("Nothing".equalsIgnoreCase(code)) { + logLevel = LogLevel.NOTHING; + } + + return logLevel; + } + + private static String uKettle() { + String classPath = Constant.class.getResource("/").getPath().replace("%20", " "); + String iQuartz = ""; + String index = "WEB-INF"; + if (classPath.indexOf("target") > 0) { + index = "target"; + } + + if ("\\".equals(FILE_SEPARATOR)) { + iQuartz = classPath.substring(1, classPath.indexOf(index)); + iQuartz = iQuartz.replace("/", "\\"); + } + + if ("/".equals(FILE_SEPARATOR)) { + iQuartz = classPath.substring(0, classPath.indexOf(index)); + iQuartz = iQuartz.replace("\\", "/"); + } + + return iQuartz; + } + + public static Map getQuartzBasic(String name, String path) { + Map quartzBasic = new HashMap(); + StringBuilder jobName = new StringBuilder(); + jobName.append("JOB").append("@").append(name).append("@").append(path); + StringBuilder jobGroupName = new StringBuilder(); + jobGroupName.append("JOB_GROUP").append("@").append("@").append(name).append("@").append(path); + String triggerName = StringUtils.replace(jobName.toString(), "JOB", "TRIGGER"); + String triggerGroupName = StringUtils.replace(jobGroupName.toString(), "JOB_GROUP", "TRIGGER_GROUP"); + quartzBasic.put("jobName", jobName.toString()); + quartzBasic.put("jobGroupName", jobGroupName.toString()); + quartzBasic.put("triggerName", triggerName); + quartzBasic.put("triggerGroupName", triggerGroupName); + return quartzBasic; + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/DateHelper.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/DateHelper.java new file mode 100644 index 000000000..9ee790282 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/DateHelper.java @@ -0,0 +1,16 @@ +package com.ruoyi.kettle.tools; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateHelper { + public DateHelper() { + } + + public static String format(Date date) { + String strDate = ""; + SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.s"); + strDate = formatter.format(date); + return strDate; + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/GenCodeUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/GenCodeUtil.java new file mode 100644 index 000000000..5fda8aab4 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/GenCodeUtil.java @@ -0,0 +1,108 @@ +package com.ruoyi.kettle.tools; + + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +public class GenCodeUtil { + private static final long TWEPOCH = 1288834974657L; + private static final long WORKER_ID_BITS = 5L; + private static final long DATACENTER_ID_BITS = 5L; + private static final long MAX_WORKER_ID = 31L; + private static final long MAX_DATACENTER_ID = 31L; + private static final long SEQUENCE_BITS = 12L; + private static final long WORKER_ID_SHIFT = 12L; + private static final long DATACENTER_ID_SHIFT = 17L; + private static final long TIMESTAMP_LEFT_SHIFT = 22L; + private static final long SEQUENCE_MASK = 4095L; + private static long lastTimestamp = -1L; + private static long sequence = 0L; + private static long workerId; + private static long datacenterId; + + public GenCodeUtil() { + datacenterId = getDatacenterId(31L); + workerId = getMaxWorkerId(datacenterId, 31L); + } + + public GenCodeUtil(long workerId, long datacenterId) { + if (workerId <= 31L && workerId >= 0L) { + if (datacenterId <= 31L && datacenterId >= 0L) { + GenCodeUtil.workerId = workerId; + GenCodeUtil.datacenterId = datacenterId; + } else { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", 31L)); + } + } else { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", 31L)); + } + } + + public static synchronized String nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } else { + if (lastTimestamp == timestamp) { + sequence = sequence + 1L & 4095L; + if (sequence == 0L) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + + lastTimestamp = timestamp; + long nextId = timestamp - 1288834974657L << 22 | datacenterId << 17 | workerId << 12 | sequence; + return String.valueOf(nextId); + } + } + + private static long tilNextMillis(long lastTimestamp) { + long timestamp; + for(timestamp = timeGen(); timestamp <= lastTimestamp; timestamp = timeGen()) { + } + + return timestamp; + } + + private static long timeGen() { + return System.currentTimeMillis(); + } + + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + mpid.append(name.split("@")[0]); + } + + return (long)(mpid.toString().hashCode() & '\uffff') % (maxWorkerId + 1L); + } + + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = (255L & (long)mac[mac.length - 1] | 65280L & (long)mac[mac.length - 2] << 8) >> 6; + id %= maxDatacenterId + 1L; + } + } catch (Exception var7) { + System.out.println(" getDatacenterId: " + var7.getMessage()); + } + + return id; + } + + public static void main(String[] args) { + System.out.println(nextId()); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java new file mode 100644 index 000000000..381229457 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java @@ -0,0 +1,332 @@ +package com.ruoyi.kettle.tools; + +import lombok.extern.slf4j.Slf4j; +import org.pentaho.di.core.KettleEnvironment; +import org.pentaho.di.core.database.DatabaseMeta; +import org.pentaho.di.core.exception.KettleException; +import org.pentaho.di.core.logging.*; +import org.pentaho.di.core.util.EnvUtil; +import org.pentaho.di.core.variables.VariableSpace; +import org.pentaho.di.core.variables.Variables; +import org.pentaho.di.job.Job; +import org.pentaho.di.job.JobMeta; +import org.pentaho.di.repository.RepositoryDirectoryInterface; +import org.pentaho.di.repository.filerep.KettleFileRepository; +import org.pentaho.di.repository.filerep.KettleFileRepositoryMeta; +import org.pentaho.di.trans.Trans; +import org.pentaho.di.trans.TransMeta; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import java.util.Iterator; +import java.util.Map; +@Slf4j +@Component +public class KettleUtil { + + + public String KETTLE_LOG_LEVEL = "basic"; + public String KETTLE_REPO_ID = "2"; + public String KETTLE_REPO_NAME = "koneTest"; + public String KETTLE_REPO_DESC = "DESC"; + public String KETTLE_REPO_PATH = "D:\\etl"; + + /** + * 执行文件资源库转换 + * @param transPath 转换路径(相对于资源库) + * @param transName 转换名称(不需要后缀) + * @param namedParams 命名参数 + * @param clParams 命令行参数 + */ + public void callTrans(String transPath, String transName, Map namedParams, String[] clParams) throws Exception { + KettleEnv.init(); + DatabaseMeta databaseMeta=new DatabaseMeta("kettle_trans_log", "mysql", "Native(JDBC)", + "192.168.2.18","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "abc.123"); +// DatabaseMeta databaseMeta=new DatabaseMeta("kettle_trans_log", "mysql", "Native(JDBC)", +// "127.0.0.1","etl?useUniCode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC","3306","root","2129"); + + String msg; + KettleFileRepository repo = this.fileRepositoryCon(); + TransMeta transMeta = this.loadTrans(repo, transPath, transName); + + transMeta.addDatabase(databaseMeta); + VariableSpace space=new Variables(); + TransLogTable jobLogTable= TransLogTable.getDefault(space,transMeta,null); + jobLogTable.setTableName("kettle_trans_log"); + jobLogTable.setConnectionName("kettle_trans_log"); + transMeta.setTransLogTable(jobLogTable); + //transMeta.getTransLogTable().setTableName(repInitialization.transLog); + //转换 + Trans trans = new Trans(transMeta); + //设置命名参数 + if(null != namedParams) { + //namedParams.forEach(trans::setParameterValue); + /*for (Map.Entry entry : namedParams.entrySet()) { + trans.setParameterValue(entry.getKey(), entry.getValue()); + }*/ + for(Iterator> it = namedParams.entrySet().iterator(); it.hasNext();){ + Map.Entry entry = it.next(); + trans.setParameterValue(entry.getKey(), entry.getValue()); + } + } + trans.setLogLevel(this.getLogerLevel(KETTLE_LOG_LEVEL)); + //执行 + trans.execute(clParams); + trans.waitUntilFinished(); + + KettleLogStore.discardLines(trans.getLogChannelId(),true); + + //记录日志 + String logChannelId = trans.getLogChannelId(); + LoggingBuffer appender = KettleLogStore.getAppender(); + String logText = appender.getBuffer(logChannelId, true).toString(); + log.info("[logTextlogText:"+logText+":logTextlogText]"); + //抛出异常 + if (trans.getErrors() > 0) { + msg = "There are errors during transformation exception!(转换过程中发生异常)"; + log.error(msg); + throw new Exception(msg); + } + } + + /** + * 执行文件资源库job + * @param jobName + * @throws Exception + */ + public boolean callJob(String jobPath, String jobName, Map variables, String[] clParams) throws Exception { + KettleEnv.init(); + String msg; + DatabaseMeta databaseMeta=new DatabaseMeta("kettle_job_log", "mysql", "Native(JDBC)", + "192.168.2.18","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "abc.123"); + KettleFileRepository repo = this.fileRepositoryCon(); + JobMeta jobMeta = this.loadJob(repo, jobPath, jobName); + jobMeta.addDatabase(databaseMeta); + VariableSpace space=new Variables(); + space.setVariable("test","fromDbName"); + JobLogTable jobLogTable= JobLogTable.getDefault(space,jobMeta); + jobLogTable.setTableName("kettle_job_log"); + jobLogTable.setConnectionName("kettle_job_log"); + jobMeta.setJobLogTable(jobLogTable); + + Job job = new Job(repo, jobMeta); + //向Job 脚本传递参数,脚本中获取参数值:${参数名} + if(null != variables) { + for(Iterator> it = variables.entrySet().iterator(); it.hasNext();){ + Map.Entry entry = it.next(); + job.setVariable(entry.getKey(), entry.getValue()); + } + } + //设置日志级别 + job.setLogLevel(this.getLogerLevel(KETTLE_LOG_LEVEL)); + job.setArguments(clParams); + job.start(); + job.waitUntilFinished(); + //记录日志 + String logChannelId = job.getLogChannelId(); + LoggingBuffer appender = KettleLogStore.getAppender(); + String logText = appender.getBuffer(logChannelId, true).toString(); + log.info(logText); + if (job.getErrors() > 0) { + msg = "There are errors during job exception!(执行job发生异常)"; + log.error(msg); + throw new Exception(msg); + } + return true; + } + + /** + * 加载转换 + * @param repo kettle文件资源库 + * @param transPath 相对路径 + * @param transName 转换名称 + */ + public TransMeta loadTrans(KettleFileRepository repo, String transPath, String transName) throws Exception{ + String msg; + RepositoryDirectoryInterface dir = repo.findDirectory(transPath);//根据指定的字符串路径找到目录 + if(null == dir){ + msg = "kettle资源库转换路径不存在【"+repo.getRepositoryMeta().getBaseDirectory()+transPath+"】!"; + throw new Exception(msg); + } + TransMeta transMeta = repo.loadTransformation(repo.getTransformationID(transName, dir), null); + if(null == transMeta){ + msg = "kettle资源库【"+dir.getPath()+"】不存在该转换【"+transName+"】!"; + throw new Exception(msg); + } + return transMeta; + } + + + + + + + + /** + * 加载job + * @param repo kettle文件资源库 + * @param jobPath 相对路径 + * @param jobName job名称 + */ + private JobMeta loadJob(KettleFileRepository repo, String jobPath, String jobName) throws Exception{ + String msg; + RepositoryDirectoryInterface dir = repo.findDirectory(jobPath);//根据指定的字符串路径找到目录 + if(null == dir){ + msg = "kettle资源库Job路径不存在【"+repo.getRepositoryMeta().getBaseDirectory()+jobPath+"】!"; + throw new Exception(msg); + } + JobMeta jobMeta = repo.loadJob(repo.getJobId(jobName, dir), null); + if(null == jobMeta){ + msg = "kettle资源库【"+dir.getPath()+"】不存在该转换【"+jobName+"】!"; + throw new Exception(msg); + } + return jobMeta; + } + + /** + * 调用trans文件 带参数的 + */ + public void callNativeTransWithParams(String[] params, String transName) throws Exception { + // 初始化 + KettleEnvironment.init(); + EnvUtil.environmentInit(); + TransMeta transMeta = new TransMeta(transName); + //转换 + Trans trans = new Trans(transMeta); + //执行 + trans.execute(params); + //等待结束 + trans.waitUntilFinished(); + //抛出异常 + if (trans.getErrors() > 0) { + throw new Exception("There are errors during transformation exception!(传输过程中发生异常)"); + } + } + + + + + + /** + * 调用job文件 + * @param jobName + * @throws Exception + */ + public void callNativeJob(String jobName) throws Exception { + // 初始化 + /*KettleEnvironment.init();*/ + + JobMeta jobMeta = new JobMeta(jobName, null); + Job job = new Job(null, jobMeta); + //向Job 脚本传递参数,脚本中获取参数值:${参数名} + //job.setVariable(paraname, paravalue); + //设置日志级别 + job.setLogLevel(this.getLogerLevel(KETTLE_LOG_LEVEL)); + job.start(); + job.waitUntilFinished(); + if (job.getErrors() > 0) { + throw new Exception("There are errors during job exception!(执行job发生异常)"); + } + } + + /** + * 取得kettle的日志级别 + */ + private LogLevel getLogerLevel(String level) { + LogLevel logLevel; + if ("basic".equals(level)) { + logLevel = LogLevel.BASIC; + } else if ("detail".equals(level)) { + logLevel = LogLevel.DETAILED; + } else if ("error".equals(level)) { + logLevel = LogLevel.ERROR; + } else if ("debug".equals(level)) { + logLevel = LogLevel.DEBUG; + } else if ("minimal".equals(level)) { + logLevel = LogLevel.MINIMAL; + } else if ("rowlevel".equals(level)) { + logLevel = LogLevel.ROWLEVEL; + } else if ("nothing".endsWith(level)){ + logLevel = LogLevel.NOTHING; + }else { + logLevel = null; + } + return logLevel; + } + + /** + * 配置kettle文件库资源库环境 + **/ + public KettleFileRepository fileRepositoryCon() throws KettleException { + String msg; + //初始化 + /*EnvUtil.environmentInit(); + KettleEnvironment.init();*/ + + //资源库元对象 + KettleFileRepositoryMeta fileRepositoryMeta = new KettleFileRepositoryMeta(this.KETTLE_REPO_ID, this.KETTLE_REPO_NAME, this.KETTLE_REPO_DESC, this.KETTLE_REPO_PATH); + // 文件形式的资源库 + KettleFileRepository repo = new KettleFileRepository(); + repo.init(fileRepositoryMeta); + //连接到资源库 + repo.connect("", "");//默认的连接资源库的用户名和密码 + + if (repo.isConnected()) { + msg = "kettle文件库资源库【" + KETTLE_REPO_PATH + "】连接成功"; + log.info(msg); + return repo; + } else { + msg = "kettle文件库资源库【" + KETTLE_REPO_PATH + "】连接失败"; + log.error(msg); + throw new KettleException(msg); + } + } + + // 调用Transformation示例 + public static void runTrans(String filename) { + try { + KettleEnvironment.init(); + TransMeta transMeta = new TransMeta(filename); + Trans trans = new Trans(transMeta); + trans.execute(null);// 执行转换 + trans.waitUntilFinished(); // 等待转换执行结束 + if (trans.getErrors() != 0) { + System.out.println("Error"); + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + /** + * Kettle环境初始化. + */ + public static class KettleEnv { + public static void init(){ + try { + KettleEnvironment.init(); + EnvUtil.environmentInit(); + log.info("Kettle环境初始化成功"); + }catch (Exception e){ + e.printStackTrace(); + log.error("Kettle环境初始化失败"); + } + + } + } + + /** + * 初始化环境 + */ + public class StartInit implements InitializingBean { + + @Override + public void afterPropertiesSet() throws Exception { + KettleEnv.init(); + + } + + } + + +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java new file mode 100644 index 000000000..60bf26356 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java @@ -0,0 +1,735 @@ +package com.ruoyi.kettle.tools; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.kettle.cons.XJobStatus; +import com.ruoyi.kettle.cons.XTransStatus; +import com.ruoyi.kettle.repo.XRepoManager; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.vfs2.FileObject; +import org.pentaho.di.core.Const; +import org.pentaho.di.core.ProgressMonitorListener; +import org.pentaho.di.core.database.Database; +import org.pentaho.di.core.database.DatabaseMeta; +import org.pentaho.di.core.exception.KettleException; +import org.pentaho.di.core.exception.KettleSecurityException; +import org.pentaho.di.core.gui.Point; +import org.pentaho.di.core.gui.Rectangle; +import org.pentaho.di.core.gui.ScrollBarInterface; +import org.pentaho.di.core.gui.SwingGC; +import org.pentaho.di.core.parameters.NamedParams; +import org.pentaho.di.core.variables.VariableSpace; +import org.pentaho.di.core.vfs.KettleVFS; +import org.pentaho.di.job.Job; +import org.pentaho.di.job.JobHopMeta; +import org.pentaho.di.job.JobMeta; +import org.pentaho.di.job.JobPainter; +import org.pentaho.di.job.entries.job.JobEntryJob; +import org.pentaho.di.job.entries.special.JobEntrySpecial; +import org.pentaho.di.job.entries.trans.JobEntryTrans; +import org.pentaho.di.job.entry.JobEntryBase; +import org.pentaho.di.job.entry.JobEntryCopy; +import org.pentaho.di.job.entry.JobEntryInterface; +import org.pentaho.di.repository.*; +import org.pentaho.di.repository.filerep.KettleFileRepositoryMeta; +import org.pentaho.di.repository.kdr.KettleDatabaseRepository; +import org.pentaho.di.trans.Trans; +import org.pentaho.di.trans.TransHopMeta; +import org.pentaho.di.trans.TransMeta; +import org.pentaho.di.trans.TransPainter; +import org.pentaho.di.trans.step.StepInterface; +import org.pentaho.di.trans.step.StepMeta; +import org.pentaho.di.trans.step.StepMetaInterface; +import org.pentaho.di.trans.steps.jobexecutor.JobExecutorMeta; +import org.pentaho.di.trans.steps.transexecutor.TransExecutorMeta; +import org.pentaho.metastore.api.IMetaStore; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.awt.image.BufferedImage; +import java.awt.image.ImageObserver; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class KettleUtil_2 { + private static final Logger log = LoggerFactory.getLogger(KettleUtil_2.class); + public static Map holder = new ConcurrentHashMap(); + + public static Map getHolder() { + return holder; + } + + public static void setHolder(Map holder) { + KettleUtil_2.holder = holder; + } + + public KettleUtil_2() { + } + + public static Repository conByJndi(String repoId, String name, String db, String type, String kuser, String kpass) throws Exception { + testConnect(repoId); + if (holder.containsKey(repoId)) { + return (Repository)holder.get(repoId); + } else { + XRepoManager.createDBRepByJndi(repoId, name, type, db); + Repository repository = connect(repoId, kuser, kpass); + if (null != repository) { + holder.put(repoId, repository); + return repository; + } else { + return null; + } + } + } + + public static Repository conFileRep(String repoId, String repoName, String baseDirectory) throws KettleException { + if (holder.containsKey(repoId)) { + return (Repository)holder.get(repoId); + } else { + XRepoManager.createFileRep(repoId, repoName, "文件资源库", baseDirectory); + Repository repository = connect(repoId); + if (null != repository) { + holder.put(repoId, repository); + return repository; + } else { + return null; + } + } + } + + public static Repository conByNative(String repoId, String repoName, String name, String type, String host, String port, String db, String user, String pass, String kuser, String kpass) throws KettleException { + testConnect(repoId); + if (holder.containsKey(repoId)) { + return (Repository)holder.get(repoId); + } else { + XRepoManager.createDBRepByDesc(repoId, repoName, "资源库", name, type, "Native", host, db, port, user, pass); + Repository repository = connect(repoId, kuser, kpass); + if (null != repository) { + holder.put(repoId, repository); + return repository; + } else { + return null; + } + } + } + + public static DatabaseMeta createDatabaseMeta(String name, String type, String access, String host, String dbName, String port, String user, String pass, boolean replace, Repository repository) { + return XRepoManager.createDatabaseMeta(name, type, access, host, dbName, port, user, pass, (Map)null, replace, repository); + } + + public static DatabaseMeta createDatabaseMeta(String name, String type, String access, String host, String dbName, String port, String user, String pass, Map params, Repository repository) { + return XRepoManager.createDatabaseMeta(name, type, access, host, dbName, port, user, pass, params, false, repository); + } + + public static Repository conByParams(String repoId, String repoName, JSONObject params, String name, String type, String access, String host, String db, String port, String user, String pass, String kuser, String kpass) throws Exception { + testConnect(repoId); + if (holder.containsKey(repoId)) { + return (Repository)holder.get(repoId); + } else { + XRepoManager.createDBRepByParams(repoId, repoName, params, name, type, access, host, db, port, user, pass); + Repository repository = connect(repoId, kuser, kpass); + if (null != repository) { + holder.put(repoId, repository); + return repository; + } else { + return null; + } + } + } + + public static Repository connect(String repoId) throws KettleSecurityException, KettleException { + return connect(repoId, (String)null, (String)null); + } + + public static Repository connect(String repoId, String username, String password) throws KettleSecurityException, KettleException { + Repository repository = (Repository)XRepoManager.repositoryCache.get(repoId); + if (!repository.isConnected()) { + repository.connect(username, password); + log.info(repository.getName() + "资源库已连接!"); + } + + return repository; + } + + public static void setRepository(Repository repository) { + } + + public static void destroy(String id) { + XRepoManager.disConnectionRepository(id); + } + + public static void delJob(String repoId, long id_job) throws KettleException { + testConnect(repoId); + delJob(id_job, (Repository)holder.get(repoId)); + } + + private static String calcRelativeElementDirectory(RepositoryDirectoryInterface dir) { + return dir != null ? dir.getPath() : "/"; + } + + private static String calcDirectoryName(String repoId, RepositoryDirectoryInterface dir) { + testConnect(repoId); + StringBuilder directory = new StringBuilder(); + KettleFileRepositoryMeta repositoryMeta = (KettleFileRepositoryMeta)((Repository)holder.get(repoId)).getRepositoryMeta(); + String baseDir = repositoryMeta.getBaseDirectory(); + baseDir = Const.replace(baseDir, "\\", "/"); + directory.append(baseDir); + if (!baseDir.endsWith("/")) { + directory.append("/"); + } + + if (dir != null) { + String path = calcRelativeElementDirectory(dir); + if (path.startsWith("/")) { + directory.append(path.substring(1)); + } else { + directory.append(path); + } + + if (!path.endsWith("/")) { + directory.append("/"); + } + } + + return directory.toString(); + } + + public static void delFileJob(String repoId, String jobId) throws KettleException { + String path = jobId.substring(0, jobId.lastIndexOf("/")); + String jobName = jobId.substring(jobId.lastIndexOf("/") + 1); + RepositoryDirectoryInterface repositoryDirectoryInterface = ((Repository)holder.get(repoId)).findDirectory(path); + String filename = calcFilename(repoId, repositoryDirectoryInterface, jobName); + deleteFile(filename); + } + + private static String calcFilename(String repoId, RepositoryDirectoryInterface repositoryDirectoryInterface, String jobName) { + return calcDirectoryName(repoId, (RepositoryDirectoryInterface)null) + repositoryDirectoryInterface.getPath() + "/" + jobName; + } + + private static void deleteFile(String filename) throws KettleException { + try { + FileObject fileObject = KettleVFS.getFileObject(filename); + fileObject.delete(); + } catch (Exception var2) { + throw new KettleException("Unable to delete file with name [" + filename + "]", var2); + } + } + + public static void delJob(long id_job, Repository repository) throws KettleException { + repository.deleteJob(new LongObjectId(id_job)); + } + + public static void delTrans(String repoId, long id_job) throws KettleException { + testConnect(repoId); + delTrans(id_job, (Repository)holder.get(repoId)); + } + + public static void delTrans(long id_job, Repository repository) throws KettleException { + repository.deleteTransformation(new LongObjectId(id_job)); + } + + public static JobMeta loadJob(String repoId, long jobId) throws KettleException { + testConnect(repoId); + return ((Repository)holder.get(repoId)).loadJob(new LongObjectId(jobId), (String)null); + } + + public static JobMeta loadJob(String repoId, String jobId) throws KettleException { + testConnect(repoId); + return ((Repository)holder.get(repoId)).loadJob(new StringObjectId(jobId), (String)null); + } + + public static JobMeta loadJob(String repoId, String jobname, String directory) throws KettleException { + testConnect(repoId); + return loadJob(jobname, directory, (Repository)holder.get(repoId)); + } + + public static JobMeta loadJob(String jobname, String directory, Repository repository) throws KettleException { + RepositoryDirectoryInterface dir = repository.findDirectory(directory); + return repository.loadJob(jobname, dir, (ProgressMonitorListener)null, (String)null); + } + + public static JobMeta loadJob(String repoId, String jobname, long directory) throws KettleException { + testConnect(repoId); + return loadJob(jobname, directory, (Repository)holder.get(repoId)); + } + + public static JobMeta loadJob(String jobname, long directory, Repository repository) throws KettleException { + RepositoryDirectoryInterface dir = repository.findDirectory(new LongObjectId(directory)); + return repository.loadJob(jobname, dir, (ProgressMonitorListener)null, (String)null); + } + + public static TransMeta loadTrans(String repoId, long id) throws KettleException { + testConnect(repoId); + return ((Repository)holder.get(repoId)).loadTransformation(new LongObjectId(id), (String)null); + } + + public static TransMeta loadTrans(String repoId, String transname, String directory) throws KettleException { + testConnect(repoId); + return loadTrans(transname, directory, (Repository)holder.get(repoId)); + } + + public static TransMeta loadTrans(String transname, String directory, Repository repository) throws KettleException { + RepositoryDirectoryInterface dir = repository.findDirectory(directory); + return repository.loadTransformation(transname, dir, (ProgressMonitorListener)null, true, (String)null); + } + + public static TransMeta loadTrans(String repoId, JobMeta jobMeta, String teansName) throws KettleException { + JobEntryTrans trans = (JobEntryTrans)jobMeta.findJobEntry(teansName).getEntry(); + TransMeta transMeta = loadTrans(repoId, trans.getTransname(), trans.getDirectory()); + return transMeta; + } + + public static T loadJobEntry(String repoId, JobMeta jobMeta, String jobEntryName, T jobEntryMeta) throws KettleException { + return loadJobEntry(repoId, jobMeta.findJobEntry(jobEntryName).getEntry().getObjectId(), jobEntryMeta); + } + + public static T loadJobEntry(String repoId, ObjectId entryId, T jobEntryMeta) throws KettleException { + testConnect(repoId); + jobEntryMeta.loadRep((Repository)holder.get(repoId), (IMetaStore)null, entryId, (List)null, (List)null); + jobEntryMeta.setObjectId(entryId); + return jobEntryMeta; + } + + public static JobEntrySpecial findStart(JobMeta jobMeta) { + for(int i = 0; i < jobMeta.nrJobEntries(); ++i) { + JobEntryCopy jec = jobMeta.getJobEntry(i); + JobEntryInterface je = jec.getEntry(); + if (je.getPluginId().equals("SPECIAL")) { + return (JobEntrySpecial)je; + } + } + + return null; + } + + public static void saveRepositoryElement(String repoId, RepositoryElementInterface repositoryElement) throws KettleException { + testConnect(repoId); + saveRepositoryElement((Repository)holder.get(repoId), repositoryElement); + } + + public static void saveRepositoryElement(Repository repository, RepositoryElementInterface repositoryElement) throws KettleException { + repository.save(repositoryElement, (String)null, (ProgressMonitorListener)null, true); + } + + public static void saveTrans(String repoId, TransMeta transMeta) throws KettleException { + testConnect(repoId); + saveRepositoryElement((Repository)((Repository)holder.get(repoId)), transMeta); + } + + public static void saveTrans(Repository repository, TransMeta transMeta) throws KettleException { + saveRepositoryElement((Repository)repository, transMeta); + } + + public static void saveJob(String repoId, JobMeta jobMeta) throws KettleException { + testConnect(repoId); + saveRepositoryElement((Repository)((Repository)holder.get(repoId)), jobMeta); + } + + public static void saveJob(Repository repository, JobMeta jobMeta) throws KettleException { + saveRepositoryElement((Repository)repository, jobMeta); + } + + public static boolean isDirectoryExist(Repository repository, String directoryName) { + try { + RepositoryDirectoryInterface dir = repository.findDirectory(directoryName); + return dir != null; + } catch (KettleException var3) { + log.error("判断job目录是否存在失败!", var3); + return false; + } + } + + public static RepositoryDirectoryInterface getOrMakeDirectory(String repoId, String parentDirectory, String directoryName) throws KettleException { + testConnect(repoId); + RepositoryDirectoryInterface parent = ((Repository)holder.get(repoId)).findDirectory(parentDirectory); + if (StringUtils.isBlank(parentDirectory)) { + parent = ((Repository)holder.get(repoId)).findDirectory("/"); + } + + if (StringUtils.isNotBlank(directoryName)) { + RepositoryDirectoryInterface dir = ((Repository)holder.get(repoId)).findDirectory(parentDirectory + "/" + directoryName); + return dir == null ? ((Repository)holder.get(repoId)).createRepositoryDirectory(parent, directoryName) : dir; + } else { + return parent; + } + } + + public static RepositoryDirectoryInterface makeDirs(String repoId, String directoryName) throws KettleException { + if (!StringUtils.isNotBlank(directoryName)) { + return null; + } else { + String parentDirectory = ""; + String[] dirArr = directoryName.replace("\\", "/").split("/"); + String[] var6 = dirArr; + int var5 = dirArr.length; + + for(int var4 = 0; var4 < var5; ++var4) { + String dirStr = var6[var4]; + + try { + if (StringUtils.isNotBlank(dirStr)) { + RepositoryDirectoryInterface p = getOrMakeDirectory(repoId, parentDirectory, dirStr); + parentDirectory = p.getPath(); + } + } catch (Exception var9) { + log.error("创建目录失败:" + directoryName + "," + parentDirectory + "," + dirStr, var9); + } + } + + return getOrMakeDirectory(repoId, parentDirectory, (String)null); + } + } + + public static String getDirectory(String repoId, long dirId) throws KettleException { + return getDirectory(repoId, new LongObjectId(dirId)); + } + + public static String getDirectory(String repoId, ObjectId dirId) throws KettleException { + testConnect(repoId); + RepositoryDirectoryInterface dir = ((Repository)holder.get(repoId)).findDirectory(dirId); + return dir == null ? null : dir.getPath(); + } + + public static void setStepToTrans(TransMeta teans, String stepName, StepMetaInterface smi) { + StepMeta step = teans.findStep(stepName); + step.setStepMetaInterface(smi); + } + + public static void setStepToTransAndSave(String repoId, TransMeta teans, String stepName, StepMetaInterface smi) throws KettleException { + setStepToTrans(teans, stepName, smi); + saveTrans(repoId, teans); + } + + public static void jobStopAll(Job job) { + job.stopAll(); + JobMeta jobMeta = job.getJobMeta(); + Iterator var3 = jobMeta.getJobCopies().iterator(); + + while(var3.hasNext()) { + JobEntryCopy jec = (JobEntryCopy)var3.next(); + if (jec.isTransformation()) { + JobEntryTrans jet = (JobEntryTrans)jec.getEntry(); + if (jet.getTrans() != null) { + jet.getTrans().stopAll(); + } + } else if (jec.isJob()) { + JobEntryJob jej = (JobEntryJob)jec.getEntry(); + if (jej.getJob() != null) { + jobStopAll(jej.getJob()); + } + } + } + + } + + public static void jobKillAll(Job job) { + job.stopAll(); + JobMeta jobMeta = job.getJobMeta(); + Iterator var3 = jobMeta.getJobCopies().iterator(); + + while(var3.hasNext()) { + JobEntryCopy jec = (JobEntryCopy)var3.next(); + if (jec.isTransformation()) { + JobEntryTrans jet = (JobEntryTrans)jec.getEntry(); + if (jet.getTrans() != null) { + jet.getTrans().killAll(); + } + } else if (jec.isJob()) { + JobEntryJob jej = (JobEntryJob)jec.getEntry(); + if (jej.getJob() != null) { + jobKillAll(jej.getJob()); + } + } + } + + if (!job.getState().equals(Thread.State.BLOCKED) && !job.getState().equals(Thread.State.TIMED_WAITING)) { + job.interrupt(); + } else { + job.stop(); + } + + } + + public static void transCopy(Map param, Repository fromRepository, Repository toRepository) throws KettleException { + String jobName = param.get("transName") + ""; + String jobPath = param.get("transPath") + ""; + String newName = param.get("newName") + ""; + String newPath = param.get("newPath") + ""; + String des = param.get("transDescription") + ""; + TransMeta jobMeta = loadTrans(jobName, jobPath, fromRepository); + new TransMeta(); + jobMeta.setName(newName); + jobMeta.setDescription(des); + jobMeta.setRepositoryDirectory(makeDirs(param.get("repoId") + "", newPath)); + saveTrans(toRepository, jobMeta); + } + + public static void jobCopy(Map param, Repository fromRepository, Repository toRepository) throws KettleException { + String jobName = param.get("jobName") + ""; + String jobPath = param.get("jobPath") + ""; + String newName = param.get("newName") + ""; + String newPath = param.get("newPath") + ""; + String des = param.get("jobDescription") + ""; + JobMeta jobMeta = loadJob(jobName, jobPath, fromRepository); + jobMeta.setName(newName); + jobMeta.setDescription(des); + jobMeta.setRepositoryDirectory(makeDirs(param.get("repoId") + "", newPath)); + saveJob(toRepository, jobMeta); + } + + public static void jobCopy(String jobName, String jobPath, Repository fromRepository, Repository toRepository) throws KettleException { + JobMeta jobMeta = loadJob(jobName, jobPath, fromRepository); + Iterator var6 = jobMeta.getJobCopies().iterator(); + + while(var6.hasNext()) { + JobEntryCopy jec = (JobEntryCopy)var6.next(); + if (jec.isTransformation()) { + JobEntryTrans jet = (JobEntryTrans)jec.getEntry(); + transCopy(jet.getObjectName(), jet.getDirectory(), fromRepository, toRepository); + } else if (jec.isJob()) { + JobEntryJob jej = (JobEntryJob)jec.getEntry(); + jobCopy(jej.getObjectName(), jej.getDirectory(), fromRepository, toRepository); + } + } + + jobMeta.setRepository(toRepository); + jobMeta.setMetaStore(toRepository.getMetaStore()); + if (!isDirectoryExist(toRepository, jobPath)) { + toRepository.createRepositoryDirectory(toRepository.findDirectory("/"), jobPath); + } + + saveJob(toRepository, jobMeta); + } + + public static void transCopy(String transName, String transPath, Repository fromRepository, Repository toRepository) throws KettleException { + TransMeta tm = loadTrans(transName, transPath, fromRepository); + Iterator var6 = tm.getSteps().iterator(); + + while(var6.hasNext()) { + StepMeta sm = (StepMeta)var6.next(); + if (sm.isJobExecutor()) { + JobExecutorMeta jem = (JobExecutorMeta)sm.getStepMetaInterface(); + jobCopy(jem.getJobName(), jem.getDirectoryPath(), fromRepository, toRepository); + } else if (sm.getStepMetaInterface() instanceof TransExecutorMeta) { + TransExecutorMeta te = (TransExecutorMeta)sm.getStepMetaInterface(); + transCopy(te.getTransName(), te.getDirectoryPath(), fromRepository, toRepository); + } + } + + if (!isDirectoryExist(toRepository, transPath)) { + toRepository.createRepositoryDirectory(toRepository.findDirectory("/"), transPath); + } + + tm.setRepository(toRepository); + tm.setMetaStore(toRepository.getMetaStore()); + saveTrans(toRepository, tm); + } + + public static ObjectId getJobId(String repoId, JobMeta jm) { + return getJobId(repoId, jm.getName(), jm.getRepositoryDirectory()); + } + + public static ObjectId getJobId(String repoId, String name, RepositoryDirectoryInterface repositoryDirectory) { + try { + testConnect(repoId); + return ((Repository)holder.get(repoId)).getJobId(name, repositoryDirectory); + } catch (KettleException var4) { + log.info("获取作业id失败", var4); + return null; + } + } + + public static ObjectId getTransformationID(String repoId, TransMeta tm) { + return getTransformationID(repoId, tm.getName(), tm.getRepositoryDirectory()); + } + + public static ObjectId getTransformationID(String repoId, String name, RepositoryDirectoryInterface repositoryDirectory) { + try { + testConnect(repoId); + return ((Repository)holder.get(repoId)).getTransformationID(name, repositoryDirectory); + } catch (KettleException var4) { + log.info("获取转换id失败", var4); + return null; + } + } + + public static void repairTransHop(TransMeta tm) { + for(int i = 0; i < tm.nrTransHops(); ++i) { + TransHopMeta hop = tm.getTransHop(i); + hop.setFromStep(tm.findStep(hop.getFromStep().getName())); + hop.setToStep(tm.findStep(hop.getToStep().getName())); + } + + } + + public static void setParams(NamedParams target, NamedParams source, Map params) { + target.eraseParameters(); + + try { + String[] var6; + int var5 = (var6 = source.listParameters()).length; + + for(int var4 = 0; var4 < var5; ++var4) { + String key = var6[var4]; + String defaultVal = source.getParameterDefault(key); + if (params.containsKey(key)) { + defaultVal = (String)params.get(key); + } + + target.addParameterDefinition(key, defaultVal, source.getParameterDescription(key)); + } + } catch (Exception var8) { + log.error("保存JOB失败", var8); + } + + } + + public static void repairHop(JobMeta jm) { + Iterator var2 = jm.getJobhops().iterator(); + + while(var2.hasNext()) { + JobHopMeta hop = (JobHopMeta)var2.next(); + hop.setFromEntry(jm.findJobEntry(hop.getFromEntry().getName())); + hop.setToEntry(jm.findJobEntry(hop.getToEntry().getName())); + } + + } + + public static String getProp(VariableSpace vs, String key) { + String value = vs.environmentSubstitute("${" + key + "}"); + return value.startsWith("${") ? "" : value; + } + + public static JSONObject getPropJSONObject(VariableSpace vs, String key) { + String value = getProp(vs, key); + return StringUtils.isNotBlank(value) ? JSON.parseObject(value) : null; + } + + public static Job getRootJob(Job rootjob) { + while(rootjob != null && rootjob.getParentJob() != null) { + rootjob = rootjob.getParentJob(); + } + + return rootjob; + } + + public static Job getRootJob(JobEntryBase jee) { + Job rootjob = jee.getParentJob(); + return getRootJob(rootjob); + } + + public static Job getRootJob(StepInterface si) { + Job rootjob = si.getTrans().getParentJob(); + return getRootJob(rootjob); + } + + public static String getRootJobId(JobEntryBase jee) { + return getRootJob(jee).getObjectId().getId(); + } + + public static String getRootJobId(StepInterface si) { + Job rootjob = getRootJob(si); + return rootjob != null ? rootjob.getObjectId().getId() : null; + } + + public static String getRootJobName(StepInterface si) { + Job rootjob = getRootJob(si); + return rootjob != null ? rootjob.getObjectName() : null; + } + + public static BufferedImage generateTransformationImage(TransMeta transMeta) throws Exception { + float magnification = 1.0F; + Point maximum = transMeta.getMaximum(); + maximum.multiply(magnification); + SwingGC gc = new SwingGC((ImageObserver)null, maximum, 32, 0, 0); + TransPainter transPainter = new TransPainter(gc, transMeta, maximum, (ScrollBarInterface)null, (ScrollBarInterface)null, (TransHopMeta)null, (Point)null, (Rectangle)null, new ArrayList(), new ArrayList(), 32, 1, 0, 0, true, "Arial", 10); + transPainter.setMagnification(magnification); + transPainter.buildTransformationImage(); + BufferedImage image = (BufferedImage)gc.getImage(); + return image; + } + + public static BufferedImage generateJobImage(JobMeta jobMeta) throws Exception { + float magnification = 1.0F; + Point maximum = jobMeta.getMaximum(); + maximum.multiply(magnification); + SwingGC gc = new SwingGC((ImageObserver)null, maximum, 32, 0, 0); + JobPainter jobPainter = new JobPainter(gc, jobMeta, maximum, (ScrollBarInterface)null, (ScrollBarInterface)null, (JobHopMeta)null, (Point)null, (Rectangle)null, new ArrayList(), new ArrayList(), 32, 1, 0, 0, true, "Arial", 10); + jobPainter.setMagnification(magnification); + jobPainter.drawJob(); + BufferedImage image = (BufferedImage)gc.getImage(); + return image; + } + + public static XJobStatus getJobStatus(Job job) { + String status = job.getStatus(); + if (status.indexOf("errors") > -1) { + return XJobStatus.FAILED; + } else if (status.equals("Waiting")) { + return XJobStatus.PENDING; + } else if (status.equals("Halting")) { + return XJobStatus.HALTING; + } else if (status.equals("Running")) { + return XJobStatus.RUNNING; + } else if (status.equals("Stopped")) { + return XJobStatus.STOPPED; + } else { + return status.equalsIgnoreCase("Finished") ? XJobStatus.FINISHED : XJobStatus.UNKNOWN; + } + } + + public static XTransStatus getTransStatus(Trans trans) { + String status = trans.getStatus(); + if (status.indexOf("errors") > -1) { + return XTransStatus.FAILED; + } else if (status.equals("Waiting")) { + return XTransStatus.WAITING; + } else if (status.equals("Halting")) { + return XTransStatus.HALTING; + } else if (status.equals("Running")) { + return XTransStatus.RUNNING; + } else if (status.equals("Stopped")) { + return XTransStatus.STOPPED; + } else if (status.equals("Finished")) { + return XTransStatus.FINISHED; + } else if (status.equals("Paused")) { + return XTransStatus.PAUSED; + } else if (status.contains("Preparing")) { + return XTransStatus.PREPARING; + } else { + return status.equals("Initializing") ? XTransStatus.INITIALIZING : XTransStatus.UNKNOWN; + } + } + + private static void testConnect(String repoId) { + Repository repository = (Repository)holder.get(repoId); + if (repository instanceof KettleDatabaseRepository) { + KettleDatabaseRepository kettleDatabaseRepository = (KettleDatabaseRepository)repository; + Database database = kettleDatabaseRepository.getDatabase(); + Connection connection = database.getConnection(); + + try { + if (connection.isClosed()) { + holder.remove(repoId); + log.info("当前数据库连接已经关闭,准备重新连接......."); + DatabaseMeta databaseMeta = (DatabaseMeta)XRepoManager.databaseMeta.get("databaseMeta"); + XRepoManager.createDBRepByDesc(repoId, repository.getName(), "资源库", databaseMeta.getName(), databaseMeta.getDatabaseTypeDesc(), "Native", databaseMeta.getHostname(), databaseMeta.getDatabaseName(), databaseMeta.getDatabasePortNumberString(), databaseMeta.getUsername(), databaseMeta.getPassword()); + kettleDatabaseRepository = (KettleDatabaseRepository)connect(repoId, "admin", "admin"); + if (null != repository) { + holder.put(repoId, kettleDatabaseRepository); + } + } + } catch (SQLException var6) { + log.error("数据库重连出现异常,{}", var6); + } catch (KettleException var7) { + log.error("数据库重连出现异常,{}", var7); + } + } + + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java deleted file mode 100644 index 11b6231cb..000000000 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtils.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.ruoyi.kettle.tools; - -import org.pentaho.di.core.KettleEnvironment; -import org.pentaho.di.job.Job; -import org.pentaho.di.job.JobMeta; -import org.pentaho.di.trans.Trans; -import org.pentaho.di.trans.TransMeta; -import org.springframework.core.io.ClassPathResource; - -import java.io.File; -import java.util.Iterator; -import java.util.Map; - -public class KettleUtils { - - /** - * 执行ktr文件 - * - * @param filename - * @param params - * @return - */ - public static void runKtr(String filename, Map params, String dirPath) { - try { - KettleEnvironment.init(); - TransMeta tm = new TransMeta(dirPath + File.separator + filename); - Trans trans = new Trans(tm); - if (params != null) { - Iterator> entries = params.entrySet().iterator(); - while (entries.hasNext()) { - Map.Entry entry = entries.next(); - trans.setParameterValue(entry.getKey(), entry.getValue()); - } - } - trans.execute(null); - trans.waitUntilFinished(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * 执行kjb文件 - * - * @param filename - * @param params - * @return - */ - public static void runKjb(String filename, Map params, String dirPath) { - try { - KettleEnvironment.init(); - JobMeta jm = new JobMeta(dirPath + File.separator + filename, null); - Job job = new Job(null, jm); - if (params != null) { - Iterator> entries = params.entrySet().iterator(); - while (entries.hasNext()) { - Map.Entry entry = entries.next(); - job.setVariable(entry.getKey(), entry.getValue()); - } - } - job.start(); - job.waitUntilFinished(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) throws Exception { - ClassPathResource classPathResource = new ClassPathResource("kettle"); - System.out.println("classPathResource:" + classPathResource.getFile().getPath()); - runKtr("D:\\etl\\kone.ktr", null, classPathResource.getFile().getPath()); - } -} \ No newline at end of file diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java new file mode 100644 index 000000000..9ccbbfed9 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java @@ -0,0 +1,85 @@ +package com.ruoyi.kettle.tools; + + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.util.Iterator; +import java.util.Map; + +@Component +public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + private static ConfigurableListableBeanFactory beanFactory; + private static ApplicationContext context = null; + + private SpringContextUtil() { + } + + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + public static T getBean(String beanName) { + return (T) beanFactory.getBean(beanName); + } + + public static T getBean(String beanName, Class clazz) { + return beanFactory.getBean(beanName, clazz); + } + + public static T getBean(Class clazz) { + T t = null; + Map map = beanFactory.getBeansOfType(clazz); + + Map.Entry entry; + for(Iterator var3 = map.entrySet().iterator(); var3.hasNext(); + t = (T) entry.getValue()) { + entry = (Map.Entry)var3.next(); + } + + return t; + } + + public static boolean containsBean(String beanName) { + return beanFactory.containsBean(beanName); + } + + public static boolean isSingleton(String beanName) { + return beanFactory.isSingleton(beanName); + } + + public static Class getType(String beanName) { + return beanFactory.getType(beanName); + } + + public static HttpServletResponse getResponse() { + return getServletRequestAttributes().getResponse(); + } + + public static HttpServletRequest getRequest() { + return getServletRequestAttributes().getRequest(); + } + + public static ServletRequestAttributes getServletRequestAttributes() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes)requestAttributes; + } + + public static HttpSession getSession() { + return getRequest().getSession(); + } + + public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { + beanFactory = configurableListableBeanFactory; + } +} diff --git a/bps-kettle/src/main/resources/mapper/kettle/KettleJobMapper.xml b/bps-kettle/src/main/resources/mapper/kettle/KettleJobMapper.xml new file mode 100644 index 000000000..324cb0b46 --- /dev/null +++ b/bps-kettle/src/main/resources/mapper/kettle/KettleJobMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select id, created_time, update_time, created_by, update_by, job_name, job_description, job_type, job_path, job_repository_id, job_log_level, job_status, is_del, is_monitor_enabled, role_key, tpl_key from kettle_job + + + + + + + + + insert into kettle_job + + created_time, + update_time, + created_by, + update_by, + job_name, + job_description, + job_type, + job_path, + job_repository_id, + job_log_level, + job_status, + is_del, + is_monitor_enabled, + role_key, + tpl_key, + + + #{createdTime}, + #{updateTime}, + #{createdBy}, + #{updateBy}, + #{jobName}, + #{jobDescription}, + #{jobType}, + #{jobPath}, + #{jobRepositoryId}, + #{jobLogLevel}, + #{jobStatus}, + #{isDel}, + #{isMonitorEnabled}, + #{roleKey}, + #{tplKey}, + + + + + update kettle_job + + created_time = #{createdTime}, + update_time = #{updateTime}, + created_by = #{createdBy}, + update_by = #{updateBy}, + job_name = #{jobName}, + job_description = #{jobDescription}, + job_type = #{jobType}, + job_path = #{jobPath}, + job_repository_id = #{jobRepositoryId}, + job_log_level = #{jobLogLevel}, + job_status = #{jobStatus}, + is_del = #{isDel}, + is_monitor_enabled = #{isMonitorEnabled}, + role_key = #{roleKey}, + tpl_key = #{tplKey}, + + where id = #{id} + + + + delete from kettle_job where id = #{id} + + + + delete from kettle_job where id in + + #{id} + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml b/bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml index 09824a03f..4e562a405 100644 --- a/bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml +++ b/bps-kettle/src/main/resources/mapper/kettle/KettleTransMapper.xml @@ -54,7 +54,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + + + + insert into kettle_trans diff --git a/bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml b/bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml index 9e7517b22..3d82ca3c4 100644 --- a/bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml +++ b/bps-kettle/src/main/resources/mapper/kettle/XRepositoryMapper.xml @@ -44,11 +44,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and db_name like concat('%', #{dbName}, '%') and db_username like concat('%', #{dbUsername}, '%') and db_password = #{dbPassword} - and is_del = #{isDel} and created_time = #{createdTime} and created_by = #{createdBy} and type = #{type} and base_dir = #{baseDir} + and is_del != 1 @@ -125,7 +125,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + + update kettle_repository set is_del=1 where id = #{id} + + + update kettle_repository set is_del=1 where id IN + + #{id} + + delete from kettle_repository where id = #{id} diff --git a/bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html b/bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html new file mode 100644 index 000000000..f8bf1f2d0 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + +
          + + +
          + +
          + 展开 / + 折叠 +
          +
          +
          + + + + + diff --git a/bps-kettle/src/main/resources/templates/kettle/job/add.html b/bps-kettle/src/main/resources/templates/kettle/job/add.html new file mode 100644 index 000000000..f3f2c64ec --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/job/add.html @@ -0,0 +1,110 @@ + + + + + + + + + +
          +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/job/detail.html b/bps-kettle/src/main/resources/templates/kettle/job/detail.html new file mode 100644 index 000000000..1d95583f9 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/job/detail.html @@ -0,0 +1,36 @@ + + + + + + +
          +
          + +
          + + +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/job/edit.html b/bps-kettle/src/main/resources/templates/kettle/job/edit.html new file mode 100644 index 000000000..5e55d8886 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/job/edit.html @@ -0,0 +1,90 @@ + + + + + + + + + +
          +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          + +
          + +
          + +
          +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/job/job.html b/bps-kettle/src/main/resources/templates/kettle/job/job.html new file mode 100644 index 000000000..9d2740b65 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/job/job.html @@ -0,0 +1,160 @@ + + + + + + +
          +
          +
          +
          +
          +
            +
          • + + +
          • + +
          • + + +
          • +
          • +  搜索 +  重置 +
          • +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/quartz/addquartz.html b/bps-kettle/src/main/resources/templates/kettle/quartz/addquartz.html new file mode 100644 index 000000000..f5dc8da71 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/quartz/addquartz.html @@ -0,0 +1,107 @@ + + + + + + +
          +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + + +
          +
          +
          + +
          + + +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + diff --git a/bps-kettle/src/main/resources/templates/kettle/quartz/editquartz.html b/bps-kettle/src/main/resources/templates/kettle/quartz/editquartz.html new file mode 100644 index 000000000..46f421948 --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/quartz/editquartz.html @@ -0,0 +1,108 @@ + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + + +
          +
          +
          + +
          + + +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + diff --git a/bps-kettle/src/main/resources/templates/kettle/repository/repository.html b/bps-kettle/src/main/resources/templates/kettle/repository/repository.html index 725ae2136..a2a66e6db 100644 --- a/bps-kettle/src/main/resources/templates/kettle/repository/repository.html +++ b/bps-kettle/src/main/resources/templates/kettle/repository/repository.html @@ -41,9 +41,9 @@ 删除 - +
        diff --git a/bps-kettle/src/main/resources/templates/kettle/trans/add.html b/bps-kettle/src/main/resources/templates/kettle/trans/add.html index 3a06f95c6..63dee6eed 100644 --- a/bps-kettle/src/main/resources/templates/kettle/trans/add.html +++ b/bps-kettle/src/main/resources/templates/kettle/trans/add.html @@ -9,10 +9,17 @@
        -
        - + + +
        + +
        +
        @@ -30,9 +37,9 @@
        - +
        - +
        @@ -59,15 +66,15 @@ 代码生成请选择字典属性
        --> -
        - + @@ -107,6 +114,30 @@ minView: "month", autoclose: true }); + function chooseTrans(){ + var treeId = $("#treeId").val(); + //var repoid = $.common.isEmpty(treeId) ? "999999" : $("#treeId").val(); + var url = ctx + "kettle/repository/selectRepositoryTree/" + var options = { + title: '选择资源库', + width: "380", + url: url, + callBack: doSubmit + }; + $.modal.openOptions(options); + } + + function doSubmit(index, layero){ + var tree = layero.find("iframe")[0].contentWindow.$._tree; + var body = layer.getChildFrame('body', index); + $("#treeId").val(body.find('#treeId').val()); + $("#treeName").val(body.find('#treeName').val()); + $("#transRepositoryId").val(body.find('#transRepositoryId').val()); + $("#transPath").val(body.find('#transPath').val()); + + + layer.close(index); + } \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/trans/detail.html b/bps-kettle/src/main/resources/templates/kettle/trans/detail.html new file mode 100644 index 000000000..c77d55e2c --- /dev/null +++ b/bps-kettle/src/main/resources/templates/kettle/trans/detail.html @@ -0,0 +1,36 @@ + + + + + + +
        + + +
        + + +
        + +
        + + + + + + \ No newline at end of file diff --git a/bps-kettle/src/main/resources/templates/kettle/trans/edit.html b/bps-kettle/src/main/resources/templates/kettle/trans/edit.html index a001ad59c..36c2f244d 100644 --- a/bps-kettle/src/main/resources/templates/kettle/trans/edit.html +++ b/bps-kettle/src/main/resources/templates/kettle/trans/edit.html @@ -10,10 +10,11 @@
        +
        - +
        @@ -23,9 +24,9 @@
        - +
        - +
        @@ -54,7 +54,11 @@ \ No newline at end of file diff --git a/bps-kettle/src/test/java/com/kone/Testsetset.java b/bps-kettle/src/test/java/com/kone/Testsetset.java new file mode 100644 index 000000000..9ebe25fd3 --- /dev/null +++ b/bps-kettle/src/test/java/com/kone/Testsetset.java @@ -0,0 +1,15 @@ +package com.kone; + +import com.ruoyi.kettle.tools.KettleUtil; +import org.junit.Test; + +public class Testsetset { + + + @Test + public void test1() throws Exception { + KettleUtil.KettleEnv.init(); + KettleUtil util=new KettleUtil(); + util.callTrans("/","text",null,null); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java index 3e41606ce..eb934b55f 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java @@ -196,7 +196,7 @@ public class SysJobServiceImpl implements ISysJobService @Transactional public int insertJob(SysJob job) throws SchedulerException, TaskException { - job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + //job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.insertJob(job); if (rows > 0) { From 69815d7e44d3ef8945223371940c2c89497df462 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Fri, 23 Jul 2021 09:41:42 +0800 Subject: [PATCH 42/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Excel=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=EF=BC=88=E8=AF=A6=E7=BB=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=BE=85=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpImportQueryController.java | 96 +++++++++++--- .../com/ruoyi/bps/domain/ExpImportQuery.java | 118 ++++++++++-------- .../com/ruoyi/bps/domain/ExpressInfo.java | 36 +++++- .../bps/service/IExpressInfoService.java | 8 ++ .../service/impl/ExpressInfoServiceImpl.java | 10 +- .../mapper/bps/ExpImportQueryMapper.xml | 16 ++- .../mapper/bps/ExpressInfoMapper.xml | 52 ++++++-- .../templates/bps/expImportQuery/add.html | 8 +- .../templates/bps/expImportQuery/detail.html | 1 + .../templates/bps/expImportQuery/edit.html | 2 +- .../bps/expImportQuery/expImportQuery.html | 31 ++++- .../bps/expressInfo/expressInfo.html | 2 +- 12 files changed, 279 insertions(+), 101 deletions(-) create mode 100644 box-bps/src/main/resources/templates/bps/expImportQuery/detail.html diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java index ab3e1b576..7c727ffd5 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java @@ -1,23 +1,29 @@ package com.ruoyi.bps.controller; -import java.util.List; +import com.ruoyi.bps.domain.ExpImportQuery; +import com.ruoyi.bps.domain.ExpSubsPushResp; +import com.ruoyi.bps.domain.ExpressInfo; +import com.ruoyi.bps.service.IExpImportQueryService; +import com.ruoyi.bps.service.IExpressInfoService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ExceptionUtil; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.bps.domain.ExpImportQuery; -import com.ruoyi.bps.service.IExpImportQueryService; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; /** * Excel批量快递查询Controller @@ -34,6 +40,9 @@ public class ExpImportQueryController extends BaseController @Autowired private IExpImportQueryService expImportQueryService; + @Autowired + private IExpressInfoService expressInfoService; + @RequiresPermissions("bps:expImportQuery:view") @GetMapping() public String expImportQuery() @@ -123,4 +132,63 @@ public class ExpImportQueryController extends BaseController { return toAjax(expImportQueryService.deleteExpImportQueryByIds(ids)); } + + + /** + * 快递查询明细信息 + */ + @RequiresPermissions("bps:expImportQuery:detail") + @GetMapping("/detail/{queryId}") + public String detail(@PathVariable("queryId") String queryId, ModelMap mmap) + { + /*ExpSubsPushResp expSubsPushResp = expSubsPushRespService.selectExpSubsPushRespById(sid); + mmap.put("expSubsPushResp", expSubsPushResp);*/ + return prefix + "/detail"; + } + + + + @GetMapping ( "/importTemplate" ) + @ResponseBody + public AjaxResult importTemplate ( ) { + ExcelUtil util = new ExcelUtil<>(ExpressInfo.class); + return util.importTemplateExcel ( "快递查询导入模板" ); + } + + @PostMapping("/importData") + @ResponseBody + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + String queryTime= DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); + String queryID= LocalDateTime.now().toString(); + ExcelUtil util= new ExcelUtil(ExpressInfo.class); + List expressInfoList=util.importExcel(file.getInputStream()); + ExpImportQuery expImportQuery=new ExpImportQuery(); + try{ + for( ExpressInfo expressInfo:expressInfoList){ + ExpressInfo ei= expressInfoService.SelectExpressInfo(expressInfo); + ei.setQueryID(queryID); + ei.setQueryUserName(ShiroUtils.getSysUser().getUserName()); + ei.setQueryType("excel"); + ei.setQueryTime(queryTime); + expressInfoService.insertExpressInfo(ei); + } + + expImportQuery.setQueryTime(queryTime); + expImportQuery.setQueryLoginName(ShiroUtils.getLoginName()); + expImportQuery.setQueryUserName(ShiroUtils.getSysUser().getUserName()); + expImportQuery.setFinishTime(DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); + expImportQuery.setQueryIp(ShiroUtils.getIp()); + expImportQuery.setStatus("success"); + expImportQuery.setQueryQty(String.valueOf(expressInfoList.size())); + expImportQuery.setQueryId(queryID); + expImportQueryService.insertExpImportQuery(expImportQuery); + + return AjaxResult.success("导入查询成功!"); + }catch (Exception e){ + expImportQuery.setStatus("fail"); + return AjaxResult.error(e.getMessage()); + } + + } } diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java index 3ac9fad28..b18dde143 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpImportQuery.java @@ -18,13 +18,17 @@ public class ExpImportQuery extends BaseEntity /** sid */ private Long sid; + /** 查询ID */ + @Excel(name = "查询ID") + private String queryId; + /** 查询时间 */ @Excel(name = "查询时间") private String queryTime; /** 用户ID */ @Excel(name = "用户ID") - private String queryUserId; + private String queryLoginName; /** 用户名 */ @Excel(name = "用户名") @@ -46,90 +50,94 @@ public class ExpImportQuery extends BaseEntity @Excel(name = "运单总量") private String queryQty; - public void setSid(Long sid) - { + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public Long getSid() { + return sid; + } + + public void setSid(Long sid) { this.sid = sid; } - public Long getSid() - { - return sid; + public String getQueryId() { + return queryId; } - public void setQueryTime(String queryTime) - { + + public void setQueryId(String queryId) { + this.queryId = queryId; + } + + public String getQueryTime() { + return queryTime; + } + + public void setQueryTime(String queryTime) { this.queryTime = queryTime; } - public String getQueryTime() - { - return queryTime; - } - public void setQueryUserId(String queryUserId) - { - this.queryUserId = queryUserId; + public String getQueryLoginName() { + return queryLoginName; } - public String getQueryUserId() - { - return queryUserId; + public void setQueryLoginName(String queryLoginName) { + this.queryLoginName = queryLoginName; } - public void setQueryUserName(String queryUserName) - { + + public String getQueryUserName() { + return queryUserName; + } + + public void setQueryUserName(String queryUserName) { this.queryUserName = queryUserName; } - public String getQueryUserName() - { - return queryUserName; + public String getQueryIp() { + return queryIp; } - public void setQueryIp(String queryIp) - { + + public void setQueryIp(String queryIp) { this.queryIp = queryIp; } - public String getQueryIp() - { - return queryIp; + public String getFinishTime() { + return finishTime; } - public void setFinishTime(String finishTime) - { + + public void setFinishTime(String finishTime) { this.finishTime = finishTime; } - public String getFinishTime() - { - return finishTime; + public String getStatus() { + return status; } - public void setStatus(String status) - { + + public void setStatus(String status) { this.status = status; } - public String getStatus() - { - return status; - } - public void setQueryQty(String queryQty) - { - this.queryQty = queryQty; + public String getQueryQty() { + return queryQty; } - public String getQueryQty() - { - return queryQty; + public void setQueryQty(String queryQty) { + this.queryQty = queryQty; } @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("sid", getSid()) - .append("queryTime", getQueryTime()) - .append("queryUserId", getQueryUserId()) - .append("queryUserName", getQueryUserName()) - .append("queryIp", getQueryIp()) - .append("finishTime", getFinishTime()) - .append("status", getStatus()) - .append("queryQty", getQueryQty()) - .toString(); + return "ExpImportQuery{" + + "sid=" + sid + + ", queryId='" + queryId + '\'' + + ", queryTime='" + queryTime + '\'' + + ", queryLoginName='" + queryLoginName + '\'' + + ", queryUserName='" + queryUserName + '\'' + + ", queryIp='" + queryIp + '\'' + + ", finishTime='" + finishTime + '\'' + + ", status='" + status + '\'' + + ", queryQty='" + queryQty + '\'' + + '}'; } } diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java index e34dd86b6..90abce865 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java @@ -86,7 +86,13 @@ public class ExpressInfo extends BaseEntity /** 查询人*/ @Excel(name = "查询人",type= Excel.Type.EXPORT) - private String queryUser; + private String queryUserName; + + /** 查询ID*/ + private String queryID; + + /** 查询类型*/ + private String queryType; public void setMessage(String message) @@ -234,12 +240,12 @@ public class ExpressInfo extends BaseEntity this.queryTime = queryTime; } - public String getQueryUser() { - return queryUser; + public String getQueryUserName() { + return queryUserName; } - public void setQueryUser(String queryUser) { - this.queryUser = queryUser; + public void setQueryUserName(String queryUserName) { + this.queryUserName = queryUserName; } public String getDeliveryNum() { @@ -250,6 +256,22 @@ public class ExpressInfo extends BaseEntity this.deliveryNum = deliveryNum; } + public String getQueryID() { + return queryID; + } + + public void setQueryID(String queryID) { + this.queryID = queryID; + } + + public String getQueryType() { + return queryType; + } + + public void setQueryType(String queryType) { + this.queryType = queryType; + } + @Override public String toString() { return "ExpressInfo{" + @@ -270,7 +292,9 @@ public class ExpressInfo extends BaseEntity ", singedTime='" + singedTime + '\'' + ", lastUpdateTime='" + lastUpdateTime + '\'' + ", queryTime='" + queryTime + '\'' + - ", queryUser='" + queryUser + '\'' + + ", queryUserName='" + queryUserName + '\'' + + ", queryID='" + queryID + '\'' + + ", queryType='" + queryType + '\'' + '}'; } } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java index 90c079f32..d0a13cb8c 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java @@ -59,4 +59,12 @@ public interface IExpressInfoService * @return 结果 */ public int deleteExpressInfoById(String message); + + /** + * 查询快递信息 + * + * @param expressInfo 快递信息 + * @return 快递信息 + */ + public ExpressInfo SelectExpressInfo(ExpressInfo expressInfo); } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java index fcec56e11..37c5f105c 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java @@ -107,7 +107,8 @@ public class ExpressInfoServiceImpl implements IExpressInfoService //return expressInfoMapper.selectExpressInfoList(expressInfo); } - private ExpressInfo SelectExpressInfo(ExpressInfo expressInfo){ + @Override + public ExpressInfo SelectExpressInfo(ExpressInfo expressInfo){ String nu=expressInfo.getNu(); //快递单号 String com=expressInfo.getCom(); //快递公司 String phone=expressInfo.getPhone(); //收、寄件人电话号码 @@ -176,10 +177,10 @@ public class ExpressInfoServiceImpl implements IExpressInfoService String collectTime= queryTrackResp.getData().get(queryTrackResp.getData().size()-1).getTime(); //获取查询时间 - String queryTime= DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); + String queryTime= StringUtils.isNotEmpty(expressInfo.getQueryTime())?expressInfo.getQueryTime():DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); //获取查询人(登录用户) - String queryUser= ShiroUtils.getLoginName(); + String queryUserName= ShiroUtils.getLoginName(); //将快递信息中的Context转化为字符 String dataStr=""; @@ -190,6 +191,7 @@ public class ExpressInfoServiceImpl implements IExpressInfoService dataStr+="\r\n"; } } + String a= queryTrackResp.getCondition(); ExpressInfo callbackExpressInfo=new ExpressInfo(); callbackExpressInfo.setMessage(queryTrackResp.getMessage()); callbackExpressInfo.setNu(queryTrackResp.getNu()); @@ -207,7 +209,7 @@ public class ExpressInfoServiceImpl implements IExpressInfoService callbackExpressInfo.setCollectTime(collectTime); callbackExpressInfo.setLastUpdateTime(lastUpdateTime); callbackExpressInfo.setQueryTime(queryTime); - callbackExpressInfo.setQueryUser(queryUser); + callbackExpressInfo.setQueryUserName(queryUserName); callbackExpressInfo.setDeliveryNum(expressInfo.getDeliveryNum()); return callbackExpressInfo; diff --git a/box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml index 9cd140c00..1a405a2c7 100644 --- a/box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml +++ b/box-bps/src/main/resources/mapper/bps/ExpImportQueryMapper.xml @@ -6,8 +6,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - + @@ -16,14 +17,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select sid, queryTime, queryUserId, queryUserName, queryIp, finishTime, status, queryQty from exp_import_query + select sid, queryId, queryTime, queryLoginName, queryUserName, queryIp, finishTime, status, queryQty from exp_import_query @@ -36,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where message = #{message} - + insert into expressInfo @@ -45,14 +54,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ischeck, com, status, - data, - state, - condition, + `data`, + `state`, + `condition`, routeInfo, returnCode, - result, + `result`, phone, - + collectTime, + singedTime, + lastUpdateTime, + queryTime, + queryUserName, + queryID, + queryType, + #{message}, #{nu}, @@ -66,6 +82,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{returnCode}, #{result}, #{phone}, + #{collectTime}, + #{singedTime}, + #{lastUpdateTime}, + #{queryTime}, + #{queryUserName}, + #{queryID}, + #{queryType}, @@ -76,13 +99,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ischeck = #{ischeck}, com = #{com}, status = #{status}, - data = #{data}, - state = #{state}, - condition = #{condition}, + `data` = #{data}, + `state` = #{state}, + `condition` = #{condition}, routeInfo = #{routeInfo}, returnCode = #{returnCode}, - result = #{result}, + `result` = #{result}, phone = #{phone}, + collectTime = #{collectTime}, + singedTime = #{singedTime}, + lastUpdateTime = #{lastUpdateTime}, + queryTime = #{queryTime}, + queryUserName = #{queryUserName}, + queryID = #{queryID}, + queryType = #{queryType}, where message = #{message} diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/add.html b/box-bps/src/main/resources/templates/bps/expImportQuery/add.html index cea2ae111..fcd4d1c68 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/add.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/add.html @@ -6,6 +6,12 @@
        +
        + +
        + +
        +
        @@ -15,7 +21,7 @@
        - +
        diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html b/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html new file mode 100644 index 000000000..6dd90d24d --- /dev/null +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html @@ -0,0 +1 @@ +222 \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/edit.html b/box-bps/src/main/resources/templates/bps/expImportQuery/edit.html index a4db55aa5..47f9f625b 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/edit.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/edit.html @@ -16,7 +16,7 @@
        - +
        diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html index d4e9221e4..37a7a4eaa 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html @@ -16,7 +16,7 @@
      • - +
      • @@ -39,6 +39,9 @@
      + + 导入 + 添加 @@ -61,6 +64,7 @@ + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html index 5cb02ff5c..5b465cb04 100644 --- a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html +++ b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html @@ -161,7 +161,7 @@ title: '查询时间' }, { - field: 'queryUser', + field: 'queryUserName', title: '查询人' } /* From fb41124eeee6a9c246e922f5cd4259a2c71375e7 Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Fri, 23 Jul 2021 14:40:48 +0800 Subject: [PATCH 43/90] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E7=9A=84=E5=AE=89=E5=85=A8=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bps-kettle/pom.xml | 4 +- .../com/ruoyi/kettle/repo/XRepoManager.java | 250 +++++++++--------- .../service/impl/KettleJobServiceImpl.java | 11 +- .../service/impl/KettleTransServiceImpl.java | 18 +- .../java/com/ruoyi/kettle/tools/Constant.java | 2 +- .../com/ruoyi/kettle/tools/KettleUtil.java | 6 +- .../com/ruoyi/kettle/tools/KettleUtil_2.java | 59 +++-- .../ruoyi/kettle/tools/SpringContextUtil.java | 85 ------ 8 files changed, 183 insertions(+), 252 deletions(-) delete mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java diff --git a/bps-kettle/pom.xml b/bps-kettle/pom.xml index 3a8b0043c..d99135432 100644 --- a/bps-kettle/pom.xml +++ b/bps-kettle/pom.xml @@ -134,10 +134,10 @@ junit test - + diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java index de38be223..9775c6d77 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java @@ -21,13 +21,136 @@ import java.util.concurrent.ConcurrentHashMap; public class XRepoManager { private static final Logger log = LoggerFactory.getLogger(XRepoManager.class); - public static Map repositoryCache = new HashMap(); - public static Map databaseMeta = new ConcurrentHashMap(); + public static Map repositoryCache = new HashMap(); + public static Map databaseMeta = new ConcurrentHashMap(); public XRepoManager() { } + public static List getAllDirectoryTreeList(String repoId, Repository repository, String path, List allRepositoryTreeList) throws KettleException { + List repositoryTreeList = getJobAndTrans(repoId, repository, path); + if (repositoryTreeList.size() != 0) { + Iterator var5 = repositoryTreeList.iterator(); - public static String[] getDataBaseAccess() { + while(var5.hasNext()) { + RepositoryTree repositoryTree = (RepositoryTree)var5.next(); + if (!repositoryTree.isLasted()) { + getAllDirectoryTreeList(repoId, repository, repositoryTree.getPath(), allRepositoryTreeList); + allRepositoryTreeList.add(repositoryTree); + } else { + allRepositoryTreeList.add(repositoryTree); + } + } + } + + return allRepositoryTreeList; + } + public static List getJobAndTrans(String repoId, Repository repository, String path) throws KettleException { + RepositoryDirectoryInterface rDirectory = repository.loadRepositoryDirectoryTree().findDirectory(path); + List repositoryTreeList = getDirectory(repoId, repository, rDirectory); + List li = repository.getJobAndTransformationObjects(rDirectory.getObjectId(), false); + if (null != li) { + Iterator var6 = li.iterator(); + + while(var6.hasNext()) { + RepositoryElementMetaInterface repel = (RepositoryElementMetaInterface)var6.next(); + RepositoryTree repositoryTree; + StringBuilder stringBuilder; + if ("job".equals(repel.getObjectType().toString())) { + repositoryTree = new RepositoryTree(); + stringBuilder = new StringBuilder(); + stringBuilder.append("job").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); + repositoryTree.setId(stringBuilder.toString()); + repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); + repositoryTree.setText(repel.getName()); + if (repository instanceof KettleDatabaseRepository) { + repositoryTree.setType(repoId + "@db@" + "job"); + } else if (repository instanceof KettleFileRepository) { + repositoryTree.setType(repoId + "@file@" + "job"); + } + + repositoryTree.setLasted(true); + repositoryTree.setPath(repel.getRepositoryDirectory().getPath()); + repositoryTreeList.add(repositoryTree); + } else if ("transformation".equals(repel.getObjectType().toString())) { + repositoryTree = new RepositoryTree(); + stringBuilder = new StringBuilder(); + stringBuilder.append("transformation").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); + repositoryTree.setId(stringBuilder.toString()); + repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); + repositoryTree.setText(repel.getName()); + if (repository instanceof KettleDatabaseRepository) { + repositoryTree.setType(repoId + "@db@" + "transformation"); + } else if (repository instanceof KettleFileRepository) { + repositoryTree.setType(repoId + "@file@" + "transformation"); + } + + repositoryTree.setLasted(true); + repositoryTree.setPath(repel.getRepositoryDirectory().getPath()); + repositoryTreeList.add(repositoryTree); + } + } + } + + return repositoryTreeList; + } + private static List getDirectory(String repoId, Repository repository, RepositoryDirectoryInterface rDirectory) throws KettleException { + List repositoryTreeList = new ArrayList(); + if (null != repository && null != rDirectory) { + RepositoryDirectoryInterface tree = repository.loadRepositoryDirectoryTree().findDirectory(rDirectory.getObjectId()); + if (rDirectory.getNrSubdirectories() > 0) { + for(int i = 0; i < rDirectory.getNrSubdirectories(); ++i) { + RepositoryDirectory subTree = tree.getSubdirectory(i); + RepositoryTree repositoryTree = new RepositoryTree(); + repositoryTree.setId(repoId + "@" + subTree.getObjectId().toString()); + repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); + repositoryTree.setText(subTree.getName()); + repositoryTree.setPath(subTree.getPath()); + repositoryTree.setType("subTree"); + List RepositoryElementMetaInterfaceList = repository.getJobAndTransformationObjects(subTree.getObjectId(), false); + if (subTree.getNrSubdirectories() <= 0 && RepositoryElementMetaInterfaceList.size() <= 0) { + repositoryTree.setLasted(true); + } else { + repositoryTree.setLasted(false); + } + + repositoryTreeList.add(repositoryTree); + } + } + } + + return repositoryTreeList; + } + public static Repository createRep(BaseRepositoryMeta baseRepositoryMeta, String id) throws KettleException { + if (get(id) != null) { + return get(id); + } else { + Repository repo = null; + if (baseRepositoryMeta instanceof KettleDatabaseRepositoryMeta) { + repo = new KettleDatabaseRepository(); + ((Repository)repo).init((KettleDatabaseRepositoryMeta)baseRepositoryMeta); + } else { + repo = new KettleFileRepository(); + ((Repository)repo).init((KettleFileRepositoryMeta)baseRepositoryMeta); + } + + repositoryCache.put(id, repo); + log.info(((Repository)repo).getName() + "资源库初始化成功"); + return (Repository)repo; + } + } + + public static Repository createFileRep(String repoId, String repName, String description, String baseDirectory) throws KettleException { + if (!KettleEnvironment.isInitialized()) { + KettleEnvironment.init(); + } + + KettleFileRepositoryMeta fileRepMeta = new KettleFileRepositoryMeta(repoId, repName, description, baseDirectory); + return createRep(fileRepMeta, repoId); + } + private static Repository get(String repoId) { + return (Repository)repositoryCache.get(repoId); + } + /* public static String[] getDataBaseAccess() { String[] dataBaseAccess = DatabaseMeta.dbAccessTypeCode; return dataBaseAccess; } @@ -76,37 +199,9 @@ public class XRepoManager { return dm; } - private static Repository get(String repoId) { - return (Repository)repositoryCache.get(repoId); - } - public static Repository createRep(BaseRepositoryMeta baseRepositoryMeta, String id) throws KettleException { - if (get(id) != null) { - return get(id); - } else { - Repository repo = null; - if (baseRepositoryMeta instanceof KettleDatabaseRepositoryMeta) { - repo = new KettleDatabaseRepository(); - ((Repository)repo).init((KettleDatabaseRepositoryMeta)baseRepositoryMeta); - } else { - repo = new KettleFileRepository(); - ((Repository)repo).init((KettleFileRepositoryMeta)baseRepositoryMeta); - } - repositoryCache.put(id, repo); - log.info(((Repository)repo).getName() + "资源库初始化成功"); - return (Repository)repo; - } - } - public static Repository createFileRep(String repoId, String repName, String description, String baseDirectory) throws KettleException { - if (!KettleEnvironment.isInitialized()) { - KettleEnvironment.init(); - } - - KettleFileRepositoryMeta fileRepMeta = new KettleFileRepositoryMeta(repoId, repName, description, baseDirectory); - return createRep(fileRepMeta, repoId); - } public static Repository createDBRepByJndi(String repoId, String name, String type, String db) throws KettleException { return createBaseMetaRep(repoId, (String)null, (String)null, (JSONObject)null, name, type, DatabaseMeta.dbAccessTypeCode[4], (String)null, db, (String)null, (String)null, (String)null); @@ -163,100 +258,9 @@ public class XRepoManager { repositoryCache.clear(); } - public static List getAllDirectoryTreeList(String repoId, Repository repository, String path, List allRepositoryTreeList) throws KettleException { - List repositoryTreeList = getJobAndTrans(repoId, repository, path); - if (repositoryTreeList.size() != 0) { - Iterator var5 = repositoryTreeList.iterator(); - while(var5.hasNext()) { - RepositoryTree repositoryTree = (RepositoryTree)var5.next(); - if (!repositoryTree.isLasted()) { - getAllDirectoryTreeList(repoId, repository, repositoryTree.getPath(), allRepositoryTreeList); - allRepositoryTreeList.add(repositoryTree); - } else { - allRepositoryTreeList.add(repositoryTree); - } - } - } - return allRepositoryTreeList; - } - public static List getJobAndTrans(String repoId, Repository repository, String path) throws KettleException { - RepositoryDirectoryInterface rDirectory = repository.loadRepositoryDirectoryTree().findDirectory(path); - List repositoryTreeList = getDirectory(repoId, repository, rDirectory); - List li = repository.getJobAndTransformationObjects(rDirectory.getObjectId(), false); - if (null != li) { - Iterator var6 = li.iterator(); - while(var6.hasNext()) { - RepositoryElementMetaInterface repel = (RepositoryElementMetaInterface)var6.next(); - RepositoryTree repositoryTree; - StringBuilder stringBuilder; - if ("job".equals(repel.getObjectType().toString())) { - repositoryTree = new RepositoryTree(); - stringBuilder = new StringBuilder(); - stringBuilder.append("job").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); - repositoryTree.setId(stringBuilder.toString()); - repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); - repositoryTree.setText(repel.getName()); - if (repository instanceof KettleDatabaseRepository) { - repositoryTree.setType(repoId + "@db@" + "job"); - } else if (repository instanceof KettleFileRepository) { - repositoryTree.setType(repoId + "@file@" + "job"); - } - - repositoryTree.setLasted(true); - repositoryTree.setPath(repel.getRepositoryDirectory().getPath()); - repositoryTreeList.add(repositoryTree); - } else if ("transformation".equals(repel.getObjectType().toString())) { - repositoryTree = new RepositoryTree(); - stringBuilder = new StringBuilder(); - stringBuilder.append("transformation").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); - repositoryTree.setId(stringBuilder.toString()); - repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); - repositoryTree.setText(repel.getName()); - if (repository instanceof KettleDatabaseRepository) { - repositoryTree.setType(repoId + "@db@" + "transformation"); - } else if (repository instanceof KettleFileRepository) { - repositoryTree.setType(repoId + "@file@" + "transformation"); - } - - repositoryTree.setLasted(true); - repositoryTree.setPath(repel.getRepositoryDirectory().getPath()); - repositoryTreeList.add(repositoryTree); - } - } - } - - return repositoryTreeList; - } - - private static List getDirectory(String repoId, Repository repository, RepositoryDirectoryInterface rDirectory) throws KettleException { - List repositoryTreeList = new ArrayList(); - if (null != repository && null != rDirectory) { - RepositoryDirectoryInterface tree = repository.loadRepositoryDirectoryTree().findDirectory(rDirectory.getObjectId()); - if (rDirectory.getNrSubdirectories() > 0) { - for(int i = 0; i < rDirectory.getNrSubdirectories(); ++i) { - RepositoryDirectory subTree = tree.getSubdirectory(i); - RepositoryTree repositoryTree = new RepositoryTree(); - repositoryTree.setId(repoId + "@" + subTree.getObjectId().toString()); - repositoryTree.setParent(repoId + "@" + rDirectory.getObjectId().toString()); - repositoryTree.setText(subTree.getName()); - repositoryTree.setPath(subTree.getPath()); - repositoryTree.setType("subTree"); - List RepositoryElementMetaInterfaceList = repository.getJobAndTransformationObjects(subTree.getObjectId(), false); - if (subTree.getNrSubdirectories() <= 0 && RepositoryElementMetaInterfaceList.size() <= 0) { - repositoryTree.setLasted(true); - } else { - repositoryTree.setLasted(false); - } - - repositoryTreeList.add(repositoryTree); - } - } - } - - return repositoryTreeList; - } + */ } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java index cd7d71f53..2a1451d99 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.kettle.service.impl; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -56,8 +57,14 @@ public class KettleJobServiceImpl implements IKettleJobService @Override public List selectKettleJobList(KettleJob kettleJob) { - List roleList = (List) PermissionUtils.getPrincipalProperty("roles"); - //当前用户的roleKey + Object o=PermissionUtils.getPrincipalProperty("roles"); + List roleList=new ArrayList<>(); + // roleList= (List) PermissionUtils.getPrincipalProperty("roles"); + if(o != null && o instanceof List){ + for(Object r:(List)o){ + roleList.add(SysRole.class.cast(r)); + } + } //当前用户的roleKey List roleKeys=roleList.stream().map(SysRole::getRoleKey).collect(Collectors.toList()); return kettleJobMapper.selectKettleJobList(kettleJob,roleKeys); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java index 377c2fd5c..a856baf84 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java @@ -1,8 +1,7 @@ package com.ruoyi.kettle.service.impl; +import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import com.ruoyi.common.core.domain.AjaxResult; @@ -13,11 +12,7 @@ import com.ruoyi.kettle.domain.XRepository; import com.ruoyi.kettle.mapper.XRepositoryMapper; import com.ruoyi.kettle.service.IKettleTransService; import com.ruoyi.kettle.tools.KettleUtil; -import lombok.extern.slf4j.Slf4j; -import org.pentaho.di.repository.Repository; -import org.pentaho.di.trans.Trans; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.ruoyi.kettle.mapper.KettleTransMapper; import com.ruoyi.kettle.domain.KettleTrans; @@ -30,7 +25,6 @@ import com.ruoyi.common.core.text.Convert; * @date 2021-07-14 */ @Service("kettleTransServiceImpl") -@Slf4j public class KettleTransServiceImpl implements IKettleTransService { @Autowired @@ -62,7 +56,15 @@ public class KettleTransServiceImpl implements IKettleTransService @Override public List selectKettleTransList(KettleTrans kettleTrans) { - List roleList = (List) PermissionUtils.getPrincipalProperty("roles"); + Object o=PermissionUtils.getPrincipalProperty("roles"); + List roleList=new ArrayList<>(); + // roleList= (List) PermissionUtils.getPrincipalProperty("roles"); + if(o != null && o instanceof List){ + for(Object r:(List)o){ + roleList.add(SysRole.class.cast(r)); + } + } + //当前用户的roleKey List roleKeys=roleList.stream().map(SysRole::getRoleKey).collect(Collectors.toList()); diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java index 660d4e261..cad202178 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/Constant.java @@ -135,7 +135,7 @@ public class Constant extends Const { } public static Map getQuartzBasic(String name, String path) { - Map quartzBasic = new HashMap(); + Map quartzBasic = new HashMap(); StringBuilder jobName = new StringBuilder(); jobName.append("JOB").append("@").append(name).append("@").append(path); StringBuilder jobGroupName = new StringBuilder(); diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java index 381229457..38a230e1e 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java @@ -1,6 +1,6 @@ package com.ruoyi.kettle.tools; -import lombok.extern.slf4j.Slf4j; +import com.ruoyi.common.config.datasource.DynamicDataSourceContextHolder; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; @@ -15,14 +15,16 @@ import org.pentaho.di.repository.filerep.KettleFileRepository; import org.pentaho.di.repository.filerep.KettleFileRepositoryMeta; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; import java.util.Iterator; import java.util.Map; -@Slf4j @Component public class KettleUtil { + public static final Logger log = LoggerFactory.getLogger(KettleUtil.class); public String KETTLE_LOG_LEVEL = "basic"; diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java index 60bf26356..5b1132613 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil_2.java @@ -58,7 +58,7 @@ import java.util.concurrent.ConcurrentHashMap; public class KettleUtil_2 { private static final Logger log = LoggerFactory.getLogger(KettleUtil_2.class); - public static Map holder = new ConcurrentHashMap(); + public static Map holder = new ConcurrentHashMap(); public static Map getHolder() { return holder; @@ -70,8 +70,34 @@ public class KettleUtil_2 { public KettleUtil_2() { } + public static Repository conFileRep(String repoId, String repoName, String baseDirectory) throws KettleException { + if (holder.containsKey(repoId)) { + return (Repository)holder.get(repoId); + } else { + XRepoManager.createFileRep(repoId, repoName, "文件资源库", baseDirectory); + Repository repository = connect(repoId); + if (null != repository) { + holder.put(repoId, repository); + return repository; + } else { + return null; + } + } + } + public static Repository connect(String repoId) throws KettleSecurityException, KettleException { + return connect(repoId, (String)null, (String)null); + } - public static Repository conByJndi(String repoId, String name, String db, String type, String kuser, String kpass) throws Exception { + public static Repository connect(String repoId, String username, String password) throws KettleSecurityException, KettleException { + Repository repository = (Repository)XRepoManager.repositoryCache.get(repoId); + if (!repository.isConnected()) { + repository.connect(username, password); + log.info(repository.getName() + "资源库已连接!"); + } + + return repository; + } + /*public static Repository conByJndi(String repoId, String name, String db, String type, String kuser, String kpass) throws Exception { testConnect(repoId); if (holder.containsKey(repoId)) { return (Repository)holder.get(repoId); @@ -87,20 +113,7 @@ public class KettleUtil_2 { } } - public static Repository conFileRep(String repoId, String repoName, String baseDirectory) throws KettleException { - if (holder.containsKey(repoId)) { - return (Repository)holder.get(repoId); - } else { - XRepoManager.createFileRep(repoId, repoName, "文件资源库", baseDirectory); - Repository repository = connect(repoId); - if (null != repository) { - holder.put(repoId, repository); - return repository; - } else { - return null; - } - } - } + public static Repository conByNative(String repoId, String repoName, String name, String type, String host, String port, String db, String user, String pass, String kuser, String kpass) throws KettleException { testConnect(repoId); @@ -142,19 +155,7 @@ public class KettleUtil_2 { } } - public static Repository connect(String repoId) throws KettleSecurityException, KettleException { - return connect(repoId, (String)null, (String)null); - } - public static Repository connect(String repoId, String username, String password) throws KettleSecurityException, KettleException { - Repository repository = (Repository)XRepoManager.repositoryCache.get(repoId); - if (!repository.isConnected()) { - repository.connect(username, password); - log.info(repository.getName() + "资源库已连接!"); - } - - return repository; - } public static void setRepository(Repository repository) { } @@ -731,5 +732,5 @@ public class KettleUtil_2 { } } - } + }*/ } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java deleted file mode 100644 index 9ccbbfed9..000000000 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/SpringContextUtil.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.ruoyi.kettle.tools; - - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanFactoryPostProcessor; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.util.Iterator; -import java.util.Map; - -@Component -public class SpringContextUtil implements BeanFactoryPostProcessor, ApplicationContextAware { - private static ConfigurableListableBeanFactory beanFactory; - private static ApplicationContext context = null; - - private SpringContextUtil() { - } - - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - context = applicationContext; - } - - public static T getBean(String beanName) { - return (T) beanFactory.getBean(beanName); - } - - public static T getBean(String beanName, Class clazz) { - return beanFactory.getBean(beanName, clazz); - } - - public static T getBean(Class clazz) { - T t = null; - Map map = beanFactory.getBeansOfType(clazz); - - Map.Entry entry; - for(Iterator var3 = map.entrySet().iterator(); var3.hasNext(); - t = (T) entry.getValue()) { - entry = (Map.Entry)var3.next(); - } - - return t; - } - - public static boolean containsBean(String beanName) { - return beanFactory.containsBean(beanName); - } - - public static boolean isSingleton(String beanName) { - return beanFactory.isSingleton(beanName); - } - - public static Class getType(String beanName) { - return beanFactory.getType(beanName); - } - - public static HttpServletResponse getResponse() { - return getServletRequestAttributes().getResponse(); - } - - public static HttpServletRequest getRequest() { - return getServletRequestAttributes().getRequest(); - } - - public static ServletRequestAttributes getServletRequestAttributes() { - RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - return (ServletRequestAttributes)requestAttributes; - } - - public static HttpSession getSession() { - return getRequest().getSession(); - } - - public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { - beanFactory = configurableListableBeanFactory; - } -} From 9f63b7bf24e96146bc877df8784aabd770b03477 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Fri, 23 Jul 2021 17:49:37 +0800 Subject: [PATCH 44/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Excel=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=EF=BC=88=E8=AF=A6=E7=BB=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?-=E8=BF=9B=E8=A1=8C=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpImportQueryController.java | 38 ++++- .../bps/controller/ExpressInfoController.java | 14 ++ .../com/ruoyi/bps/domain/ExpressInfo.java | 144 ++++++++---------- .../bps/service/IExpressInfoService.java | 10 +- .../service/impl/ExpressInfoServiceImpl.java | 11 ++ .../mapper/bps/ExpressInfoMapper.xml | 11 +- .../templates/bps/expImportQuery/add.html | 2 +- .../templates/bps/expImportQuery/detail.html | 140 ++++++++++++++++- .../bps/expImportQuery/expImportQuery.html | 4 +- 9 files changed, 278 insertions(+), 96 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java index 7c727ffd5..0ae4890ce 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java @@ -3,6 +3,7 @@ package com.ruoyi.bps.controller; import com.ruoyi.bps.domain.ExpImportQuery; import com.ruoyi.bps.domain.ExpSubsPushResp; import com.ruoyi.bps.domain.ExpressInfo; +import com.ruoyi.bps.mapper.ExpressInfoMapper; import com.ruoyi.bps.service.IExpImportQueryService; import com.ruoyi.bps.service.IExpressInfoService; import com.ruoyi.common.annotation.Log; @@ -43,6 +44,9 @@ public class ExpImportQueryController extends BaseController @Autowired private IExpressInfoService expressInfoService; + @Autowired + private ExpressInfoMapper expressInfoMapper; + @RequiresPermissions("bps:expImportQuery:view") @GetMapping() public String expImportQuery() @@ -77,6 +81,21 @@ public class ExpImportQueryController extends BaseController return util.exportExcel(list, "Excel批量快递查询数据"); } + + /** + * 导出Excel批量快递查询列表 + */ + @RequiresPermissions("bps:expImportQuery:export") + @Log(title = "详细快递信息导出", businessType = BusinessType.EXPORT) + @PostMapping("/exportDetail") + @ResponseBody + public AjaxResult exportDetail(ExpressInfo expressInfo) + { + List list = expressInfoService.selectLocalExpressInfoList(expressInfo); + ExcelUtil util = new ExcelUtil(ExpressInfo.class); + return util.exportExcel(list, "Excel批量快递查询数据"); + } + /** * 新增Excel批量快递查询 */ @@ -138,11 +157,16 @@ public class ExpImportQueryController extends BaseController * 快递查询明细信息 */ @RequiresPermissions("bps:expImportQuery:detail") - @GetMapping("/detail/{queryId}") - public String detail(@PathVariable("queryId") String queryId, ModelMap mmap) + @GetMapping("/detail/{sid}") + public String detail(@PathVariable("sid") Long sid, ModelMap mmap) { - /*ExpSubsPushResp expSubsPushResp = expSubsPushRespService.selectExpSubsPushRespById(sid); - mmap.put("expSubsPushResp", expSubsPushResp);*/ + /*ExpImportQuery expImportQuery = expImportQueryService.selectExpImportQueryById(sid); + mmap.put("expImportQuery", expImportQuery);*/ + + String queryId = expImportQueryService.selectExpImportQueryById(sid).getQueryId(); + ExpressInfo expressInfo= new ExpressInfo(); + expressInfo.setQueryId(queryId); + mmap.put("expressInfo",expressInfo); return prefix + "/detail"; } @@ -160,14 +184,14 @@ public class ExpImportQueryController extends BaseController public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { String queryTime= DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); - String queryID= LocalDateTime.now().toString(); + String queryId= LocalDateTime.now().toString(); ExcelUtil util= new ExcelUtil(ExpressInfo.class); List expressInfoList=util.importExcel(file.getInputStream()); ExpImportQuery expImportQuery=new ExpImportQuery(); try{ for( ExpressInfo expressInfo:expressInfoList){ ExpressInfo ei= expressInfoService.SelectExpressInfo(expressInfo); - ei.setQueryID(queryID); + ei.setQueryId(queryId); ei.setQueryUserName(ShiroUtils.getSysUser().getUserName()); ei.setQueryType("excel"); ei.setQueryTime(queryTime); @@ -181,7 +205,7 @@ public class ExpImportQueryController extends BaseController expImportQuery.setQueryIp(ShiroUtils.getIp()); expImportQuery.setStatus("success"); expImportQuery.setQueryQty(String.valueOf(expressInfoList.size())); - expImportQuery.setQueryId(queryID); + expImportQuery.setQueryId(queryId); expImportQueryService.insertExpImportQuery(expImportQuery); return AjaxResult.success("导入查询成功!"); diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java index fc2474be1..93f7e921f 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpressInfoController.java @@ -55,6 +55,20 @@ public class ExpressInfoController extends BaseController return getDataTable(list); } + /** + * 查询快递信息列表 + */ + @RequiresPermissions("bps:expressInfo:list") + @PostMapping("/localList") + @ResponseBody + public TableDataInfo localList(ExpressInfo expressInfo) + { + startPage(); + List list = expressInfoService.selectLocalExpressInfoList(expressInfo); + + return getDataTable(list); + } + /** * 导出快递信息列表 */ diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java index 90abce865..400f41032 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java @@ -89,123 +89,117 @@ public class ExpressInfo extends BaseEntity private String queryUserName; /** 查询ID*/ - private String queryID; + private String queryId; /** 查询类型*/ private String queryType; + public static long getSerialVersionUID() { + return serialVersionUID; + } - public void setMessage(String message) - { + public String getMessage() { + return message; + } + + public void setMessage(String message) { this.message = message; } - public String getMessage() - { - return message; + public String getDeliveryNum() { + return deliveryNum; } - public void setNu(String nu) - { + + public void setDeliveryNum(String deliveryNum) { + this.deliveryNum = deliveryNum; + } + + public String getNu() { + return nu; + } + + public void setNu(String nu) { this.nu = nu; } - public String getNu() - { - return nu; + public String getIscheck() { + return ischeck; } - public void setIscheck(String ischeck) - { + + public void setIscheck(String ischeck) { this.ischeck = ischeck; } - public String getIscheck() - { - return ischeck; + public String getCom() { + return com; } - public void setCom(String com) - { + + public void setCom(String com) { this.com = com; } - public String getCom() - { - return com; + public String getStatus() { + return status; } - public void setStatus(String status) - { + + public void setStatus(String status) { this.status = status; } - public String getStatus() - { - return status; + public String getData() { + return data; } - public void setData(String data) - { + + public void setData(String data) { this.data = data; } - public String getData() - { - return data; + public String getState() { + return state; } - public void setState(String state) - { + + public void setState(String state) { this.state = state; } - public String getState() - { - return state; + public String getCondition() { + return condition; } - public void setCondition(String condition) - { + + public void setCondition(String condition) { this.condition = condition; } - public String getCondition() - { - return condition; + public String getRouteInfo() { + return routeInfo; } - public void setRouteInfo(String routeInfo) - { + + public void setRouteInfo(String routeInfo) { this.routeInfo = routeInfo; } - public String getRouteInfo() - { - return routeInfo; + public String getReturnCode() { + return returnCode; } - public void setReturnCode(String returnCode) - { + + public void setReturnCode(String returnCode) { this.returnCode = returnCode; } - public String getReturnCode() - { - return returnCode; + public String getResult() { + return result; } - public void setResult(String result) - { + + public void setResult(String result) { this.result = result; } - public String getResult() - { - return result; - } - public void setPhone(String phone) - { - this.phone = phone; - } - - public String getPhone() - { + public String getPhone() { return phone; } - public static long getSerialVersionUID() { - return serialVersionUID; + public void setPhone(String phone) { + this.phone = phone; } public String getCollectTime() { @@ -248,20 +242,12 @@ public class ExpressInfo extends BaseEntity this.queryUserName = queryUserName; } - public String getDeliveryNum() { - return deliveryNum; + public String getQueryId() { + return queryId; } - public void setDeliveryNum(String deliveryNum) { - this.deliveryNum = deliveryNum; - } - - public String getQueryID() { - return queryID; - } - - public void setQueryID(String queryID) { - this.queryID = queryID; + public void setQueryId(String queryId) { + this.queryId = queryId; } public String getQueryType() { @@ -293,7 +279,7 @@ public class ExpressInfo extends BaseEntity ", lastUpdateTime='" + lastUpdateTime + '\'' + ", queryTime='" + queryTime + '\'' + ", queryUserName='" + queryUserName + '\'' + - ", queryID='" + queryID + '\'' + + ", queryId='" + queryId + '\'' + ", queryType='" + queryType + '\'' + '}'; } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java index d0a13cb8c..48c284c68 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpressInfoService.java @@ -21,11 +21,19 @@ public interface IExpressInfoService public ExpressInfo selectExpressInfoById(String message); /** - * 查询快递信息列表 + * 查询本地快递信息列表 * * @param expressInfo 快递信息 * @return 快递信息集合 */ + public List selectLocalExpressInfoList(ExpressInfo expressInfo); + + /** + * 查询本地快递信息列表 + * + * @param expressInfo 快递信息 + * @return 快递信息集合 + */ public List selectExpressInfoList(ExpressInfo expressInfo); /** diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java index 37c5f105c..6e1f80630 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java @@ -72,6 +72,17 @@ public class ExpressInfoServiceImpl implements IExpressInfoService return expressInfoMapper.selectExpressInfoById(message); } + /** + * 查询本地快递信息列表 + * + * @param expressInfo 快递信息 + * @return 快递信息集合 + */ + @Override + public List selectLocalExpressInfoList(ExpressInfo expressInfo) { + return expressInfoMapper.selectExpressInfoList(expressInfo); + } + /** * 查询快递信息列表 * diff --git a/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml index 04f6adf4e..cb1805b0f 100644 --- a/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml +++ b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml @@ -22,13 +22,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + select message, nu, ischeck, com, status, `data`, `state`, `condition`, routeInfo, returnCode, `result`, phone, - collectTime, singedTime, lastUpdateTime, queryTime, queryUserName, queryID, queryType + collectTime, singedTime, lastUpdateTime, queryTime, queryUserName, queryId, queryType from expressInfo @@ -38,6 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and nu = #{nu} and com = #{com} and phone = #{phone} + and queryId = #{queryId} @@ -66,7 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" lastUpdateTime, queryTime, queryUserName, - queryID, + queryId, queryType, @@ -87,7 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{lastUpdateTime}, #{queryTime}, #{queryUserName}, - #{queryID}, + #{queryId}, #{queryType}, @@ -111,7 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" lastUpdateTime = #{lastUpdateTime}, queryTime = #{queryTime}, queryUserName = #{queryUserName}, - queryID = #{queryID}, + queryId = #{queryId}, queryType = #{queryType}, where message = #{message} diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/add.html b/box-bps/src/main/resources/templates/bps/expImportQuery/add.html index fcd4d1c68..fb3398328 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/add.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/add.html @@ -9,7 +9,7 @@
      - +
      diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html b/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html index 6dd90d24d..848535ec6 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html @@ -1 +1,139 @@ -222 \ No newline at end of file + + + + + + +
      +
      +
      + +
      +
        +
      • + + +
      • +
      +
      + +
      + + +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html index 37a7a4eaa..c489c82a5 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html @@ -74,7 +74,7 @@ createUrl: prefix + "/add", updateUrl: prefix + "/edit/{id}", removeUrl: prefix + "/remove", - detailUrl: prefix + "/detail/{queryId}", + detailUrl: prefix + "/detail/{id}", exportUrl: prefix + "/export", importUrl: prefix + "/importData", importTemplateUrl: prefix + "/importTemplate", @@ -127,7 +127,7 @@ align: 'center', formatter: function(value, row, index) { var actions = []; - actions.push('详细 '); + actions.push('详细 '); actions.push('编辑 '); actions.push('删除'); return actions.join(''); From 67cfa2b1d60fb6b8a5ca36db0b1d06b9a1a1fe66 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Sat, 24 Jul 2021 18:40:40 +0800 Subject: [PATCH 45/90] =?UTF-8?q?1=E3=80=81Excel=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=BF=AB=E9=80=92=E6=9F=A5=E8=AF=A2=E5=AF=BC=E5=87=BA=E5=AE=8C?= =?UTF-8?q?=E6=88=90=202=E3=80=81=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8selec?= =?UTF-8?q?t2=E4=B8=8B=E6=8B=89=E6=A1=86=EF=BC=8C=E9=87=8D=E7=BD=AE?= =?UTF-8?q?=E5=80=BC=E4=B8=8D=E6=94=B9=E5=8F=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpImportQueryController.java | 18 ++++++++---------- .../templates/bps/expImportQuery/detail.html | 4 ++-- .../bps/expImportQuery/expImportQuery.html | 4 ++-- .../templates/bps/expressInfo/expressInfo.html | 4 ++-- .../bps/expsubspushresp/expsubspushresp.html | 11 ++++++++--- .../templates/bps/subscribe/subscribe.html | 9 +++++++-- ruoyi-admin/src/main/resources/application.yml | 2 +- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java index 0ae4890ce..84d2a6f6c 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpImportQueryController.java @@ -18,6 +18,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -85,7 +86,7 @@ public class ExpImportQueryController extends BaseController /** * 导出Excel批量快递查询列表 */ - @RequiresPermissions("bps:expImportQuery:export") + @RequiresPermissions("bps:expressInfo:export") @Log(title = "详细快递信息导出", businessType = BusinessType.EXPORT) @PostMapping("/exportDetail") @ResponseBody @@ -160,9 +161,6 @@ public class ExpImportQueryController extends BaseController @GetMapping("/detail/{sid}") public String detail(@PathVariable("sid") Long sid, ModelMap mmap) { - /*ExpImportQuery expImportQuery = expImportQueryService.selectExpImportQueryById(sid); - mmap.put("expImportQuery", expImportQuery);*/ - String queryId = expImportQueryService.selectExpImportQueryById(sid).getQueryId(); ExpressInfo expressInfo= new ExpressInfo(); expressInfo.setQueryId(queryId); @@ -190,12 +188,12 @@ public class ExpImportQueryController extends BaseController ExpImportQuery expImportQuery=new ExpImportQuery(); try{ for( ExpressInfo expressInfo:expressInfoList){ - ExpressInfo ei= expressInfoService.SelectExpressInfo(expressInfo); - ei.setQueryId(queryId); - ei.setQueryUserName(ShiroUtils.getSysUser().getUserName()); - ei.setQueryType("excel"); - ei.setQueryTime(queryTime); - expressInfoService.insertExpressInfo(ei); + ExpressInfo ei= expressInfoService.SelectExpressInfo(expressInfo); + ei.setQueryId(queryId); + ei.setQueryUserName(ShiroUtils.getSysUser().getUserName()); + ei.setQueryType("excel"); + ei.setQueryTime(queryTime); + expressInfoService.insertExpressInfo(ei); } expImportQuery.setQueryTime(queryTime); diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html b/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html index 848535ec6..d0b2a4496 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/detail.html @@ -20,7 +20,7 @@
      @@ -41,7 +41,7 @@ $(function() { var options = { url: prefix + "/localList", - exportUrl: prefix + "/exportDetail", + exportUrl: ctx+ "bps/expImportQuery/exportDetail", modalName: "快递信息", columns: [{ checkbox: true diff --git a/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html index c489c82a5..c8f1778cc 100644 --- a/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html +++ b/box-bps/src/main/resources/templates/bps/expImportQuery/expImportQuery.html @@ -42,7 +42,7 @@ 导入 - +
      @@ -220,6 +220,11 @@ }; $.table.init(options); }); + + function reset(){ + $('.form-control').val(null).trigger('change'); + $.form.reset(); + } \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html index 1520a1125..6c20e4111 100644 --- a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html +++ b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html @@ -14,7 +14,7 @@
    @@ -61,6 +64,7 @@ + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html index 5cb02ff5c..04a3a4e21 100644 --- a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html +++ b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html @@ -45,12 +45,12 @@ 删除 --> - +
    @@ -220,6 +220,11 @@ }; $.table.init(options); }); + + function reset(){ + $('.form-control').val(null).trigger('change'); + $.form.reset(); + } \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html index 1520a1125..6c20e4111 100644 --- a/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html +++ b/box-bps/src/main/resources/templates/bps/subscribe/subscribe.html @@ -14,7 +14,7 @@
    • 快递公司: - @@ -45,7 +45,7 @@
    • -->
    •  搜索 -  重置 +  重置
    • 提示:仅允许导入“xls”或“xlsx”格式文件! diff --git a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html index 04a3a4e21..3b190cb30 100644 --- a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html +++ b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html @@ -27,7 +27,7 @@
    • -  搜索 + 实时查询  重置
    From bbdd968254786c9a4a43ee39745dd7b946cab7c4 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Sun, 25 Jul 2021 10:46:41 +0800 Subject: [PATCH 49/90] =?UTF-8?q?1=E3=80=81=E6=8F=90=E5=8D=87Excel?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=95=B0=E6=8D=AE=E8=A1=A8expressInfo=E7=9A=84?= =?UTF-8?q?=E6=95=88=E7=8E=87=202=E3=80=81expressInfo=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=87=AA=E5=A2=9E=E9=95=BFID=EF=BC=8Csid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/bps/domain/ExpressInfo.java | 14 ++++++++- .../ruoyi/bps/mapper/ExpressInfoMapper.java | 8 +++++ .../impl/ExpImportQueryServiceImpl.java | 13 ++++++-- .../mapper/bps/ExpressInfoMapper.xml | 21 ++++++++++--- .../bps/expressInfo/expressInfo.html | 30 +++++++++++++------ 5 files changed, 70 insertions(+), 16 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java index 400f41032..fdd8384e4 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpressInfo.java @@ -15,6 +15,9 @@ public class ExpressInfo extends BaseEntity { private static final long serialVersionUID = 1L; + /** 消息 */ + private String sid; + /** 消息 */ @Excel(name = "消息",type= Excel.Type.EXPORT) private String message; @@ -98,6 +101,14 @@ public class ExpressInfo extends BaseEntity return serialVersionUID; } + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + public String getMessage() { return message; } @@ -261,7 +272,8 @@ public class ExpressInfo extends BaseEntity @Override public String toString() { return "ExpressInfo{" + - "message='" + message + '\'' + + "sid='" + sid + '\'' + + ", message='" + message + '\'' + ", deliveryNum='" + deliveryNum + '\'' + ", nu='" + nu + '\'' + ", ischeck='" + ischeck + '\'' + diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java index 4dede87d7..9abb35afb 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java @@ -61,4 +61,12 @@ public interface ExpressInfoMapper * @return 结果 */ public int deleteExpressInfoByIds(String[] messages); + + /** + * 批量新增快递信息 + * + * @param expressInfoList 角色菜单列表 + * @return 结果 + */ + public int batchInsertExpressInfo(List expressInfoList); } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java index 032407c36..7ab9b07e7 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java @@ -3,6 +3,7 @@ package com.ruoyi.bps.service.impl; import com.ruoyi.bps.domain.ExpImportQuery; import com.ruoyi.bps.domain.ExpressInfo; import com.ruoyi.bps.mapper.ExpImportQueryMapper; +import com.ruoyi.bps.mapper.ExpressInfoMapper; import com.ruoyi.bps.service.IExpImportQueryService; import com.ruoyi.bps.service.IExpressInfoService; import com.ruoyi.common.core.domain.AjaxResult; @@ -13,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; /** @@ -30,6 +32,9 @@ public class ExpImportQueryServiceImpl implements IExpImportQueryService @Autowired private IExpressInfoService expressInfoService; + @Autowired + private ExpressInfoMapper expressInfoMapper; + /** * 查询Excel批量快递查询 * @@ -114,16 +119,20 @@ public class ExpImportQueryServiceImpl implements IExpImportQueryService String queryTime= DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); String queryId= LocalDateTime.now().toString(); ExpImportQuery expImportQuery=new ExpImportQuery(); + List expressInfoListForInsert=new ArrayList<>(); try{ + //将查询到的快递结果放到expressInfoListForInsert,并插入到数据库表expressInfo for( ExpressInfo expressInfo:expressInfoList){ ExpressInfo ei= expressInfoService.SelectExpressInfo(expressInfo); ei.setQueryId(queryId); ei.setQueryUserName(ShiroUtils.getSysUser().getUserName()); ei.setQueryType("excel"); ei.setQueryTime(queryTime); - expressInfoService.insertExpressInfo(ei); + //expressInfoService.insertExpressInfo(ei); + expressInfoListForInsert.add(ei); } - + expressInfoMapper.batchInsertExpressInfo(expressInfoListForInsert); + //将本次excel导入查询记录到数据表exp_import_query expImportQuery.setQueryTime(queryTime); expImportQuery.setQueryLoginName(ShiroUtils.getLoginName()); expImportQuery.setQueryUserName(ShiroUtils.getSysUser().getUserName()); diff --git a/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml index 7d190b26b..5f01579ef 100644 --- a/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml +++ b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml @@ -5,6 +5,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -29,7 +30,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select message, nu, deliveryNum, ischeck, com, status, `data`, `state`, `condition`, routeInfo, returnCode, `result`, phone, + select sid, message, nu, deliveryNum, ischeck, com, status, `data`, `state`, `condition`, routeInfo, returnCode, `result`, phone, collectTime, singedTime, lastUpdateTime, queryTime, queryUserName, queryId, queryType from expressInfo @@ -47,7 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -125,14 +126,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from expressInfo where message = #{message} + delete from expressInfo where sid = #{sid} delete from expressInfo where message in - #{message} + #{sid} + + insert into expressInfo(message, nu, deliveryNum, ischeck, com, status, `data`, `state`, `condition`, routeInfo, returnCode, `result`, phone, + collectTime, singedTime, lastUpdateTime, queryTime, queryUserName, queryId, queryType) values + + ( #{expressInfo.message}, #{expressInfo.nu}, #{expressInfo.deliveryNum}, #{expressInfo.ischeck}, #{expressInfo.com}, #{expressInfo.status}, + #{expressInfo.data}, #{expressInfo.state}, #{expressInfo.condition}, #{expressInfo.routeInfo}, #{expressInfo.returnCode}, + #{expressInfo.result}, #{expressInfo.phone}, #{expressInfo.collectTime}, #{expressInfo.singedTime}, #{expressInfo.lastUpdateTime}, + #{expressInfo.queryTime}, #{expressInfo.queryUserName}, #{expressInfo.queryId}, #{expressInfo.queryType} + ) + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html index 3b190cb30..58f71f9ec 100644 --- a/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html +++ b/box-bps/src/main/resources/templates/bps/expressInfo/expressInfo.html @@ -78,11 +78,17 @@ modalName: "快递信息", columns: [{ checkbox: false + }, + { + field: 'sid', + title: 'SID', + visible: false }, /* { field: 'message', - title: '消息' + title: '消息', + visible: false },*/ { field: 'deliveryNum', @@ -95,7 +101,8 @@ /* { field: 'ischeck', - title: '签收状态' + title: '签收状态', + visible: false },*/ { field: 'com', @@ -107,7 +114,8 @@ /* { field: 'status', - title: '通信状态' + title: '通信状态', + visible: false },*/ { field: 'data', @@ -125,19 +133,23 @@ },/* { field: 'condition', - title: '状态标志' + title: '状态标志', + visible: false }, { field: 'routeInfo', - title: '路由信息' + title: '路由信息', + visible: false }, { field: 'returnCode', - title: '返回码' + title: '返回码', + visible: false }, { field: 'result', - title: '返回结果' + title: '返回结果', + visible: false },*/ { @@ -170,8 +182,8 @@ align: 'center', formatter: function(value, row, index) { var actions = []; - actions.push('编辑 '); - actions.push('删除'); + actions.push('编辑 '); + actions.push('删除'); return actions.join(''); } }*/] From 145db2122641b993be1ca3dea7f69487e42d54ee Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Sun, 25 Jul 2021 15:23:50 +0800 Subject: [PATCH 50/90] =?UTF-8?q?1=E3=80=81=E6=8F=90=E5=8D=87Excel?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=95=B0=E6=8D=AE=E8=A1=A8expressInfo=E7=9A=84?= =?UTF-8?q?=E6=95=88=E7=8E=87=202=E3=80=81=E5=88=A0=E9=99=A4exp=5Fimport?= =?UTF-8?q?=5Fquery=E7=9A=84=E8=AE=B0=E5=BD=95=E6=97=B6=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=88=A0=E9=99=A4expressInfo=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E5=AF=B9=E5=BA=94queryId=E7=9A=84=E8=AE=B0=E5=BD=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/bps/mapper/ExpressInfoMapper.java | 12 +++++++++++- .../impl/ExpImportQueryServiceImpl.java | 19 ++++++++++++++++++- .../mapper/bps/ExpressInfoMapper.xml | 9 +++++++-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java index 9abb35afb..0d8fcd6a5 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/ExpressInfoMapper.java @@ -48,7 +48,7 @@ public interface ExpressInfoMapper /** * 删除快递信息 - * + * * @param message 快递信息ID * @return 结果 */ @@ -69,4 +69,14 @@ public interface ExpressInfoMapper * @return 结果 */ public int batchInsertExpressInfo(List expressInfoList); + + + /** + * 删除快递信息 + * + * @param queryId 快递信息queryId + * @return 结果 + */ + public int deleteExpressInfoByQueryId(String queryId); + } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java index 7ab9b07e7..c3f4e28a7 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java @@ -10,11 +10,13 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -92,6 +94,10 @@ public class ExpImportQueryServiceImpl implements IExpImportQueryService @Override public int deleteExpImportQueryByIds(String ids) { + for(String str:Arrays.asList(ids.split(","))) + { + expressInfoMapper.deleteExpressInfoByQueryId(str); + } return expImportQueryMapper.deleteExpImportQueryByIds(Convert.toStrArray(ids)); } @@ -130,8 +136,19 @@ public class ExpImportQueryServiceImpl implements IExpImportQueryService ei.setQueryTime(queryTime); //expressInfoService.insertExpressInfo(ei); expressInfoListForInsert.add(ei); + /* for(int i=1;i<1001;i++){ //测试批量插入效率用时打开Mark,产生5万条数据。 + expressInfoListForInsert.add(ei); + }*/ + } + int size= expressInfoListForInsert.size(); + List expressInfos= new ArrayList<>(); + for(int i=1;i<=size;i++){ + expressInfos.add(expressInfoListForInsert.get(i-1)); + if( (i%400==0 ) ||i== size) { + expressInfoMapper.batchInsertExpressInfo(expressInfos); + expressInfos.clear(); + } } - expressInfoMapper.batchInsertExpressInfo(expressInfoListForInsert); //将本次excel导入查询记录到数据表exp_import_query expImportQuery.setQueryTime(queryTime); expImportQuery.setQueryLoginName(ShiroUtils.getLoginName()); diff --git a/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml index 5f01579ef..5d9416346 100644 --- a/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml +++ b/box-bps/src/main/resources/mapper/bps/ExpressInfoMapper.xml @@ -130,8 +130,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from expressInfo where message in - + delete from expressInfo where sid in + #{sid} @@ -148,4 +148,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + delete from expressInfo where queryId in (select queryId from exp_import_query where sid= #{sid}) + + + \ No newline at end of file From 5280a7200ccb9b31889d6337be8e1c0e94542347 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Sun, 25 Jul 2021 15:47:02 +0800 Subject: [PATCH 51/90] =?UTF-8?q?1=E3=80=81Excel=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E3=80=81=E5=88=A0=E9=99=A4=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=8B=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bps/service/IExpImportQueryService.java | 2 +- .../impl/ExpImportQueryServiceImpl.java | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java index e8f81ecb4..0a08b6692 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpImportQueryService.java @@ -67,6 +67,6 @@ public interface IExpImportQueryService * @param expressInfoList Excel导入的快递列表 * @return 结果 */ - public AjaxResult importData(List expressInfoList); + public AjaxResult importData(List expressInfoList) throws Exception; } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java index c3f4e28a7..813c66b4c 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpImportQueryServiceImpl.java @@ -13,6 +13,7 @@ import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; @@ -92,13 +93,15 @@ public class ExpImportQueryServiceImpl implements IExpImportQueryService * @return 结果 */ @Override + @Transactional public int deleteExpImportQueryByIds(String ids) { for(String str:Arrays.asList(ids.split(","))) { expressInfoMapper.deleteExpressInfoByQueryId(str); } - return expImportQueryMapper.deleteExpImportQueryByIds(Convert.toStrArray(ids)); + int message= expImportQueryMapper.deleteExpImportQueryByIds(Convert.toStrArray(ids)); + return message; } /** @@ -115,18 +118,19 @@ public class ExpImportQueryServiceImpl implements IExpImportQueryService /** - * 删除Excel批量快递查询信息 + * Excel批量快递查询信息 * * @param expressInfoList Excel导入的快递列表 * @return 结果 */ @Override - public AjaxResult importData(List expressInfoList) { + @Transactional + public AjaxResult importData(List expressInfoList) throws Exception { String queryTime= DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); String queryId= LocalDateTime.now().toString(); ExpImportQuery expImportQuery=new ExpImportQuery(); List expressInfoListForInsert=new ArrayList<>(); - try{ + /* try{*/ //将查询到的快递结果放到expressInfoListForInsert,并插入到数据库表expressInfo for( ExpressInfo expressInfo:expressInfoList){ ExpressInfo ei= expressInfoService.SelectExpressInfo(expressInfo); @@ -158,12 +162,13 @@ public class ExpImportQueryServiceImpl implements IExpImportQueryService expImportQuery.setStatus("success"); expImportQuery.setQueryQty(String.valueOf(expressInfoList.size())); expImportQuery.setQueryId(queryId); - expImportQueryMapper.insertExpImportQuery(expImportQuery); + int message=expImportQueryMapper.insertExpImportQuery(expImportQuery); + return AjaxResult.success(message); - return AjaxResult.success("导入查询成功!"); - }catch (Exception e){ + + /*}catch (Exception e){ expImportQuery.setStatus("fail"); return AjaxResult.error(e.getMessage()); - } + }*/ } } From 90093a13276266edf049fe2f32c2d95063e3e77e Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Mon, 26 Jul 2021 20:51:04 +0800 Subject: [PATCH 52/90] =?UTF-8?q?=E5=AE=8C=E6=88=90BPS=20=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E8=8E=B7=E5=8F=96Access=20Token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bps/controller/WechatApiController.java | 17 +++ .../ruoyi/bps/domain/WechatAccessToken.java | 112 ++++++++++++++++++ .../bps/mapper/WechatAccessTokenMapper.java | 67 +++++++++++ .../ruoyi/bps/service/IWechatApiService.java | 6 + .../service/impl/WechatApiServiceImpl.java | 96 +++++++++++++++ .../mapper/bps/WechatAccessTokenMapper.xml | 92 ++++++++++++++ .../src/main/resources/application.yml | 8 ++ 7 files changed, 398 insertions(+) create mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java create mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java create mode 100644 box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java new file mode 100644 index 000000000..394b8eb19 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java @@ -0,0 +1,17 @@ +package com.ruoyi.bps.controller; + +import com.ruoyi.bps.service.IWechatApiService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WechatApiController { + @Autowired + IWechatApiService wechatApiService; + + @RequestMapping("anon/getAccessToken") + public String getAccessToken() { + return wechatApiService.GetAccessToken(); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java b/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java new file mode 100644 index 000000000..95d318913 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java @@ -0,0 +1,112 @@ +package com.ruoyi.bps.domain; + +import java.util.Date; + +public class WechatAccessToken { + private Long sid; + private String corpId; + private String agentId; + private String secret; + private String errcode; + private String errmsg; + private String access_token; //access_token + private String expires_in; + private Date getTokenTime; + private String aesKey; + + public Long getSid() { + return sid; + } + + public void setSid(Long sid) { + this.sid = sid; + } + + public String getCorpId() { + return corpId; + } + + public void setCorpId(String corpId) { + this.corpId = corpId; + } + + public String getAgentId() { + return agentId; + } + + public void setAgentId(String agentId) { + this.agentId = agentId; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getErrcode() { + return errcode; + } + + public void setErrcode(String errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getExpires_in() { + return expires_in; + } + + public void setExpires_in(String expires_in) { + this.expires_in = expires_in; + } + + public Date getGetTokenTime() { + return getTokenTime; + } + + public void setGetTokenTime(Date getTokenTime) { + this.getTokenTime = getTokenTime; + } + + public String getAesKey() { + return aesKey; + } + + public void setAesKey(String aesKey) { + this.aesKey = aesKey; + } + + @Override + public String toString() { + return "WechatAccessToken{" + + "sid='" + sid + '\'' + + ", corpId='" + corpId + '\'' + + ", agentId='" + agentId + '\'' + + ", secrect='" + secret + '\'' + + ", errcode='" + errcode + '\'' + + ", errmsg='" + errmsg + '\'' + + ", access_token='" + access_token + '\'' + + ", expires_in='" + expires_in + '\'' + + ", getTokenTime=" + getTokenTime + + ", aesKey='" + aesKey + '\'' + + '}'; + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java new file mode 100644 index 000000000..541980bd7 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java @@ -0,0 +1,67 @@ +package com.ruoyi.bps.mapper; + +import com.ruoyi.bps.domain.WechatAccessToken; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +/** + * 企业微信获取Access Token 的Mapper接口 + * + * @author Bo + * @date 2021-07-21 + */ +public interface WechatAccessTokenMapper +{ + + + + /** + * 根据SID查询Access Token + * + * @param sid + * @return 企业微信Access Token信息 + */ + public WechatAccessToken selectWechatAccessTokenById(Long sid); + + + /** + * 查询Access Token + * @param wechatAccessToken + * @return 企业微信Access Token信息 + */ + public List selectWechatAccessTokenList(WechatAccessToken wechatAccessToken); + + /** + * 新增Access Token + * + * @param wechatAccessToken Access Token + * @return 结果 + */ + public int insertWechatAccessToken(WechatAccessToken wechatAccessToken); + + /** + * 修改Access Token + * + * @param wechatAccessToken Access Token + * @return 结果 + */ + public int updateWechatAccessToken(WechatAccessToken wechatAccessToken); + + /** + * 删除Access Token + * + * @param sid Access TokenID + * @return 结果 + */ + public int deleteWechatAccessTokenById(Long sid); + + /** + * 批量删除Access Token + * + * @param sids 需要删除的数据ID + * @return 结果 + */ + public int deleteWechatAccessTokenByIds(String[] sids); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java new file mode 100644 index 000000000..6a75b451c --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java @@ -0,0 +1,6 @@ +package com.ruoyi.bps.service; + +public interface IWechatApiService { + //获取Access Token + public String GetAccessToken(); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java new file mode 100644 index 000000000..58d589ecf --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bps.service.impl; + +import com.google.gson.Gson; +import com.ruoyi.bps.domain.WechatAccessToken; +import com.ruoyi.bps.mapper.WechatAccessTokenMapper; +import com.ruoyi.bps.service.IWechatApiService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +@Service +public class WechatApiServiceImpl implements IWechatApiService { + @Value("${wechat.corpId}") + private String corpId; + @Value("${wechat.secret}") + private String secret; + @Value("${wechat.agentId}") + private String agentId; + + @Autowired + WechatAccessTokenMapper wechatAccessTokenMapper; + + /** + * 获取企业微信Access Token + * @return Access Token + */ + @Override + public String GetAccessToken() { + //获取本地数据库中的Token + WechatAccessToken wat = new WechatAccessToken(); + wat.setCorpId(corpId); + wat.setSecret(secret); + List list= wechatAccessTokenMapper.selectWechatAccessTokenList(wat); + WechatAccessToken returnWat; + //如果数据库中没有对应corpId+corpSecret的数据,或者数据多于一条,则从企业微信获取Token,并插入数据库 + if(list.isEmpty() || list.size() <=0) + { + returnWat= getAccessTokenFromWechat(corpId,secret,agentId); + wechatAccessTokenMapper.insertWechatAccessToken(returnWat); + return returnWat.getAccess_token(); + } + + //如果数据库中存在多条corpId+corpSecret的数据,则全部删除再从企业微信获取Token,并插入数据库 + if(list.size()>1 || StringUtils.isEmpty(list.get(0).getAccess_token())) + { + for(WechatAccessToken token:list){ + wechatAccessTokenMapper.deleteWechatAccessTokenById(token.getSid()); + } + returnWat= getAccessTokenFromWechat(corpId,secret,agentId); + wechatAccessTokenMapper.insertWechatAccessToken(returnWat); + return returnWat.getAccess_token(); + } + + //如果获取到的数据中,Token或更新时间为空,或者离过期时间小于1000秒,则从企业微信获取Token,并更新数据库 + int a= differenceSecond(DateUtils.getNowDate(),list.get(0).getGetTokenTime())-Integer.parseInt(list.get(0).getExpires_in())-1000; + if(StringUtils.isEmpty(list.get(0).getAccess_token()) || list.get(0).getGetTokenTime() ==null + || differenceSecond(DateUtils.getNowDate(),list.get(0).getGetTokenTime())>Integer.parseInt(list.get(0).getExpires_in())-1000){ + returnWat= getAccessTokenFromWechat(corpId,secret,agentId); + returnWat.setSid(list.get(0).getSid()); + wechatAccessTokenMapper.updateWechatAccessToken(returnWat); + return returnWat.getAccess_token(); + } + + //如果以上情况皆不是,则返回本地数据库的token + return list.get(0).getAccess_token(); + + } + + //根据corpId与corpSecret获取Token + private WechatAccessToken getAccessTokenFromWechat(String corpId,String secret, String agentId){ + String param ="corpid=" + corpId + "&corpsecret=" + secret; + String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; + WechatAccessToken wechatAccessToken= new Gson().fromJson(HttpUtils.sendGet(url,param),WechatAccessToken.class); + wechatAccessToken.setCorpId(corpId); + wechatAccessToken.setSecret(secret); + wechatAccessToken.setAgentId(agentId); + wechatAccessToken.setGetTokenTime(DateUtils.getNowDate()); + return wechatAccessToken; + } + + /** + * + * @param minuendDate 被减数日期 + * @param subtractionDate 减数日期 + * @return 相差秒数 + */ + public int differenceSecond(Date minuendDate, Date subtractionDate ) { + return (int)((minuendDate.getTime() - subtractionDate.getTime()) / 1000); + } +} diff --git a/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml b/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml new file mode 100644 index 000000000..d5dfc1c85 --- /dev/null +++ b/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + select sid, corp_id, agent_id, secret, errcode, errmsg, access_token, expires_in, get_token_time, aes_key from wechat_access_token + + + + + + + + insert into wechat_access_token + + corp_id, + agent_id, + secret, + errcode, + errmsg, + access_token, + expires_in, + getToken_time, + aes_key, + + + #{corpId}, + #{agentId}, + #{secret}, + #{errcode}, + #{errmsg}, + #{access_token}, + #{expires_in}, + #{getTokenTime}, + #{aesKey}, + + + + + update wechat_access_token + + corp_id = #{corpId}, + agent_id = #{agentId}, + secret = #{secret}, + errcode = #{errcode}, + errmsg = #{errmsg}, + access_token = #{access_token}, + expires_in = #{expires_in}, + get_token_time = #{getTokenTime}, + aes_key = #{aesKey}, + + where sid = #{sid} + + + + delete from wechat_access_token where sid = #{sid} + + + + delete from wechat_access_token where sid in + + #{sid} + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 5582ace2b..10b87328c 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -141,3 +141,11 @@ xss: swagger: # 是否开启swagger enabled: true + +#企业微信 +wechat: + corpId: ww4ed3771457e5f463 + agentId: 1000080 + secret: drtHKYabI9_EgjJQ8aqDPTQkY1WUYeWUTMkYw7D_z64 + token: 111 + aesKey: 111 \ No newline at end of file From f728740b70e39c8be1e0701bc8e8d1c74eb0da05 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Mon, 26 Jul 2021 22:53:06 +0800 Subject: [PATCH 53/90] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=88=E6=9C=AA=E5=AE=8C=E5=B7=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bps/controller/WechatApiController.java | 42 ++++ .../com/ruoyi/bps/domain/WechatUserInfo.java | 215 ++++++++++++++++++ 2 files changed, 257 insertions(+) create mode 100644 box-bps/src/main/java/com/ruoyi/bps/domain/WechatUserInfo.java diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java index 394b8eb19..878b858cd 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java @@ -1,9 +1,24 @@ package com.ruoyi.bps.controller; +import com.alibaba.fastjson.JSON; +import com.ruoyi.bps.domain.WechatUserInfo; import com.ruoyi.bps.service.IWechatApiService; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.http.HttpUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Map; @RestController public class WechatApiController { @@ -14,4 +29,31 @@ public class WechatApiController { public String getAccessToken() { return wechatApiService.GetAccessToken(); } + + @GetMapping("anon/wechatLogin") + public String codeTest(HttpServletRequest request) + { + String code= request.getParameter("code"); + String state = request.getParameter("state"); + + String url="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; + String param = "access_token="+wechatApiService.GetAccessToken()+"&code="+code; + String userInfo = HttpUtils.sendGet(url,code); + return code; + } + + @GetMapping("anon/userInfo") + public Map getJSON(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8")); + StringBuilder responseStrBuilder = new StringBuilder(); + String inputStr; + while ((inputStr = streamReader.readLine()) != null) { + responseStrBuilder.append(inputStr); + } + Map params = JSON.parseObject(responseStrBuilder.toString(), Map.class); + return params; + } + + } diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/WechatUserInfo.java b/box-bps/src/main/java/com/ruoyi/bps/domain/WechatUserInfo.java new file mode 100644 index 000000000..15533af17 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/WechatUserInfo.java @@ -0,0 +1,215 @@ +package com.ruoyi.bps.domain; + +import java.util.List; + +public class WechatUserInfo { + String errocode; //返回码 + String errmsg; //返回码描述 + String Userid; //成员UserID + String name; //成员名称 + String depatrment; //成员所属部门id列表 + String order; //部门内的排序值 + String position; //职务信息 + String mobile; //手机号码 + String gender; //性别,0:未定义,1:男,2:女 + String email; //邮箱 + String is_leader_in_dept; //在所在的部门内是否为上级 + String avatar; //头像Url + String thumb_avatar; //头像缩略图Url + String telephone; //座机 + String alias; //别名 + String address; //地址 + String open_userid; //全局唯一id + String main_department; //主部门 + String extattr; //扩展属性 + String Status; //激活状态: 1=已激活,2=已禁用,4=未激活,5=退出企业。 + String qr_code; //员工个人二维码 + String external_position; // 对外职务 + String external_profile; //成员对外属性 + + public String getErrocode() { + return errocode; + } + + public void setErrocode(String errocode) { + this.errocode = errocode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + public String getUserid() { + return Userid; + } + + public void setUserid(String userid) { + Userid = userid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDepatrment() { + return depatrment; + } + + public void setDepatrment(String depatrment) { + this.depatrment = depatrment; + } + + public String getOrder() { + return order; + } + + public void setOrder(String order) { + this.order = order; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getIs_leader_in_dept() { + return is_leader_in_dept; + } + + public void setIs_leader_in_dept(String is_leader_in_dept) { + this.is_leader_in_dept = is_leader_in_dept; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getThumb_avatar() { + return thumb_avatar; + } + + public void setThumb_avatar(String thumb_avatar) { + this.thumb_avatar = thumb_avatar; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getOpen_userid() { + return open_userid; + } + + public void setOpen_userid(String open_userid) { + this.open_userid = open_userid; + } + + public String getMain_department() { + return main_department; + } + + public void setMain_department(String main_department) { + this.main_department = main_department; + } + + public String getExtattr() { + return extattr; + } + + public void setExtattr(String extattr) { + this.extattr = extattr; + } + + public String getStatus() { + return Status; + } + + public void setStatus(String status) { + Status = status; + } + + public String getQr_code() { + return qr_code; + } + + public void setQr_code(String qr_code) { + this.qr_code = qr_code; + } + + public String getExternal_position() { + return external_position; + } + + public void setExternal_position(String external_position) { + this.external_position = external_position; + } + + public String getExternal_profile() { + return external_profile; + } + + public void setExternal_profile(String external_profile) { + this.external_profile = external_profile; + } + + +} From c3c66b19a0d8144cd381cbb3c553c7f26e019c65 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Tue, 27 Jul 2021 13:47:13 +0800 Subject: [PATCH 54/90] =?UTF-8?q?=E5=BE=AE=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bps/controller/WechatApiController.java | 91 +++++++++++++++++-- 1 file changed, 84 insertions(+), 7 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java index 878b858cd..cdb7f0ead 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java @@ -1,15 +1,22 @@ package com.ruoyi.bps.controller; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.ruoyi.bps.domain.WechatUserInfo; import com.ruoyi.bps.service.IWechatApiService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; +import com.ruoyi.system.service.ISysUserService; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.ServletException; @@ -18,28 +25,98 @@ import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.List; import java.util.Map; @RestController -public class WechatApiController { +public class WechatApiController extends BaseController { @Autowired IWechatApiService wechatApiService; + @Autowired + private ISysUserService userService; + @RequestMapping("anon/getAccessToken") public String getAccessToken() { return wechatApiService.GetAccessToken(); } + + + + @PostMapping("/wxlogin") + @ResponseBody + public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe) + { + + UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe); + Subject subject = SecurityUtils.getSubject(); + try + { + subject.login(token); + return success(); + } + catch (AuthenticationException e) + { + String msg = "用户或密码错误"; + if (StringUtils.isNotEmpty(e.getMessage())) + { + msg = e.getMessage(); + } + return error(msg); + } + } + + + @GetMapping("anon/wechatLogin") public String codeTest(HttpServletRequest request) { String code= request.getParameter("code"); String state = request.getParameter("state"); + //获取访问用户身份ID String url="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; String param = "access_token="+wechatApiService.GetAccessToken()+"&code="+code; - String userInfo = HttpUtils.sendGet(url,code); - return code; + // String userInfo = HttpUtils.sendGet(url,param); //测试已能正常返回UserInfo Json,正式使用时打开 + String userInfo = "{\"UserId\":\"359\",\"DeviceId\":\"10000589102865WJ\",\"errcode\":0,\"errmsg\":\"ok\"}"; //为避免去微信获取code麻烦,开发调试时打开 + JSONObject jsonObjectUserInfo = JSONObject.parseObject(userInfo); + //如果返回码不为0,则返回错误信息 + if ( Integer.parseInt(jsonObjectUserInfo.getString("errcode")) != 0){ + return jsonObjectUserInfo.getString("errmsg"); + } + String userId = jsonObjectUserInfo.getString("UserId"); + + //获取用户邮箱 + url="https://qyapi.weixin.qq.com/cgi-bin/user/get"; + param="access_token="+wechatApiService.GetAccessToken()+"&userid="+userId; + String userInfoDetail=HttpUtils.sendGet(url,param); //获取成员信息 + JSONObject jsonObjectUserInfoDetail=JSONObject.parseObject(userInfoDetail); + //如果返回码不为0,则返回错误信息 + if(Integer.parseInt(jsonObjectUserInfoDetail.getString("errcode")) != 0) + { + return jsonObjectUserInfo.getString("errmsg"); + } + String userEmail= jsonObjectUserInfoDetail.getString("email"); + String userName= jsonObjectUserInfoDetail.getString("name"); + + //根据邮箱名+用户名匹配本地用户对应的邮箱名与用户名 + SysUser sysUser=new SysUser(); + sysUser.setUserName(userName); + sysUser.setEmail(userEmail); + sysUser.setStatus("02"); //只获取从OA同步的用户,保持与企业微信一致。 + List userList= userService.selectUserList(sysUser); + int count= userList.size(); + if(count <= 0){ + return "false"; //系统里没有用户,没有从OA同步? 处理逻辑待定 + } + if(count > 1){ + return "false"; //本地数据库存在多个姓名与邮箱相同的记录,如何处理?? + } + + + + return userEmail; } @GetMapping("anon/userInfo") From a1b250e782972033ac0fbac077b8da757ada0ebd Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Tue, 27 Jul 2021 14:47:25 +0800 Subject: [PATCH 55/90] =?UTF-8?q?excel=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA?= =?UTF-8?q?bug(poi=E7=89=88=E6=9C=AC=E5=86=B2=E7=AA=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bps-kettle/pom.xml | 46 ++++++++++--------- .../src/test/java/com/kone/Testsetset.java | 15 ------ pom.xml | 12 ++++- 3 files changed, 35 insertions(+), 38 deletions(-) delete mode 100644 bps-kettle/src/test/java/com/kone/Testsetset.java diff --git a/bps-kettle/pom.xml b/bps-kettle/pom.xml index d99135432..657b1ad91 100644 --- a/bps-kettle/pom.xml +++ b/bps-kettle/pom.xml @@ -31,18 +31,6 @@ com.ruoyi ruoyi-quartz - - org.json - json - 20160810 - - - - io.swagger - swagger-annotations - 1.5.21 - compile - @@ -54,6 +42,20 @@ pentaho-kettle kettle-engine ${kettle-version} + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + org.apache.poi + poi-ooxml-schemas + + pentaho-kettle @@ -113,7 +115,7 @@ jtds 1.2.4 - + + + diff --git a/bps-kettle/src/test/java/com/kone/Testsetset.java b/bps-kettle/src/test/java/com/kone/Testsetset.java deleted file mode 100644 index 9ebe25fd3..000000000 --- a/bps-kettle/src/test/java/com/kone/Testsetset.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.kone; - -import com.ruoyi.kettle.tools.KettleUtil; -import org.junit.Test; - -public class Testsetset { - - - @Test - public void test1() throws Exception { - KettleUtil.KettleEnv.init(); - KettleUtil util=new KettleUtil(); - util.callTrans("/","text",null,null); - } -} diff --git a/pom.xml b/pom.xml index 81de1e84b..388a59e28 100644 --- a/pom.xml +++ b/pom.xml @@ -161,8 +161,18 @@ org.apache.poi poi-ooxml ${poi.version} + + + org.apache.xmlbeans + xmlbeans + + + + + org.apache.xmlbeans + xmlbeans + 3.1.0 - org.apache.velocity From 3828b0e2628b38cbedb72971619f301f5949921b Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Tue, 27 Jul 2021 18:19:00 +0800 Subject: [PATCH 56/90] =?UTF-8?q?=E5=BE=AE=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bps/controller/WechatApiController.java | 136 ------------------ .../ruoyi/bps/service/IWechatApiService.java | 6 - .../system/WechatApiController.java | 91 ++++++++++++ .../src/main/resources/application.yml | 2 +- .../system}/domain/WechatAccessToken.java | 2 +- .../ruoyi/system}/domain/WechatUserInfo.java | 2 +- .../ruoyi/system/mapper/SysUserMapper.java | 8 ++ .../mapper/WechatAccessTokenMapper.java | 4 +- .../ruoyi/system/service/ISysUserService.java | 8 ++ .../system/service/IWechatApiService.java | 9 ++ .../service/impl/SysUserServiceImpl.java | 11 ++ .../service/impl/WechatApiServiceImpl.java | 81 +++++++++-- .../resources/mapper/system/SysUserMapper.xml | 16 ++- .../system}/WechatAccessTokenMapper.xml | 2 +- 14 files changed, 218 insertions(+), 160 deletions(-) delete mode 100644 box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java delete mode 100644 box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java rename {box-bps/src/main/java/com/ruoyi/bps => ruoyi-system/src/main/java/com/ruoyi/system}/domain/WechatAccessToken.java (98%) rename {box-bps/src/main/java/com/ruoyi/bps => ruoyi-system/src/main/java/com/ruoyi/system}/domain/WechatUserInfo.java (99%) rename {box-bps/src/main/java/com/ruoyi/bps => ruoyi-system/src/main/java/com/ruoyi/system}/mapper/WechatAccessTokenMapper.java (94%) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatApiService.java rename {box-bps/src/main/java/com/ruoyi/bps => ruoyi-system/src/main/java/com/ruoyi/system}/service/impl/WechatApiServiceImpl.java (55%) rename {box-bps/src/main/resources/mapper/bps => ruoyi-system/src/main/resources/mapper/system}/WechatAccessTokenMapper.xml (98%) diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java deleted file mode 100644 index cdb7f0ead..000000000 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.ruoyi.bps.controller; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.ruoyi.bps.domain.WechatUserInfo; -import com.ruoyi.bps.service.IWechatApiService; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.http.HttpUtils; -import com.ruoyi.system.service.ISysUserService; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.UsernamePasswordToken; -import org.apache.shiro.subject.Subject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.List; -import java.util.Map; - -@RestController -public class WechatApiController extends BaseController { - @Autowired - IWechatApiService wechatApiService; - - @Autowired - private ISysUserService userService; - - @RequestMapping("anon/getAccessToken") - public String getAccessToken() { - return wechatApiService.GetAccessToken(); - } - - - - - @PostMapping("/wxlogin") - @ResponseBody - public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe) - { - - UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe); - Subject subject = SecurityUtils.getSubject(); - try - { - subject.login(token); - return success(); - } - catch (AuthenticationException e) - { - String msg = "用户或密码错误"; - if (StringUtils.isNotEmpty(e.getMessage())) - { - msg = e.getMessage(); - } - return error(msg); - } - } - - - - @GetMapping("anon/wechatLogin") - public String codeTest(HttpServletRequest request) - { - String code= request.getParameter("code"); - String state = request.getParameter("state"); - - //获取访问用户身份ID - String url="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; - String param = "access_token="+wechatApiService.GetAccessToken()+"&code="+code; - // String userInfo = HttpUtils.sendGet(url,param); //测试已能正常返回UserInfo Json,正式使用时打开 - String userInfo = "{\"UserId\":\"359\",\"DeviceId\":\"10000589102865WJ\",\"errcode\":0,\"errmsg\":\"ok\"}"; //为避免去微信获取code麻烦,开发调试时打开 - JSONObject jsonObjectUserInfo = JSONObject.parseObject(userInfo); - //如果返回码不为0,则返回错误信息 - if ( Integer.parseInt(jsonObjectUserInfo.getString("errcode")) != 0){ - return jsonObjectUserInfo.getString("errmsg"); - } - String userId = jsonObjectUserInfo.getString("UserId"); - - //获取用户邮箱 - url="https://qyapi.weixin.qq.com/cgi-bin/user/get"; - param="access_token="+wechatApiService.GetAccessToken()+"&userid="+userId; - String userInfoDetail=HttpUtils.sendGet(url,param); //获取成员信息 - JSONObject jsonObjectUserInfoDetail=JSONObject.parseObject(userInfoDetail); - //如果返回码不为0,则返回错误信息 - if(Integer.parseInt(jsonObjectUserInfoDetail.getString("errcode")) != 0) - { - return jsonObjectUserInfo.getString("errmsg"); - } - String userEmail= jsonObjectUserInfoDetail.getString("email"); - String userName= jsonObjectUserInfoDetail.getString("name"); - - //根据邮箱名+用户名匹配本地用户对应的邮箱名与用户名 - SysUser sysUser=new SysUser(); - sysUser.setUserName(userName); - sysUser.setEmail(userEmail); - sysUser.setStatus("02"); //只获取从OA同步的用户,保持与企业微信一致。 - List userList= userService.selectUserList(sysUser); - int count= userList.size(); - if(count <= 0){ - return "false"; //系统里没有用户,没有从OA同步? 处理逻辑待定 - } - if(count > 1){ - return "false"; //本地数据库存在多个姓名与邮箱相同的记录,如何处理?? - } - - - - return userEmail; - } - - @GetMapping("anon/userInfo") - public Map getJSON(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8")); - StringBuilder responseStrBuilder = new StringBuilder(); - String inputStr; - while ((inputStr = streamReader.readLine()) != null) { - responseStrBuilder.append(inputStr); - } - Map params = JSON.parseObject(responseStrBuilder.toString(), Map.class); - return params; - } - - -} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java deleted file mode 100644 index 6a75b451c..000000000 --- a/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.ruoyi.bps.service; - -public interface IWechatApiService { - //获取Access Token - public String GetAccessToken(); -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java new file mode 100644 index 000000000..c2b773b62 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java @@ -0,0 +1,91 @@ +package com.ruoyi.web.controller.system; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpUtils; +import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.system.service.IWechatApiService; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; +import java.util.Map; + +@RestController +public class WechatApiController extends BaseController { + @Autowired + IWechatApiService wechatApiService; + + + + @RequestMapping("anon/getAccessToken") + public String getAccessToken() { + return wechatApiService.GetAccessToken(); + } + + + + + + + + + @GetMapping("anon/wechatLogin") + @ResponseBody + public AjaxResult WechatLogin(HttpServletRequest request) + { + String code= request.getParameter("code"); + //String state = request.getParameter("state"); + String username=wechatApiService.GetLoginNameWithWechatCode(code); + String password=code; + String rememberMe="0"; + + UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe); + Subject subject = SecurityUtils.getSubject(); + try + { + subject.login(token); + return success(); + } + catch (AuthenticationException e) + { + String msg = "用户或密码错误"; + if (StringUtils.isNotEmpty(e.getMessage())) + { + msg = e.getMessage(); + } + return error(msg); + } + + + } + + @GetMapping("anon/userInfo") + public Map getJSON(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8")); + StringBuilder responseStrBuilder = new StringBuilder(); + String inputStr; + while ((inputStr = streamReader.readLine()) != null) { + responseStrBuilder.append(inputStr); + } + Map params = JSON.parseObject(responseStrBuilder.toString(), Map.class); + return params; + } + + +} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 10b87328c..0c6577083 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -19,7 +19,7 @@ server: port: 80 servlet: # 应用的访问路径 - context-path: /it_war + context-path: /it tomcat: # tomcat的URI编码 uri-encoding: UTF-8 diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatAccessToken.java similarity index 98% rename from box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java rename to ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatAccessToken.java index 95d318913..75a178f3a 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatAccessToken.java @@ -1,4 +1,4 @@ -package com.ruoyi.bps.domain; +package com.ruoyi.system.domain; import java.util.Date; diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/WechatUserInfo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatUserInfo.java similarity index 99% rename from box-bps/src/main/java/com/ruoyi/bps/domain/WechatUserInfo.java rename to ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatUserInfo.java index 15533af17..b66f361d3 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/domain/WechatUserInfo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/WechatUserInfo.java @@ -1,4 +1,4 @@ -package com.ruoyi.bps.domain; +package com.ruoyi.system.domain; import java.util.List; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 22fb5cbf6..48365ff21 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -126,4 +126,12 @@ public interface SysUserMapper * 删除Ecology同步过来的用户 */ public void deleteEcologySyncUser(); + + /** + * 查询用户列表 + * + * @param sysUser 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserLists(SysUser sysUser); } diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/WechatAccessTokenMapper.java similarity index 94% rename from box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java rename to ruoyi-system/src/main/java/com/ruoyi/system/mapper/WechatAccessTokenMapper.java index 541980bd7..5294bd138 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/WechatAccessTokenMapper.java @@ -1,6 +1,6 @@ -package com.ruoyi.bps.mapper; +package com.ruoyi.system.mapper; -import com.ruoyi.bps.domain.WechatAccessToken; +import com.ruoyi.system.domain.WechatAccessToken; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 40ebb36bb..0492ec362 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -209,4 +209,12 @@ public interface ISysUserService * Ecology人员信息同步 */ public int syncEcologyUser(String url,String params); + + /** + * 查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserLists(SysUser user); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatApiService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatApiService.java new file mode 100644 index 000000000..d4968517f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IWechatApiService.java @@ -0,0 +1,9 @@ +package com.ruoyi.system.service; + +public interface IWechatApiService { + //获取Access Token + public String GetAccessToken(); + + //根据企业微信登录身份获取本地LoginName + public String GetLoginNameWithWechatCode(String code); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 6b6cdf99e..eaf08e3ab 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -540,6 +540,17 @@ public class SysUserServiceImpl implements ISysUserService return result; } + /** + * 查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserLists(SysUser user) { + return userMapper.selectUserLists(user); + } + @SuppressWarnings("unchecked") public int userSync(Map mapResult){ //如果接口返回状态码不为200,则不做同步处理 diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java similarity index 55% rename from box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java rename to ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java index 58d589ecf..27152e025 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java @@ -1,12 +1,15 @@ -package com.ruoyi.bps.service.impl; +package com.ruoyi.system.service.impl; +import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; -import com.ruoyi.bps.domain.WechatAccessToken; -import com.ruoyi.bps.mapper.WechatAccessTokenMapper; -import com.ruoyi.bps.service.IWechatApiService; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; +import com.ruoyi.system.domain.WechatAccessToken; +import com.ruoyi.system.mapper.WechatAccessTokenMapper; +import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.system.service.IWechatApiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -26,7 +29,14 @@ public class WechatApiServiceImpl implements IWechatApiService { @Autowired WechatAccessTokenMapper wechatAccessTokenMapper; + @Autowired + IWechatApiService wechatApiService; + + @Autowired + private ISysUserService userService; + /** + * * 获取企业微信Access Token * @return Access Token */ @@ -84,13 +94,62 @@ public class WechatApiServiceImpl implements IWechatApiService { return wechatAccessToken; } - /** - * - * @param minuendDate 被减数日期 - * @param subtractionDate 减数日期 - * @return 相差秒数 - */ - public int differenceSecond(Date minuendDate, Date subtractionDate ) { + //获取相两个日期相差秒数 + private int differenceSecond(Date minuendDate, Date subtractionDate ) { return (int)((minuendDate.getTime() - subtractionDate.getTime()) / 1000); } + + + /** + * 根据企业微信登录身份获取本地LoginName + * + * @param code + * @return LoginName + */ + @Override + public String GetLoginNameWithWechatCode(String code) + { + //获取访问用户身份ID + String url="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; + String param = "access_token="+wechatApiService.GetAccessToken()+"&code="+code; + //String userInfo = HttpUtils.sendGet(url,param); //测试已能正常返回UserInfo Json,正式使用时打开 + String userInfo = "{\"UserId\":\"359\",\"DeviceId\":\"10000589102865WJ\",\"errcode\":0,\"errmsg\":\"ok\"}"; //为避免去微信获取code麻烦,开发调试时打开 + JSONObject jsonObjectUserInfo = JSONObject.parseObject(userInfo); + //如果返回码不为0,则返回错误信息 + if ( Integer.parseInt(jsonObjectUserInfo.getString("errcode")) != 0){ + return jsonObjectUserInfo.getString("errmsg"); + } + String userId = jsonObjectUserInfo.getString("UserId"); + + //获取用户邮箱与姓名 + url="https://qyapi.weixin.qq.com/cgi-bin/user/get"; + param="access_token="+wechatApiService.GetAccessToken()+"&userid="+userId; + String userInfoDetail=HttpUtils.sendGet(url,param); //获取成员信息 + JSONObject jsonObjectUserInfoDetail=JSONObject.parseObject(userInfoDetail); + //如果返回码不为0,则返回错误信息 + if(Integer.parseInt(jsonObjectUserInfoDetail.getString("errcode")) != 0) + { + return jsonObjectUserInfo.getString("errmsg"); + } + String userEmail= jsonObjectUserInfoDetail.getString("email"); + String userName= jsonObjectUserInfoDetail.getString("name"); + + //根据邮箱名+用户名匹配本地用户对应的邮箱名与用户名 + SysUser sysUser=new SysUser(); + sysUser.setUserName(userName); + sysUser.setEmail(userEmail); + sysUser.setUserType("02"); //只获取从OA同步的用户,保持与企业微信一致。 + List userList= userService.selectUserLists(sysUser); + int count= userList.size(); + if(count <= 0){ + return ""; //系统里没有用户,没有从OA同步? 处理逻辑待定 + } + if(count > 1){ + return ""; //本地数据库存在多个姓名与邮箱相同的记录,如何处理?? + } + String loginName= userList.get(0).getLoginName(); + return loginName; + + } + } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 36acbf155..827c417b5 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -227,5 +227,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete from sys_user where user_type ='02' - + + + \ No newline at end of file diff --git a/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml b/ruoyi-system/src/main/resources/mapper/system/WechatAccessTokenMapper.xml similarity index 98% rename from box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml rename to ruoyi-system/src/main/resources/mapper/system/WechatAccessTokenMapper.xml index d5dfc1c85..b14442540 100644 --- a/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/WechatAccessTokenMapper.xml @@ -2,7 +2,7 @@ - + From 5af0efb50f694602a7dc2e47cd68a032447f36a5 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 28 Jul 2021 23:17:08 +0800 Subject: [PATCH 57/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E8=B0=83=E6=95=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysLoginController.java | 31 ++++++++++-- .../system/WechatApiController.java | 34 +++++-------- .../src/main/resources/templates/login.html | 37 +++++++++++++- .../framework/shiro/realm/UserRealm.java | 9 +++- .../shiro/service/SysLoginService.java | 48 ++++++++++--------- .../ruoyi/framework/shiro/util/CustToken.java | 20 ++++++++ .../service/impl/WechatApiServiceImpl.java | 4 +- 7 files changed, 128 insertions(+), 55 deletions(-) create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/util/CustToken.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 1652f74ef..fb8f8dc6c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -2,10 +2,14 @@ package com.ruoyi.web.controller.system; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.framework.shiro.util.CustToken; +import com.ruoyi.system.service.IWechatApiService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -15,6 +19,8 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; +import java.util.Map; + /** * 登录验证 * @@ -23,23 +29,40 @@ import com.ruoyi.common.utils.StringUtils; @Controller public class SysLoginController extends BaseController { + @Autowired + private IWechatApiService wechatApiService; + @GetMapping("/login") - public String login(HttpServletRequest request, HttpServletResponse response) + public String login(HttpServletRequest request, HttpServletResponse response, Map map) { + String loginType= request.getParameter("loginType"); + if(StringUtils.isNotEmpty(loginType) && request.getParameter("loginType").equals("wechat")){ + String code= request.getParameter("code"); + //String state = request.getParameter("state"); + String username=wechatApiService.GetLoginNameWithWechatCode(code); + String password=""; + Boolean rememberMe=true; + map.put("loginType","wechat"); + map.put("username",username); + map.put("password",password); + + return "login"; + } + // 如果是Ajax请求,返回Json字符串。 if (ServletUtils.isAjaxRequest(request)) { return ServletUtils.renderString(response, "{\"code\":\"1\",\"msg\":\"未登录或登录超时。请重新登录\"}"); } - return "login"; } @PostMapping("/login") @ResponseBody - public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe) + public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe,String loginType) { - UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe); + // UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe); + CustToken token=new CustToken(username,password,rememberMe,loginType); Subject subject = SecurityUtils.getSubject(); try { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java index c2b773b62..5898a1cfa 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/WechatApiController.java @@ -1,20 +1,19 @@ package com.ruoyi.web.controller.system; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.http.HttpUtils; -import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.framework.shiro.util.CustToken; import com.ruoyi.system.service.IWechatApiService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -22,39 +21,31 @@ import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.util.List; import java.util.Map; -@RestController +@Controller public class WechatApiController extends BaseController { @Autowired IWechatApiService wechatApiService; - - @RequestMapping("anon/getAccessToken") public String getAccessToken() { return wechatApiService.GetAccessToken(); } - - - - - - - @GetMapping("anon/wechatLogin") @ResponseBody public AjaxResult WechatLogin(HttpServletRequest request) { String code= request.getParameter("code"); - //String state = request.getParameter("state"); + String state = request.getParameter("state"); String username=wechatApiService.GetLoginNameWithWechatCode(code); - String password=code; - String rememberMe="0"; + String password=""; + Boolean rememberMe=true; + String loginType=request.getParameter("loginType"); - UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe); + //UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe); + CustToken token=new CustToken(username,password,rememberMe,loginType); Subject subject = SecurityUtils.getSubject(); try { @@ -71,7 +62,6 @@ public class WechatApiController extends BaseController { return error(msg); } - } @GetMapping("anon/userInfo") diff --git a/ruoyi-admin/src/main/resources/templates/login.html b/ruoyi-admin/src/main/resources/templates/login.html index 7f13bfaba..4083cfa7f 100644 --- a/ruoyi-admin/src/main/resources/templates/login.html +++ b/ruoyi-admin/src/main/resources/templates/login.html @@ -44,8 +44,8 @@

    登录:

    请输入用户名、密码进行登录!

    - - + +
    @@ -81,5 +81,38 @@ + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java index 8cda35e2d..88ad4d249 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java @@ -2,6 +2,8 @@ package com.ruoyi.framework.shiro.realm; import java.util.HashSet; import java.util.Set; + +import com.ruoyi.framework.shiro.util.CustToken; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -86,9 +88,12 @@ public class UserRealm extends AuthorizingRealm @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { - UsernamePasswordToken upToken = (UsernamePasswordToken) token; + //UsernamePasswordToken upToken = (UsernamePasswordToken) token; + CustToken upToken= (CustToken) token; + String loginType = upToken.getLoginType(); String username = upToken.getUsername(); String password = ""; + if (upToken.getPassword() != null) { password = new String(upToken.getPassword()); @@ -97,7 +102,7 @@ public class UserRealm extends AuthorizingRealm SysUser user = null; try { - user = loginService.login(username, password); + user = loginService.login(username, password,loginType); } catch (CaptchaException e) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java index e729ff714..2b60bd489 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java @@ -38,26 +38,26 @@ public class SysLoginService /** * 登录 */ - public SysUser login(String username, String password) + public SysUser login(String username, String password,String loginType) { - // 验证码校验 - if (ShiroConstants.CAPTCHA_ERROR.equals(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); - throw new CaptchaException(); - } - // 用户名或密码为空 错误 - if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); - throw new UserNotExistsException(); - } - // 密码如果不在指定范围内 错误 - if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); - throw new UserPasswordNotMatchException(); + //如果是企业微信登录,则无需验证本密码规则 + if(StringUtils.isEmpty(loginType) || !loginType.equals("wechat")) { + // 验证码校验 + if (ShiroConstants.CAPTCHA_ERROR.equals(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); + } + // 用户名或密码为空 错误 + if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); + throw new UserNotExistsException(); + } + // 密码如果不在指定范围内 错误 + if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } } // 用户名不在指定范围内 错误 @@ -88,20 +88,22 @@ public class SysLoginService AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.not.exists"))); throw new UserNotExistsException(); } - + if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.delete"))); throw new UserDeleteException(); } - + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.blocked", user.getRemark()))); throw new UserBlockedException(); } - - passwordService.validate(user, password); + //如果是企业微信登录,则无需本地验证密码 + if(StringUtils.isEmpty(loginType) || !loginType.equals("wechat")){ + passwordService.validate(user, password); + } AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); recordLoginInfo(user); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/util/CustToken.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/util/CustToken.java new file mode 100644 index 000000000..9c00686e8 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/util/CustToken.java @@ -0,0 +1,20 @@ +package com.ruoyi.framework.shiro.util; + +import org.apache.shiro.authc.UsernamePasswordToken; + +public class CustToken extends UsernamePasswordToken { + private String loginType;// 企业微信:wechat + + public String getLoginType() { + return loginType; + } + + public void setLoginType(String loginType) { + this.loginType = loginType; + } + + public CustToken(String username, String password, Boolean rememberMe, String loginType) { + super(username, password); + this.loginType = loginType; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java index 27152e025..14d685ce2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java @@ -112,8 +112,8 @@ public class WechatApiServiceImpl implements IWechatApiService { //获取访问用户身份ID String url="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; String param = "access_token="+wechatApiService.GetAccessToken()+"&code="+code; - //String userInfo = HttpUtils.sendGet(url,param); //测试已能正常返回UserInfo Json,正式使用时打开 - String userInfo = "{\"UserId\":\"359\",\"DeviceId\":\"10000589102865WJ\",\"errcode\":0,\"errmsg\":\"ok\"}"; //为避免去微信获取code麻烦,开发调试时打开 + String userInfo = HttpUtils.sendGet(url,param); //测试已能正常返回UserInfo Json,正式使用时打开 + //String userInfo = "{\"UserId\":\"359\",\"DeviceId\":\"10000589102865WJ\",\"errcode\":0,\"errmsg\":\"ok\"}"; //为避免去微信获取code麻烦,开发调试时打开 JSONObject jsonObjectUserInfo = JSONObject.parseObject(userInfo); //如果返回码不为0,则返回错误信息 if ( Integer.parseInt(jsonObjectUserInfo.getString("errcode")) != 0){ From 02c9693871d732dadd31490a4fd164c90c2391e1 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Thu, 29 Jul 2021 11:12:19 +0800 Subject: [PATCH 58/90] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E8=B5=B0=E5=8D=95=E7=8B=AC=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysLoginController.java | 23 ++++-- .../src/main/resources/templates/login.html | 33 -------- .../main/resources/templates/loginwechat.html | 82 +++++++++++++++++++ .../service/impl/WechatApiServiceImpl.java | 13 +-- 4 files changed, 104 insertions(+), 47 deletions(-) create mode 100644 ruoyi-admin/src/main/resources/templates/loginwechat.html diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index fb8f8dc6c..9d1abc8fe 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,24 +1,22 @@ package com.ruoyi.web.controller.system; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.shiro.util.CustToken; import com.ruoyi.system.service.IWechatApiService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.Map; /** @@ -40,13 +38,20 @@ public class SysLoginController extends BaseController String code= request.getParameter("code"); //String state = request.getParameter("state"); String username=wechatApiService.GetLoginNameWithWechatCode(code); + //如果没有获取到用户名,说明验证失败,跳转登录页 + if(StringUtils.isEmpty(username)){ + return "login"; + } + String password=""; Boolean rememberMe=true; map.put("loginType","wechat"); map.put("username",username); map.put("password",password); - return "login"; + return "loginwechat"; + + } // 如果是Ajax请求,返回Json字符串。 diff --git a/ruoyi-admin/src/main/resources/templates/login.html b/ruoyi-admin/src/main/resources/templates/login.html index 4083cfa7f..95188c7f1 100644 --- a/ruoyi-admin/src/main/resources/templates/login.html +++ b/ruoyi-admin/src/main/resources/templates/login.html @@ -81,38 +81,5 @@ - diff --git a/ruoyi-admin/src/main/resources/templates/loginwechat.html b/ruoyi-admin/src/main/resources/templates/loginwechat.html new file mode 100644 index 000000000..ab13f59d5 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/loginwechat.html @@ -0,0 +1,82 @@ + + + + + + 登录BPS后台管理系统 + + + + + + + + + + +
    +

    登录中...

    +
    +
    + + + + + + + + + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java index 14d685ce2..fc5bb895d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.system.service.impl; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; @@ -112,12 +113,13 @@ public class WechatApiServiceImpl implements IWechatApiService { //获取访问用户身份ID String url="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; String param = "access_token="+wechatApiService.GetAccessToken()+"&code="+code; - String userInfo = HttpUtils.sendGet(url,param); //测试已能正常返回UserInfo Json,正式使用时打开 - //String userInfo = "{\"UserId\":\"359\",\"DeviceId\":\"10000589102865WJ\",\"errcode\":0,\"errmsg\":\"ok\"}"; //为避免去微信获取code麻烦,开发调试时打开 + //String userInfo = HttpUtils.sendGet(url,param); //测试已能正常返回UserInfo Json,正式使用时打开 + String userInfo = "{\"UserId\":\"359\",\"DeviceId\":\"10000589102865WJ\",\"errcode\":0,\"errmsg\":\"ok\"}"; //为避免去微信获取code麻烦,开发调试时打开 JSONObject jsonObjectUserInfo = JSONObject.parseObject(userInfo); - //如果返回码不为0,则返回错误信息 + //如果返回码不为0,则输出错误信息,并返回空值 if ( Integer.parseInt(jsonObjectUserInfo.getString("errcode")) != 0){ - return jsonObjectUserInfo.getString("errmsg"); + System.out.println(jsonObjectUserInfo.getString("errmsg")); + return ""; } String userId = jsonObjectUserInfo.getString("UserId"); @@ -129,7 +131,8 @@ public class WechatApiServiceImpl implements IWechatApiService { //如果返回码不为0,则返回错误信息 if(Integer.parseInt(jsonObjectUserInfoDetail.getString("errcode")) != 0) { - return jsonObjectUserInfo.getString("errmsg"); + System.out.println(jsonObjectUserInfo.getString("errmsg")); + return ""; } String userEmail= jsonObjectUserInfoDetail.getString("email"); String userName= jsonObjectUserInfoDetail.getString("name"); From b2e512aa53ea1eaf7774fae508d2b5655f163194 Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Thu, 29 Jul 2021 11:31:32 +0800 Subject: [PATCH 59/90] =?UTF-8?q?=E5=BD=93=E8=B5=84=E6=BA=90=E5=BA=93?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E5=AD=98=E5=9C=A8trans=E5=92=8Cjob=E6=97=B6:?= =?UTF-8?q?=E4=BC=98=E5=8C=96:=E6=96=B0=E5=BB=BA=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E5=8F=AA=E8=83=BD=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2,=E6=96=B0=E5=BB=BAjob=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E5=8F=AA=E8=83=BD=E9=80=89=E6=8B=A9job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kettle/controller/XRepositoryController.java | 16 ++++++++-------- .../java/com/ruoyi/kettle/repo/XRepoManager.java | 12 ++++++------ .../kettle/service/IXRepositoryService.java | 2 +- .../service/impl/KettleTransServiceImpl.java | 8 +++++++- .../service/impl/XRepositoryServiceImpl.java | 9 ++++----- .../java/com/ruoyi/kettle/tools/KettleUtil.java | 6 ++---- .../templates/kettle/common/repository_tree.html | 7 +++---- .../main/resources/templates/kettle/job/add.html | 3 ++- .../resources/templates/kettle/trans/add.html | 3 ++- 9 files changed, 35 insertions(+), 31 deletions(-) diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java index 56be3d8c6..cb8f61be1 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/XRepositoryController.java @@ -57,15 +57,15 @@ public class XRepositoryController extends BaseController List list = xRepositoryService.selectXRepositoryList(xRepository); return getDataTable(list); } - @GetMapping(value = { "/selectRepositoryTree", "/selectRepositoryTree/{excludeId}" }) - public String selectRepositoryTree( @PathVariable(value = "excludeId", required = false) String excludeId, ModelMap mmap) + @GetMapping(value = { "/selectRepositoryTree", "/selectRepositoryTree/{type}" }) + public String selectRepositoryTree( @PathVariable(value = "type", required = false) String type, ModelMap mmap) { XRepository r=new XRepository(); List repoTree = xRepositoryService.selectXRepositoryList(r); - XRepository repository=xRepositoryService.selectXRepositoryById(2L); - mmap.put("repository", repository); + //XRepository repository=xRepositoryService.selectXRepositoryById(2L); + //mmap.put("repository", repository); mmap.put("repoTree", repoTree); - mmap.put("excludeId", excludeId); + mmap.put("type", type); return "kettle/common/repository_tree"; } @GetMapping("/repositoryRoot") @@ -75,10 +75,10 @@ public class XRepositoryController extends BaseController List ztrees = xRepositoryService.selectRepoRoot(new XRepository()); return ztrees; } - @PostMapping("/qryRepoSubTree/{id}") + @PostMapping("/qryRepoSubTree/{id}/{type}") @ResponseBody - public List qryRepoSubTree(@PathVariable("id") Long id, ModelMap mmapy) { - List ztrees = xRepositoryService.selectRepoTree(id); + public List qryRepoSubTree(@PathVariable("id") Long id,@PathVariable("type") String type, ModelMap mmapy) { + List ztrees = xRepositoryService.selectRepoTree(id,type); return ztrees; } /** diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java index 9775c6d77..ad01cc53b 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/repo/XRepoManager.java @@ -26,15 +26,15 @@ public class XRepoManager { public XRepoManager() { } - public static List getAllDirectoryTreeList(String repoId, Repository repository, String path, List allRepositoryTreeList) throws KettleException { - List repositoryTreeList = getJobAndTrans(repoId, repository, path); + public static List getAllDirectoryTreeList(String repoId, Repository repository, String path, List allRepositoryTreeList,String type) throws KettleException { + List repositoryTreeList = getJobAndTrans(repoId, repository, path,type); if (repositoryTreeList.size() != 0) { Iterator var5 = repositoryTreeList.iterator(); while(var5.hasNext()) { RepositoryTree repositoryTree = (RepositoryTree)var5.next(); if (!repositoryTree.isLasted()) { - getAllDirectoryTreeList(repoId, repository, repositoryTree.getPath(), allRepositoryTreeList); + getAllDirectoryTreeList(repoId, repository, repositoryTree.getPath(), allRepositoryTreeList,type); allRepositoryTreeList.add(repositoryTree); } else { allRepositoryTreeList.add(repositoryTree); @@ -44,7 +44,7 @@ public class XRepoManager { return allRepositoryTreeList; } - public static List getJobAndTrans(String repoId, Repository repository, String path) throws KettleException { + public static List getJobAndTrans(String repoId, Repository repository, String path,String type) throws KettleException { RepositoryDirectoryInterface rDirectory = repository.loadRepositoryDirectoryTree().findDirectory(path); List repositoryTreeList = getDirectory(repoId, repository, rDirectory); List li = repository.getJobAndTransformationObjects(rDirectory.getObjectId(), false); @@ -55,7 +55,7 @@ public class XRepoManager { RepositoryElementMetaInterface repel = (RepositoryElementMetaInterface)var6.next(); RepositoryTree repositoryTree; StringBuilder stringBuilder; - if ("job".equals(repel.getObjectType().toString())) { + if ("job".equals(repel.getObjectType().toString()) && type.equals("job")) { repositoryTree = new RepositoryTree(); stringBuilder = new StringBuilder(); stringBuilder.append("job").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); @@ -71,7 +71,7 @@ public class XRepoManager { repositoryTree.setLasted(true); repositoryTree.setPath(repel.getRepositoryDirectory().getPath()); repositoryTreeList.add(repositoryTree); - } else if ("transformation".equals(repel.getObjectType().toString())) { + } else if ("transformation".equals(repel.getObjectType().toString())&& type.equals("trans")) { repositoryTree = new RepositoryTree(); stringBuilder = new StringBuilder(); stringBuilder.append("transformation").append(rDirectory.getObjectId().toString()).append("@").append(repel.getObjectId().toString()); diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java index f8d8289f9..eca79054a 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IXRepositoryService.java @@ -63,7 +63,7 @@ public interface IXRepositoryService */ public int deleteXRepositoryById(Long id); - List selectRepoTree(Long id); + List selectRepoTree(Long id,String type); List selectRepoRoot(XRepository repository); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java index a856baf84..499236de8 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java @@ -177,7 +177,13 @@ public class KettleTransServiceImpl implements IKettleTransService return AjaxResult.success("执行成功!"); } - + /** + * @Description:查询抓换执行日志 + * @Author: Kone.wang + * @Date: 2021/7/28 16:24 + * @param kettleTrans: + * @return: java.util.List + **/ @Override public List queryTransLog(KettleTrans kettleTrans) { List transLogs=kettleTransMapper.queryTransLog(kettleTrans.getTransName()); diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java index 28478b3c3..d103612c3 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/XRepositoryServiceImpl.java @@ -124,11 +124,10 @@ public class XRepositoryServiceImpl implements IXRepositoryService } @Override - public List selectRepoTree(Long id) { + public List selectRepoTree(Long id,String type) { XRepository xrs = xRepositoryMapper.selectXRepositoryById(id); - List repositoryTrees = getRepoTress(xrs); + List repositoryTrees = getRepoTress(xrs,type); List subTrees = new ArrayList<>(); - String type=null; String pId=String.valueOf(xrs.getId()); // try // { @@ -192,7 +191,7 @@ public class XRepositoryServiceImpl implements IXRepositoryService } return ztrees; } - private List getRepoTress(XRepository xr) { + private List getRepoTress(XRepository xr,String jobortrans) { List repositoryTrees = new ArrayList<>(); List xRepositoryList =xRepositoryMapper.selectXRepositoryList(xr); @@ -208,7 +207,7 @@ public class XRepositoryServiceImpl implements IXRepositoryService try { KettleFileRepository repository = (KettleFileRepository) KettleUtil_2. conFileRep(String.valueOf(item.getId()), item.getRepoName(), baseDir); - XRepoManager.getAllDirectoryTreeList(String.valueOf(item.getId()), repository, "/", tmpRepositoryList); + XRepoManager.getAllDirectoryTreeList(String.valueOf(item.getId()), repository, "/", tmpRepositoryList,jobortrans); if (tmpRepositoryList.size() > 0) { RepositoryDirectoryInterface rDirectory = repository.loadRepositoryDirectoryTree().findDirectory("/"); RepositoryTree repositoryTree = new RepositoryTree(); diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java index 38a230e1e..c94960847 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java @@ -43,9 +43,7 @@ public class KettleUtil { public void callTrans(String transPath, String transName, Map namedParams, String[] clParams) throws Exception { KettleEnv.init(); DatabaseMeta databaseMeta=new DatabaseMeta("kettle_trans_log", "mysql", "Native(JDBC)", - "192.168.2.18","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "abc.123"); -// DatabaseMeta databaseMeta=new DatabaseMeta("kettle_trans_log", "mysql", "Native(JDBC)", -// "127.0.0.1","etl?useUniCode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC","3306","root","2129"); + "xxx.xxx.x.xx","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "password"); String msg; KettleFileRepository repo = this.fileRepositoryCon(); @@ -100,7 +98,7 @@ public class KettleUtil { KettleEnv.init(); String msg; DatabaseMeta databaseMeta=new DatabaseMeta("kettle_job_log", "mysql", "Native(JDBC)", - "192.168.2.18","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "abc.123"); + "xxx.xxx.x.xx","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "password"); KettleFileRepository repo = this.fileRepositoryCon(); JobMeta jobMeta = this.loadJob(repo, jobPath, jobName); jobMeta.addDatabase(databaseMeta); diff --git a/bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html b/bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html index f8bf1f2d0..c3b637b95 100644 --- a/bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html +++ b/bps-kettle/src/main/resources/templates/kettle/common/repository_tree.html @@ -32,9 +32,9 @@ diff --git a/ruoyi-admin/src/main/resources/templates/main.html b/ruoyi-admin/src/main/resources/templates/main.html index ef324c721..ab20e2681 100644 --- a/ruoyi-admin/src/main/resources/templates/main.html +++ b/ruoyi-admin/src/main/resources/templates/main.html @@ -9,10 +9,41 @@ + -
    +
    +
    +

    [[${wordsContent}]]

    +
    --  《[[${wordsOrigin}]]》 · [[${wordsAuthor}]]
    +

    +

    [[${oneWordContent}]]

    +
    --  《[[${oneWordOrigin}]]》
    +
    +
    + + From 934b2854aa8fc0d3b10b31d55ca0473dedd87560 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Sun, 1 Aug 2021 00:29:14 +0800 Subject: [PATCH 67/90] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1Token=E7=94=B1=E5=AD=98=E6=94=BE=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=AD=98?= =?UTF-8?q?=E6=94=BE=E5=88=B0EHCache=E7=BC=93=E5=AD=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/conrtroller/WechatApiController.java | 16 +++-- .../src/main/resources/templates/main.html | 4 +- .../service/impl/WechatApiServiceImpl.java | 72 ++++++++++++++++--- 3 files changed, 73 insertions(+), 19 deletions(-) diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java index d5347d7d9..7439ebbbf 100644 --- a/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java @@ -7,6 +7,7 @@ import com.ruoyi.system.service.IWechatApiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.ServletException; @@ -24,13 +25,14 @@ public class WechatApiController extends BaseController { @Autowired IWechatApiService wechatApiService; - /* @RequestMapping("anon/getAccessToken") + @RequestMapping("anon/getAccessToken") + @ResponseBody public String getAccessToken() { return wechatApiService.GetAccessToken(); } - */ + @GetMapping("anon/userInfo") - public Map getJSON(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + public Map getJSON(HttpServletRequest request, HttpServletResponse response) throws IOException { BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8")); StringBuilder responseStrBuilder = new StringBuilder(); @@ -38,8 +40,8 @@ public class WechatApiController extends BaseController { while ((inputStr = streamReader.readLine()) != null) { responseStrBuilder.append(inputStr); } - Map params = JSON.parseObject(responseStrBuilder.toString(), Map.class); - return params; + return JSON.parseObject(responseStrBuilder.toString(), Map.class); + } @@ -51,7 +53,7 @@ public class WechatApiController extends BaseController { userIdList.add("erqrqwe");//错误userId示例 userIdList.add(""); //空UserId示例 userIdList.add("359"); - if(!ShiroUtils.getUserId().equals("359")){ + if(! String.valueOf(ShiroUtils.getUserId()).equals("359")){ userIdList.add(String.valueOf(ShiroUtils.getUserId())); } Map resultMap = wechatApiService.SendTextMessageToWechatUser(userIdList,"哈哈哈!"); @@ -68,7 +70,7 @@ public class WechatApiController extends BaseController { userIdList.add("359"); //userIdList.add("454"); //userIdList.add("408"); - if(!ShiroUtils.getUserId().equals("359")){ + if(!String.valueOf(ShiroUtils.getUserId()).equals("359")){ userIdList.add(String.valueOf(ShiroUtils.getUserId())); } String title="号外:特大优惠!限时抢购"; diff --git a/ruoyi-admin/src/main/resources/templates/main.html b/ruoyi-admin/src/main/resources/templates/main.html index ab20e2681..6ec038b68 100644 --- a/ruoyi-admin/src/main/resources/templates/main.html +++ b/ruoyi-admin/src/main/resources/templates/main.html @@ -4,7 +4,7 @@ - BPS后台管理系统介绍 + BPS后台管理系统 @@ -33,7 +33,7 @@ -
    +

    [[${wordsContent}]]

    --  《[[${wordsOrigin}]]》 · [[${wordsAuthor}]]
    diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java index 4be152a3c..52bad6719 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatApiServiceImpl.java @@ -2,23 +2,25 @@ package com.ruoyi.system.service.impl; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; -import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.CacheUtils; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.system.domain.WechatAccessToken; -import com.ruoyi.system.domain.WechatSendMessage; import com.ruoyi.system.domain.WechatUserInfo; import com.ruoyi.system.mapper.WechatAccessTokenMapper; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.IWechatApiService; +import org.apache.shiro.cache.Cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.ResponseBody; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Service public class WechatApiServiceImpl implements IWechatApiService { @@ -45,6 +47,31 @@ public class WechatApiServiceImpl implements IWechatApiService { */ @Override public String GetAccessToken() { + String cacheName = "wechatToke:" + corpId + "," + agentId; + + //获取缓存中accessToken与缓存的时间信息 + Cache cache = CacheUtils.getCache(cacheName); + String accessToken = (String) cache.get("accessToken"); + Date getTokenTime = ObjectToDate(cache.get("getTokenTime")); + Integer expires_in = ObjectToInteger(cache.get("expires_in")); + //如果没有获取到cache或者accessToken为空或者cache即将过期,则重新获取并返回新的accessToken; + if (StringUtils.isEmpty(accessToken) || null == getTokenTime ? true : (differenceSecond(DateUtils.getNowDate(), getTokenTime) + 1000 > expires_in ? true : false)) { + //清空wechatAccessTokenCache + CacheUtils.removeAll(cacheName); + //从企业微信获取新的accessToken + WechatAccessToken wechatAccessToken = getAccessTokenFromWechat(corpId, secret, agentId); + //将Token写入缓存 + CacheUtils.put(cacheName, "accessToken", wechatAccessToken.getAccess_token()); + CacheUtils.put(cacheName, "expires_in", wechatAccessToken.getExpires_in()); + CacheUtils.put(cacheName, "getTokenTime", DateUtils.getNowDate()); + //返回token + return wechatAccessToken.getAccess_token(); + } + return accessToken; + } + + /* + public String GetAccessToken() { //获取本地数据库中的Token WechatAccessToken wat = new WechatAccessToken(); wat.setCorpId(corpId); @@ -55,6 +82,7 @@ public class WechatApiServiceImpl implements IWechatApiService { if(list.isEmpty() || list.size() <=0) { returnWat= getAccessTokenFromWechat(corpId,secret,agentId); + //将accessToken写入数据库 wechatAccessTokenMapper.insertWechatAccessToken(returnWat); return returnWat.getAccess_token(); } @@ -83,6 +111,34 @@ public class WechatApiServiceImpl implements IWechatApiService { //如果以上情况皆不是,则返回本地数据库的token return list.get(0).getAccess_token(); + }*/ + + //将对象转化为日期,如果无法转换则返回空值,避免抛出异常。 + private Date ObjectToDate(Object obj){ + try { + return (Date) obj; + }catch (Exception e){ + return null; + } + } + + //将对象转化为Integer,如果对象为空或无法转换返回0, + private Integer ObjectToInteger(Object obj){ + //如果为空返回零 + if(null==obj){ + return 0; + } + try{ + return Integer.parseInt(obj.toString()); + }catch (Exception e){ + //发生异常返回0 + return 0; + } + } + + //获取相两个日期相差秒数 + private int differenceSecond(Date minuendDate, Date subtractionDate ) { + return (int)((minuendDate.getTime() - subtractionDate.getTime()) / 1000); } //根据corpId与corpSecret获取Token @@ -97,12 +153,6 @@ public class WechatApiServiceImpl implements IWechatApiService { return wechatAccessToken; } - //获取相两个日期相差秒数 - private int differenceSecond(Date minuendDate, Date subtractionDate ) { - return (int)((minuendDate.getTime() - subtractionDate.getTime()) / 1000); - } - - /** * 根据企业微信登录身份获取本地LoginName * @@ -201,6 +251,8 @@ public class WechatApiServiceImpl implements IWechatApiService { /** * 推送text消息到企业微信用户 + * 其中text参数的content字段可以支持换行、以及A标签,即可打开自定义的网页 + * 示例:"content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看邮件中心视频实况,聪明避开排队。" * @param toUserList 发送的用户列表 * @param message 发送的消息内容 * @return 消息发送结果 From 188a53bf7fff2ee1f31e1e9c21507acfe6c8aadb Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Mon, 2 Aug 2021 00:58:21 +0800 Subject: [PATCH 68/90] =?UTF-8?q?1=E3=80=81=E8=B0=83=E6=95=B4=E5=90=8C?= =?UTF-8?q?=E6=AD=A5OA=E4=BA=BA=E5=91=98=E3=80=81=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=202=E3=80=81=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BF=9D=E7=95=99=E7=B3=BB=E7=BB=9F=E5=8E=9F?= =?UTF-8?q?=E6=9C=89=E5=A4=B4=E5=83=8F=EF=BC=8C=E5=AF=86=E7=A0=81=E7=AD=89?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=203=E3=80=81=E5=BD=93=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E5=8F=82=E8=AE=BE=E7=BD=AE=E4=B8=BA=E4=BB=8EOA=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=97=B6=EF=BC=8C=E9=9A=90=E8=97=8F=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E3=80=81=E7=BC=96=E8=BE=91=E3=80=81=E5=88=A0=E9=99=A4=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetEcologyInfoTestController.java | 18 +++----- .../controller/system/SysDeptController.java | 20 ++++----- .../controller/system/SysUserController.java | 19 ++++---- .../src/main/resources/templates/main.html | 2 +- .../resources/templates/system/dept/dept.html | 29 ++++++++++--- .../resources/templates/system/user/edit.html | 35 +++++++++------ .../resources/templates/system/user/user.html | 7 ++- .../ruoyi/system/service/ISysDeptService.java | 4 +- .../ruoyi/system/service/ISysUserService.java | 4 +- .../service/impl/SysDeptServiceImpl.java | 38 ++++++++++++++-- .../service/impl/SysUserServiceImpl.java | 43 +++++++++++++++++-- 11 files changed, 156 insertions(+), 63 deletions(-) diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java index faf741d0d..0d52737dc 100644 --- a/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/GetEcologyInfoTestController.java @@ -2,6 +2,7 @@ package com.ruoyi.test.conrtroller; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; @@ -16,27 +17,20 @@ public class GetEcologyInfoTestController extends BaseController { private ISysUserService userService; @RequestMapping("/anon/getEcologyDept") - public String getEcologyDept() throws Exception { + public AjaxResult getEcologyDept() throws Exception { String url="http://192.168.2.85:90/api/hrm/resful/getHrmdepartmentWithPage"; String params="{\"params\":{\"pagesize\":999999}}"; //return sendPost(url,params); - int result = deptService.syncEcologyDept(url,params); - if(result==200){ - return "同步成功"; - } - return "同步失败"; + return deptService.syncEcologyDept(url,params); + } @RequestMapping("/anon/getEcologyUser") - public String getEcologyUser(){ + public AjaxResult getEcologyUser(){ String url="http://192.168.2.85:90/api/hrm/resful/getHrmUserInfoWithPage"; String params="{\"params\":{\"pagesize\":999999}}"; - int result = userService.syncEcologyUser(url,params); - if(result==200){ - return "同步成功"; - } - return "同步失败"; + return userService.syncEcologyUser(url,params); } /* *//*public Map sendPostWithRest(String url,String params){ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index e123bee99..f751e33b2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,6 +1,8 @@ package com.ruoyi.web.controller.system; import java.util.List; + +import com.ruoyi.system.service.ISysConfigService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -37,6 +39,9 @@ public class SysDeptController extends BaseController @Autowired private ISysDeptService deptService; + @Autowired + ISysConfigService configService; + @RequiresPermissions("system:dept:view") @GetMapping() public String dept() @@ -157,7 +162,7 @@ public class SysDeptController extends BaseController /** * 选择部门树 - * + * * @param deptId 部门ID * @param excludeId 排除ID */ @@ -212,14 +217,9 @@ public class SysDeptController extends BaseController @RequiresPermissions("system:dept:sync") @PostMapping("/syncDept") @ResponseBody - public AjaxResult syncDept() - { - String url="http://192.168.2.85:90/api/hrm/resful/getHrmdepartmentWithPage"; - String params="{\"params\":{\"pagesize\":999999}}"; - int result = deptService.syncEcologyDept(url,params); - if(result==200){ - return AjaxResult.success("同步Ecology部门成功,返回状态码:"+result); - } - return AjaxResult.error("同步Ecology部门失败,返回状态码:"+result); + public AjaxResult syncDept() { + String url = "http://192.168.2.85:90/api/hrm/resful/getHrmdepartmentWithPage"; + String params = "{\"params\":{\"pagesize\":999999}}"; + return deptService.syncEcologyDept(url, params); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 1a6a487fc..cd51e33ff 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -2,6 +2,8 @@ package com.ruoyi.web.controller.system; import java.util.List; import java.util.stream.Collectors; + +import com.ruoyi.system.service.ISysConfigService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -52,6 +54,9 @@ public class SysUserController extends BaseController @Autowired private SysPasswordService passwordService; + @Autowired + private ISysConfigService configService; + @RequiresPermissions("system:user:view") @GetMapping() public String user() @@ -293,14 +298,10 @@ public class SysUserController extends BaseController @RequiresPermissions("system:user:sync") @PostMapping("/syncUser") @ResponseBody - public AjaxResult syncDept() - { - String url="http://192.168.2.85:90/api/hrm/resful/getHrmUserInfoWithPage"; - String params="{\"params\":{\"pagesize\":999999}}"; - int result = userService.syncEcologyUser(url,params); - if(result==200){ - return AjaxResult.success("Ecology人员同步成功,返回状态码:"+result); - } - return AjaxResult.error("Ecology人员同步失败,返回状态码:"+result); + public AjaxResult syncUser() { + String url = "http://192.168.2.85:90/api/hrm/resful/getHrmUserInfoWithPage"; + String params = "{\"params\":{\"pagesize\":999999}}"; + return userService.syncEcologyUser(url, params); } + } \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/main.html b/ruoyi-admin/src/main/resources/templates/main.html index 6ec038b68..3b5096ee6 100644 --- a/ruoyi-admin/src/main/resources/templates/main.html +++ b/ruoyi-admin/src/main/resources/templates/main.html @@ -33,7 +33,7 @@ -
    +

    [[${wordsContent}]]

    --  《[[${wordsOrigin}]]》 · [[${wordsAuthor}]]
    diff --git a/ruoyi-admin/src/main/resources/templates/system/dept/dept.html b/ruoyi-admin/src/main/resources/templates/system/dept/dept.html index 566ba20a8..4cc4b0948 100644 --- a/ruoyi-admin/src/main/resources/templates/system/dept/dept.html +++ b/ruoyi-admin/src/main/resources/templates/system/dept/dept.html @@ -35,7 +35,7 @@ 新增 - + 修改 @@ -96,6 +96,7 @@ { title: '操作', align: 'left', + visible: showAction(), formatter: function(value, row, index) { if (row.parentId != 0) { var actions = []; @@ -112,30 +113,44 @@ $.treeTable.init(options); }); + function showAction(){ + if(deptSyncType == "1"){ + return false; + } + return true; + } + + function editDept(){ + if(deptSyncType =="0") { + $.operate.edit(); + }else { + alert("已启用同步Ecology部门信息,禁止手动修改部门!") + } + } function addDept(){ if(deptSyncType =="0") { $.operate.add(999999); }else { - alert("系统参数已启用同步Ecology部门信息,禁止手动新增部门!") + alert("已启用同步Ecology部门信息,禁止手动新增部门!") } } function syncDept() { - if(deptSyncType =="1") { + /*if(deptSyncType =="1") {*/ $.ajax({ type: 'POST', url: ctx + "system/dept/syncDept", - data: JSON.stringify(""), //beauty是字符串 + data: JSON.stringify(""), contentType: "application/json", dataType: "json", success: function (message) { alert(JSON.stringify(message)); //将JSON对象转换为字符串 } }); - }else { - alert("系统参数未启用同步Ecology部门!") - } + /*}else { + alert("系统未启用同步Ecology部门!"); + }*/ }; diff --git a/ruoyi-admin/src/main/resources/templates/system/user/edit.html b/ruoyi-admin/src/main/resources/templates/system/user/edit.html index 3d598dbd4..afd2919ad 100644 --- a/ruoyi-admin/src/main/resources/templates/system/user/edit.html +++ b/ruoyi-admin/src/main/resources/templates/system/user/edit.html @@ -15,7 +15,7 @@
    - +
    @@ -37,7 +37,7 @@
    - +
    @@ -48,7 +48,7 @@
    - +
    @@ -91,8 +91,8 @@
    - +
    @@ -133,6 +133,7 @@ diff --git a/ruoyi-admin/src/main/resources/templates/system/user/user.html b/ruoyi-admin/src/main/resources/templates/system/user/user.html index f7a58d70d..10ae93007 100644 --- a/ruoyi-admin/src/main/resources/templates/system/user/user.html +++ b/ruoyi-admin/src/main/resources/templates/system/user/user.html @@ -96,6 +96,7 @@ var editFlag = [[${@permission.hasPermi('system:user:edit')}]]; var removeFlag = [[${@permission.hasPermi('system:user:remove')}]]; var resetPwdFlag = [[${@permission.hasPermi('system:user:resetPwd')}]]; + var userSyncType = [[${#strings.defaultString(@config.getKey('sys.user.sync'), 0)}]]; var prefix = ctx + "system/user"; $(function() { @@ -191,7 +192,7 @@ }; $.table.init(options); } - + function queryDeptTree() { var url = ctx + "system/dept/treeData"; @@ -267,6 +268,7 @@ } function syncUser() { + /*if(userSyncType=="1") {*/ $.ajax({ type: 'POST', url: ctx + "system/user/syncUser", @@ -277,6 +279,9 @@ alert(JSON.stringify(message)); //将JSON对象转换为字符串 } }); + /*}else { + alert("系统未启用同步Ecology部门!"); + }*/ }; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java index 7deaf4055..258f75511 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -1,6 +1,8 @@ package com.ruoyi.system.service; import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; @@ -111,5 +113,5 @@ public interface ISysDeptService /** * Ecology部门信息同步 */ - public int syncEcologyDept(String url,String params); + public AjaxResult syncEcologyDept(String url, String params); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 0492ec362..e4c214331 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -1,6 +1,8 @@ package com.ruoyi.system.service; import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.system.domain.SysUserRole; @@ -208,7 +210,7 @@ public interface ISysUserService /** * Ecology人员信息同步 */ - public int syncEcologyUser(String url,String params); + public AjaxResult syncEcologyUser(String url, String params); /** * 查询用户列表 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 3a6bc28ba..1bcd2f9ff 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -4,16 +4,22 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.exception.BusinessException; +import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.system.domain.EcologyDept; import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysDeptService; +import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.system.service.IWechatApiService; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -35,6 +41,15 @@ public class SysDeptServiceImpl implements ISysDeptService @Autowired private SysDeptMapper deptMapper; + @Autowired + private ISysConfigService sysconfig; + + @Autowired + private IWechatApiService wechatApiService; + + @Autowired + ISysUserService userService; + /** * 查询部门管理数据 * @@ -66,7 +81,7 @@ public class SysDeptServiceImpl implements ISysDeptService /** * 查询部门管理树(排除下级) * - * @param deptId 部门ID + * @param dept 部门 * @return 所有部门信息 */ @Override @@ -320,9 +335,24 @@ public class SysDeptServiceImpl implements ISysDeptService * Ecology部门信息同步 */ @Override - public int syncEcologyDept(String url,String params) { - int result= deptSync(HttpUtils.sendPostWithRest(url,params)); - return result; + public AjaxResult syncEcologyDept(String url, String params) { + String msg="同步OA部门失败!"; + List userList=new ArrayList<>(); + userList.add(ShiroUtils.getLoginName().equals("admin")?"359":String.valueOf(ShiroUtils.getUserId())); + if( ! sysconfig.selectConfigByKey("sys.dept.sync").equals("1")){ + msg="OA部门同步失败!系统未开启OA部门同步!"; + wechatApiService.SendTextMessageToWechatUser(userList,msg); + return AjaxResult.success(msg,"false"); + } + int result =deptSync(HttpUtils.sendPostWithRest(url,params)); + if( result==200) + { + return AjaxResult.success("OA部门同步成功!",result); + } + + wechatApiService.SendTextMessageToWechatUser(userList,msg+"result:"+result); + return AjaxResult.error(msg,result); + } @SuppressWarnings("unchecked") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index eaf08e3ab..5045313b8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -6,10 +6,12 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.exception.BusinessException; +import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.security.Md5Utils; @@ -17,6 +19,7 @@ import com.ruoyi.system.domain.*; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.system.service.IWechatApiService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -56,6 +59,9 @@ public class SysUserServiceImpl implements ISysUserService @Autowired private ISysConfigService configService; + @Autowired + private IWechatApiService wechatApiService; + /** * 根据条件分页查询用户列表 * @@ -535,9 +541,24 @@ public class SysUserServiceImpl implements ISysUserService * @param params */ @Override - public int syncEcologyUser(String url, String params) { + public AjaxResult syncEcologyUser(String url, String params) { + String msg="OA人员同步失败!"; + List userList=new ArrayList<>(); + userList.add(ShiroUtils.getLoginName().equals("admin")?"359":String.valueOf(ShiroUtils.getUserId())); + if( ! configService.selectConfigByKey("sys.user.sync").equals("1")){ + msg="OA人员同步失败!系统未开启OA人员同步!"; + wechatApiService.SendTextMessageToWechatUser(userList,msg); + return AjaxResult.success(msg,"false"); + } int result= userSync(HttpUtils.sendPostWithRest(url,params)); - return result; + if( result==200) + { + return AjaxResult.success("OA人员同步成功!",result); + } + + wechatApiService.SendTextMessageToWechatUser(userList,msg+"result:"+result); + return AjaxResult.error(msg,result); + } /** @@ -569,10 +590,15 @@ public class SysUserServiceImpl implements ISysUserService List ecologyUserList= new Gson().fromJson(dataMap.get("dataList").toString(), new TypeToken>(){}.getType()); */ + //获取原同步的用户 + SysUser oldSysUser=new SysUser(); + oldSysUser.setUserType("02"); + List oldSysUserList=userMapper.selectUserLists(oldSysUser); + //删除从Ecology同步过来(用户类型为02)的用户 userMapper.deleteEcologySyncUser(); - //同步Ecology部门信息 + //同步Ecology人员信息 SysUser user = new SysUser(); for(EcologyUser ecologyUser:ecologyUserList){ if(ecologyUser.getSubcompanyid1().equals("1") && StringUtils.isNotEmpty(ecologyUser.getLoginid())) { //只取分部ID为“1”的员工 @@ -593,6 +619,17 @@ public class SysUserServiceImpl implements ISysUserService user.setPhonenumber(ecologyUser.getMobile()); user.setStatus(ecologyUser.getStatus().equals("5")?"1":"0"); //Ecology为离职状态5,则无效 user.setDelFlag("0"); + for(SysUser oldUser:oldSysUserList){ + if(String.valueOf(oldUser.getUserId()).equals(ecologyUser.getId())){ + user.setAvatar(oldUser.getAvatar()); + user.setPassword(oldUser.getPassword()); + user.setSalt(oldUser.getSalt()); + user.setLoginDate(oldUser.getLoginDate()); + user.setLoginIp(oldUser.getLoginIp()); + user.setPwdUpdateDate(oldUser.getPwdUpdateDate()); + user.setRemark(oldUser.getRemark()); + } + } userMapper.insertUser(user); } } From 1b58ebf2e80e62cf9f2c1e3cdb3418cfdff9cf08 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Mon, 2 Aug 2021 11:56:30 +0800 Subject: [PATCH 69/90] =?UTF-8?q?1=E3=80=81=E8=B0=83=E6=95=B4=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=A4=B4=E5=83=8F=202=E3=80=81=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=8A=B6=E6=80=81=E4=B8=BA02=EF=BC=88?= =?UTF-8?q?=E4=BB=8EOA=E5=90=8C=E6=AD=A5=EF=BC=89=EF=BC=8C=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=9C=A8=E8=81=8C=E7=8A=B6=E6=80=81=E4=B9=9F=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E5=81=9A=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/static/img/profile.jpg | Bin 81131 -> 16644 bytes .../resources/templates/system/user/edit.html | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ruoyi-admin/src/main/resources/static/img/profile.jpg b/ruoyi-admin/src/main/resources/static/img/profile.jpg index b3a940b21cc9dcea01e62d94e243eebcf76d96bc..91e9a7a3558f77461117773e2ef54f36c368f515 100644 GIT binary patch literal 16644 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 z≺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 diff --git a/ruoyi-admin/src/main/resources/templates/system/user/edit.html b/ruoyi-admin/src/main/resources/templates/system/user/edit.html index afd2919ad..2dec17c30 100644 --- a/ruoyi-admin/src/main/resources/templates/system/user/edit.html +++ b/ruoyi-admin/src/main/resources/templates/system/user/edit.html @@ -231,8 +231,11 @@ }); //如果用户状态为02(从OA同步),则将相关信息不能做变更 if(userType=="02") { - $("#email,#userName,#treeName,#phonenumber").attr("readonly", "readonly") - } + $("#email,#userName,#treeName,#phonenumber").attr("readonly", "readonly"); + $("#status").click(function(){ + this.checked = !this.checked; + }); + }; }) From 36db7fa387fc2ad5891a3b2f641314803ab529da Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Tue, 3 Aug 2021 09:12:51 +0800 Subject: [PATCH 70/90] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8E=A5=E5=8F=97Topgp?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E5=BF=AB=E9=80=92=E8=AF=B7=E6=B1=82=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpSubsPushApiController.java | 13 ++++ .../bps/service/IExpSubsPushApiService.java | 14 +++++ .../impl/ExpSubsPushApiServiceImpl.java | 63 +++++++++++++++++-- .../test/conrtroller/WechatApiController.java | 7 ++- .../com/ruoyi/common/utils/ServletUtils.java | 30 +++++++-- 5 files changed, 115 insertions(+), 12 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java index 02e7cc63e..b3146b5c5 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java @@ -3,7 +3,9 @@ package com.ruoyi.bps.controller; import com.kuaidi100.sdk.response.SubscribeResp; import com.ruoyi.bps.domain.ExpSubscribe; import com.ruoyi.bps.service.IExpSubsPushApiService; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; /** * 接受快递推送信息的API接口Controller @@ -42,5 +46,14 @@ public class ExpSubsPushApiController extends BaseController { return expSubsPushApiService.ExpressSubscribe(expSubscribe); } + //接受ERP订阅, + @Log(title = "快递订阅", businessType = BusinessType.OTHER) + @CrossOrigin + @PostMapping("/topgpExpressSubscribe") + public String topgpSubscribe(HttpServletRequest request,HttpServletResponse response) throws IOException { + return expSubsPushApiService.ExpressSubscribeWithTopgp(request); + } + + } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java index 5867116de..f47f834de 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IExpSubsPushApiService.java @@ -4,8 +4,15 @@ import com.ruoyi.bps.domain.ExpSubscribe; import com.kuaidi100.sdk.response.SubscribeResp; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; public interface IExpSubsPushApiService { + + /** + * 向快递100推送订阅请求 + * @param expSubscribe + * @return + */ public SubscribeResp ExpressSubscribe(ExpSubscribe expSubscribe); /** @@ -19,4 +26,11 @@ public interface IExpSubsPushApiService { * */ public SubscribeResp ExpressSubscribeCallBackUrl(HttpServletRequest request); + + /** + * 获取Topgp推送的快递信息,向快递100推送订阅请求 + * @param request + * @return + */ + public String ExpressSubscribeWithTopgp(HttpServletRequest request) throws IOException; } diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java index 50b3ede50..a3b86615d 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.bps.service.impl; +import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.kuaidi100.sdk.api.Subscribe; import com.kuaidi100.sdk.contant.ApiInfoConstant; @@ -20,12 +21,16 @@ import com.ruoyi.bps.service.IExpSubsPushApiService; import com.ruoyi.bps.service.IExpSubsPushRespService; import com.ruoyi.bps.service.IExpSubscribeService; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { @@ -50,6 +55,8 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { */ @Override public SubscribeResp ExpressSubscribe(ExpSubscribe expSubscribe) { + String subscribeFrom= expSubscribe.getSalt().equals("topgp")?"topgp":"bpsemi"; + SubscribeParameters subscribeParameters = new SubscribeParameters(); SubscribeResp subscribeResp = new SubscribeResp(); subscribeParameters.setCallbackurl("http://report.bpsemi.cn:8081/it_war/anon/subscribeCallBackUrl"); @@ -68,7 +75,7 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { IBaseClient subscribe = new Subscribe(); try{ HttpResult httpResult= subscribe.execute(subscribeReq); - System.out.println(httpResult); + //System.out.println(httpResult); subscribeResp= new Gson().fromJson(httpResult.getBody(),SubscribeResp.class); }catch (Exception e) { @@ -85,13 +92,13 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { newExpSubscribe.setCompany(expSubscribe.getCompany()); newExpSubscribe.setNumber(expSubscribe.getNumber()); newExpSubscribe.setPhone(expSubscribe.getPhone()); - newExpSubscribe.setSalt("bpsemi"); + newExpSubscribe.setSalt(subscribeFrom); //偷懒,把请求来源记录到salt栏位,不再增加exp_subscribe字段了。。以后找时间改吧 newExpSubscribe.setSubscribeTime(DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); newExpSubscribe.setResult((subscribeResp.isResult())?"true":"false"); newExpSubscribe.setReturnCode(subscribeResp.getReturnCode()); newExpSubscribe.setMessage(subscribeResp.getMessage()); - ExpSubscribe queryExpSubscribe = new ExpSubscribe(); + /*ExpSubscribe queryExpSubscribe = new ExpSubscribe(); queryExpSubscribe.setCompany(expSubscribe.getCompany()); queryExpSubscribe.setNumber(expSubscribe.getNumber()); queryExpSubscribe.setResult(expSubscribe.getResult()); @@ -107,7 +114,9 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { }else { //如果数据库中没有快递单号+快递公司编码,则更插入新记录 expSubscribeService.insertExpSubscribe(newExpSubscribe); - } + }*/ + //20210802 无论系统里有没有记录,都会记录本次推送。 + expSubscribeService.insertExpSubscribe(newExpSubscribe); //返回订阅结果 return subscribeResp; @@ -252,6 +261,52 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { } + /** + * 获取Topgp推送的快递信息,向快递100推送订阅请求 + * + * @param request + * @return + */ + @Override + public String ExpressSubscribeWithTopgp(HttpServletRequest request) throws IOException { + //获取httpServletRequest传过来的Json字符串,并进行解析 + JSONObject contentJson= JSONObject.parseObject(ServletUtils.getRequestContent(request)); + String deliveryNo= contentJson.getString("deliveryNo"); + String expressNo = contentJson.getString("expressNo"); + String company = contentJson.getString("company"); + String phone = contentJson.getString("phone"); + //如果出货单号或者快递单号为空,则返回错误信息,并写入Logo + if(StringUtils.isEmpty(deliveryNo) || StringUtils.isEmpty(expressNo)){ + Map map=new HashMap<>(); + map.put("result",false); + map.put("returnCode",700); + map.put("message","快递单号或出货单号为空!"); + map.put("deliveryNo",deliveryNo); + map.put("expressNo",expressNo); + //写入Logo + //todo + + //返回错误信息 + return map.toString(); + + } + //向快递100推送订阅请求 + ExpSubscribe expSubscribe=new ExpSubscribe(); + expSubscribe.setNumber(expressNo); + expSubscribe.setCompany(company); + expSubscribe.setPhone(phone); + expSubscribe.setSalt("topgp"); //偷懒,把请求来源记录到salt栏位,不再增加exp_subscribe字段了。。以后找时间改吧 + SubscribeResp subscribeResp= ExpressSubscribe(expSubscribe); + + Object object = JSONObject.toJSON(subscribeResp); + Map map=JSONObject.parseObject(object.toString(), Map.class); + map.put("deliveryNo",deliveryNo); + map.put("expressNo",expressNo); + return map.toString(); + } + + + } diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java index 7439ebbbf..ef71ebbee 100644 --- a/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/WechatApiController.java @@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; @@ -32,7 +31,8 @@ public class WechatApiController extends BaseController { } @GetMapping("anon/userInfo") - public Map getJSON(HttpServletRequest request, HttpServletResponse response) throws IOException { + @ResponseBody + public Object getJSON(HttpServletRequest request, HttpServletResponse response) throws IOException { BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8")); StringBuilder responseStrBuilder = new StringBuilder(); @@ -40,7 +40,8 @@ public class WechatApiController extends BaseController { while ((inputStr = streamReader.readLine()) != null) { responseStrBuilder.append(inputStr); } - return JSON.parseObject(responseStrBuilder.toString(), Map.class); + //return JSON.parseObject(responseStrBuilder.toString(), Map.class); + return JSON.parse(responseStrBuilder.toString()); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java index a5a190cdd..f09cbadf9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -1,13 +1,15 @@ package com.ruoyi.common.utils; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import com.ruoyi.common.core.text.Convert; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import com.ruoyi.common.core.text.Convert; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.BufferedReader; +import java.io.IOException; /** * 客户端工具类 @@ -161,4 +163,22 @@ public class ServletUtils } return flag; } + + /** + * 从HttpServletRequest中获取post的json对象数据content-type=“text/plain” + * @param request + * @return content + * @throws IOException + */ + public static String getRequestContent(HttpServletRequest request) throws IOException { + BufferedReader reader = request.getReader(); + char[] buf = new char[request.getContentLength()]; + int len = 0; + StringBuffer contentBuffer = new StringBuffer(); + while ((len = reader.read(buf)) != -1) { + contentBuffer.append(buf, 0, len); + } + String content= contentBuffer.toString(); + return content; + } } From d5dcc8285d405a913c6b65bcae1f8f9a94c5f1f7 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 4 Aug 2021 16:59:22 +0800 Subject: [PATCH 71/90] =?UTF-8?q?=E9=9B=86=E6=88=90Jwt=E7=99=BB=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81TOPGP=E8=AE=BF=E9=97=AE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20Swagger=E6=96=87=E6=A1=A3=E5=AE=8C=E5=96=84?= =?UTF-8?q?=EF=BC=88=E5=BF=AB=E9=80=92=E3=80=81=E5=B8=86=E8=BD=AF=E3=80=81?= =?UTF-8?q?TOPGP=E8=AE=BF=E9=97=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpSubsPushApiController.java | 23 +-- .../controller/FrForCrTopgpController.java | 17 ++- .../impl/ExpSubsPushApiServiceImpl.java | 6 +- .../controller/system/SysLoginController.java | 51 ++++++- .../ruoyi/web/core/config/SwaggerConfig.java | 4 +- ruoyi-framework/pom.xml | 9 +- .../ruoyi/framework/config/ShiroConfig.java | 9 ++ .../jwt/auth/AllowAllCredentialsMatcher.java | 19 +++ .../ruoyi/framework/jwt/auth/JwtToken.java | 45 ++++++ .../ruoyi/framework/jwt/filter/JwtFilter.java | 135 +++++++++++++++++ .../jwt/service/IJwtTokenService.java | 13 ++ .../jwt/service/impl/JwtTokenServiceImpl.java | 59 ++++++++ .../ruoyi/framework/jwt/utils/JwtUtils.java | 66 +++++++++ .../framework/shiro/realm/UserRealm.java | 136 ++++++++++++------ .../web/exception/GlobalExceptionHandler.java | 3 +- 15 files changed, 525 insertions(+), 70 deletions(-) create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/AllowAllCredentialsMatcher.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/JwtToken.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/filter/JwtFilter.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/IJwtTokenService.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/impl/JwtTokenServiceImpl.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/utils/JwtUtils.java diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java index b3146b5c5..b33d9f2aa 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java @@ -7,11 +7,12 @@ import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.enums.BusinessType; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @@ -24,16 +25,16 @@ import java.io.IOException; * @author box * @date 2021-05-13 */ -@Api("快递信息订阅推送") +@Api(value = "快递信息订阅推送",tags = "快递订阅接口") @RestController -@RequestMapping("/anon") +/*@RequestMapping("/anon")*/ public class ExpSubsPushApiController extends BaseController { @Autowired IExpSubsPushApiService expSubsPushApiService; //推送 @CrossOrigin - @PostMapping("/subscribeCallBackUrl") + @PostMapping("anon/subscribeCallBackUrl") @ApiOperation("快递信息订阅推送接受") public SubscribeResp SubscribeCallBackUrl(HttpServletRequest request) { return expSubsPushApiService.ExpressSubscribeCallBackUrl(request); @@ -41,16 +42,22 @@ public class ExpSubsPushApiController extends BaseController { //订阅 @CrossOrigin - @PostMapping("/subscribe") + @PostMapping("anon/subscribe") public SubscribeResp Subscribe(ExpSubscribe expSubscribe){ return expSubsPushApiService.ExpressSubscribe(expSubscribe); } - //接受ERP订阅, + //接受topgp订阅, @Log(title = "快递订阅", businessType = BusinessType.OTHER) @CrossOrigin - @PostMapping("/topgpExpressSubscribe") - public String topgpSubscribe(HttpServletRequest request,HttpServletResponse response) throws IOException { + @ApiOperation(value="topgp订阅快递",notes = "request body格式: {\"deliveryNo\":\"S301-2108020001\",\"expressNo\":\"300444235610\",\"company\":\"annengwuliu\",\"phone\":\"13800138000\"}") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "requestJson", value = "请求json",required = true, paramType = "body", dataType = "String", dataTypeClass = String.class) + }) + + @PostMapping("api/express/topgpSubscribe") + public String topgpSubscribe(HttpServletRequest request, HttpServletResponse response) throws IOException { return expSubsPushApiService.ExpressSubscribeWithTopgp(request); } diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java index c0d8f02a3..ea61ca9ac 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/FrForCrTopgpController.java @@ -7,34 +7,39 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.Map; +@Api(tags = "TOPGP使用帆软报表接口") @RestController public class FrForCrTopgpController { @Autowired private TopgpDdlService topgpDdlService; //访问 ../anon/bps/frforcr/topprod时,使用topprod + @ApiOperation("TOPPROD正式区访问") + @ApiImplicitParam(name = "jsonString", value = "Json字符串", paramType = "body", dataType = "String", dataTypeClass = String.class) @CrossOrigin @Log(title = "CSFR412_CR报表_TOPPROD", businessType = BusinessType.DROP) - @RequestMapping("/anon/bps/frforcr/topprod") + @PostMapping("/anon/bps/frforcr/topprod") @DataSource(value = DataSourceType.TOPPRODDSREPORT) public AjaxResult frforcrtopprod(@RequestBody Map map){ return frforcrtoppgp(map); } //访问../anon/bps/frforcr/topprod时,使用toptest实例 + @ApiOperation("TOPTEST正式区访问") + @ApiImplicitParam(name = "jsonString", value = "Json字符串", paramType = "body", dataType = "String", dataTypeClass = String.class) @CrossOrigin @Log(title = "CSFR412_CR报表_TOPTEST", businessType = BusinessType.DROP) - @RequestMapping("/anon/bps/frforcr/toptest") + @PostMapping("/anon/bps/frforcr/toptest") @DataSource(value = DataSourceType.TOPTESTDSREPORT) public AjaxResult frforcrtoptest(@RequestBody Map map){ return frforcrtoppgp(map); diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java index a3b86615d..96c5e6fa9 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java @@ -256,7 +256,7 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { str+="\r\n"; } } - System.out.println(str); + //System.out.println(str); return str; } @@ -287,7 +287,7 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { //todo //返回错误信息 - return map.toString(); + return JSONObject.toJSONString(map); } //向快递100推送订阅请求 @@ -302,7 +302,7 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { Map map=JSONObject.parseObject(object.toString(), Map.class); map.put("deliveryNo",deliveryNo); map.put("expressNo",expressNo); - return map.toString(); + return JSONObject.toJSONString(map); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 7cd0e251d..5ee51536b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,22 +1,37 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.utils.http.HttpUtils; +import com.ruoyi.framework.jwt.service.IJwtTokenService; import com.ruoyi.framework.shiro.util.CustToken; import com.ruoyi.system.service.IWechatApiService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.UserStatus; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.jwt.utils.JwtUtils; +import com.ruoyi.framework.shiro.service.SysPasswordService; +import com.ruoyi.system.service.ISysUserService; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.util.Map; /** @@ -24,9 +39,13 @@ import java.util.Map; * * @author ruoyi */ +@Api(tags = "生成AccessToken接口") @Controller public class SysLoginController extends BaseController { + @Autowired + private IJwtTokenService jwtTokenService; + @Autowired private IWechatApiService wechatApiService; @@ -83,6 +102,26 @@ public class SysLoginController extends BaseController } } + @ApiOperation("获取Json格式AccessToken") + @ApiImplicitParams({ + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + }) + @PostMapping("/jwt/login") + @ResponseBody + public AjaxResult jwtLogin(String username, String password) + { + return jwtTokenService.AjaxResultJwtToken(username,password); + } + + @ApiOperation("获取String格式AccessToken") + @PostMapping("/jwt/topgplogin") + @ResponseBody + public String topgpJwtLogin(String username, String password) + { + return JSONObject.toJSONString(jwtTokenService.AjaxResultJwtToken(username,password)); + } + @GetMapping("/unauth") public String unauth() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java index 0cfbfbadb..0a3f38239 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -55,9 +55,9 @@ public class SwaggerConfig // 用ApiInfoBuilder进行定制 return new ApiInfoBuilder() // 设置标题 - .title("标题:若依管理系统_接口文档") + .title("BPS管理系统_接口文档") // 描述 - .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + .description("描述:用于管理系统的各类接口的文档说明。") // 作者信息 .contact(new Contact(RuoYiConfig.getName(), null, null)) // 版本 diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 4541aa3b1..0a05c2a56 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -77,12 +77,19 @@ ruoyi-system - + org.springframework.boot spring-boot-starter-data-ldap + + + com.auth0 + java-jwt + 3.4.0 + + \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java index 422654aa2..b2c10506f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java @@ -25,6 +25,8 @@ import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.security.CipherUtils; import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.jwt.auth.AllowAllCredentialsMatcher; +import com.ruoyi.framework.jwt.filter.JwtFilter; import com.ruoyi.framework.shiro.realm.UserRealm; import com.ruoyi.framework.shiro.session.OnlineSessionDAO; import com.ruoyi.framework.shiro.session.OnlineSessionFactory; @@ -177,6 +179,7 @@ public class ShiroConfig UserRealm userRealm = new UserRealm(); userRealm.setAuthorizationCacheName(Constants.SYS_AUTH_CACHE); userRealm.setCacheManager(cacheManager); + userRealm.setCredentialsMatcher(new AllowAllCredentialsMatcher()); return userRealm; } @@ -287,6 +290,8 @@ public class ShiroConfig filterChainDefinitionMap.put("/logout", "logout"); // 不需要拦截的访问 filterChainDefinitionMap.put("/login", "anon,captchaValidate"); + filterChainDefinitionMap.put("/jwt/login", "anon"); + filterChainDefinitionMap.put("/jwt/topgplogin", "anon"); // 注册相关 filterChainDefinitionMap.put("/register", "anon,captchaValidate"); // 系统权限列表 @@ -297,10 +302,14 @@ public class ShiroConfig filters.put("syncOnlineSession", syncOnlineSessionFilter()); filters.put("captchaValidate", captchaValidateFilter()); filters.put("kickout", kickoutSessionFilter()); + filters.put("jwt", new JwtFilter()); // 注销成功,则跳转到指定页面 filters.put("logout", logoutFilter()); shiroFilterFactoryBean.setFilters(filters); + // jwt 请求单独验证 + filterChainDefinitionMap.put("/api/**", "jwt"); + // 所有请求需要认证 filterChainDefinitionMap.put("/**", "user,kickout,onlineSession,syncOnlineSession"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/AllowAllCredentialsMatcher.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/AllowAllCredentialsMatcher.java new file mode 100644 index 000000000..9131fdcfe --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/AllowAllCredentialsMatcher.java @@ -0,0 +1,19 @@ +package com.ruoyi.framework.jwt.auth; + +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.credential.SimpleCredentialsMatcher; + +/** + * 无需验证密码 + * + * @author ruoyi + */ +public class AllowAllCredentialsMatcher extends SimpleCredentialsMatcher +{ + @Override + public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) + { + return true; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/JwtToken.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/JwtToken.java new file mode 100644 index 000000000..3dfc19eac --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/auth/JwtToken.java @@ -0,0 +1,45 @@ +package com.ruoyi.framework.jwt.auth; + +import org.apache.shiro.authc.UsernamePasswordToken; + +/** + * 自定义登录Token + * + * @author ruoyi + */ +public class JwtToken extends UsernamePasswordToken +{ + private static final long serialVersionUID = 1L; + + private String token; + + public JwtToken() + { + } + + public JwtToken(String username, String password, boolean rememberMe) + { + super(username, password, rememberMe); + } + + public JwtToken(String username, String password) + { + super(username, password, false); + } + + public JwtToken(String token) + { + super("", "", false); + this.token = token; + } + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } +} \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/filter/JwtFilter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/filter/JwtFilter.java new file mode 100644 index 000000000..980a8ae4f --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/filter/JwtFilter.java @@ -0,0 +1,135 @@ +package com.ruoyi.framework.jwt.filter; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.apache.shiro.web.util.WebUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.RequestMethod; +import com.alibaba.fastjson.JSON; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.exceptions.TokenExpiredException; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.jwt.auth.JwtToken; + +/** + * jwt 自定义拦截器 + * + * @author ruoyi + */ +public class JwtFilter extends AccessControlFilter +{ + private static final Logger LOGGER = LoggerFactory.getLogger(JwtFilter.class); + + private static final String AUTHZ_HEADER = "token"; + + private final ThreadLocal MSG_HOLDER = new ThreadLocal<>(); + + @Override + public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception + { + return super.onPreHandle(request, response, mappedValue); + } + + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception + { + return this.executeLogin(request, response); + } + + /** + * 执行登录方法(UserRealm判断,异常返回false) + */ + protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception + { + String token = WebUtils.toHttp(request).getHeader(AUTHZ_HEADER); + if (StringUtils.isEmpty(token)) + { + MSG_HOLDER.set("消息头不正确,header需要携带token参数"); + return false; + } + try + { + // 断是否有权限 + JwtToken jwtToken = new JwtToken(token); + this.getSubject(request, response).login(jwtToken); + return true; + } + catch (AuthenticationException e) + { + if (e.getCause() instanceof TokenExpiredException) + { + MSG_HOLDER.set("token已过期"); + } + else if (e.getCause() instanceof JWTVerificationException) + { + MSG_HOLDER.set("用户密码错误"); + } + else + { + MSG_HOLDER.set("用户信息验证失败:" + e.getMessage()); + } + return false; + } + } + + /** + * 请求前处理,处理跨域 + */ + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception + { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); + // 跨域时,option请求直接返回正常状态 + if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) + { + httpServletResponse.setStatus(HttpStatus.OK.value()); + return false; + } + return super.preHandle(request, response); + } + + /** + * 异常处理 + */ + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception + { + this.jwtFail(request, response, 401, "对不起,您无权限进行操作!"); + return false; + } + + /** + * 认证失败,异常返回 + */ + protected void jwtFail(ServletRequest request, ServletResponse response, int code, String message) + { + HttpServletResponse httpResponse = WebUtils.toHttp(response); + String contentType = "application/json;charset=UTF-8"; + httpResponse.setStatus(401); + httpResponse.setContentType(contentType); + try + { + String msg = StringUtils.isNotEmpty(MSG_HOLDER.get()) ? MSG_HOLDER.get() : message; + AjaxResult ajaxResult = new AjaxResult().put(AjaxResult.CODE_TAG, code).put(AjaxResult.MSG_TAG, msg); + PrintWriter printWriter = httpResponse.getWriter(); + printWriter.append(JSON.toJSONString(ajaxResult)); + } + catch (IOException e) + { + LOGGER.error("sendChallenge error,can not resolve httpServletResponse"); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/IJwtTokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/IJwtTokenService.java new file mode 100644 index 000000000..79c383efa --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/IJwtTokenService.java @@ -0,0 +1,13 @@ +package com.ruoyi.framework.jwt.service; + +import com.ruoyi.common.core.domain.AjaxResult; + +public interface IJwtTokenService { + /** + * 获取AjaxResult格式的jwt token + * @param username 用户名 + * @param password 密码 + * @return jwtToken + */ + public AjaxResult AjaxResultJwtToken(String username, String password); +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/impl/JwtTokenServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/impl/JwtTokenServiceImpl.java new file mode 100644 index 000000000..65e6649b6 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/service/impl/JwtTokenServiceImpl.java @@ -0,0 +1,59 @@ +package com.ruoyi.framework.jwt.service.impl; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.UserStatus; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.jwt.service.IJwtTokenService; +import com.ruoyi.framework.jwt.utils.JwtUtils; +import com.ruoyi.framework.shiro.service.SysPasswordService; +import com.ruoyi.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class JwtTokenServiceImpl implements IJwtTokenService { + @Autowired + private ISysUserService userService; + + @Autowired + private SysPasswordService passwordService; + /** + * 获取AjaxResult格式的jwt token + * + * @param username 用户名 + * @param password 密码 + * @return jwtToken + */ + @Override + public AjaxResult AjaxResultJwtToken(String username, String password) { + if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) + { + return AjaxResult.error("账号和密码不能为空!"); + } + + SysUser user = userService.selectUserByLoginName(username); + if (user == null) + { + return AjaxResult.error("用户不存在/密码错误!"); + } + + if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + return AjaxResult.error("对不起,您的账号已被删除!"); + } + + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + return AjaxResult.error("用户已封禁,请联系管理员!"); + } + + if (!passwordService.matches(user, password)) + { + return AjaxResult.error("用户不存在/密码错误!"); + } + + String token = JwtUtils.createToken(username, user.getPassword()); + return AjaxResult.success("登录成功,请妥善保管您的token信息").put("token", token); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/utils/JwtUtils.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/utils/JwtUtils.java new file mode 100644 index 000000000..c0ce30121 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jwt/utils/JwtUtils.java @@ -0,0 +1,66 @@ +package com.ruoyi.framework.jwt.utils; + +import java.util.Date; +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTDecodeException; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.exceptions.TokenExpiredException; +import com.auth0.jwt.interfaces.DecodedJWT; + +/** + * jwt 工具类 + * + * @author ruoyi + */ +public class JwtUtils +{ + private static final long EXPIRE_TIME = 30 * 60 * 1000; + + private static final String CLAIM_NAME = "username"; + + public static String createToken(String username, String password) + { + return createToken(username, password, EXPIRE_TIME); + } + + public static String createToken(String username, String password, long expireTime) + { + Date date = new Date(System.currentTimeMillis() + expireTime); + // 加密处理密码 + Algorithm algorithm = Algorithm.HMAC256(password); + return JWT.create().withClaim(CLAIM_NAME, username).withExpiresAt(date).sign(algorithm); + } + + public static void verify(String username, String dbPwd, String token) + { + Algorithm algorithm = Algorithm.HMAC256(dbPwd); + JWTVerifier jwtVerifier = JWT.require(algorithm).withClaim(CLAIM_NAME, username).build(); + try + { + jwtVerifier.verify(token); + } + catch (TokenExpiredException e) + { + throw new TokenExpiredException("token已过期"); + } + catch (JWTVerificationException e) + { + throw new JWTVerificationException("token验证失败"); + } + } + + public static String getUserName(String token) + { + try + { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim(CLAIM_NAME).asString(); + } + catch (JWTDecodeException e) + { + return null; + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java index 88ad4d249..5723523a0 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.Set; import com.ruoyi.framework.shiro.util.CustToken; +import org.apache.shiro.authc.AccountException; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -23,16 +24,21 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.UserStatus; import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.RoleBlockedException; import com.ruoyi.common.exception.user.UserBlockedException; +import com.ruoyi.common.exception.user.UserDeleteException; import com.ruoyi.common.exception.user.UserNotExistsException; import com.ruoyi.common.exception.user.UserPasswordNotMatchException; import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException; import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.framework.jwt.auth.JwtToken; +import com.ruoyi.framework.jwt.utils.JwtUtils; import com.ruoyi.framework.shiro.service.SysLoginService; import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysRoleService; +import com.ruoyi.system.service.ISysUserService; /** * 自定义Realm 处理登录 权限 @@ -52,6 +58,9 @@ public class UserRealm extends AuthorizingRealm @Autowired private SysLoginService loginService; + @Autowired + private ISysUserService userService; + /** * 授权 */ @@ -86,55 +95,96 @@ public class UserRealm extends AuthorizingRealm * 登录认证 */ @Override - protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) + throws AuthenticationException { - //UsernamePasswordToken upToken = (UsernamePasswordToken) token; - CustToken upToken= (CustToken) token; - String loginType = upToken.getLoginType(); - String username = upToken.getUsername(); - String password = ""; + if (authenticationToken instanceof JwtToken) + { + JwtToken jwtToken = (JwtToken) authenticationToken; + String token = jwtToken.getToken(); + String username = JwtUtils.getUserName(token); + if (username == null) + { + throw new AccountException("token 验证失败"); + } + SysUser user = userService.selectUserByLoginName(username); + if (user == null) + { + throw new AuthenticationException("用户数据不存在"); + } - if (upToken.getPassword() != null) - { - password = new String(upToken.getPassword()); - } + try + { + JwtUtils.verify(username, user.getPassword(), jwtToken.getToken()); - SysUser user = null; - try - { - user = loginService.login(username, password,loginType); + if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + throw new UserDeleteException(); + } + + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + throw new UserBlockedException(); + } + } + catch (Exception e) + { + log.info("对用户[" + username + "]进行jwt登录验证..验证未通过{}", e.getMessage()); + throw new AuthenticationException(e.getMessage(), e); + } + + return new SimpleAuthenticationInfo(user, null, getName()); } - catch (CaptchaException e) + else { - throw new AuthenticationException(e.getMessage(), e); + //UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken; + CustToken upToken= (CustToken) authenticationToken; + String loginType = upToken.getLoginType(); + String username = upToken.getUsername(); + String password = ""; + + if (upToken.getPassword() != null) + { + password = new String(upToken.getPassword()); + } + + SysUser user = null; + try + { + user = loginService.login(username, password,loginType); + } + catch (CaptchaException e) + { + throw new AuthenticationException(e.getMessage(), e); + } + catch (UserNotExistsException e) + { + throw new UnknownAccountException(e.getMessage(), e); + } + catch (UserPasswordNotMatchException e) + { + throw new IncorrectCredentialsException(e.getMessage(), e); + } + catch (UserPasswordRetryLimitExceedException e) + { + throw new ExcessiveAttemptsException(e.getMessage(), e); + } + catch (UserBlockedException e) + { + throw new LockedAccountException(e.getMessage(), e); + } + catch (RoleBlockedException e) + { + throw new LockedAccountException(e.getMessage(), e); + } + catch (Exception e) + { + log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage()); + throw new AuthenticationException(e.getMessage(), e); + } + SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName()); + return info; } - catch (UserNotExistsException e) - { - throw new UnknownAccountException(e.getMessage(), e); - } - catch (UserPasswordNotMatchException e) - { - throw new IncorrectCredentialsException(e.getMessage(), e); - } - catch (UserPasswordRetryLimitExceedException e) - { - throw new ExcessiveAttemptsException(e.getMessage(), e); - } - catch (UserBlockedException e) - { - throw new LockedAccountException(e.getMessage(), e); - } - catch (RoleBlockedException e) - { - throw new LockedAccountException(e.getMessage(), e); - } - catch (Exception e) - { - log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage()); - throw new AuthenticationException(e.getMessage(), e); - } - SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName()); - return info; } /** diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index d9812d8a4..21a9c876d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -13,6 +13,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.DemoModeException; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.security.PermissionUtils; /** @@ -32,7 +33,7 @@ public class GlobalExceptionHandler public Object handleAuthorizationException(HttpServletRequest request, AuthorizationException e) { log.error(e.getMessage(), e); - if (ServletUtils.isAjaxRequest(request)) + if (ServletUtils.isAjaxRequest(request) || StringUtils.isNotEmpty(request.getHeader("token"))) { return AjaxResult.error(PermissionUtils.getMsg(e.getMessage())); } From e44e212af59f598df1d53e8cb1419cff28b6cc57 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 4 Aug 2021 17:33:15 +0800 Subject: [PATCH 72/90] =?UTF-8?q?=E9=9B=86=E6=88=90Jwt=E7=99=BB=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81TOPGP=E8=AE=BF=E9=97=AE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20Swagger=E6=96=87=E6=A1=A3=E5=AE=8C=E5=96=84?= =?UTF-8?q?=EF=BC=88=E5=BF=AB=E9=80=92=E3=80=81=E5=B8=86=E8=BD=AF=E3=80=81?= =?UTF-8?q?TOPGP=E8=AE=BF=E9=97=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 3ccd384ad..ecdd5485c 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -145,6 +145,6 @@ swagger: wechat: corpId: ww4ed3771457e5f463 agentId: 1000080 - secret: drtHKYabI9_EgjJQ8aqDPTQkY1WUYeWUTMkYw7D_z64 + secret: drtHKYabI9_EgjJQ8aqDPRpt3XiM4d1znaVODMCSdvc token: 111 aesKey: 111 \ No newline at end of file From 83bce07713fcea1d72578fb078b5e23b4b6bc631 Mon Sep 17 00:00:00 2001 From: "bo.yang" Date: Wed, 4 Aug 2021 20:30:37 +0800 Subject: [PATCH 73/90] =?UTF-8?q?=E5=BF=AB=E9=80=92100=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=8C=E6=94=B9=E5=88=B0yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ExpSubsPushApiServiceImpl.java | 11 +++++--- box-bps/src/main/resources/account.properties | 12 ++++----- .../src/main/resources/application.yml | 26 ++++++++++++++++--- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java index 96c5e6fa9..c0e782aa9 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java @@ -24,6 +24,7 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; @@ -34,14 +35,16 @@ import java.util.Map; @Service public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { - String key = PropertiesReader.get("key"); + /*String key = PropertiesReader.get("key"); String customer = PropertiesReader.get("customer"); String secret = PropertiesReader.get("secret"); String siid = PropertiesReader.get("siid"); String userid = PropertiesReader.get("userid"); String tid = PropertiesReader.get("tid"); String secret_key = PropertiesReader.get("secret_key"); - String secret_secret = PropertiesReader.get("secret_secret"); + String secret_secret = PropertiesReader.get("secret_secret"); */ + @Value("${express.key}") + private String key; @Autowired private IExpSubsPushRespService expSubsPushRespService; @@ -55,7 +58,9 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { */ @Override public SubscribeResp ExpressSubscribe(ExpSubscribe expSubscribe) { - String subscribeFrom= expSubscribe.getSalt().equals("topgp")?"topgp":"bpsemi"; + + String loginFrom= expSubscribe.getSalt(); + String subscribeFrom= StringUtils.isNotEmpty(loginFrom)?loginFrom.equals("topgp")?"topgp":"localhost":"localhost"; SubscribeParameters subscribeParameters = new SubscribeParameters(); SubscribeResp subscribeResp = new SubscribeResp(); diff --git a/box-bps/src/main/resources/account.properties b/box-bps/src/main/resources/account.properties index c7f7dc6a0..eca321a27 100644 --- a/box-bps/src/main/resources/account.properties +++ b/box-bps/src/main/resources/account.properties @@ -1,9 +1,9 @@ #快递100的基础账号信息,可以在这里获取 # https://poll.kuaidi100.com/manager/page/myinfo/enterprise -key = Jydbrxsm2311 -customer = 2DD48B3469B82F2B7700569093AB792B -secret = 8781ed9b35a7438499eb02fee915915a -userid = 2a62da2192c24d17a943ff78ee64f8c6 +#key = kzuyKyAE3985 +#customer = 6774D6F41D773B17027EEBE5CC902C9E +#secret = 4fc7633a027c4fe1a68b68237c236d6e +#userid = bfc0389a986f45c4b36e27d9b18b7bd3 #电子面单快递公司账号信息(非必填) partnerId = @@ -20,6 +20,6 @@ secret_key = secret_secret = #是否记录快递100接口返回结果,建议记录日志或者入库,方便后期有问题双方排查(true:启用 false: 关闭 ) -log.return.record = true +#log.return.record = true #日志记录位置,建议根据自身情况配置 -logPath = logs \ No newline at end of file +#logPath = logs \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index ecdd5485c..7ec588bd5 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -144,7 +144,27 @@ swagger: #企业微信 wechat: corpId: ww4ed3771457e5f463 - agentId: 1000080 - secret: drtHKYabI9_EgjJQ8aqDPRpt3XiM4d1znaVODMCSdvc + agentId: 1000082 + secret: PqTYlveYQc54T13QS-cDyuAesDaGgyMSgpZLXBNJ-Uc token: 111 - aesKey: 111 \ No newline at end of file + aesKey: 111 + +#快递100 +express: + #快递100的基础账号信息,可以在这里获取 + # https://poll.kuaidi100.com/manager/page/myinfo/enterprise + key: kzuyKyAE3985 + customer: 6774D6F41D773B17027EEBE5CC902C9E + secret: 4fc7633a027c4fe1a68b68237c236d6e + userid: bfc0389a986f45c4b36e27d9b18b7bd3 + #电子面单快递公司账号信息(非必填) + partnerId: + partnerKey: + net: + siid: + #短信模板id(非必填) + tid: + #云平台相关(非必填) + #登录云平台 https://cloud.kuaidi100.com/buyer/user/info + secret_key: + secret_secret: \ No newline at end of file From a81ca0a5bbac1a8ad67bf690cb322a747c205659 Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Fri, 6 Aug 2021 16:07:43 +0800 Subject: [PATCH 74/90] =?UTF-8?q?=E8=AE=A1=E5=85=A5=E9=98=9F=E5=88=97?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/kettle/config/RedisConfig.java | 195 ++++++++++++++++++ .../controller/KettleTransController.java | 4 +- .../controller/RedisStreamController.java | 105 ++++++++++ .../kettle/service/IKettleJobService.java | 2 + .../kettle/service/IKettleTransService.java | 4 +- .../service/impl/KettleJobServiceImpl.java | 72 ++++++- .../service/impl/KettleTransServiceImpl.java | 59 +++++- .../kettle/tools/CommandLineRunnerImpl.java | 18 ++ .../com/ruoyi/kettle/tools/KettleUtil.java | 14 +- .../ruoyi/kettle/tools/RedisStreamUtil.java | 141 +++++++++++++ .../src/main/resources/application.yml | 18 +- 11 files changed, 605 insertions(+), 27 deletions(-) create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/config/RedisConfig.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/controller/RedisStreamController.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/CommandLineRunnerImpl.java create mode 100644 bps-kettle/src/main/java/com/ruoyi/kettle/tools/RedisStreamUtil.java diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/config/RedisConfig.java b/bps-kettle/src/main/java/com/ruoyi/kettle/config/RedisConfig.java new file mode 100644 index 000000000..dcf2025c2 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/config/RedisConfig.java @@ -0,0 +1,195 @@ +package com.ruoyi.kettle.config; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.lettuce.core.cluster.ClusterClientOptions; +import io.lettuce.core.cluster.ClusterTopologyRefreshOptions; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisNode; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +import java.time.Duration; +import java.util.HashSet; +import java.util.Set; + + +/** + * @author zh + * @date 2020/12/1 16:49 + */ +@Configuration +public class RedisConfig { + /** redis 服务器地址 */ + @Value("${spring.redis.host}") + private String host; + + /** redis 端口号 */ + @Value("${spring.redis.port}") + private int port; + + /** redis 服务器密码 */ + @Value("${spring.redis.password}") + private String password; + + /** redis 连接池最大连接数(使用负值无限制) */ + @Value("${spring.redis.lettuce.pool.max-active}") + private int maxActive; + + /** redis 连接池最大空闲数 */ + @Value("${spring.redis.lettuce.pool.max-idle}") + private int maxIdle; + + /** redis 连接池小空闲数 */ + @Value("${spring.redis.lettuce.pool.min-idle}") + private int minIdle; + + /** redis 连接池最大阻塞等待时间(负值无限制) */ + @Value("${spring.redis.lettuce.pool.max-wait}") + private int maxWait; + + /** redis 数据库索引(默认0) */ + @Value("${spring.redis.database}") + private int database; + + /** redis 超时时间 */ + @Value("${spring.redis.timeout}") + private int timeout; + + @Autowired + private RedisProperties redisProperties; + + + //这是固定的模板 + //自己定义了一个RedisTemplate + @Bean + @SuppressWarnings("all") + public RedisTemplate redisTemplate(@Qualifier("lettuceConnectionFactoryUvPv") RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + + //Json序列化配置 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.activateDefaultTyping(om.getPolymorphicTypeValidator()); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + //解决序列化问题 + om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + jackson2JsonRedisSerializer.setObjectMapper(om); + + //String的序列化 + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + + //key采用String的序列化方式 + template.setKeySerializer(stringRedisSerializer); + //hash的key也采用String的序列化方式 + template.setHashKeySerializer(stringRedisSerializer); + + //value序列化方式采用jackson + template.setValueSerializer(jackson2JsonRedisSerializer); + + //hash的value序列化方式采用jackson + template.setHashValueSerializer(jackson2JsonRedisSerializer); + template.afterPropertiesSet(); + + return template; + } + + /** + * 为RedisTemplate配置Redis连接工厂实现 + * LettuceConnectionFactory实现了RedisConnectionFactory接口 + * UVPV用Redis + * + * @return 返回LettuceConnectionFactory + */ + @Bean(destroyMethod = "destroy") + //这里要注意的是,在构建LettuceConnectionFactory 时,如果不使用内置的destroyMethod,可能会导致Redis连接早于其它Bean被销毁 + public LettuceConnectionFactory lettuceConnectionFactoryUvPv() throws Exception { + +// List clusterNodes = redisProperties.getCluster().getNodes(); +// Set nodes = new HashSet<>(); +// clusterNodes.forEach(address -> nodes.add(new RedisNode(address.split(":")[0].trim(), Integer.parseInt(address.split(":")[1])))); +// RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); +// clusterConfiguration.setClusterNodes(nodes); +// clusterConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword())); +// clusterConfiguration.setMaxRedirects(redisProperties.getCluster().getMaxRedirects()); + + //我使用的是单机redis,集群使用上面注释的代码 + Set nodes = new HashSet<>(); + nodes.add(new RedisNode(redisProperties.getHost(), redisProperties.getPort())); + + + RedisStandaloneConfiguration redisStandaloneConfiguration=new RedisStandaloneConfiguration(); + redisStandaloneConfiguration.setHostName(redisProperties.getHost()); + redisStandaloneConfiguration.setPassword(redisProperties.getPassword()); + redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase()); + redisStandaloneConfiguration.setPort(redisProperties.getPort()); + + GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); + poolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle()); + poolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle()); + poolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive()); + + return new LettuceConnectionFactory(redisStandaloneConfiguration, getLettuceClientConfiguration(poolConfig)); + } + + /** + * 配置LettuceClientConfiguration 包括线程池配置和安全项配置 + * + * @param genericObjectPoolConfig common-pool2线程池 + * @return lettuceClientConfiguration + */ + private LettuceClientConfiguration getLettuceClientConfiguration(GenericObjectPoolConfig genericObjectPoolConfig) { + /* + ClusterTopologyRefreshOptions配置用于开启自适应刷新和定时刷新。如自适应刷新不开启,Redis集群变更时将会导致连接异常! + */ + ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() + //开启自适应刷新 + //.enableAdaptiveRefreshTrigger(ClusterTopologyRefreshOptions.RefreshTrigger.MOVED_REDIRECT, ClusterTopologyRefreshOptions.RefreshTrigger.PERSISTENT_RECONNECTS) + //开启所有自适应刷新,MOVED,ASK,PERSISTENT都会触发 + .enableAllAdaptiveRefreshTriggers() + // 自适应刷新超时时间(默认30秒) + .adaptiveRefreshTriggersTimeout(Duration.ofSeconds(25)) //默认关闭开启后时间为30秒 + // 开周期刷新 + .enablePeriodicRefresh(Duration.ofSeconds(20)) // 默认关闭开启后时间为60秒 ClusterTopologyRefreshOptions.DEFAULT_REFRESH_PERIOD 60 .enablePeriodicRefresh(Duration.ofSeconds(2)) = .enablePeriodicRefresh().refreshPeriod(Duration.ofSeconds(2)) + .build(); + return LettucePoolingClientConfiguration.builder() + .poolConfig(genericObjectPoolConfig) + .clientOptions(ClusterClientOptions.builder().topologyRefreshOptions(topologyRefreshOptions).build()) + //将appID传入连接,方便Redis监控中查看 + //.clientName(appName + "_lettuce") + .build(); + } + + @Bean + public JedisPool jedisPool() { + JedisPool jedisPool = new JedisPool(getRedisConfig(), host, port, timeout,password); + return jedisPool; + } + @Bean + public JedisPoolConfig getRedisConfig(){ + JedisPoolConfig config = new JedisPoolConfig(); + config.setMaxTotal(maxActive); + config.setMaxIdle(maxIdle); + config.setMinIdle(minIdle); + config.setMaxWaitMillis(maxWait); + return config; + } + +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java index dfe56dae6..1245529fd 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/KettleTransController.java @@ -162,9 +162,9 @@ public class KettleTransController extends BaseController @RequiresPermissions("kettle:trans:run") @PostMapping("/run") @ResponseBody - public AjaxResult run(KettleTrans trans) + public AjaxResult runToQueue(KettleTrans trans) { - AjaxResult result = kettleTransService.run(trans); + AjaxResult result = kettleTransService.runToQueue(trans); return result; } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/controller/RedisStreamController.java b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/RedisStreamController.java new file mode 100644 index 000000000..aed3f2ef5 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/controller/RedisStreamController.java @@ -0,0 +1,105 @@ +package com.ruoyi.kettle.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.kettle.domain.KettleJob; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.stream.*; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.StreamEntry; +import redis.clients.jedis.StreamEntryID; + +import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Controller +@RequestMapping("/redis/stream") +public class RedisStreamController extends BaseController { + String koneConsumer="koneConsumer"; + + String koneStream = "koneStream2"; + + String koneGroup= "koneGroup2"; + int i=1; + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private JedisPool jedisPool; + + + + + @GetMapping("/createComsumer") + public AjaxResult createCrgoup() { + Jedis jedis = jedisPool.getResource(); + //String key, String groupname, StreamEntryID id, boolean makeStream + /** + * key为stream name, group为消费组,id为上次读取的位置,如果空则重新读取,makeStream是否创建流,已有的话就不用创建 + */ + System.out.println(jedis.xgroupCreate(koneStream, koneGroup, null,true)); + return AjaxResult.success(); + + } + @GetMapping("/add") + @ResponseBody + public AjaxResult addMessage() { + //这里可以添加更多的属性 + Map map = new HashMap(); + map.put("date"+i++, System.currentTimeMillis() + ""); + Jedis jedis = jedisPool.getResource(); + + jedis.xadd(koneStream, new StreamEntryID().NEW_ENTRY, map); + return AjaxResult.success(); + } + @ResponseBody + @GetMapping("/read") + public AjaxResult readGroup() { + Jedis jedis = jedisPool.getResource(); + Map t = new HashMap(); + t.put(koneStream, null);//null 则为 > 重头读起,也可以为$接受新消息,还可以是上一次未读完的消息id + Map.Entry e = null; + for(Map.Entry c:t.entrySet()){ + e=c; + } + //noAck为false的话需要手动ack,true则自动ack. commsumer新建的方式为xreadgroup。 + System.out.println("开始:"+ ZonedDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss ms"))); + List> list = jedis.xreadGroup(koneGroup, koneConsumer, 1, 0, false, e); + System.out.println("结束:"+ ZonedDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss ms"))); + if(list ==null){ + System.out.println("list为空"); + return AjaxResult.error("list为空"); + } + for (Map.Entry m : list) { + System.out.println(m.getKey() + "---" + m.getValue().getClass()); + if (m.getValue() instanceof ArrayList) { + List l = (List) m.getValue(); + Map result = l.get(0).getFields(); + for (Map.Entry entry : result.entrySet()) { + System.out.println(entry.getKey() + "---" + entry.getValue()); + } + try { + TimeUnit.SECONDS.sleep(2); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + jedis.xack(koneStream, koneGroup, l.get(0).getID()); + System.out.println("消息消费成功"); + } + } + return AjaxResult.success(); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java index a9a6b69a0..ddbff9ebc 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleJobService.java @@ -68,4 +68,6 @@ public interface IKettleJobService Long checkQuartzExist(String checkStr); public AjaxResult runJobQuartz(String id, String jobName); + + void runJobRightNow(Long valueOf); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java index 37629babe..94e7a57f4 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/IKettleTransService.java @@ -67,7 +67,7 @@ public interface IKettleTransService * @param trans : * @return: void **/ - AjaxResult run(KettleTrans trans); + AjaxResult runToQueue(KettleTrans trans); List queryTransLog(KettleTrans trans) ; /** @@ -81,4 +81,6 @@ public interface IKettleTransService public AjaxResult runTransQuartz(String id,String transName); Long checkQuartzExist(String checkStr); + + void runTransRightNow(Long valueOf); } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java index 2a1451d99..3eef4bcfc 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleJobServiceImpl.java @@ -12,6 +12,9 @@ import com.ruoyi.kettle.domain.KettleTrans; import com.ruoyi.kettle.domain.XRepository; import com.ruoyi.kettle.mapper.XRepositoryMapper; import com.ruoyi.kettle.tools.KettleUtil; +import com.ruoyi.kettle.tools.RedisStreamUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.kettle.mapper.KettleJobMapper; @@ -28,6 +31,7 @@ import com.ruoyi.common.core.text.Convert; @Service("kettleJobServiceImpl") public class KettleJobServiceImpl implements IKettleJobService { + private static final Logger log = LoggerFactory.getLogger(KettleJobServiceImpl.class); @Autowired private KettleJobMapper kettleJobMapper; @Autowired @@ -36,6 +40,9 @@ public class KettleJobServiceImpl implements IKettleJobService @Autowired private KettleUtil kettleUtil; + + @Autowired + private RedisStreamUtil redisStreamUtil; /** * 查询作业调度 * @@ -84,11 +91,14 @@ public class KettleJobServiceImpl implements IKettleJobService } String userName = (String) PermissionUtils.getPrincipalProperty("userName"); if(kettleJob.getRoleKey()==null){ - kettleJob.setRoleKey("admin"); + kettleJob.setRoleKey("admin,bpsadmin"); }else{ if(!kettleJob.getRoleKey().contains("admin")){ kettleJob.setRoleKey(kettleJob.getRoleKey().concat(",admin")); } + if(!kettleJob.getRoleKey().contains("bpsadmin")){ + kettleJob.setRoleKey(kettleJob.getRoleKey().concat(",bpsadmin")); + } } kettleJob.setCreatedBy(userName); kettleJob.setUpdateBy(userName); @@ -105,7 +115,21 @@ public class KettleJobServiceImpl implements IKettleJobService @Override public int updateKettleJob(KettleJob kettleJob) { + String userName = (String) PermissionUtils.getPrincipalProperty("userName"); + kettleJob.setUpdateTime(DateUtils.getNowDate()); + kettleJob.setUpdateBy(userName); + kettleJob.setJobType("File"); + if(kettleJob.getRoleKey()==null){ + kettleJob.setRoleKey("admin,bpsadmin"); + }else{ + if(!kettleJob.getRoleKey().contains("admin")){ + kettleJob.setRoleKey(kettleJob.getRoleKey().concat(",admin")); + } + if(!kettleJob.getRoleKey().contains("bpsadmin")){ + kettleJob.setRoleKey(kettleJob.getRoleKey().concat(",bpsadmin")); + } + } return kettleJobMapper.updateKettleJob(kettleJob); } @@ -144,6 +168,43 @@ public class KettleJobServiceImpl implements IKettleJobService if(repository==null){ return AjaxResult.error("资源库不存在!"); } + //加入队列中,等待执行 + redisStreamUtil.addKettleJob(kettleJob); + //更新一下状态 + kettleJob.setJobStatus("等待中"); + kettleJobMapper.updateKettleJob(kettleJob); + return AjaxResult.success("已加入执行队列,请等待运行结果通知!"); +// String path = kettleJob.getJobPath(); +// try { +// kettleUtil.KETTLE_LOG_LEVEL=kettleJob.getJobLogLevel(); +// kettleUtil.KETTLE_REPO_ID=String.valueOf(kettleJob.getJobRepositoryId()); +// kettleUtil.KETTLE_REPO_NAME=repository.getRepoName(); +// kettleUtil.KETTLE_REPO_PATH=repository.getBaseDir(); +// kettleUtil.callJob(path,kettleJob.getJobName(),null,null); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// + + } + + @Override + public void runJobRightNow(Long id) { + KettleJob kettleJob = kettleJobMapper.selectKettleJobById(id); + if(kettleJob ==null){ + log.error("作业不存在!"); + return; + } + XRepository repository=repositoryMapper.selectXRepositoryById(kettleJob.getJobRepositoryId()); + if(repository==null){ + log.error("资源库不存在!"); + return; + } + //加入队列中,等待执行 + redisStreamUtil.addKettleJob(kettleJob); + //更新一下状态 + kettleJob.setJobStatus("运行中"); + kettleJobMapper.updateKettleJob(kettleJob); String path = kettleJob.getJobPath(); try { kettleUtil.KETTLE_LOG_LEVEL=kettleJob.getJobLogLevel(); @@ -151,13 +212,15 @@ public class KettleJobServiceImpl implements IKettleJobService kettleUtil.KETTLE_REPO_NAME=repository.getRepoName(); kettleUtil.KETTLE_REPO_PATH=repository.getBaseDir(); kettleUtil.callJob(path,kettleJob.getJobName(),null,null); + kettleJob.setJobStatus("已结束"); + kettleJobMapper.updateKettleJob(kettleJob); } catch (Exception e) { + kettleJob.setJobStatus("异常"); + kettleJobMapper.updateKettleJob(kettleJob); e.printStackTrace(); } - - return AjaxResult.success("执行成功!"); } - + } @Override public List queryJobLog(KettleJob kettleJob) { List logs=kettleJobMapper.queryJobLog(kettleJob.getJobName()); @@ -173,4 +236,5 @@ public class KettleJobServiceImpl implements IKettleJobService KettleJob kettleJob = kettleJobMapper.selectKettleJobById(Long.valueOf(id)); return run(kettleJob); } + } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java index 499236de8..6c5f32787 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/service/impl/KettleTransServiceImpl.java @@ -12,6 +12,9 @@ import com.ruoyi.kettle.domain.XRepository; import com.ruoyi.kettle.mapper.XRepositoryMapper; import com.ruoyi.kettle.service.IKettleTransService; import com.ruoyi.kettle.tools.KettleUtil; +import com.ruoyi.kettle.tools.RedisStreamUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.kettle.mapper.KettleTransMapper; @@ -27,6 +30,8 @@ import com.ruoyi.common.core.text.Convert; @Service("kettleTransServiceImpl") public class KettleTransServiceImpl implements IKettleTransService { + + private static final Logger log = LoggerFactory.getLogger(KettleTransServiceImpl.class); @Autowired private KettleTransMapper kettleTransMapper; @Autowired @@ -35,6 +40,9 @@ public class KettleTransServiceImpl implements IKettleTransService @Autowired private KettleUtil kettleUtil; + @Autowired + private RedisStreamUtil redisStreamUtil; + /** * 查询转换 * @@ -86,11 +94,14 @@ public class KettleTransServiceImpl implements IKettleTransService } String userName = (String) PermissionUtils.getPrincipalProperty("userName"); if(kettleTrans.getRoleKey()==null){ - kettleTrans.setRoleKey("admin"); + kettleTrans.setRoleKey("admin,bpsadmin"); }else{ if(!kettleTrans.getRoleKey().contains("admin")){ kettleTrans.setRoleKey(kettleTrans.getRoleKey().concat(",admin")); } + if(!kettleTrans.getRoleKey().contains("bpsadmin")){ + kettleTrans.setRoleKey(kettleTrans.getRoleKey().concat(",bpsadmin")); + } } kettleTrans.setCreatedBy(userName); kettleTrans.setUpdateBy(userName); @@ -112,11 +123,14 @@ public class KettleTransServiceImpl implements IKettleTransService kettleTrans.setUpdateTime(DateUtils.getNowDate()); kettleTrans.setTransType("File"); if(kettleTrans.getRoleKey()==null){ - kettleTrans.setRoleKey("admin"); + kettleTrans.setRoleKey("admin,bpsadmin"); }else{ if(!kettleTrans.getRoleKey().contains("admin")){ kettleTrans.setRoleKey(kettleTrans.getRoleKey().concat(",admin")); } + if(!kettleTrans.getRoleKey().contains("bpsadmin")){ + kettleTrans.setRoleKey(kettleTrans.getRoleKey().concat(",bpsadmin")); + } } return kettleTransMapper.updateKettleTrans(kettleTrans); } @@ -146,23 +160,46 @@ public class KettleTransServiceImpl implements IKettleTransService /** - * @Description:立即执行一次转换 + * @Description:立即执行一次转换,放到redis队列中 * @Author: Kone.wang * @Date: 2021/7/15 14:31 * @param trans : * @return: void **/ @Override - public AjaxResult run(KettleTrans trans) { + public AjaxResult runToQueue(KettleTrans trans) { Long id = trans.getId(); KettleTrans kettleTrans = kettleTransMapper.selectKettleTransById(id); - if(kettleTrans ==null){ + if(kettleTrans ==null || kettleTrans.getId()==null){ return AjaxResult.error("转换不存在!"); } XRepository repository=repositoryMapper.selectXRepositoryById(kettleTrans.getTransRepositoryId()); if(repository==null){ return AjaxResult.error("资源库不存在!"); } + //加入队列中,等待执行 + redisStreamUtil.addKettleTrans(kettleTrans); + //更新一下状态 + trans.setTransStatus("等待中"); + kettleTransMapper.updateKettleTrans(trans); + return AjaxResult.success("已加入执行队列,请等待运行结果通知!"); + } + + @Override + public void runTransRightNow(Long id) { + KettleTrans kettleTrans = kettleTransMapper.selectKettleTransById(id); + if(kettleTrans ==null || kettleTrans.getId()==null){ + log.error("转换不存在!:"+id); + return; + } + XRepository repository=repositoryMapper.selectXRepositoryById(kettleTrans.getTransRepositoryId()); + if(repository==null){ + log.error("资源库不存在!"); + return; + } + //更新状态未运行中 + kettleTrans.setTransStatus("运行中"); + kettleTransMapper.updateKettleTrans(kettleTrans); String path = kettleTrans.getTransPath(); try { kettleUtil.KETTLE_LOG_LEVEL=kettleTrans.getTransLogLevel(); @@ -170,12 +207,13 @@ public class KettleTransServiceImpl implements IKettleTransService kettleUtil.KETTLE_REPO_NAME=repository.getRepoName(); kettleUtil.KETTLE_REPO_PATH=repository.getBaseDir(); kettleUtil.callTrans(path,kettleTrans.getTransName(),null,null); + kettleTrans.setTransStatus("已结束"); + kettleTransMapper.updateKettleTrans(kettleTrans); } catch (Exception e) { - e.printStackTrace(); + kettleTrans.setTransStatus("异常"); + kettleTransMapper.updateKettleTrans(kettleTrans); + log.error(id+"的trans执行失败:"+e.getMessage()); } - - - return AjaxResult.success("执行成功!"); } /** * @Description:查询抓换执行日志 @@ -200,7 +238,7 @@ public class KettleTransServiceImpl implements IKettleTransService @Override public AjaxResult runTransQuartz(String id, String transName) { KettleTrans kettleTrans = kettleTransMapper.selectKettleTransById(Long.valueOf(id)); - return run(kettleTrans); + return runToQueue(kettleTrans); } /** * @Description:检查该转换是否设置了定时任务 @@ -214,4 +252,5 @@ public class KettleTransServiceImpl implements IKettleTransService return kettleTransMapper.checkQuartzExist(checkStr); } + } diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/CommandLineRunnerImpl.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/CommandLineRunnerImpl.java new file mode 100644 index 000000000..053e429d7 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/CommandLineRunnerImpl.java @@ -0,0 +1,18 @@ +package com.ruoyi.kettle.tools; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class CommandLineRunnerImpl implements CommandLineRunner { + + @Autowired + private RedisStreamUtil redisStreamUtil; + + + @Override + public void run(String... args) throws Exception { + redisStreamUtil.readGroup(); + } +} diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java index c94960847..11261303c 100644 --- a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/KettleUtil.java @@ -22,6 +22,8 @@ import org.springframework.stereotype.Component; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.TimeUnit; + @Component public class KettleUtil { public static final Logger log = LoggerFactory.getLogger(KettleUtil.class); @@ -43,7 +45,7 @@ public class KettleUtil { public void callTrans(String transPath, String transName, Map namedParams, String[] clParams) throws Exception { KettleEnv.init(); DatabaseMeta databaseMeta=new DatabaseMeta("kettle_trans_log", "mysql", "Native(JDBC)", - "xxx.xxx.x.xx","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "password"); + "192.168.2.18","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "abc.123"); String msg; KettleFileRepository repo = this.fileRepositoryCon(); @@ -87,6 +89,7 @@ public class KettleUtil { log.error(msg); throw new Exception(msg); } + TimeUnit.SECONDS.sleep(10); } /** @@ -98,7 +101,7 @@ public class KettleUtil { KettleEnv.init(); String msg; DatabaseMeta databaseMeta=new DatabaseMeta("kettle_job_log", "mysql", "Native(JDBC)", - "xxx.xxx.x.xx","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "password"); + "192.168.2.18","bps?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8", "3306", "root", "abc.123"); KettleFileRepository repo = this.fileRepositoryCon(); JobMeta jobMeta = this.loadJob(repo, jobPath, jobName); jobMeta.addDatabase(databaseMeta); @@ -155,13 +158,6 @@ public class KettleUtil { } return transMeta; } - - - - - - - /** * 加载job * @param repo kettle文件资源库 diff --git a/bps-kettle/src/main/java/com/ruoyi/kettle/tools/RedisStreamUtil.java b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/RedisStreamUtil.java new file mode 100644 index 000000000..fcdccf153 --- /dev/null +++ b/bps-kettle/src/main/java/com/ruoyi/kettle/tools/RedisStreamUtil.java @@ -0,0 +1,141 @@ +package com.ruoyi.kettle.tools; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.kettle.domain.KettleJob; +import com.ruoyi.kettle.domain.KettleTrans; +import com.ruoyi.kettle.service.IKettleJobService; +import com.ruoyi.kettle.service.IKettleTransService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.StreamEntry; +import redis.clients.jedis.StreamEntryID; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component +public class RedisStreamUtil { + private static final Logger log = LoggerFactory.getLogger(RedisStreamUtil.class); + String koneConsumer="koneConsumer"; + + String koneStream = "koneStream2"; + + String koneGroup= "koneGroup2"; + + @Autowired + private JedisPool jedisPool; + + @Autowired + private IKettleTransService transService; + + @Autowired + private IKettleJobService jobService; + + /** + * @Description: 往队列中插入trans + * @Author: Kone.wang + * @Date: 2021/8/6 13:50 + * @param trans: + * @return: com.ruoyi.common.core.domain.AjaxResult + **/ + public void addKettleTrans(KettleTrans trans) { + String transName=trans.getTransName(); + Long trandId = trans.getId(); + + //这里可以添加更多的属性 + Map map = new HashMap(); + map.put("trans_"+trandId, transName); + Jedis jedis = jedisPool.getResource(); + + jedis.xadd(koneStream, new StreamEntryID().NEW_ENTRY, map); + } + + /** + * @Description: 往队列中插入job + * @Author: Kone.wang + * @Date: 2021/8/6 13:50 + * @param job: + * @return: com.ruoyi.common.core.domain.AjaxResult + **/ + public void addKettleJob(KettleJob job) { + String jobName=job.getJobName(); + Long jobId = job.getId(); + //这里可以添加更多的属性 + Map map = new HashMap(); + map.put("job_"+jobId, jobName); + Jedis jedis = jedisPool.getResource(); + + jedis.xadd(koneStream, new StreamEntryID().NEW_ENTRY, map); + } + /** + * @Description: 循环重队列中读消息 + * @Author: Kone.wang + * @Date: 2021/8/6 13:50 + * @return: void + **/ + public void readGroup() { + + while (true){ + Jedis jedis = jedisPool.getResource(); + Map t = new HashMap(); + List> list = new ArrayList<>(); + t.put(koneStream, null);//null 则为 > 重头读起,也可以为$接受新消息,还可以是上一次未读完的消息id + Map.Entry e = null; + for(Map.Entry c:t.entrySet()){ + e=c; + } + //noAck为false的话需要手动ack,true则自动ack. commsumer新建的方式为xreadgroup。 + System.out.println("开始:"+ ZonedDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss ms"))); + try{ + list = jedis.xreadGroup(koneGroup, koneConsumer, 1, 3600000, false, e); + + }catch (Exception ex){ + log.error("超时了!!!!!!!!"); + } + System.out.println("结束:"+ ZonedDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))); + if(list ==null){ + log.error("list为空"); + }else{ + for (Map.Entry m : list) { + if (m.getValue() instanceof ArrayList) { + List l = (List) m.getValue(); + Map result = l.get(0).getFields(); + for (Map.Entry entry : result.entrySet()) { + System.out.println(entry.getKey() + "---" + entry.getValue()); + if(entry.getKey() != null){ + String key = String.valueOf(entry.getKey()); + String value =String.valueOf(entry.getValue()); + String id=key.substring(key.indexOf("_")+1); + if(key.startsWith("trans_")){ + log.info(value+"的trans:开始执行"); + transService.runTransRightNow(Long.valueOf(id)); + log.info(value+"的trans:结束执行"); + }else if(key.startsWith("job_")){ + log.info(value+"的job:开始执行"); + jobService.runJobRightNow(Long.valueOf(id)); + log.info(value+"的job:结束执行"); + } + } + } + jedis.xack(koneStream, koneGroup, l.get(0).getID()); + System.out.println("消息消费成功"); + } + } + } + + } + } + +} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index fefe9f965..37267eb23 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -75,7 +75,23 @@ spring: base: OU=bp,DC=bpsemi,DC=com username: administrator@bpsemi.com password: Bps@2831! - + redis: + host: 127.0.0.1 + port: 6379 + password: "2129" + timeout: 3600000 + database: 2 + lettuce: + pool: + max-active: 100 + max-idle: 10 + min-idle: 0 + max-wait: 3600000 + cluster: + refresh: + adaptive: true + #20秒自动刷新一次 + period: 20 # MyBatis mybatis: # 搜索指定包别名 From 69d476e62854c6630a9fb499e019a29720369d3a Mon Sep 17 00:00:00 2001 From: Bo Date: Sat, 7 Aug 2021 22:28:47 +0800 Subject: [PATCH 75/90] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=BF=AB=E9=80=92?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ExpSubsPushApiServiceImpl.java | 16 ++++++++++------ .../service/impl/ExpressInfoServiceImpl.java | 17 +++++++++-------- .../bps/service/impl/ExpressServiceImpl.java | 12 ++++++++++-- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java index c0e782aa9..ac794b775 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java @@ -13,7 +13,6 @@ import com.kuaidi100.sdk.response.SubscribePushData; import com.kuaidi100.sdk.response.SubscribePushParamResp; import com.kuaidi100.sdk.response.SubscribePushResult; import com.kuaidi100.sdk.response.SubscribeResp; -import com.kuaidi100.sdk.utils.PropertiesReader; import com.kuaidi100.sdk.utils.SignUtils; import com.ruoyi.bps.domain.ExpSubsPushResp; import com.ruoyi.bps.domain.ExpSubscribe; @@ -282,10 +281,13 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { String phone = contentJson.getString("phone"); //如果出货单号或者快递单号为空,则返回错误信息,并写入Logo if(StringUtils.isEmpty(deliveryNo) || StringUtils.isEmpty(expressNo)){ + SubscribeResp subscribeResp=new SubscribeResp(); + subscribeResp.setMessage("快递单号或出货单号为空"); + subscribeResp.setResult(false); + subscribeResp.setReturnCode("700"); + Map map=new HashMap<>(); - map.put("result",false); - map.put("returnCode",700); - map.put("message","快递单号或出货单号为空!"); + map.put("subscribeResp",subscribeResp); map.put("deliveryNo",deliveryNo); map.put("expressNo",expressNo); //写入Logo @@ -303,8 +305,10 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { expSubscribe.setSalt("topgp"); //偷懒,把请求来源记录到salt栏位,不再增加exp_subscribe字段了。。以后找时间改吧 SubscribeResp subscribeResp= ExpressSubscribe(expSubscribe); - Object object = JSONObject.toJSON(subscribeResp); - Map map=JSONObject.parseObject(object.toString(), Map.class); + /*Object object = JSONObject.toJSON(subscribeResp); + Map map=JSONObject.parseObject(object.toString(), Map.class);*/ + Map map= new HashMap<>(); + map.put("expSubscribe",subscribeResp); map.put("deliveryNo",deliveryNo); map.put("expressNo",expressNo); return JSONObject.toJSONString(map); diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java index 6e1f80630..e9f6093cf 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressInfoServiceImpl.java @@ -21,6 +21,7 @@ import com.kuaidi100.sdk.response.QueryTrackResp; import com.kuaidi100.sdk.utils.PropertiesReader; import com.kuaidi100.sdk.utils.SignUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -37,13 +38,6 @@ import java.util.List; public class ExpressInfoServiceImpl implements IExpressInfoService { /* - String key = "Jydbrxsm2311"; - String customer = "2DD48B3469B82F2B7700569093AB792B"; - String secret = "8781ed9b35a7438499eb02fee915915a"; - String userid = "2a62da2192c24d17a943ff78ee64f8c6"; - - */ - String key = PropertiesReader.get("key"); String customer = PropertiesReader.get("customer"); String secret = PropertiesReader.get("secret"); @@ -52,6 +46,13 @@ public class ExpressInfoServiceImpl implements IExpressInfoService String tid = PropertiesReader.get("tid"); String secret_key = PropertiesReader.get("secret_key"); String secret_secret = PropertiesReader.get("secret_secret"); + */ + @Value("${express.key}") + private String key; + + @Value("${express.customer}") + private String customer; + @@ -132,7 +133,7 @@ public class ExpressInfoServiceImpl implements IExpressInfoService //如果没有输入快递公司编号,则查询快递公司编号 if(StringUtils.isEmpty(com)){ if(AutoGetExpressCom(nu)==null){ - callbackExpressInfo.setData("根据快递单号查询不到快递公司,请确认快递单号是否正确!"); + callbackExpressInfo.setData("请提供要查询的快递所属物流公司编号!"); return callbackExpressInfo; } com=AutoGetExpressCom(nu).getComCode(); diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java index 7be4e0eb5..b71b0370a 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpressServiceImpl.java @@ -14,6 +14,7 @@ import com.kuaidi100.sdk.utils.SignUtils; import com.ruoyi.bps.service.IExpressService; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -27,14 +28,21 @@ public class ExpressServiceImpl implements IExpressService { String secret = "8781ed9b35a7438499eb02fee915915a"; String userid = "2a62da2192c24d17a943ff78ee64f8c6"; */ - String key = PropertiesReader.get("key"); + /*String key = PropertiesReader.get("key"); String customer = PropertiesReader.get("customer"); String secret = PropertiesReader.get("secret"); String siid = PropertiesReader.get("siid"); String userid = PropertiesReader.get("userid"); String tid = PropertiesReader.get("tid"); String secret_key = PropertiesReader.get("secret_key"); - String secret_secret = PropertiesReader.get("secret_secret"); + String secret_secret = PropertiesReader.get("secret_secret");*/ + + @Value("${express.key}") + private String key; + + @Value("${express.customer}") + private String customer; + String msg=""; @Autowired IExpressService expressService; From 2723b5cd14f3af9215f1fe52b212a98c8c1942e6 Mon Sep 17 00:00:00 2001 From: Bo Date: Mon, 9 Aug 2021 10:29:30 +0800 Subject: [PATCH 76/90] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=BF=E9=97=AETopgp?= =?UTF-8?q?=20Webservice=E6=8E=A5=E5=8F=A3Demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conrtroller/XmlWebserviceController.java | 28 ++++++ ruoyi-common/pom.xml | 7 ++ .../java/com/ruoyi/common/utils/XmlUtils.java | 73 ++++++++++++++++ .../ruoyi/common/utils/http/HttpUtils.java | 86 +++++++++++++++---- 4 files changed, 177 insertions(+), 17 deletions(-) create mode 100644 box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/XmlUtils.java diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java new file mode 100644 index 000000000..5efb3a233 --- /dev/null +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java @@ -0,0 +1,28 @@ +package com.ruoyi.test.conrtroller; + +import com.ruoyi.common.utils.XmlUtils; +import com.ruoyi.common.utils.http.HttpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController + +public class XmlWebserviceController { + //private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + @PostMapping("/anon/sendXml") + public String SendXml() { + Map map = new HashMap<>(); + map.put("responseInfo", "此处为测试消息"); + String param = XmlUtils.GetTopgpRequestXml("express_testRequest", map); + String url = "http://192.168.2.81:85/web/ws/r/aws_ttsrv2_toptest"; + String returnXml = HttpUtils.sendXmlPost(url,param); + return XmlUtils.GetStatusFromTopgpResponse(returnXml).toString(); + + } +} diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index edd31141d..bf5675cd1 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -101,6 +101,13 @@ javax.servlet-api + + org.json + json + 20160810 + compile + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/XmlUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/XmlUtils.java new file mode 100644 index 000000000..2278c008c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/XmlUtils.java @@ -0,0 +1,73 @@ +package com.ruoyi.common.utils; + +import com.ruoyi.common.utils.http.HttpUtils; +import org.json.JSONObject; +import org.json.XML; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + +public class XmlUtils { + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 组合TOPGP所需的XML格式 + * @param tip 调用TOPGP的Webservice的方法名 如:express_testRequest + * @param mapInfo XML中Filed对应的键值对Map + * @return xml字符串 + */ + public static String GetTopgpRequestXml(String tip, Map mapInfo){ + log.info("=======生成xml======"); + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append("\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " <Request>\n" + + " <Access>\n" + + " <Authentication user='topgui' password='' />\n" + + " <Connection application='bps' source='www.bpsemi.com' />\n" + + " <Organization name='SYSTEM' />\n" + + " <Locale language='zh_cn' />\n" + + " </Access>\n" + + " <RequestContent>\n" + + " <Parameter>\n" + + " <Record>\n" + + " <Field name="); + for(String key:mapInfo.keySet()){ + stringBuffer.append("'"+key+"' value='" +mapInfo.get(key).toString().replaceAll("&","&")+"' />\n"); + } + stringBuffer.append(" </Record>\n" + + " </Parameter>\n" + + " <Document/>\n" + + " </RequestContent>\n" + + " </Request>\n" + + " \n" + + " \n" + + " \n" + + ""); + log.info("=======生成xml结束======"); + return stringBuffer.toString(); + } + + /** + * 将TOPGP返回的XML转化为Json,并提出返回Status + * @param TopgpResonseXml 调用TOPGP的Webservice的方法名 如:express_testRequest + * @return Status JsonObject + */ + public static JSONObject GetStatusFromTopgpResponse(String TopgpResonseXml) { + JSONObject jsonObject = XML.toJSONObject(TopgpResonseXml); + + JSONObject envelope = jsonObject.getJSONObject("SOAP-ENV:Envelope"); + JSONObject body = envelope.getJSONObject("SOAP-ENV:Body"); + JSONObject express_testResponse = body.getJSONObject("fjs1:express_testResponse"); + JSONObject fjs1Response = express_testResponse.getJSONObject("fjs1:response"); + JSONObject response = fjs1Response.getJSONObject("Response"); + JSONObject execution = response.getJSONObject("Execution"); + return execution.getJSONObject("Status"); + } + + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java index 11c8404b7..dcaa8c5a2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -1,10 +1,14 @@ package com.ruoyi.common.utils.http; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; +import com.ruoyi.common.constant.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import javax.net.ssl.*; +import java.io.*; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.URL; @@ -12,18 +16,6 @@ import java.net.URLConnection; import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Map; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.ruoyi.common.constant.Constants; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; /** * 通用http发送方法 @@ -265,12 +257,72 @@ public class HttpUtils } } + /** + * 向指定 URL 发送xml POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + *Author yangbo + */ + public static String sendXmlPost(String url, String param) { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try { + String urlNameString = url; + log.info("sendPost - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8"); //发送xml需加上此请求头 + conn.addRequestProperty("SOAPAction", "\"\""); //向topgp发送xml必须加上该Name=“SOAPAction", Value="\"\"" ,否则会报415错误,不能识别XML. + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); + String line; + while ((line = in.readLine()) != null) { + result.append(line); + } + log.info("recv - {}", result); + } catch (ConnectException e) { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString().replace("<","<").replace(">",">"); + } + + /** * 向指定 Restful接口 发送POST方法的请求 * * @param url 发送请求的 URL * @param params 请求参数,请求参数为json的形式。例:params="{\"params\":{\"pagesize\":1000}}" * @return 返回Map, Key="statusCode",接口访问返回状态, key="result":接口返回接果 + * + * author yangbo */ //public static Map sendPostWithRest(String url, String params){ //如果参数为String类型,推送企业微信消息会乱码,因此改为Object类型,直接推送Map --yangbo 20210729 From 051a7695da94135960cc36b93a3700e7820280f6 Mon Sep 17 00:00:00 2001 From: Bo Date: Mon, 9 Aug 2021 11:50:32 +0800 Subject: [PATCH 77/90] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=BF=E9=97=AETopgp?= =?UTF-8?q?=20Webservice=E6=8E=A5=E5=8F=A3Demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/test/conrtroller/XmlWebserviceController.java | 8 +++----- .../common/utils/{XmlUtils.java => TopgpXmlUtils.java} | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) rename ruoyi-common/src/main/java/com/ruoyi/common/utils/{XmlUtils.java => TopgpXmlUtils.java} (99%) diff --git a/box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java b/box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java index 5efb3a233..831579088 100644 --- a/box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java +++ b/box-test/src/main/java/com/ruoyi/test/conrtroller/XmlWebserviceController.java @@ -1,9 +1,7 @@ package com.ruoyi.test.conrtroller; -import com.ruoyi.common.utils.XmlUtils; +import com.ruoyi.common.utils.TopgpXmlUtils; import com.ruoyi.common.utils.http.HttpUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @@ -19,10 +17,10 @@ public class XmlWebserviceController { public String SendXml() { Map map = new HashMap<>(); map.put("responseInfo", "此处为测试消息"); - String param = XmlUtils.GetTopgpRequestXml("express_testRequest", map); + String param = TopgpXmlUtils.GetTopgpRequestXml("express_testRequest", map); String url = "http://192.168.2.81:85/web/ws/r/aws_ttsrv2_toptest"; String returnXml = HttpUtils.sendXmlPost(url,param); - return XmlUtils.GetStatusFromTopgpResponse(returnXml).toString(); + return TopgpXmlUtils.GetStatusFromTopgpResponse(returnXml).toString(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/XmlUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TopgpXmlUtils.java similarity index 99% rename from ruoyi-common/src/main/java/com/ruoyi/common/utils/XmlUtils.java rename to ruoyi-common/src/main/java/com/ruoyi/common/utils/TopgpXmlUtils.java index 2278c008c..d5dc2ae38 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/XmlUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TopgpXmlUtils.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import java.util.Map; -public class XmlUtils { +public class TopgpXmlUtils { private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); /** From ed9277506d6d526465313ba33a803b962356f2e2 Mon Sep 17 00:00:00 2001 From: 18326186802 <862709625@qq.com> Date: Mon, 9 Aug 2021 13:43:36 +0800 Subject: [PATCH 78/90] =?UTF-8?q?poi=E7=89=88=E6=9C=AC=E9=99=8D=E4=BD=8E.?= =?UTF-8?q?=E5=8A=A0=E5=85=A5redis=E9=98=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bps-kettle/pom.xml | 13 +++++++++++++ .../com/ruoyi/kettle/domain/KettleJob.java | 12 +++++++++--- .../com/ruoyi/kettle/domain/KettleTrans.java | 12 ++++++++++++ .../service/impl/KettleJobServiceImpl.java | 6 +++--- .../service/impl/KettleTransServiceImpl.java | 3 ++- .../ruoyi/kettle/tools/RedisStreamUtil.java | 6 +----- .../mapper/kettle/KettleJobMapper.xml | 4 +++- .../mapper/kettle/KettleTransMapper.xml | 4 +++- .../kettle/common/repository_tree.html | 16 +++++++++++++++- .../resources/templates/kettle/job/job.html | 17 ++++++++++++++--- .../templates/kettle/trans/trans.html | 18 +++++++++++------- pom.xml | 2 +- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 10 +++++----- 13 files changed, 92 insertions(+), 31 deletions(-) diff --git a/bps-kettle/pom.xml b/bps-kettle/pom.xml index 657b1ad91..e8db1e4f9 100644 --- a/bps-kettle/pom.xml +++ b/bps-kettle/pom.xml @@ -115,6 +115,19 @@ jtds 1.2.4 + + org.springframework.boot + spring-boot-starter-data-redis + + + redis.clients + jedis + + + + org.apache.poi + poi-ooxml + \n" + + " \n" + + " \n" + + " \n" + + " \t\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \t\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n" + + "\n" + + " \n" + + " \n" + + ""; } From 2d5f955aebc38cf5a69bdd0a23eb9a51d109af29 Mon Sep 17 00:00:00 2001 From: Bo Date: Sun, 15 Aug 2021 20:00:06 +0800 Subject: [PATCH 88/90] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=BF=AB=E9=80=92?= =?UTF-8?q?=E5=8D=95=E5=8F=B7=EF=BC=8C=E5=87=BA=E8=B4=A7=E5=8D=95=E5=8F=B7?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E4=B8=BA(expressNum,deliveryNum)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ExpSubsPushApiController.java | 6 ++--- .../com/ruoyi/bps/domain/ExpTopgpLog.java | 24 +++++++++---------- .../impl/ExpSubsPushApiServiceImpl.java | 22 ++++++++--------- .../mapper/bps/ExpTopgpLogMapper.xml | 22 ++++++++--------- .../templates/bps/expTopgpLog/add.html | 4 ++-- .../templates/bps/expTopgpLog/edit.html | 4 ++-- .../bps/expTopgpLog/expTopgpLog.html | 8 +++---- 7 files changed, 45 insertions(+), 45 deletions(-) diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java index dd190880f..8bb2ae3d1 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/ExpSubsPushApiController.java @@ -55,7 +55,7 @@ public class ExpSubsPushApiController extends BaseController { //接受topgp订阅, @Log(title = "快递订阅", businessType = BusinessType.OTHER) @CrossOrigin - @ApiOperation(value="topgp订阅快递",notes = "request body格式: {\"requestId\":\"1628584040740\",\"deliveryNo\":\"S301-2108020001\",\"expressNo\":\"300444235610\",\"company\":\"annengwuliu\",\"phone\":\"13800138000\"}") + @ApiOperation(value="topgp订阅快递",notes = "request body格式: {\"requestId\":\"1628584040740\",\"deliveryNum\":\"S301-2108020001\",\"expressNum\":\"300444235610\",\"company\":\"annengwuliu\",\"phone\":\"13800138000\"}") @ApiImplicitParams({ @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String", dataTypeClass = String.class), @ApiImplicitParam(name = "requestJson", value = "请求json",required = true, paramType = "body", dataType = "String", dataTypeClass = String.class) @@ -69,8 +69,8 @@ public class ExpSubsPushApiController extends BaseController { @Log(title = "TOPGP出货已转签收", businessType = BusinessType.OTHER) @CrossOrigin @ApiOperation(value="接受TOPGP已转签收消息推送",notes = "request body格式: {\"requestId\":\"topgpSign1628584040740\"," + - "\"signedInfoList\":[{\"deliveryNo\":\"S301-2108020001\",\"signNo\":\"S501-2108020001\"},{\"deliveryNo\":\"S301-2108020002\",\"signNo\":\"S501-2108020002\"}]," + - "\"expressNo\":\"300444235610\",\"company\":\"annengwuliu\",\"phone\":\"13800138000\",\"status\":\"0\"}" + "\"signedInfoList\":[{\"deliveryNum\":\"S301-2108020001\",\"signNo\":\"S501-2108020001\"},{\"deliveryNum\":\"S301-2108020002\",\"signNo\":\"S501-2108020002\"}]," + + "\"expressNum\":\"300444235610\",\"company\":\"annengwuliu\",\"phone\":\"13800138000\",\"status\":\"0\"}" ) @ApiImplicitParams({ @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String", dataTypeClass = String.class), diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpTopgpLog.java b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpTopgpLog.java index 3e3bbd29f..371ddd225 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/domain/ExpTopgpLog.java +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/ExpTopgpLog.java @@ -28,11 +28,11 @@ public class ExpTopgpLog extends BaseEntity /** 快递单 */ @Excel(name = "快递单") - private String expressNumber; + private String expressNum; /** 出货单号 */ @Excel(name = "出货单号") - private String deliveryNumber; + private String deliveryNum; /** 请求报文 */ @Excel(name = "请求报文") @@ -77,23 +77,23 @@ public class ExpTopgpLog extends BaseEntity { return requestType; } - public void setExpressNumber(String expressNumber) + public void setExpressNum(String expressNum) { - this.expressNumber = expressNumber; + this.expressNum = expressNum; } - public String getExpressNumber() + public String getExpressNum() { - return expressNumber; + return expressNum; } - public void setDeliveryNumber(String deliveryNumber) + public void setDeliveryNum(String deliveryNum) { - this.deliveryNumber = deliveryNumber; + this.deliveryNum = deliveryNum; } - public String getDeliveryNumber() + public String getDeliveryNum() { - return deliveryNumber; + return deliveryNum; } public void setRequestStr(String requestStr) { @@ -138,8 +138,8 @@ public class ExpTopgpLog extends BaseEntity .append("sid", getSid()) .append("requestId", getRequestId()) .append("requestType", getRequestType()) - .append("expressNumber", getExpressNumber()) - .append("deliveryNumber", getDeliveryNumber()) + .append("expressNum", getExpressNum()) + .append("deliveryNum", getDeliveryNum()) .append("requestStr", getRequestStr()) .append("requestTime", getRequestTime()) .append("responseCode", getResponseCode()) diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java index 85be23795..4483d28a2 100644 --- a/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/ExpSubsPushApiServiceImpl.java @@ -172,15 +172,15 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { return "貌似没有接受到任何参数!"; } String requestId=contentJson.getString("requestId"); //TOPGP请求ID,年月日时分稍毫秒 - String deliveryNo= contentJson.getString("deliveryNo"); //TOPGP出货单号 - String expressNo = contentJson.getString("expressNo"); //TOPGP快递单号 + String deliveryNum= contentJson.getString("deliveryNum"); //TOPGP出货单号 + String expressNum = contentJson.getString("expressNum"); //TOPGP快递单号 String company = contentJson.getString("company"); //TOPGP物流公司编号 String phone = contentJson.getString("phone"); //TOPGP出货单号 //Long timeStamp = System.currentTimeMillis(); //获取时间戳 String subscribeTime= DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); //获取订阅时间 SubscribeResp subscribeResp=new SubscribeResp(); //如果请求ID、出货单号或者快递单号为空,则不向快递100请求订阅,自己组合返回信息。 - if(StringUtils.isEmpty(deliveryNo) || StringUtils.isEmpty(expressNo) || StringUtils.isEmpty(requestId)){ + if(StringUtils.isEmpty(deliveryNum) || StringUtils.isEmpty(expressNum) || StringUtils.isEmpty(requestId)){ subscribeResp.setMessage("请求ID、快递单号或出货单号不可为空"); subscribeResp.setResult(false); subscribeResp.setReturnCode("700"); @@ -188,7 +188,7 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { //组合向快递100推送订阅请求的参数 ExpSubscribe expSubscribe=new ExpSubscribe(); expSubscribe.setSid(Long.getLong(requestId)); //时间戳 - expSubscribe.setNumber(expressNo); + expSubscribe.setNumber(expressNum); expSubscribe.setCompany(company); expSubscribe.setPhone(phone); expSubscribe.setSubscribeTime(subscribeTime); //订阅时间 @@ -201,8 +201,8 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { //根据快递100的订阅返回结果,组合返回Topgp的JSON字符串 Map map= new HashMap<>(); map.put("requestId",requestId); //从TOPGP传过来的requestId, 时间戳 - map.put("deliveryNo",deliveryNo); //出货单号 - map.put("expressNo",expressNo); //快递单号 + map.put("deliveryNum",deliveryNum); //出货单号 + map.put("expressNum",expressNum); //快递单号 map.put("responseStr",subscribeResp.getMessage()); //返回消息 map.put("responseCode",subscribeResp.getReturnCode()); //返回码 map.put("result",subscribeResp.isResult()); //订阅结果 @@ -214,8 +214,8 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { ExpTopgpLog expTopgpLog=new ExpTopgpLog(); expTopgpLog.setRequestId(requestId); expTopgpLog.setRequestType("fromTopgp"); - expTopgpLog.setExpressNumber(expressNo); - expTopgpLog.setDeliveryNumber(deliveryNo); + expTopgpLog.setExpressNum(expressNum); + expTopgpLog.setDeliveryNum(deliveryNum); expTopgpLog.setRequestStr(contentJson.toString()); expTopgpLog.setRequestTime(subscribeTime); expTopgpLog.setResponseCode(subscribeResp.getReturnCode()); @@ -257,9 +257,9 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { ExpTopgpLog expTopgpLog=new ExpTopgpLog(); expTopgpLog.setRequestId(contentJson.getString("requestId")); expTopgpLog.setRequestType("topgpSigned"); - expTopgpLog.setExpressNumber(contentJson.getString("expressNum")); + expTopgpLog.setExpressNum(contentJson.getString("expressNum")); expTopgpLog.setRequestStr(contentJson.toString()); - expTopgpLog.setDeliveryNumber(deliveryNum); + expTopgpLog.setDeliveryNum(deliveryNum); expTopgpLog.setRequestTime(DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); expTopgpLog.setResponseCode("200"); expTopgpLog.setResponseStr(returnStr); @@ -357,7 +357,7 @@ public class ExpSubsPushApiServiceImpl implements IExpSubsPushApiService { ExpTopgpLog expTopgpLog=new ExpTopgpLog(); expTopgpLog.setRequestId(requestMap.get("requestId").toString()); expTopgpLog.setRequestType("toTopgp"); - expTopgpLog.setExpressNumber(requestMap.get("expressNum").toString()); + expTopgpLog.setExpressNum(requestMap.get("expressNum").toString()); expTopgpLog.setRequestStr(JSONObject.toJSONString(requestMap)); expTopgpLog.setRequestTime(DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); JSONObject object = jsonObject.getJSONObject("execution"); diff --git a/box-bps/src/main/resources/mapper/bps/ExpTopgpLogMapper.xml b/box-bps/src/main/resources/mapper/bps/ExpTopgpLogMapper.xml index 78ca7c67e..7ccd1e472 100644 --- a/box-bps/src/main/resources/mapper/bps/ExpTopgpLogMapper.xml +++ b/box-bps/src/main/resources/mapper/bps/ExpTopgpLogMapper.xml @@ -8,8 +8,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - + + @@ -17,7 +17,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select sid, requestId, requestType, expressNumber, deliveryNumber, requestStr, requestTime, responseCode, responseStr from exp_topgp_log + select sid, requestId, requestType, expressNum, deliveryNum, requestStr, requestTime, responseCode, responseStr from exp_topgp_log +
    - +
    diff --git a/box-bps/src/main/resources/templates/bps/expTopgpLog/edit.html b/box-bps/src/main/resources/templates/bps/expTopgpLog/edit.html index 574853c6c..b2dcedc7a 100644 --- a/box-bps/src/main/resources/templates/bps/expTopgpLog/edit.html +++ b/box-bps/src/main/resources/templates/bps/expTopgpLog/edit.html @@ -22,13 +22,13 @@
    - +
    - +
    diff --git a/box-bps/src/main/resources/templates/bps/expTopgpLog/expTopgpLog.html b/box-bps/src/main/resources/templates/bps/expTopgpLog/expTopgpLog.html index 010215e84..a0a37b094 100644 --- a/box-bps/src/main/resources/templates/bps/expTopgpLog/expTopgpLog.html +++ b/box-bps/src/main/resources/templates/bps/expTopgpLog/expTopgpLog.html @@ -20,11 +20,11 @@
  • - +
  • - +
  • @@ -96,11 +96,11 @@ title: '请求类型' }, { - field: 'expressNumber', + field: 'expressNum', title: '快递单' }, { - field: 'deliveryNumber', + field: 'deliveryNum', title: '出货单号' }, { From f90e82224d0c3d87992a1ceb291b795043c174b9 Mon Sep 17 00:00:00 2001 From: Bo Date: Sun, 15 Aug 2021 20:58:06 +0800 Subject: [PATCH 89/90] =?UTF-8?q?=E5=8F=AA=E8=AE=A9admin=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=8F=AF=E8=A7=81=E5=AE=9E=E4=BE=8B=E6=BC=94=E7=A4=BA=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/templates/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/templates/index.html b/ruoyi-admin/src/main/resources/templates/index.html index 13252a844..980c785e1 100644 --- a/ruoyi-admin/src/main/resources/templates/index.html +++ b/ruoyi-admin/src/main/resources/templates/index.html @@ -72,7 +72,7 @@
  • -
  • +
  • 实例演示