From f9233646749cb6232b60eefce944db20dbca6c86 Mon Sep 17 00:00:00 2001 From: hongtianzai Date: Tue, 18 Jan 2022 15:20:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6=EF=BC=8Cex?= =?UTF-8?q?cel=E9=80=9A=E7=94=A8=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../glxp/udidl/admin/config/AuthAspect.java | 52 ++++ .../glxp/udidl/admin/config/GlobalConfig.java | 2 + .../controller/device/ContactController.java | 4 +- .../controller/device/DeviceController.java | 3 +- .../controller/device/FileInfoController.java | 5 +- .../device/PosTaggerController.java | 10 +- .../device/ProductInfoController.java | 8 +- .../controller/device/TestController.java | 34 --- .../device/UdiCompanyController.java | 5 +- .../device/UdiCooperController.java | 2 + .../device/UdiDownloadController.java | 10 +- .../device/UdidlDeviceController.java | 58 +++++ .../controller/info/CompanyController.java | 5 +- .../controller/info/JobLogController.java | 3 + .../udplat/UdplatGoodsController.java | 30 +++ .../udidl/admin/dao/sys/SysMenuMapper.java | 19 ++ .../udidl/admin/dao/sys/SysRoleMapper.java | 19 ++ .../admin/dao/sys/SysRoleMenuMapper.java | 13 + .../udidl/admin/dao/sys/SysUserMapper.java | 21 ++ .../admin/dao/udplat/UdplatGoodsMapper.java | 19 ++ .../udidl/admin/dto/udplat/DeliveryGoods.java | 52 ++++ .../udidl/admin/dto/udplat/HospitalGoods.java | 53 ++++ .../glxp/udidl/admin/entity/sys/SysMenu.java | 102 ++++++++ .../glxp/udidl/admin/entity/sys/SysRole.java | 76 ++++++ .../udidl/admin/entity/sys/SysRoleMenu.java | 35 +++ .../glxp/udidl/admin/entity/sys/SysUser.java | 102 ++++++++ .../admin/entity/udplat/UdplatGoods.java | 42 ++++ .../service/udplat/UdplatGoodsService.java | 15 ++ .../udplat/impl/UdplatGoodsServiceImpl.java | 74 ++++++ .../com/glxp/udidl/admin/util/BeanUtils.java | 34 +++ .../main/resources/application-dev.properties | 5 +- .../mybatis/mapper/sys/SysMenuMapper.xml | 44 ++++ .../mybatis/mapper/sys/SysRoleMapper.xml | 38 +++ .../mybatis/mapper/sys/SysRoleMenuMapper.xml | 16 ++ .../mybatis/mapper/sys/SysUserMapper.xml | 50 ++++ .../mapper/udplat/UdplatGoodsMapper.xml | 122 +++++++++ .../target/classes/application-dev.properties | 5 +- .../udidl/admin/config/GlobalConfig.class | Bin 1727 -> 2115 bytes .../controller/device/ContactController.class | Bin 3722 -> 3806 bytes .../controller/device/DeviceController.class | Bin 15503 -> 15586 bytes .../device/FileInfoController.class | Bin 1912 -> 2006 bytes .../device/PosTaggerController.class | Bin 12256 -> 12369 bytes .../device/ProductInfoController.class | Bin 9409 -> 9451 bytes .../controller/device/TestController.class | Bin 6646 -> 5232 bytes .../device/UdiCompanyController.class | Bin 4348 -> 4453 bytes .../device/UdiCooperController.class | Bin 2586 -> 2672 bytes .../device/UdiDownloadController.class | Bin 3660 -> 3784 bytes .../controller/info/CompanyController.class | Bin 2000 -> 2093 bytes .../controller/info/JobLogController.class | Bin 1232 -> 1315 bytes .../res/udid/DataSetResult$ClinicalInfo.class | Bin 2942 -> 3445 bytes .../res/udid/DataSetResult$DeviceInfo.class | Bin 29425 -> 29383 bytes .../res/udid/DataSetResult$PackingInfo.class | Bin 3490 -> 3999 bytes .../res/udid/DataSetResult$StorageInfo.class | Bin 3343 -> 3852 bytes .../service/DataSync/DeviceSaveService.class | Bin 14411 -> 15506 bytes api-common/pom.xml | 11 +- .../glxp/udidl/common/annotation/Excel.java | 101 ++++++++ .../com/glxp/udidl/common/util/DateUtils.java | 15 ++ .../com/glxp/udidl/common/util/ExcelUtil.java | 234 ++++++++++++++++++ 58 files changed, 1494 insertions(+), 54 deletions(-) create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/config/AuthAspect.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdidlDeviceController.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/controller/udplat/UdplatGoodsController.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysMenuMapper.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMapper.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMenuMapper.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysUserMapper.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/dao/udplat/UdplatGoodsMapper.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/DeliveryGoods.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/HospitalGoods.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysMenu.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRole.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRoleMenu.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysUser.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/entity/udplat/UdplatGoods.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/UdplatGoodsService.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/impl/UdplatGoodsServiceImpl.java create mode 100644 api-admin/src/main/java/com/glxp/udidl/admin/util/BeanUtils.java create mode 100644 api-admin/src/main/resources/mybatis/mapper/sys/SysMenuMapper.xml create mode 100644 api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMapper.xml create mode 100644 api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMenuMapper.xml create mode 100644 api-admin/src/main/resources/mybatis/mapper/sys/SysUserMapper.xml create mode 100644 api-admin/src/main/resources/mybatis/mapper/udplat/UdplatGoodsMapper.xml create mode 100644 api-common/src/main/java/com/glxp/udidl/common/annotation/Excel.java create mode 100644 api-common/src/main/java/com/glxp/udidl/common/util/DateUtils.java create mode 100644 api-common/src/main/java/com/glxp/udidl/common/util/ExcelUtil.java diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/config/AuthAspect.java b/api-admin/src/main/java/com/glxp/udidl/admin/config/AuthAspect.java new file mode 100644 index 0000000..0e4b271 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/config/AuthAspect.java @@ -0,0 +1,52 @@ +package com.glxp.udidl.admin.config; + +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; +import com.glxp.udidl.admin.dao.sys.SysUserMapper; +import com.glxp.udidl.admin.exception.JsonException; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; + +@Aspect +@Component +public class AuthAspect { + @Autowired + private SysUserMapper sysUserMapper; + @Autowired + private GlobalConfig globalConfig; + @Pointcut("@annotation(com.glxp.udidl.admin.annotation.AuthRuleAnnotation)") + private void authMethod() { + } + + @Before(value = "authMethod()") + public void before(JoinPoint joinPoint) { + if(globalConfig.isOpenAuth() == false) + return; + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + + if (attributes == null) { + throw new JsonException(-1, "attributes = null"); + } + HttpServletRequest request = attributes.getRequest(); + + String key = request.getHeader("key"); + if (key == null || key == "") + throw new JsonException(401, "key不能为空"); + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + AuthRuleAnnotation action = method.getAnnotation(AuthRuleAnnotation.class); + String perms = action.value(); + Integer res = sysUserMapper.hasAuthPerms(key,perms); + if(res == 0) + throw new JsonException(402, "无权限!"); + } +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/config/GlobalConfig.java b/api-admin/src/main/java/com/glxp/udidl/admin/config/GlobalConfig.java index 7ea7eb2..9d5af5d 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/config/GlobalConfig.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/config/GlobalConfig.java @@ -9,4 +9,6 @@ import org.springframework.stereotype.Component; public class GlobalConfig { @Value("${config.downloadPath}") private String downloadPath; + @Value("${config.openAuth}") + private boolean openAuth; } diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ContactController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ContactController.java index 3d7c7aa..dc58b1d 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ContactController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ContactController.java @@ -1,11 +1,12 @@ package com.glxp.udidl.admin.controller.device; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.entity.udid.Contactlist; import com.glxp.udidl.admin.entity.udid.Device; import com.glxp.udidl.admin.req.DlConnactRequest; import com.glxp.udidl.admin.res.DLConnactResponse; -import com.glxp.udidl.admin.service.inout.DlConnactService; import com.glxp.udidl.admin.service.inout.DeviceService; +import com.glxp.udidl.admin.service.inout.DlConnactService; import com.glxp.udidl.common.enums.ResultEnum; import com.glxp.udidl.common.res.BaseResponse; import com.glxp.udidl.common.util.ResultVOUtils; @@ -28,6 +29,7 @@ public class ContactController { @Resource private DeviceService deviceService; + @AuthRuleAnnotation("udidl_contact_all") @GetMapping("udidl/device/dlconnact") public BaseResponse dlconnacts(@Valid DlConnactRequest dlConnactRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/DeviceController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/DeviceController.java index cbc04f2..b45fdfd 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/DeviceController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/DeviceController.java @@ -1,6 +1,7 @@ package com.glxp.udidl.admin.controller.device; import com.github.pagehelper.PageInfo; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.dao.udid.DevicedownloadMapper; import com.glxp.udidl.admin.entity.udid.*; import com.glxp.udidl.admin.req.udid.*; @@ -44,7 +45,7 @@ public class DeviceController { @Resource UdiCompanyService udiCompanyService; - + @AuthRuleAnnotation("udidl_device_all") @GetMapping("warehouse/device/list") public BaseResponse listDevices(@Valid DeviceListRequest deviceListRequest, BindingResult bindingResult) { diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/FileInfoController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/FileInfoController.java index dd02cf6..adc0fa9 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/FileInfoController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/FileInfoController.java @@ -1,5 +1,6 @@ package com.glxp.udidl.admin.controller.device; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.req.ListPageRequest; import com.glxp.udidl.admin.service.DataSync.ProductInfoDlService; import com.glxp.udidl.admin.service.info.FileInfoService; @@ -20,12 +21,12 @@ public class FileInfoController { FileInfoService fileInfoService; @Autowired ProductInfoDlService productInfoDlService; - + @AuthRuleAnnotation("udidl_fileInfo_all") @PostMapping("/getlist") public BaseResponse getList(@RequestBody ListPageRequest param) { return fileInfoService.getList(param); } - + @AuthRuleAnnotation("udidl_fileInfo_all") @PostMapping("/exportToFile") public BaseResponse exportToFile(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { return productInfoDlService.ExportToFile(startDate, endDate, "manual"); diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/PosTaggerController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/PosTaggerController.java index 17cf3f0..27fb6eb 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/PosTaggerController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/PosTaggerController.java @@ -1,6 +1,7 @@ package com.glxp.udidl.admin.controller.device; import com.github.pagehelper.PageInfo; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.entity.udi.ProductInfoEntity; import com.glxp.udidl.admin.req.ProductInfoFilterRequest; import com.glxp.udidl.admin.res.PageSimpleResponse; @@ -32,7 +33,7 @@ public class PosTaggerController { UdiCompanyService udiCompanyService; @Resource ProductInfoService productInfoService; - + @AuthRuleAnnotation("udidl_posTagger_all") @GetMapping("udi/company/findByCreditNo") public BaseResponse findByCreditNo(ProductInfoFilterRequest productInfoFilterRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -50,7 +51,7 @@ public class PosTaggerController { pageSimpleResponse.setList(productInfoEntities); return ResultVOUtils.success(pageSimpleResponse); } - + @AuthRuleAnnotation("udidl_posTagger_all") @GetMapping("udi/company/findCoName") public BaseResponse findCoName(ProductInfoFilterRequest productInfoFilterRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -74,7 +75,7 @@ public class PosTaggerController { pageSimpleResponse.setList(names); return ResultVOUtils.success(pageSimpleResponse); } - + @AuthRuleAnnotation("udidl_posTagger_all") @GetMapping("udi/company/findTreeData") public BaseResponse findTreeData(ProductInfoFilterRequest productInfoFilterRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -96,7 +97,6 @@ public class PosTaggerController { return ResultVOUtils.success(pageSimpleResponse); } - public List transferTreeData(List productInfoEntities) { List posTaggerResponses = new ArrayList<>(); @@ -218,7 +218,7 @@ public class PosTaggerController { return tops; } - + @AuthRuleAnnotation("udidl_posTagger_all") @GetMapping("udi/company/findByUuid") public BaseResponse findByDi(ProductInfoFilterRequest productInfoFilterRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ProductInfoController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ProductInfoController.java index cdfe622..8ba85af 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ProductInfoController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/ProductInfoController.java @@ -31,7 +31,7 @@ public class ProductInfoController { //手持枪扫码查询 - @AuthRuleAnnotation("udidl_ProductInfo_findProductInfo") + @AuthRuleAnnotation("udidl_productInfo_all") @GetMapping("udidl/device/findBydi") public BaseResponse findProductInfo(ProductInfoFilterRequest productInfoFilterRequest) { @@ -66,6 +66,7 @@ public class ProductInfoController { } //管理平台扫码查询 + @AuthRuleAnnotation("udidl_productInfo_all") @GetMapping("udidl/wms/findBydi") public BaseResponse findBydiWms(ProductInfoFilterRequest productInfoFilterRequest) { @@ -113,6 +114,7 @@ public class ProductInfoController { } //出入库同步下载 + @AuthRuleAnnotation("udidl_productInfo_all") @GetMapping("udidl/udiwms/syncUdi") public BaseResponse syncUdi(ProductInfoFilterRequest productInfoFilterRequest) { @@ -123,6 +125,7 @@ public class ProductInfoController { //开放查询 查询只查询主DI, + @AuthRuleAnnotation("udidl_productInfo_all") @GetMapping("udidl/device/filterUdi") public BaseResponse filterUdi(ProductInfoFilterRequest productInfoFilterRequest) { @@ -177,6 +180,7 @@ public class ProductInfoController { //开放查询 查询全部,不会过滤只显示主 + @AuthRuleAnnotation("udidl_productInfo_all") @GetMapping("udidl/device/filterAllUdi") public BaseResponse filterAllUdi(ProductInfoFilterRequest productInfoFilterRequest) { @@ -230,12 +234,14 @@ public class ProductInfoController { @GetMapping("udidl/device/filterByUuid") + @AuthRuleAnnotation("udidl_productInfo_all") public BaseResponse filterByUuid(ProductInfoFilterRequest productInfoFilterRequest) { List productInfoEntityList = productInfoService.findAll(productInfoFilterRequest); return ResultVOUtils.success(productInfoEntityList); } @GetMapping("udidl/device/filterByNameCode") + @AuthRuleAnnotation("udidl_productInfo_all") public BaseResponse filterByNameCode(ProductInfoFilterRequest productInfoFilterRequest) { List productInfoEntityList = productInfoService.findAll(productInfoFilterRequest); Map> listMap = productInfoEntityList.stream().collect(Collectors.groupingBy(ProductInfoEntity::getUuid)); diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/TestController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/TestController.java index 1b9f1ff..745d285 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/TestController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/TestController.java @@ -14,14 +14,11 @@ import com.glxp.udidl.common.util.ResultVOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.Date; import java.util.List; @RestController @@ -99,38 +96,7 @@ public class TestController { asyncDownloadTask.downloadByMonth(month, page); } - @GetMapping("udidl/device/dlByDay") - public String dlByDay(String day) { - logger.info(day + "---按天开启下载"); - asyncDownloadTask.downloadByDay(day); - return "ok"; - } - @GetMapping("udidl/device/dlByDays") - public BaseResponse dlByDays(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { - logger.info("---按日期段下载"); - //logger.info(startDate.toString()); - //logger.info(endDate.toString()); - return deviceSyncService.downloadUdi(startDate, endDate); - } - @PostMapping("udidl/device/dlByDi") - public BaseResponse downloadByDi(String deviceId) { - return deviceSyncService.downloadByDi(deviceId); - } - /** - * 获取产品标识详情 - * - * @param deviceId - * @return - */ - @PostMapping("udidl/device/downloadSingle") - public BaseResponse downloadSingle(String deviceId) { - return deviceSyncService.downloadSingle(deviceId); - } - @PostMapping("udidl/device/downloadHistory") - public BaseResponse downloadHistory(String key) { - return deviceSyncService.downloadHistory(key); - } } diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCompanyController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCompanyController.java index 7c55a02..69808bc 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCompanyController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCompanyController.java @@ -1,6 +1,7 @@ package com.glxp.udidl.admin.controller.device; import com.github.pagehelper.PageInfo; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.entity.udi.ProductInfoEntity; import com.glxp.udidl.admin.entity.udi.UdiCompanyEntity; import com.glxp.udidl.admin.req.ProductInfoFilterRequest; @@ -29,6 +30,7 @@ public class UdiCompanyController { @Resource ProductInfoService productInfoService; + @AuthRuleAnnotation("udidl_udiCompany_all") @GetMapping("udi/company/filter") public BaseResponse filterCompany(@Valid UdiCompanyRequest udiCompanyRequest, BindingResult bindingResult) { @@ -38,7 +40,7 @@ public class UdiCompanyController { List udiCompanyEntities = udiCompanyService.filterUdiCompany(udiCompanyRequest); return ResultVOUtils.success(udiCompanyEntities); } - + @AuthRuleAnnotation("udidl_udiCompany_all") @GetMapping("udi/company/filtertByTD") public BaseResponse filtertByTD(ProductInfoFilterRequest productInfoFilterRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -49,6 +51,7 @@ public class UdiCompanyController { } //udi查询app接口,获取企业最新DI + @AuthRuleAnnotation("udidl_udiCompany_all") @GetMapping("udi/company/filtertUdi") public BaseResponse filtertUdi(ProductInfoFilterRequest productInfoFilterRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCooperController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCooperController.java index d560757..c5549d2 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCooperController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiCooperController.java @@ -1,5 +1,6 @@ package com.glxp.udidl.admin.controller.device; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.entity.udi.ProductInfoEntity; import com.glxp.udidl.admin.req.ProductInfoFilterRequest; import com.glxp.udidl.admin.service.inout.ProductInfoService; @@ -23,6 +24,7 @@ public class UdiCooperController { @Resource AsyncDownloadTask asyncDownloadTask; + @AuthRuleAnnotation("udidl_udiCooper_all") @GetMapping("udidl/cooper/findBydi") public BaseResponse findProductInfo(ProductInfoFilterRequest productInfoFilterRequest) { diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiDownloadController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiDownloadController.java index 1dc0110..c4f4f06 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiDownloadController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdiDownloadController.java @@ -1,5 +1,6 @@ package com.glxp.udidl.admin.controller.device; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.entity.udid.*; import com.glxp.udidl.admin.req.DownloadUdiRequest; import com.glxp.udidl.admin.service.inout.UdiDownloadService; @@ -19,6 +20,7 @@ public class UdiDownloadController { @Resource private UdiDownloadService udiDownloadService; + @AuthRuleAnnotation("udidl_udiDownload_all") @GetMapping("udi/download/device") public BaseResponse downloadDevice(@Valid DownloadUdiRequest downloadUdiRequest, BindingResult bindingResult) { @@ -28,7 +30,7 @@ public class UdiDownloadController { List deviceList = udiDownloadService.downloadDevice(downloadUdiRequest); return ResultVOUtils.success(deviceList); } - + @AuthRuleAnnotation("udidl_udiDownload_all") @GetMapping("udi/download/contactlist") public BaseResponse downloadContactlist(@Valid DownloadUdiRequest downloadUdiRequest, BindingResult bindingResult) { @@ -38,7 +40,7 @@ public class UdiDownloadController { List deviceList = udiDownloadService.downloadContactlist(downloadUdiRequest); return ResultVOUtils.success(deviceList); } - + @AuthRuleAnnotation("udidl_udiDownload_all") @GetMapping("udi/download/deviceclinical") public BaseResponse downloadDeviceclinical(@Valid DownloadUdiRequest downloadUdiRequest, BindingResult bindingResult) { @@ -48,7 +50,7 @@ public class UdiDownloadController { List deviceList = udiDownloadService.downloadDeviceclinical(downloadUdiRequest); return ResultVOUtils.success(deviceList); } - + @AuthRuleAnnotation("udidl_udiDownload_all") @GetMapping("udi/download/devicepackage") public BaseResponse downloadDevicepackage(@Valid DownloadUdiRequest downloadUdiRequest, BindingResult bindingResult) { @@ -58,7 +60,7 @@ public class UdiDownloadController { List deviceList = udiDownloadService.downloadDevicepackage(downloadUdiRequest); return ResultVOUtils.success(deviceList); } - + @AuthRuleAnnotation("udidl_udiDownload_all") @GetMapping("udi/download/devicestorage") public BaseResponse downloadDevicestorage(@Valid DownloadUdiRequest downloadUdiRequest, BindingResult bindingResult) { diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdidlDeviceController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdidlDeviceController.java new file mode 100644 index 0000000..297e1be --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/device/UdidlDeviceController.java @@ -0,0 +1,58 @@ +package com.glxp.udidl.admin.controller.device; + +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; +import com.glxp.udidl.admin.service.DataSync.DeviceSyncService; +import com.glxp.udidl.common.res.BaseResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; + +@RestController +public class UdidlDeviceController { + private static final Logger logger = LoggerFactory.getLogger(UdidlDeviceController.class); + @Autowired + DeviceSyncService deviceSyncService; + + @AuthRuleAnnotation("udidl_udidlDevice_all") + @GetMapping("udidl/device/dlByDays") + public BaseResponse dlByDays(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { + logger.info("---按日期段下载"); + return deviceSyncService.downloadUdi(startDate, endDate); + } + @AuthRuleAnnotation("udidl_udidlDevice_all") + @GetMapping("udidl/device/dlByDay") + public String dlByDay(String day) { + logger.info(day + "---按天开启下载"); + deviceSyncService.downloadUdi(day,"manual"); + //asyncDownloadTask.downloadByDay(day); + return "ok"; + } + @AuthRuleAnnotation("udidl_udidlDevice_all") + @PostMapping("udidl/device/dlByDi") + public BaseResponse downloadByDi(String deviceId) { + return deviceSyncService.downloadByDi(deviceId); + } + + /** + * 获取产品标识详情 + * + * @param deviceId + * @return + */ + @AuthRuleAnnotation("udidl_udidlDevice_all") + @PostMapping("udidl/device/downloadSingle") + public BaseResponse downloadSingle(String deviceId) { + return deviceSyncService.downloadSingle(deviceId); + } + @AuthRuleAnnotation("udidl_udidlDevice_all") + @PostMapping("udidl/device/downloadHistory") + public BaseResponse downloadHistory(String key) { + return deviceSyncService.downloadHistory(key); + } +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/CompanyController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/CompanyController.java index df95270..a16bf89 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/CompanyController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/CompanyController.java @@ -1,5 +1,6 @@ package com.glxp.udidl.admin.controller.info; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.entity.info.CompanyEntity; import com.glxp.udidl.admin.service.info.CompanyService; import com.glxp.udidl.common.res.BaseResponse; @@ -16,7 +17,7 @@ public class CompanyController { @Resource private CompanyService companyService; - + @AuthRuleAnnotation("udidl_company_all") @GetMapping("/warehouse/info/company") public BaseResponse getCompanyInfo() { CompanyEntity companyEntity = companyService.findCompany(); @@ -25,7 +26,7 @@ public class CompanyController { } return ResultVOUtils.error(500, "企业信息为空"); } - + @AuthRuleAnnotation("udidl_company_all") @PostMapping("/warehouse/info/modifyCompany") public BaseResponse modifyCompany(@RequestBody CompanyEntity companyEntity) { diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/JobLogController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/JobLogController.java index 2204a18..699b3b4 100644 --- a/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/JobLogController.java +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/info/JobLogController.java @@ -1,5 +1,6 @@ package com.glxp.udidl.admin.controller.info; +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; import com.glxp.udidl.admin.req.udid.JobLogFilterRequest; import com.glxp.udidl.admin.service.udi.JobLogService; import com.glxp.udidl.common.res.BaseResponse; @@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RestController; public class JobLogController { @Autowired JobLogService jobLogService; + + @AuthRuleAnnotation("udidl_jobLog_all") @PostMapping("/list") public BaseResponse getList(@RequestBody JobLogFilterRequest jobLogFilterRequest){ //System.out.println(jobLogFilterRequest); diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/controller/udplat/UdplatGoodsController.java b/api-admin/src/main/java/com/glxp/udidl/admin/controller/udplat/UdplatGoodsController.java new file mode 100644 index 0000000..02c6876 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/controller/udplat/UdplatGoodsController.java @@ -0,0 +1,30 @@ +package com.glxp.udidl.admin.controller.udplat; + +import com.glxp.udidl.admin.annotation.AuthRuleAnnotation; +import com.glxp.udidl.admin.service.udplat.UdplatGoodsService; +import com.glxp.udidl.common.res.BaseResponse; +import com.glxp.udidl.common.util.ResultVOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequestMapping("udplat/goods") +public class UdplatGoodsController { + @Autowired + private UdplatGoodsService udplatGoodsService; + + @AuthRuleAnnotation("udidl_udplatGoods_all") + @PostMapping("/inport") + public BaseResponse importExcel(MultipartFile file,int type){ + try + { + return udplatGoodsService.importExcel(file.getInputStream(),type); + }catch (Exception e){ + return ResultVOUtils.error(-1,e.getMessage()); + } + + } +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysMenuMapper.java b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysMenuMapper.java new file mode 100644 index 0000000..58f6cea --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysMenuMapper.java @@ -0,0 +1,19 @@ +package com.glxp.udidl.admin.dao.sys; + +import com.glxp.udidl.admin.entity.sys.SysMenu; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysMenuMapper { + int deleteByPrimaryKey(Integer id); + + int insert(SysMenu record); + + SysMenu selectByPrimaryKey(Integer id); + + List selectAll(); + + int updateByPrimaryKey(SysMenu record); +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMapper.java b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMapper.java new file mode 100644 index 0000000..9246358 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMapper.java @@ -0,0 +1,19 @@ +package com.glxp.udidl.admin.dao.sys; + +import com.glxp.udidl.admin.entity.sys.SysRole; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysRoleMapper { + int deleteByPrimaryKey(Integer id); + + int insert(SysRole record); + + SysRole selectByPrimaryKey(Integer id); + + List selectAll(); + + int updateByPrimaryKey(SysRole record); +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMenuMapper.java b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMenuMapper.java new file mode 100644 index 0000000..d25e827 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysRoleMenuMapper.java @@ -0,0 +1,13 @@ +package com.glxp.udidl.admin.dao.sys; + +import com.glxp.udidl.admin.entity.sys.SysRoleMenu; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysRoleMenuMapper { + int insert(SysRoleMenu record); + + List selectAll(); +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysUserMapper.java b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysUserMapper.java new file mode 100644 index 0000000..a85580b --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/dao/sys/SysUserMapper.java @@ -0,0 +1,21 @@ +package com.glxp.udidl.admin.dao.sys; + +import com.glxp.udidl.admin.entity.sys.SysUser; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SysUserMapper { + int deleteByPrimaryKey(Integer id); + + int insert(SysUser record); + + SysUser selectByPrimaryKey(Integer id); + + List selectAll(); + + int updateByPrimaryKey(SysUser record); + int hasAuthPerms(@Param("userKey") String user_key, @Param("perms" ) String perms); +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/dao/udplat/UdplatGoodsMapper.java b/api-admin/src/main/java/com/glxp/udidl/admin/dao/udplat/UdplatGoodsMapper.java new file mode 100644 index 0000000..abf125e --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/dao/udplat/UdplatGoodsMapper.java @@ -0,0 +1,19 @@ +package com.glxp.udidl.admin.dao.udplat; + +import com.glxp.udidl.admin.entity.udplat.UdplatGoods; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface UdplatGoodsMapper { + int deleteByPrimaryKey(Long id); + + int insert(UdplatGoods record); + + UdplatGoods selectByGoodId(String deliveryGoodId); + + List selectAll(); + + int update(UdplatGoods record); +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/DeliveryGoods.java b/api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/DeliveryGoods.java new file mode 100644 index 0000000..c134df0 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/DeliveryGoods.java @@ -0,0 +1,52 @@ +package com.glxp.udidl.admin.dto.udplat; + +import com.glxp.udidl.common.annotation.Excel; +import lombok.Data; +import java.util.Date; + +@Data +public class DeliveryGoods { + @Excel(name = "*采购平台产品ID") + private String deliveryGoodId;//配送目录ID/bigint + private String projectGoodsCode;//联采目录编码/varchar(50) + private String deliveryGoodsCode;//配送目录编码/varchar(50) + private long manufactureId;//平台生产企业ID/bigint(20) + private String manufactureName;//平台生产企业名称/varchar(50) + private long distributorId; //平台配送企业ID/bigint(20) + private String distributorName;//平台配送企业名称/varchar(50) + @Excel(name = "产品名称") + private String productName; //产品通用名/varchar(255) + private Integer compId; //组件id/bigint + @Excel(name = "型号") + private String model;//型号/varchar(1000) + @Excel(name = "规格") + private String spec;//规格/varchar(1000) + @Excel(name = "材质") + private String prodMaterial;//材质/varchar(255) + @Excel(name = "包材") + private String packMaterial;//包材/varchar(255) + @Excel(name = "注册证编号") + private String regNum;//注册证编号/varchar(255) + @Excel(name = "注册证名称") + private String regName;//注册证名称/varchar(255) + @Excel(name = "注册证有效期截止时间") + private String regValidTo;//注册证有效期截止时间/varchar(255) + private long unionProjectId;//联采项目ID/bigint(20) + private String unionProjectName;//采购项目名称/varchar(255) + private double salePrice;//价格/decimal(18,4) + private String priceUnitText;//价格单位/varchar(100) + private double topSalePrice;//最高销售限价,可能为空/decimal(18,4) + private double settlePayPrice;//医保支付标准,可能为空/varchar(255) + private Integer goodsSource;//数据来源/int(11)(取值:1.集中采购 2.耗材联采 3.医院HIS/医疗机构新增 4.备案采购 9. 阳光采购10. 新型冠状病毒相关检测试剂省级集中采购14. 限新冠病毒核酸快速检测采购使用) + @Excel(name = "*缺货状态",convertExp="1=有货,2=缺货") + private String stockStatus;//缺货状态(1有货、2缺货)/int + @Excel(name = "更新内容") + private String changedContent;//更新内容 + @Excel(name = "更新时间") + private Date changedTime;//更新时间 + private String proxyName;//申报企业名称/ varchar(50) + @Excel(name = "挂网状态") + private Integer onlineStatus;//挂网状态 1挂网2挂网状态为空 6 撤销申报 + @Excel(name = "医用耗材代码") + private String medicalCode;//医保编码 +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/HospitalGoods.java b/api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/HospitalGoods.java new file mode 100644 index 0000000..deee107 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/dto/udplat/HospitalGoods.java @@ -0,0 +1,53 @@ +package com.glxp.udidl.admin.dto.udplat; + +import com.glxp.udidl.common.annotation.Excel; +import lombok.Data; +import java.util.Date; + +@Data +public class HospitalGoods { + @Excel(name = "采购平台产品ID") + private String deliveryGoodId;//配送目录ID/bigint + private String projectGoodsCode;//联采目录编码/varchar(50) + private String deliveryGoodsCode;//配送目录编码/varchar(50) + private long manufactureId;//平台生产企业ID/bigint(20) + @Excel(name = "生产企业") + private String manufactureName;//平台生产企业名称/varchar(50) + private long distributorId; //平台配送企业ID/bigint(20) + @Excel(name = "配送企业") + private String distributorName;//平台配送企业名称/varchar(50) + @Excel(name = "产品名称") + private String productName; //产品通用名/varchar(255) + private Integer compId; //组件id/bigint + @Excel(name = "型号") + private String model;//型号/varchar(1000) + @Excel(name = "规格") + private String spec;//规格/varchar(1000) + @Excel(name = "材质") + private String prodMaterial;//材质/varchar(255) + private String packMaterial;//包材/varchar(255) + @Excel(name = "注册证编号") + private String regNum;//注册证编号/varchar(255) + @Excel(name = "注册证名称") + private String regName;//注册证名称/varchar(255) + @Excel(name = "注册证有效期截止时间") + private String regValidTo;//注册证有效期截止时间/varchar(255) + private long unionProjectId;//联采项目ID/bigint(20) + private String unionProjectName;//采购项目名称/varchar(255) + @Excel(name = "企业报价(元)") + private double salePrice;//价格/decimal(18,4) + @Excel(name = "价格单位") + private String priceUnitText;//价格单位/varchar(100) + private double topSalePrice;//最高销售限价,可能为空/decimal(18,4) + private double settlePayPrice;//医保支付标准,可能为空/varchar(255) + private Integer goodsSource;//数据来源/int(11)(取值:1.集中采购 2.耗材联采 3.医院HIS/医疗机构新增 4.备案采购 9. 阳光采购10. 新型冠状病毒相关检测试剂省级集中采购14. 限新冠病毒核酸快速检测采购使用) + private String stockStatus;//缺货状态(1有货、2缺货)/int + @Excel(name = "更新内容") + private String changedContent;//更新内容 + @Excel(name = "更新时间") + private Date changedTime;//更新时间 + private String proxyName;//申报企业名称/ varchar(50) + private Integer onlineStatus;//挂网状态 1挂网2挂网状态为空 6 撤销申报 + @Excel(name = "医用耗材代码") + private String medicalCode;//医保编码 +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysMenu.java b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysMenu.java new file mode 100644 index 0000000..fd5655a --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysMenu.java @@ -0,0 +1,102 @@ +package com.glxp.udidl.admin.entity.sys; + +import java.util.Date; + +/** + * + * + * @author hong + * @date 2022/01/17 + */ +public class SysMenu { + /** + * 编号 + */ + private Integer id; + + /** + * 菜单名称 + */ + private String name; + + /** + * 父菜单ID + */ + private Integer parentId; + + /** + * 菜单类型M: 目录, C: 菜单,F: 资源 + */ + private String type; + + /** + * 权限标识 + */ + private String perms; + + /** + * 状态(0启用 1禁用) + */ + private String status; + + /** + * 创建时间 + */ + private Date createTime; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public Integer getParentId() { + return parentId; + } + + public void setParentId(Integer parentId) { + this.parentId = parentId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms == null ? null : perms.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRole.java b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRole.java new file mode 100644 index 0000000..cf6f064 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRole.java @@ -0,0 +1,76 @@ +package com.glxp.udidl.admin.entity.sys; + +import java.util.Date; + +/** + * + * + * @author hong + * @date 2022/01/17 + */ +public class SysRole { + /** + * + */ + private Integer id; + + /** + * 角色名称 + */ + private String name; + + /** + * 角色代码 + */ + private String code; + + /** + * 状态0: 启用,1: 禁用 + */ + private String status; + + /** + * 创建时间 + */ + private Date createTime; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code == null ? null : code.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRoleMenu.java b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRoleMenu.java new file mode 100644 index 0000000..fe6beab --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysRoleMenu.java @@ -0,0 +1,35 @@ +package com.glxp.udidl.admin.entity.sys; + +/** + * + * + * @author hong + * @date 2022/01/17 + */ +public class SysRoleMenu { + /** + * + */ + private Integer roleId; + + /** + * + */ + private Integer menuId; + + public Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + public Integer getMenuId() { + return menuId; + } + + public void setMenuId(Integer menuId) { + this.menuId = menuId; + } +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysUser.java b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysUser.java new file mode 100644 index 0000000..1098d73 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/entity/sys/SysUser.java @@ -0,0 +1,102 @@ +package com.glxp.udidl.admin.entity.sys; + +import java.util.Date; + +/** + * + * + * @author hong + * @date 2022/01/17 + */ +public class SysUser { + /** + * 用户ID + */ + private Integer id; + + /** + * 用户key, 登录用 + */ + private String userKey; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 密码 + */ + private String password; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 角色ID + */ + private Integer roleId; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUserKey() { + return userKey; + } + + public void setUserKey(String userKey) { + this.userKey = userKey == null ? null : userKey.trim(); + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName == null ? null : userName.trim(); + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName == null ? null : nickName.trim(); + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password == null ? null : password.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } +} \ No newline at end of file diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/entity/udplat/UdplatGoods.java b/api-admin/src/main/java/com/glxp/udidl/admin/entity/udplat/UdplatGoods.java new file mode 100644 index 0000000..2d710a5 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/entity/udplat/UdplatGoods.java @@ -0,0 +1,42 @@ +package com.glxp.udidl.admin.entity.udplat; + +import lombok.Data; + +import java.util.Date; + +@Data +public class UdplatGoods { + private long id; + private String uuid; + private String deliveryGoodId;//配送目录ID/bigint + private String projectGoodsCode;//联采目录编码/varchar(50) + private String deliveryGoodsCode;//配送目录编码/varchar(50) + private long manufactureId;//平台生产企业ID/bigint(20) + private String manufactureName;//平台生产企业名称/varchar(50) + private long distributorId; //平台配送企业ID/bigint(20) + private String distributorName;//平台配送企业名称/varchar(50) + private String productName; //产品通用名/varchar(255) + private Integer compId; //组件id/bigint + private String model;//型号/varchar(1000) + private String spec;//规格/varchar(1000) + private String prodMaterial;//材质/varchar(255) + private String packMaterial;//包材/varchar(255) + private String regNum;//注册证编号/varchar(255) + private String regName;//注册证名称/varchar(255) + private String regValidTo;//注册证有效期截止时间/varchar(255) + private long unionProjectId;//联采项目ID/bigint(20) + private String unionProjectName;//采购项目名称/varchar(255) + private double salePrice;//价格/decimal(18,4) + private String priceUnitText;//价格单位/varchar(100) + private double topSalePrice;//最高销售限价,可能为空/decimal(18,4) + private double settlePayPrice;//医保支付标准,可能为空/varchar(255) + private Integer goodsSource;//数据来源/int(11)(取值:1.集中采购 2.耗材联采 3.医院HIS/医疗机构新增 4.备案采购 9. 阳光采购10. 新型冠状病毒相关检测试剂省级集中采购14. 限新冠病毒核酸快速检测采购使用) + private String stockStatus;//缺货状态(1有货、2缺货)/int + private String changedContent;//更新内容 + private Date changedTime;//更新时间 + private String proxyName;//申报企业名称/ varchar(50) + private Integer onlineStatus;//挂网状态 1挂网2挂网状态为空 6 撤销申报 + private String medicalCode;//医保编码 + private Date createTime;//创建时间 + private Date updateTime;//最后更新时间 +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/UdplatGoodsService.java b/api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/UdplatGoodsService.java new file mode 100644 index 0000000..ef75e03 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/UdplatGoodsService.java @@ -0,0 +1,15 @@ +package com.glxp.udidl.admin.service.udplat; + +import com.glxp.udidl.common.res.BaseResponse; + +import java.io.InputStream; + +public interface UdplatGoodsService { + /** + * excel导入 + * @param is + * @param type 1:院内的导入 2;配送目录 + * @return + */ + BaseResponse importExcel(InputStream is,int type) ; +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/impl/UdplatGoodsServiceImpl.java b/api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/impl/UdplatGoodsServiceImpl.java new file mode 100644 index 0000000..bbc01ce --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/service/udplat/impl/UdplatGoodsServiceImpl.java @@ -0,0 +1,74 @@ +package com.glxp.udidl.admin.service.udplat.impl; + +import com.glxp.udidl.admin.dao.udplat.UdplatGoodsMapper; +import com.glxp.udidl.admin.dto.udplat.DeliveryGoods; +import com.glxp.udidl.admin.dto.udplat.HospitalGoods; +import com.glxp.udidl.admin.entity.udplat.UdplatGoods; +import com.glxp.udidl.admin.service.udplat.UdplatGoodsService; +import com.glxp.udidl.admin.util.BeanUtils; +import com.glxp.udidl.common.res.BaseResponse; +import com.glxp.udidl.common.util.ExcelUtil; +import com.glxp.udidl.common.util.ResultVOUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.InputStream; +import java.util.List; + +@Service +@Slf4j +public class UdplatGoodsServiceImpl implements UdplatGoodsService { + @Autowired + private UdplatGoodsMapper udplatGoodsMapper; + @Override + public BaseResponse importExcel(InputStream is, int type) { + List list; + try{ + if(type == 1) { + List list1 = getData1(is); + list = BeanUtils.convertList2List(list1,UdplatGoods.class); + }else + if(type == 2){ + List list2 = getData2(is); + //log.info(JSONUtil.toJsonStr(list2)); + list = BeanUtils.convertList2List(list2,UdplatGoods.class); + }else + return ResultVOUtils.error(-1,"文件类型不匹配!"); + return save(list); + }catch (Exception e){ + return ResultVOUtils.error(-1,"转换格式出错:"+e.getMessage()); + } + + //return ResultVOUtils.success(); + } + private List getData1(InputStream is) throws Exception{ + ExcelUtil util = new ExcelUtil(HospitalGoods.class); + return util.importExcel(is); + } + private List getData2(InputStream is) throws Exception{ + ExcelUtil util = new ExcelUtil(DeliveryGoods.class); + return util.importExcel(is); + } + private BaseResponse save(List list){ + if(list == null || list.size()<1) + return ResultVOUtils.error(-1,"无数据!"); + //log.info("数据:"+JSONUtil.toJsonStr(list)); + int count=0; + for(UdplatGoods item:list){ + String goodId = item.getDeliveryGoodId(); + if(goodId == null || goodId.isEmpty()) + continue; + UdplatGoods goods = udplatGoodsMapper.selectByGoodId(goodId); + if(goods != null) + { + BeanUtils.copyProperties(item,goods); + udplatGoodsMapper.update(goods); + }else + item.setUuid(BeanUtils.getUUId()); + udplatGoodsMapper.insert(item); + count++; + } + return ResultVOUtils.success(count); + } +} diff --git a/api-admin/src/main/java/com/glxp/udidl/admin/util/BeanUtils.java b/api-admin/src/main/java/com/glxp/udidl/admin/util/BeanUtils.java new file mode 100644 index 0000000..4d54dd9 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/udidl/admin/util/BeanUtils.java @@ -0,0 +1,34 @@ +package com.glxp.udidl.admin.util; + +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class BeanUtils extends org.springframework.beans.BeanUtils{ + /** + * list复制 + * @param input + * @param clzz + * @param + * @param + * @return + */ + public static List convertList2List(List input, Class clzz){ + List output = new ArrayList<>(); + if(!CollectionUtils.isEmpty(input)){ + for(E source:input){ + T target = org.springframework.beans.BeanUtils.instantiate(clzz); + org.springframework.beans.BeanUtils.copyProperties(source,target); + output.add(target); + } + } + return output; + } + public static String getUUId() { + UUID uuid = UUID.randomUUID(); + return uuid.toString().replace("-", ""); + } + +} diff --git a/api-admin/src/main/resources/application-dev.properties b/api-admin/src/main/resources/application-dev.properties index 1c743ee..524e87d 100644 --- a/api-admin/src/main/resources/application-dev.properties +++ b/api-admin/src/main/resources/application-dev.properties @@ -14,4 +14,7 @@ cors.allowed-methods=GET,POST,OPTIONS #mips服务地址 UDIC_MIPSDOWNLOAD_URL = http://127.0.0.1:8080/UDIC_MIPSDL_Server #UDIC_MIPSDOWNLOAD_URL=http://127.0.0.1:9997 -config.downloadPath=E:/temp \ No newline at end of file +config.downloadPath=E:/temp +config.openAuth=true +spring.servlet.multipart.max-file-size=100MB +spring.servlet.multipart.max-request-size=1000MB \ No newline at end of file diff --git a/api-admin/src/main/resources/mybatis/mapper/sys/SysMenuMapper.xml b/api-admin/src/main/resources/mybatis/mapper/sys/SysMenuMapper.xml new file mode 100644 index 0000000..aef8dba --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/sys/SysMenuMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + delete from sys_menu + where id = #{id,jdbcType=INTEGER} + + + insert into sys_menu (id, name, parent_id, + type, perms, status, create_time + ) + values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{parentId,jdbcType=INTEGER}, + #{type,jdbcType=CHAR}, #{perms,jdbcType=VARCHAR}, #{status,jdbcType=CHAR}, #{createTime,jdbcType=TIMESTAMP} + ) + + + update sys_menu + set name = #{name,jdbcType=VARCHAR}, + parent_id = #{parentId,jdbcType=INTEGER}, + type = #{type,jdbcType=CHAR}, + perms = #{perms,jdbcType=VARCHAR}, + status = #{status,jdbcType=CHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=INTEGER} + + + + \ No newline at end of file diff --git a/api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMapper.xml b/api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMapper.xml new file mode 100644 index 0000000..2fdb3e0 --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + delete from sys_role + where id = #{id,jdbcType=INTEGER} + + + insert into sys_role (id, name, code, + status, create_time) + values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{code,jdbcType=VARCHAR}, + #{status,jdbcType=CHAR}, #{createTime,jdbcType=TIMESTAMP}) + + + update sys_role + set name = #{name,jdbcType=VARCHAR}, + code = #{code,jdbcType=VARCHAR}, + status = #{status,jdbcType=CHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=INTEGER} + + + + \ No newline at end of file diff --git a/api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMenuMapper.xml b/api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMenuMapper.xml new file mode 100644 index 0000000..a27b820 --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/sys/SysRoleMenuMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + insert into sys_role_menu (role_id, menu_id) + values (#{roleId,jdbcType=INTEGER}, #{menuId,jdbcType=INTEGER}) + + + \ No newline at end of file diff --git a/api-admin/src/main/resources/mybatis/mapper/sys/SysUserMapper.xml b/api-admin/src/main/resources/mybatis/mapper/sys/SysUserMapper.xml new file mode 100644 index 0000000..fb27911 --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/sys/SysUserMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + delete from sys_user + where id = #{id,jdbcType=INTEGER} + + + insert into sys_user (id, user_key, user_name, + nick_name, password, create_time, + role_id) + values (#{id,jdbcType=INTEGER}, #{userKey,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, + #{nickName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, + #{roleId,jdbcType=INTEGER}) + + + update sys_user + set user_key = #{userKey,jdbcType=VARCHAR}, + user_name = #{userName,jdbcType=VARCHAR}, + nick_name = #{nickName,jdbcType=VARCHAR}, + password = #{password,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + role_id = #{roleId,jdbcType=INTEGER} + where id = #{id,jdbcType=INTEGER} + + + + + \ No newline at end of file diff --git a/api-admin/src/main/resources/mybatis/mapper/udplat/UdplatGoodsMapper.xml b/api-admin/src/main/resources/mybatis/mapper/udplat/UdplatGoodsMapper.xml new file mode 100644 index 0000000..bdb7d9b --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/udplat/UdplatGoodsMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete from udplat_goods + where id = #{id,jdbcType=BIGINT} + + + insert into udplat_goods (id, uuid, deliveryGoodId, + projectGoodsCode, deliveryGoodsCode, manufactureId, + manufactureName, distributorId, distributorName, + productName, compId, model, + spec, prodMaterial, packMaterial, + regNum, regName, regValidTo, + unionProjectId, unionProjectName, salePrice, + priceUnitText, topSalePrice, settlePayPrice, + goodsSource, stockStatus, changedContent, + changedTime, proxyName, onlineStatus, + medicalCode, createTime + ) + values (#{id,jdbcType=BIGINT}, #{uuid,jdbcType=VARCHAR}, #{deliveryGoodId,jdbcType=VARCHAR}, + #{projectGoodsCode,jdbcType=VARCHAR}, #{deliveryGoodsCode,jdbcType=VARCHAR}, #{manufactureId,jdbcType=BIGINT}, + #{manufactureName,jdbcType=VARCHAR}, #{distributorId,jdbcType=BIGINT}, #{distributorName,jdbcType=VARCHAR}, + #{productName,jdbcType=VARCHAR}, #{compId,jdbcType=BIGINT}, #{model,jdbcType=VARCHAR}, + #{spec,jdbcType=VARCHAR}, #{prodMaterial,jdbcType=VARCHAR}, #{packMaterial,jdbcType=VARCHAR}, + #{regNum,jdbcType=VARCHAR}, #{regName,jdbcType=VARCHAR}, #{regValidTo,jdbcType=VARCHAR}, + #{unionProjectId,jdbcType=BIGINT}, #{unionProjectName,jdbcType=VARCHAR}, #{salePrice,jdbcType=DECIMAL}, + #{priceUnitText,jdbcType=VARCHAR}, #{topSalePrice,jdbcType=DECIMAL}, #{settlePayPrice,jdbcType=DECIMAL}, + #{goodsSource,jdbcType=INTEGER}, #{stockStatus,jdbcType=VARCHAR}, #{changedContent,jdbcType=VARCHAR}, + #{changedTime,jdbcType=TIMESTAMP}, #{proxyName,jdbcType=VARCHAR}, #{onlineStatus,jdbcType=INTEGER}, + #{medicalCode,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP} + ) + + + update udplat_goods + set uuid = #{uuid,jdbcType=VARCHAR}, + deliveryGoodId = #{deliveryGoodId,jdbcType=VARCHAR}, + projectGoodsCode = #{projectGoodsCode,jdbcType=VARCHAR}, + deliveryGoodsCode = #{deliveryGoodsCode,jdbcType=VARCHAR}, + manufactureId = #{manufactureId,jdbcType=BIGINT}, + manufactureName = #{manufactureName,jdbcType=VARCHAR}, + distributorId = #{distributorId,jdbcType=BIGINT}, + distributorName = #{distributorName,jdbcType=VARCHAR}, + productName = #{productName,jdbcType=VARCHAR}, + compId = #{compId,jdbcType=BIGINT}, + model = #{model,jdbcType=VARCHAR}, + spec = #{spec,jdbcType=VARCHAR}, + prodMaterial = #{prodMaterial,jdbcType=VARCHAR}, + packMaterial = #{packMaterial,jdbcType=VARCHAR}, + regNum = #{regNum,jdbcType=VARCHAR}, + regName = #{regName,jdbcType=VARCHAR}, + regValidTo = #{regValidTo,jdbcType=VARCHAR}, + unionProjectId = #{unionProjectId,jdbcType=BIGINT}, + unionProjectName = #{unionProjectName,jdbcType=VARCHAR}, + salePrice = #{salePrice,jdbcType=DECIMAL}, + priceUnitText = #{priceUnitText,jdbcType=VARCHAR}, + topSalePrice = #{topSalePrice,jdbcType=DECIMAL}, + settlePayPrice = #{settlePayPrice,jdbcType=DECIMAL}, + goodsSource = #{goodsSource,jdbcType=INTEGER}, + stockStatus = #{stockStatus,jdbcType=VARCHAR}, + changedContent = #{changedContent,jdbcType=VARCHAR}, + changedTime = #{changedTime,jdbcType=TIMESTAMP}, + proxyName = #{proxyName,jdbcType=VARCHAR}, + onlineStatus = #{onlineStatus,jdbcType=INTEGER}, + medicalCode = #{medicalCode,jdbcType=VARCHAR}, + createTime = #{createTime,jdbcType=TIMESTAMP}, + updateTime = #{updateTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + + + \ No newline at end of file diff --git a/api-admin/target/classes/application-dev.properties b/api-admin/target/classes/application-dev.properties index 1c743ee..524e87d 100644 --- a/api-admin/target/classes/application-dev.properties +++ b/api-admin/target/classes/application-dev.properties @@ -14,4 +14,7 @@ cors.allowed-methods=GET,POST,OPTIONS #mips服务地址 UDIC_MIPSDOWNLOAD_URL = http://127.0.0.1:8080/UDIC_MIPSDL_Server #UDIC_MIPSDOWNLOAD_URL=http://127.0.0.1:9997 -config.downloadPath=E:/temp \ No newline at end of file +config.downloadPath=E:/temp +config.openAuth=true +spring.servlet.multipart.max-file-size=100MB +spring.servlet.multipart.max-request-size=1000MB \ No newline at end of file diff --git a/api-admin/target/classes/com/glxp/udidl/admin/config/GlobalConfig.class b/api-admin/target/classes/com/glxp/udidl/admin/config/GlobalConfig.class index 749e1ba246b24b81af418ccba9b73705e5682e20..198bfe457d9eac9181271ee120cb8797bab337c1 100644 GIT binary patch literal 2115 zcma)7-%}e^6#j0qNtUpb5L=KIwJO$-09!3q+d!34T2X!#Dl_)UOR^-}Zgyj`Y3(@v zA^PH*yzrniHq7WuM_+Wtze%m%-CaTmai#;@bM86!oco>coV)z>?=Q~)%;B>%vRE8| zhMQ_xO5s+Ta#=06mG6$yK33XF3ZJBr#-ff-m0Z=arsTSg4J9{IxGP|ky~nQO$?~T3 zs{+~82lA0L9qCrgZNFi=m7>7-R?GG6nzds$?On%ObY0JvzU{e9fw@($Q8Al!b#$*G zYu010@zC70q}w$2WXbm$PfXbfFn6TWvY0aQNGSrNlV6uSch9cOcH{U)K=wOqETeeeH zES~R1o9kwC!N3-_*}mzEM`Ih9?va-%0}GgBw~zCN{UKkn&fzHw%=DX(Q$rI0;e1YT zF#gw#*ZF10@+%VK54iychr2<_QT~lJ@iHCc>$Kwn252OyTwi63Nhv53`9p}Gf|Rdu zO$J6C7pWWJ0bcqBcS2Fh^>i(-x(CMw#Gkn}z%j zNN5Lz-=TenMEs!e8??3Qd>e^iOC`BJ&E>i_^Ct$!wLdVj4`XIrYa?}ZLgxYfdljuI zw&Gn>hkcq0@9NaMiP@mN=TO9D_AbW0P2(Nf;w<|T-leAD3UiGjmD2ylnH1*!!DtHa z@mCiHqOxXLmZqLlRMs`}rpQmIdU`t-VhOoVbg(3dK#f|I@p3>EA7eBNhs>uj>_K})tW8jMgWuj02me!4ZBr=k={#@k4bkY5B-hPcU!*3ZmDF)M% zCYJet3&p@yXwNYQjSL9E>LJ8)(saC!32~Pu{%h(Sp^1CG{HTa67NMR}?pLHgKg3|x rXk$p#LXkZa>UtZ)*$nkIMtUDi_iM{V$YZ#{j4^x|JaF|YKLY*(lBAD> literal 1727 zcma)7+in|G6kTULV^5t)bD>E|aY-R5_!4KhghJz_(7GwAl$5GLk>H7Adty&Jo-yNb zONICcp7{X!l7}LJD}jXI1th)+DC^9OQpfQFl703*m%aB|Yj4Yc{rmH;05-6b$5~uC zgACr!;e$NwRkduYN}eN6KE$;f8?K3Lg1hAX|53)Df89y)Pe1 z+mn9V-j71pZ`TBt?hX9N?K%f;-)(r#b>9yn8M%Sq7ueVh!nWP-si%jb>^hHv@PXZM zq~Es>WitxG$F@8Uun(j+aG26~s2qXC)vud@f9ST?M{#^3klk{9H@YT}DV7cd^m@?Z z^O;@OckT?j4JZ6m5{d#GG^KYSLs#w7Lp|!a#8%#I23@=DebuuEEw|;_vek8cJ1J;? z>;(Zn=_i0{S@r}rb-e6S~bu_&C4xZh?|`a24P zfZ37#PNFMCzRePM@7>%vbEA5$t0__q zm^2)HO5p_2-jvhWTrvUe|%BrTvMve$F`mOynw-lpf$?RAby~u;bpGb_|U`>eJgo@3wVV)p(NmXGWbVm zPsf6%CI-KXWtLFEo3t8jwp{rM+T_xU$&0kKf|ZcE#5jY$qnIJPk*0h~Yw)UGDSr<` zKdStW%y%#{N0r}@*;^|Qp~qV~#+@}Tn|k$6OfBhuVD1U5>XJT0Hh!TWF-_)_6dOtU zV?1@NV3lGlU>%n!kH+0H-r$-+nf%|Rr=!SR3&`fozi~E)(mza>{a=I&tG{!L$g8&qiG~?x18qR3is&AP>XQJiV+Lpc@3s9J?bx7Zw ztvo@lIz;Y^?ZRZ*w%mEi=e$AhD)zeP_&o&?{HX)CfT(4Mo$I>`z_q7dRa6?w7O zgqk`Ie~RuFQ>ZB{`~vf{XE-yTA7V;@q?xz43^6@EU!%iWNTF$XmsvFaRjIL8L;N1_ EAF51HZvX%Q diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/device/ContactController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/device/ContactController.class index a6bcec3e5052e9083b78d99987492fd6dd14b0bd..36d3d0e3725b1381ac1a410b1e33ce9652b5f0a1 100644 GIT binary patch delta 656 zcmX|YQ{ zPl&zj6WZ@^fP)T)=nAo%!(onaRMYJclGJ0kBFDqTh>IjNCnWKt!(x(QQuJs}Ih4>T z;)&fWlorZZs^_#|pO{&P9KKLqs9)%e6gVp#3~0`225069D~2@Z6-(L@elip9aI5T9CsZ2T&&HKsDyqAdnw^|fM{jQf!D3<2qskql2%cOlb=6AcE z7yKyP6zHPgu?vP_Ml=@q|;TmI_>xOY|7^+#JxoNn?ZAD3s+wVs5e#(nP zvsrhbHI?%TbH!+Sm`n(S#!pBr>bk*WwX z=1;WBzF{@XSZQ??Yi$F~)Y#{)CCM84sAJH&qpY(xh%iCDEwG+XY~TwG%(F3=T{PWV vP61m`Y|XKa?E+n>96M;WpDKhZvs0TL?GhH)bqTPWb}nd#Ef2-k-v$2wB?gHT delta 553 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 diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/device/PosTaggerController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/device/PosTaggerController.class index e883bd091829d981fe46fa191156b14388f1b3da..2e9ae5fb951afa43bf76b6dd4ae7405a01b2643e 100644 GIT binary patch delta 2608 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 diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/device/ProductInfoController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/device/ProductInfoController.class index 97aa2f62d164d8b551918612dad9941c7748419d..26e98f9018d5b2d276ca6a9d7f6a6015c800cbd6 100644 GIT binary patch delta 590 zcmZ9}TS(Jk7{~GNQ;dixy6}XB(mK&qP$AKUm*F}fcAS~6atX%RWJ^nf7J-=^$oRL5 zEILdm?Br?$UCfm+F{%p-iVBjVQmBh|)%o)FT# zwx~AZCCnyTsbN2xIYKQbsUwb$>*^S08!xD51V3YJCrblgb?OH@Y$5@hOwbAlSqV*e zlkwtd=A?=Wo%D<{SE~?hPS9PE+euc=%v!XaJPt6Q4wi9Hx=y`thzN&i=P1YNBB7e% zgx-uXD#*bo=pwH4IETbQI zfh9@>yHB-~E@>ObEH8a;(UdU#!lZ?{EzBKZ286jQOh$|$VeSd@K$wTZ3=8u}n8(6A z5$35d&xCm{%u8WLgn1>*YwPBX_3+lN@Xl^AD$LkFkPOud9H(zq%Xn6c-DR$i$|{@7 zs;H0&8iui}28$?^mfSkRZfDRvwBVE4KI7&Kb2Wtufx>)O%TFEo#a@2XWpLWexjB3A NzpG+@uj-t$^bhTtqEY|= delta 591 zcmZ9}Nl4UT7{~GNgA5gsb+8T^ic=Pzg76R>ByTgepsgm?aIq-@CW?s zd?j@ue?!d%Z?HDxs|^JGBYLC2NsZ2rb-2PA5f3iBjG~ya%w+=en8*S$DPbC=%wQpf zEYexbGM2D{r36&fQO+hRXrhumEawPSoTQq|_;|=llC0ttHGII&0IT`Q8h#V7G}hV} z*4re4mQ9GVSX*YgrKMv|G^@xJ7Gk6GEz2`Ji4{*CvPcsdY-2jxnavL7vr~p<>e;1k zHwS1T%3gX^B{@hxZT#YpjpMN8aLi`XZiO7TQchSEowkKj*3470yGyx~$lm-9lQU?MZee=A>`Gc)m$bQ+{8FHRY Nx&7Y{txjy}tUnSUq1pfd diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/device/TestController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/device/TestController.class index 001bbb22508c73104cff755b0ffffafabc752e71..f79f61e8dcbecdaec973765a3bbcb0fc75788da9 100644 GIT binary patch delta 1502 zcmZvb*>eD|{-!2A}2%Hacljz|(9_u*EIAHNi7J&$7*dJm+rD z`-HrZpwsny(dQ*zHoW4~#dgDvo<$XS|^5a~?hn8LJHhg5+L$_hCrH6f% zUOu+eadz11kIn7p6OWSm`g+TLKDG4G?Ge{|Bz$H$K)>OjWq?B-X0W4wuyb$5@;UoF zJm2tz^QQm`?tQ$zYh#prZUa&gXKq7 zdg1I~M%iJ@PyF1wK3G*6W=1W@)oPSrIL%Qiia8JPn54K&&&iRdUp_&@wH~I)i(#6a z8m3KWMqV2oEiyAg@X!n-XTsA{m9Z zeWoy8xU&S+=A3T8$yY2jwcuvSp(1mLjJLT(U% z!*cLl1uPd`&J}7MXlpybnEGtsO0Lp6L#X*&Ryl`y60u`cnW?mR5$tlVmRjnm5hHLf zQuDxfG`B|?p>lqt}$&9U$wR=S}iVXs%1u2DEoAhh>#gj3~NEm5~H*2G<%AXnK k&x}5XWU9803B9CxBzogC$NW)-v1)pY-eRmS9`IY?UtMCr{%7EenWL84TA})v}YH5gyK$3fI4G!Yy$k5Dy(&DJ4=2BWW zGtDwfE3@2C+$~$IY+p>v$`&EpZL{*Jp5E`y0s{Vt=b7(2_ndRj`=0lF_v38mb3J`W z|J`>8Kos@giQ* z@Unskr>m^2)UCi;;BuE`dYn_YA0HGJeni77H66nbs}{}f99W%et5%SruaAh;Rbeg2 zQ4nUAuDD9O!|u$qmsUBZlxBu9O##cJAis0LbX%1zv(oEuX6D+wr8!NW^~9+3fsr1s z&Fz(81#Oxn5KJpAxBG)_TLL6Zw%$f-n?Kd%o@w)D+RDpaUYpn9DmM^EI%byU84+2k z!shjsy2}-qtNE8vSeRkAD-d?qta7KzW@oPs1$~WH7e>YC8BqzsuG_Gw?!er-6oYGX`LwhTjB! zN2S2+m?JP>E_Y&%KF`!A;+()A__OA)sjO8@R8Z`|$?mNesh8-rYC^OEOE5Od?$A@B zi+$aA2>==rq$adfsW=q$rX9ikD#J&CoA>}W*33ucoB24GWi-B7k090qfhjDREz;VNHX0)`@=yMkeSSw)^cxb<+K%x%XQ*qxc3bz*Nh z?5sa~lkav!7=7_5Kp`#g?D(sgnNx)8S#3DI62b2&rgZ~7(NOiphGB46$YT1a!6WPq}-it zNLrHongA_n-3Zoah2;i8m30tusp2cBDCB$BJDvRLc&6$um5i zhJqPz8Yg0PY_>r?+BkM4NMuW$NG^CNf#eXaWXxn6@{lK^obC9*BUQRVM@v(5F}(se zODM)mxU1Y#cEGwHvEz0lF0B^6chV-HBv+J6pSKW2y@I>G;`ABRdDK zU6bg3f7>=t=c8}o=)`PMByF1LDco3tBDUa0}q`mvx? zEt1NlQJIVeX8!AERwF$kL#!g%n4DHX4|W;SV=mqP+hHCpA205UKy_^jHUIxZ-9ae+ zcW92}GrG!b3bpVeQ1WvLbyd(}R||N(Eeu`VmoZ)bMOwS diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/device/UdiCompanyController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/device/UdiCompanyController.class index 0476885b6bac13cd3e3cc8dcb6f91736b931e85c..5ed69c621dcefd398026b74f4e282f7643adf753 100644 GIT binary patch delta 854 zcma))*-{fx5Qe|WkPI0PSR#u=T%bS&1w?THG^{QlDByyM8ls?pAwfgXxWxrU+;LoR zx%A$$xU)(gz#E@JeF=)P523iT%Bku;-F^Q4dzmv=@T)NKWB%JLP{k*kRdl4$Ntc%+ z9M#q_o8xrboZzGvAE(mj;k0(oX!mRy0eVvj+MMIOR(&@8T+r4pA`d~O584ZpOM#2>hvC)C9Sg5~YDO79V9t(zI z{RUaFzQMjwKy*`NcqAB(2ZEuHL6x)CmF;{t3ubr}w58<7GX0 zY@~=1XL&}zpNos_80?6$lU>^A!H7~#jr=VyMvfe{BD=Ngl6&nS=N|l+&TM+A^D`qq zyg$)K?!A)OOYbnG_VCzFrefv8EJGnGgg$=Nvup{jmSS*YLb*@ z{7z`ubfQ|y)krx%YpIio>g8cIN~B42GwmFpn-+R$l{avZC~bm4qLvgl7u$e18)Osu ziwjG#-S}d=?QCAebyLV*_K_lddF&S!cVc0NQVAvL8ih2Opsi#=%ThwCOukKu*qC{~ fIaXTIQkD3!&i@#@O?KBVXcvbTw&RgCn1|snwd{vN delta 772 zcmaixTXTz16o#KKr=5J+i5b%oDMG_Y(b6g{+GtC)K~w4!RHa2JTBmA>Qyog3RX&Gu zawiq1Z00hkIBio# zmkG|;oMp&_!*cjJr#P>;@NqKkcJivyNq9m&?^yrP=)lZcPt%(So6e?J=Hwp zx#k5^nwO>|=1loweodUb#VW_r5$Bh$ETVCErFd=X-)P=4t$9a&=7Yc6Yek*!p}x>k z0xToSayb)DHk_>sW3gVWz6WcB1~$l=16cFq+9Tz@@>%99k@Mea TcgWs$N|TGu!Y+I=eHwlP!m?&#T45Dfkf*iVB=koOIv|j1p%wI^*UAS;Ec8~bb6U_&BBfA z*|Fe17@amr&nJJ19epgHsjZVjL4Y%!dZk0T@Rr74C^nXU(;|3ps|k@AP}iZ!R-NenGZt)F$ju|a4#r4!XlYqo(aqn`~%crO-}#- delta 355 zcmWlVNiRcT6o#MMs;|Ai2-VWW7*RqZQFG1nTxzbCQe0Dr)U+>atGkmBR$?hOO@kj` z*FRuY!;W7dZgXGs2{uZ}ri^^bjj5m(H*Hknql#Io2~ndbZBchN3U$VMLMX@7W1_+EXfjMX Kjm$Ji6Z`{xjz>2D diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/device/UdiDownloadController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/device/UdiDownloadController.class index d7dd2cb3d7d40e5da162f00098d69fec2cb592ff..66c30b33ba8831b8dd396055d232296536c550c2 100644 GIT binary patch delta 720 zcmajb%TE(g6vy%Jokk`zy@P@&)_@X>5AZ>2DG23drGi35i%&!?10{iE(k^Iq>B_(0 z?n(F)3=0z%>_~|6HxbXBg*)hCe&?J!H=o>`lfL6?l|QGy4}m;2pNq^SndPxZktepB z^C|JvXPyO*PM#%s&Y~TcY*)7N!p5?VmoBedDnBcK9dkpaiebIpXok(5MmV<4d}n|*IR z=*6Rtt6b+M{if5e7OvoM2gTqnL)^8^8fuq&+?Qo}s2(W~~!u*p|%+n=`+X=^!I?R_L72BQZU49-VJXkH++#P6rc07lfV? ydOD`Z&Z8f-rN?9XN01KYgf0m^FZ4o8PguHq#-0mpXopGJwj(d?mf9hEpN4-!-(_|H delta 596 zcmajbIZpyX6bJDCE|JYHvnV8*pb%pu;svsDDkyS!ta#w9hzllmc0|9()VB79&cafS z8cRQdwUwpu4V{K$i}}CzGLv6+-*e#2Uw!$xe*h52xrSb3U0A@PiX4_im)B50Q9}u3 z6>coMu!2=Fu8GbRu`Z$_Vne~Ef~~vitIS)DgtO|vkb z0EY^W7>;qGpvG{DIzt~k3eFgYU@(xRjp9nI*X&Dv@){=rN=MOvD)dD1c+E#5^-*lJ1ssGEA8 hv;t`*(#jnzCA8w-y`^n58FREfnZC(O)k%BI0KY;>N#Xzi diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/info/CompanyController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/info/CompanyController.class index 63b183b19ada9ab119bb03d3eb92269e202a26b1..e30052ec33b908cdc529b8236b276b9ed6a0b4f0 100644 GIT binary patch delta 358 zcmY+Aze_@K6vfYds9$?N%L=lHEVW^Y?hk#vJ(k`6@lbaqDr<^Laa)CDOJ~tWwl%=>fy9e&L0_CF5R}01p9@m8973? zku7Ak%xUrLT-7f#s-`i(e3U}w54me@>5bwk1#4Ir*iewhrofhhZR`+wtmleVzp-9# zKPwMbz43L|P_TqJ$ z!OtpypcxeryPv}c&Ajj*j$(}0$N49AVg{H5{3A@X36lu%P!JnaEF?^~>P+j#!R{>Z E2lz-uL;wH) delta 257 zcmX|*xlY4S5Jk^C#eT*y4iX{(B#0CCH3q`su&*iU(om&HM~C1S((}H90;NNUii(Pk zzd=k~P~4e2M>CrHGWK1{zJA|6fF|vbBI_fBY!um~5t6bMvdvCFb2#h{@m|2b<-n4? zX3rumS2daMJ$3INdxMVol=5N35yzI3h*Qoi=MfiNy0lOUuDFg!xEb6Q`bJ9b$M1}m z^q SSy8a8#;}st)qK@gx(0u6dm!il diff --git a/api-admin/target/classes/com/glxp/udidl/admin/controller/info/JobLogController.class b/api-admin/target/classes/com/glxp/udidl/admin/controller/info/JobLogController.class index 9b62d224d458d2821048aadc1605da4536ee8099..6d3d08e0627c88b554c60e5dc32df5059d9960a3 100644 GIT binary patch delta 213 zcmcb>xtL4-)W2Q(7#J8#7&N&USQ(T!8CV#UxfxU#RM{ES*csF}%0FggG?~OGW|^3m zmtT@tl9`{U?^s%r5mcI!>IfIIW@KP3OUx-vWn>U2P038jiO2vFNyqGcYlTF)%WS7c)pONP-yA n42;DLQVh~S=dm*a1!RB>CI(qBDaXJ8q=kTdc_6I-SFQ*EQhO-( delta 145 zcmZ3?b%9g<)W2Q(7#J8#7}U8KSQ!*J8CVz;xfzrgl-U_n*cnte%0FggG@aNeI{7@4 z$mBXEe%7+YoYK_IT})z(jB1k?GM{GTo1Dwy#3(X(1B;Fw9|I$U7!Zp`GcXo2NH9nO fjb>*A3P=GNObpUsQig#8NDBe^vOro6u3R1fnd%p$ diff --git a/api-admin/target/classes/com/glxp/udidl/admin/res/udid/DataSetResult$ClinicalInfo.class b/api-admin/target/classes/com/glxp/udidl/admin/res/udid/DataSetResult$ClinicalInfo.class index e9066d131f785747cd9f96ebe08f8e6305e0ff35..74b95fcd5c38c0622e9b4e8db15ce21eb89a2e41 100644 GIT binary patch literal 3445 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 a^OG?Z_Be)FHAZtBf3Um!%3+bcP5c8AQ2?$0 diff --git a/api-admin/target/classes/com/glxp/udidl/admin/res/udid/DataSetResult$DeviceInfo.class b/api-admin/target/classes/com/glxp/udidl/admin/res/udid/DataSetResult$DeviceInfo.class index c38c28acdcda39dac6cac2ac42c8ed3cac1b3975..54dbd3327fa80bc8d1c07005e57dfd7db54305ec 100644 GIT binary patch delta 157 zcmezPl=1je#tny<_ykf?%QBNwJu-_+@{1}rUt>yR78FiTEpb5+4rX%$3KydbZ{Xa) ztRq^Iky)&QVvKicB_o4aeo01Z5vs)I1-z|n{DNqLRw7qe7_}zzOR8;N@Et6OiwLw!6NC-<_453 z#x6OJa|g49bV){Lu?iN0y;Cb08D#QHGE$4MNpEiAZDkV`$0{Wza)pJ_VDf7TH8!Xt J1tqsd0svJ+OKboD diff --git a/api-admin/target/classes/com/glxp/udidl/admin/res/udid/DataSetResult$PackingInfo.class b/api-admin/target/classes/com/glxp/udidl/admin/res/udid/DataSetResult$PackingInfo.class index 1515a85df8e9bc75e2c5e9993ff35412d78a0ea8..2c25a04d0fdf8d40aee33344d4c501f55700279a 100644 GIT binary patch literal 3999 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 delta 6028 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 WWHLd2#WGPQMd?ntD@ymt{r?Ad&d~q> diff --git a/api-common/pom.xml b/api-common/pom.xml index b234626..461fffd 100644 --- a/api-common/pom.xml +++ b/api-common/pom.xml @@ -23,7 +23,16 @@ org.apache.commons commons-lang3 - + + org.apache.poi + poi-ooxml + 4.1.0 + + + cn.hutool + hutool-all + 5.5.1 + \ No newline at end of file diff --git a/api-common/src/main/java/com/glxp/udidl/common/annotation/Excel.java b/api-common/src/main/java/com/glxp/udidl/common/annotation/Excel.java new file mode 100644 index 0000000..8d7731d --- /dev/null +++ b/api-common/src/main/java/com/glxp/udidl/common/annotation/Excel.java @@ -0,0 +1,101 @@ +package com.glxp.udidl.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel { + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String convertExp() default ""; + + /** + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出时在excel中每个列的高度 单位为字符 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽 单位为字符 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } + + public enum ColumnType { + NUMERIC(0), STRING(1); + private final int value; + + ColumnType(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } +} diff --git a/api-common/src/main/java/com/glxp/udidl/common/util/DateUtils.java b/api-common/src/main/java/com/glxp/udidl/common/util/DateUtils.java new file mode 100644 index 0000000..017ee28 --- /dev/null +++ b/api-common/src/main/java/com/glxp/udidl/common/util/DateUtils.java @@ -0,0 +1,15 @@ +package com.glxp.udidl.common.util; + +import java.util.Date; + +public class DateUtils extends cn.hutool.core.date.DateUtil{ + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + return parse(str.toString()); + } +} \ No newline at end of file diff --git a/api-common/src/main/java/com/glxp/udidl/common/util/ExcelUtil.java b/api-common/src/main/java/com/glxp/udidl/common/util/ExcelUtil.java new file mode 100644 index 0000000..acfaa9a --- /dev/null +++ b/api-common/src/main/java/com/glxp/udidl/common/util/ExcelUtil.java @@ -0,0 +1,234 @@ +package com.glxp.udidl.common.util; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.glxp.udidl.common.annotation.Excel; +import com.glxp.udidl.common.annotation.Excel.Type; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.*; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.*; + +//@Slf4j +public class ExcelUtil { + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 实体对象 + */ + public Class clazz; + + public ExcelUtil(Class clazz) { + this.clazz = clazz; + } + public List importExcel(InputStream is) throws Exception { + return importExcel("", is); + } + public List importExcel(String sheetName, InputStream is) throws Exception { + this.type = Excel.Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + Sheet sheet = null; + if (!sheetName.isEmpty()) { + // 如果指定sheet名,则取指定sheet中的内容. + sheet = wb.getSheet(sheetName); + } else { + // 如果传入的sheet名不存在则默认指向第1个sheet. + sheet = wb.getSheetAt(0); + } + + if (sheet == null) { + throw new IOException("文件sheet不存在"); + } + + int rows = sheet.getPhysicalNumberOfRows(); + + if (rows > 0) { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(0); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { + Cell cell = heard.getCell(i); + if (!StrUtil.isEmptyIfStr(cell)) { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } else { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + Field[] allFields = clazz.getDeclaredFields(); + // 定义一个map用于存放列的序号和field. + Map fieldsMap = new HashMap(); + for (int col = 0; col < allFields.length; col++) { + Field field = allFields[col]; + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { + // 设置类的私有字段属性可访问. + field.setAccessible(true); + Integer column = cellMap.get(attr.name()); + fieldsMap.put(column, field); + } + } + for (int i = 1; i < rows; i++) { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = fieldsMap.get(entry.getKey()); + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) { + String s = Convert.toStr(val); + if (StrUtil.endWith(s, ".0")) { + val = StrUtil.subBefore(s, ".0", true); + } else { + val = Convert.toStr(val); + } + } else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) { + val = Convert.toInt(val); + } else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) { + val = Convert.toLong(val); + } else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) { + val = Convert.toDouble(val); + } else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) { + val = Convert.toFloat(val); + } else if (BigDecimal.class == fieldType) { + val = Convert.toBigDecimal(val); + } else if (Date.class == fieldType) { + if (val instanceof String) { + val = DateUtils.parseDate(val); + } else if (val instanceof Double) { + val = DateUtil.getJavaDate((Double) val); + } + } + if (!StrUtil.isEmptyIfStr(fieldType)) { + Excel attr = field.getAnnotation(Excel.class); + String propertyName = field.getName(); + if (StrUtil.isNotEmpty(attr.targetAttr())) { + propertyName = field.getName() + "." + attr.targetAttr(); + } else if (StrUtil.isNotEmpty(attr.convertExp())) { + val = reverseByExp(String.valueOf(val), attr.convertExp()); + } + ReflectUtil.setFieldValue(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) { + if (row == null) { + return row; + } + Object val = ""; + try { + Cell cell = row.getCell(column); + if (cell != null) { + if (cell.getCellTypeEnum() == CellType.NUMERIC || cell.getCellTypeEnum() == CellType.FORMULA) { + val = cell.getNumericCellValue(); + if (HSSFDateUtil.isCellDateFormatted(cell)) { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } else { + if ((Double) val % 1 > 0) { + val = new DecimalFormat("0.00").format(val); + } else { + val = new DecimalFormat("0").format(val); + } + } + } else if (cell.getCellTypeEnum() == CellType.STRING) { + val = cell.getStringCellValue(); + } else if (cell.getCellTypeEnum() == CellType.BOOLEAN) { + val = cell.getBooleanCellValue(); + } else if (cell.getCellTypeEnum() == CellType.ERROR) { + val = cell.getErrorCellValue(); + } + + } + } catch (Exception e) { + return val; + } + return val; + } + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @return 解析后值 + * @throws Exception + */ + public static String reverseByExp(String propertyValue, String converterExp) throws Exception { + try { + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } catch (Exception e) { + throw e; + } + return propertyValue; + } + +}