1、获取字典值方法
(1)声明sysDictFeign类
调用getDictsByGroupCode
方法得到map对象作为函数输入。groupCode为字典项编码
public Map<String, String> getDictMap(Map<String, List<SysGlobalDictItemDTO>> map, String groupCode) {
Map<String, String> resultMap = new HashMap<>();
map.get(groupCode).forEach(item -> {
resultMap.put(item.getItemValue(), item.getItemName());
});
return resultMap;
2、日期格式
private String getDate(Instant time) {
if(time == null) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(Date.from(time));
}
3、获取地址组件值
1、将数据库中存放的值分割
2、声明sysRegionFeign接口调用regionMap()方法取值。依次对应省/市/区
public String getRegionName(String regionCode) {
if(StringUtils.isEmpty(regionCode)) {
return "";
}
String[] codeArr = regionCode.split(",");
StringBuilder regionName = new StringBuilder();
Map<String, String> map = sysRegionFeign.regionMap();
if(CollectionUtils.isEmpty(map)) {
return "";
}
for(String code : codeArr) {
if(StringUtils.isEmpty(code)) {
continue;
}
regionName.append(map.get(code)).append("/");
}
String name = regionName.toString();
return name.substring(0, name.length()-1);
4、获取日志
1、在字段值添加注释
@LogTag(alias = "车辆类型(成车、底盘)",builtinType = BuiltinTypeHandler.DICT, dictGroupCode = "carCategory")
public List<Map<String, Object>> getLog(Long id){
OperationForm operationForm = new OperationForm();
operationForm.setObjectId(String.valueOf(id));
Map<String, Object> map = logClient.queryLog(operationForm);
List<Map<String,Object>> list = (List<Map<String, Object>>) map.get("respData");
return list;
}
if (update){
logClient.logObject(
String.valueOf(oldgasStationInfoBo.getId()),
SecurityContextUtil.getCurrentUserName(),
"update",
"Update a gasStationInfoBo",
null,
null,
oldgasStationInfoBo,
gasStationInfoBo);
}
5、生成账号
//生成加油站账号
private SysUserDTO saveGasAccount(GasStationInfoBo gasStationInfoBo) {
SysEmployeeDTO sysGasUserDTO = new SysEmployeeDTO();
sysGasUserDTO.setUserInfoId(String.valueOf(gasStationInfoBo.getId()));
sysGasUserDTO.setDealerCode(gasStationInfoBo.getGasStationCode());
sysGasUserDTO.setUserInfoName(gasStationInfoBo.getGasStationName());
sysGasUserDTO.setEmployeeNo(gasStationInfoBo.getGasStationCode());
sysGasUserDTO.setIsOnjob(1);
sysGasUserDTO.setGender(1);
sysGasUserDTO.setTenantId(SecurityContextUtil.getCurrentTenantId());
return externalInterfaceFeign.addSysEmployee(sysGasUserDTO);
}
6、字符串转对象列表
List<AuthorizedLiftYearDTO> dtos = JSONObject.parseArray(authorizedLiftYearDTO, AuthorizedLiftYearDTO.class);
7、导入数据
String intekeyUrl = NacosGlobalConfiguration.getByKey("intekey-url");
String appCode = NacosGlobalConfiguration.getByKey("intekey-appCode");
String secretKey = NacosGlobalConfiguration.getByKey("intekey-secretKey");
InputStream inputStream = IntekeyUtils.DecryptFile(intekeyUrl, appCode, secretKey, file);
List<RefitParamTypeDTO> importList = easyExcel.importExcel(inputStream, 0, 1, false, RefitParamTypeDTO.class);
8、查询附件
public Map<String, List<FileUploadInfoDto>> queryAttachment(Long id) {
List<FileUploadInfoDto> fileUploadInfoDtoList = fileCommonFeign.getFileListByBillId(String.valueOf(id), null);
if (fileUploadInfoDtoList != null && fileUploadInfoDtoList.size() > 0) {
return fileUploadInfoDtoList.stream().collect(Collectors.groupingBy(FileUploadInfoDto::getBillType));
} else {
return null;
}
}
9、日志
//通用查询日志方法
public Map<String, Object> queryShippingLog(Long shippingId, String objectName, String operationName, String operationAlias) {
OperationForm operationForm = new OperationForm();
if (StringUtils.isNotBlank(objectName)) {
operationForm.setObjectName(objectName);
}
if (StringUtils.isNotBlank(operationName)) {
operationForm.setOperationAlias(operationName);
}
if (StringUtils.isNotBlank(operationAlias)) {
operationForm.setOperationAlias(operationAlias);
}
operationForm.setObjectId(String.valueOf(shippingId));
Map<String, Object> map = logClient.queryLog(operationForm);
if (map == null) {
map = new HashMap<>();
}
return map;
}
//通用添加日志方法
public void addShippingLog(String operationName, String operationAlias, String extraWords, String comment,
LoShippingBO oldLoShippingBO, LoShippingBO newLoShippingBO) {
log.info("----------添加日志------------");
//如果没有传objectName,默认取变更对象的类名
//如果变更的字段是字典类型,那么旧值与新值不能一个有值,一个为null
//如果变更的字段不是字典类型,旧值或新值没有限制
logClient.logObject(
oldLoShippingBO.getId().toString(),
SecurityContextUtil.getCurrentUserName(),
operationName,
operationAlias,
extraWords,
comment,
oldLoShippingBO,
newLoShippingBO);
}
//通用添加没有属性变化的日志方法
public void addNoAttributeChangeShippingLog(String objectName, Long businessId, String operationName,
String operationAlias, String extraWords, String comment) {
log.info("-------添加没有属性变化的日志------");
//记录没有属性变化的日志
logClient.logAttributes(
objectName,
businessId.toString(),
SecurityContextUtil.getCurrentUser().getUsername(),
operationName,
operationAlias,
extraWords,
comment,
null);
}
10、**/对BigDecimal类型求和 BigDecimal **
allSinglePrice = shippingList.stream().map(item -> {
if(item.getSinglePrice() == null)
{ return new BigDecimal("0"); }
else{
return item.getSinglePrice();
}
}).reduce(BigDecimal.ZERO, BigDecimal::add);
11、Excel模板下载
public void downLoad(HttpServletResponse response) {
String fileName = null;
try {
fileName = URLEncoder.encode("改装产品导入.xlsx", "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setHeader("Content-Disposition", "attachment; filename* = UTF-8''" + fileName);
byte[] buffs = new byte[1024];
try (InputStream in = ResourceUtil.asStream("templates/refitProductTemplate.xlsx");
BufferedInputStream bis = new BufferedInputStream(in);
OutputStream os = response.getOutputStream()) {
int i = bis.read(buffs);
while (i != -1) {
os.write(buffs, 0, i);
i = bis.read(buffs);
}
os.flush();
} catch (IOException e) {
log.error("改装产品导入模板下载:", e);
}
}
12、Excel导入
public String importProduct(MultipartFile file){
String intekeyUrl = NacosGlobalConfiguration.getByKey("intekey-url");
String appCode = NacosGlobalConfiguration.getByKey("intekey-appCode");
String secretKey = NacosGlobalConfiguration.getByKey("intekey-secretKey");
InputStream inputStream = IntekeyUtils.DecryptFile(intekeyUrl, appCode, secretKey, file);
try {
List<RefitProductDTO> importList = easyExcel.importExcel(inputStream, 0, 1, false, RefitProductDTO.class);
importList.remove(importList.size()-1); //总会读取额外一行空行,因此删除
if(CollectionUtils.isEmpty(importList)) {
throw new BaseException(ErrorEnum.SYSTEM_ERROR,"导入信息为空或导入信息不符");
}
return applicationService.importProduct(RefitProductAssembler.toBOS(importList));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
13、集合按照字段值生成Map
List<FiReceiptContractDTO> contractList = fiReceiptDto.getContractList();
Map<String, List<FiReceiptContractDTO>> map = contractList.stream().collect(Collectors.groupingBy(FiReceiptContractDTO::getContractCode));
14、通过String的trim()方法只能去掉字符串两端的空格字符,但是对于\t \n等其它空白字符确不能去掉,因此需通过正则表达式,将其中匹配到的空白字符去掉
protected String replaceBlank(String str){
String dest = null;
if(str == null){
return dest;
}else{
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(str);
dest = m.replaceAll("");
return dest;
}
}
14、许可证OCR识别
@ApiOperation("许可证OCR识别")
@PostMapping("/exportPermitOCR")
public OutPermitDTO exportPermitOCR(MultipartFile file, HttpServletResponse response) throws IOException {
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentLength(file.getSize());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
String intekeyUrl = NacosGlobalConfiguration.getByKey("intekey-url");
String appCode = NacosGlobalConfiguration.getByKey("intekey-appCode");
String secretKey = NacosGlobalConfiguration.getByKey("intekey-secretKey");
InputStream inputStream = IntekeyUtils.DecryptFile(intekeyUrl, appCode, secretKey, file);
byte[] bytes = new byte[1024];
int temp;
while ((temp = inputStream.read(bytes)) != -1) {
byteArrayOutputStream.write(bytes, 0, temp);
}
byte[] by = byteArrayOutputStream.toByteArray();
HttpEntity<byte[]> httpEntity = new HttpEntity<>(by, headers);
ResponseEntity<String> data = restTemplate.postForEntity(baseOcrUrl, httpEntity, String.class);
JSONObject weChatResult = JSONObject.parseObject(data.getBody());
JSONObject details = weChatResult.getJSONObject("result").getJSONObject("details");
OutPermitDTO outPermitDTO = new OutPermitDTO();
//出口许可证号 export_licence_no
outPermitDTO.setExitPermitNo(details.getJSONObject("export_licence_no").getString("value"));
//出口许可证有效截至日期 export_licence_expiry_date
String export_licence_expiry_date = details.getJSONObject("export_licence_expiry_date").getString("value");
String replacedString = export_licence_expiry_date.replace("年", "-").replace("月", "-").replace("日", "");
DateTime datetime = DateUtil.parse(replacedString);
outPermitDTO.setPermitEffectiveDate(datetime.toInstant());
//进口国
outPermitDTO.setImportingCountry(details.getJSONObject("country/region_of_purchase").getString("value"));
//合同号.
outPermitDTO.setContractCode(details.getJSONObject("contract_no").getString("value"));
//运输方式.
outPermitDTO.setTransportType(details.getJSONObject("mode_of_transport").getString("value"));
//商品编码.
outPermitDTO.setCommodityCode(details.getJSONObject("code_of_goods").getString("value"));
//备注.
outPermitDTO.setRemark(details.getJSONObject("supplementary_details").getString("value"));
//
JSONArray jsonArray = details.getJSONArray("table_list");
List<OutPermitDetailDTO> outPermitDetailDTOS = new ArrayList<>();
for (int i = 0; i < jsonArray.size(); i++) {
OutPermitDetailDTO outPermitDetailDTO = new OutPermitDetailDTO();
JSONObject j = jsonArray.getJSONObject(i);
outPermitDetailDTO.setQuantity(j.getJSONObject("quantity").getIntValue("value"));
outPermitDetailDTO.setSpecification(j.getJSONObject("specification").getString("value"));
outPermitDetailDTOS.add(outPermitDetailDTO);
}
outPermitDTO.setPermitDetailList(outPermitDetailDTOS);
return outPermitDTO;
}catch (Exception e){
throw new BaseException(ErrorEnum.SYSTEM_ERROR, "许可证OCR识别失败!");
}
}
14、动态Excel表头、列值不统一导出
public void dynamicExportExcel(@RequestParam("id") Long id,HttpServletResponse response) {
long startTime = System.currentTimeMillis();
try (ServletOutputStream outputStream = response.getOutputStream()) {
LoCarriageSettlementBo bo = domainService.get(id);
List<LoDeliverySettlementBo> loDeliverySettlementBos = bo.getDeliveryList();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("测试." + ExcelTypeEnum.XLSX.getValue(), "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
// response.setCharacterEncoding("UTF-8");
// response.setHeader("content-Type", "application/vnd.ms-excel");
// response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("测试." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));
List<List<Object>> dataList = ListUtils.newArrayList();
for (int i = 0; i < loDeliverySettlementBos.size(); i++) {
List<Object> data = ListUtils.newArrayList();
data.add(i);//序号
data.add(loDeliverySettlementBos.get(i).getShippingNo());//备车单号
if(loDeliverySettlementBos.get(i).getDriveForm() != null){
SysGlobalDictItemDTO drivingForm = sysDictFeign.getDictByGroupCodeAndCode("drivingForm", loDeliverySettlementBos.get(i).getDriveForm());
data.add(drivingForm.getItemName());//驱动形式
}else {
data.add("无");
}
if(loDeliverySettlementBos.get(i).getFuelType() != null){
SysGlobalDictItemDTO fuelType = sysDictFeign.getDictByGroupCodeAndCode("fuelType", loDeliverySettlementBos.get(i).getFuelType());
data.add(fuelType.getItemName()); //燃料种类
}else {
data.add("无");
}
if(loDeliverySettlementBos.get(i).getFuelGrade() != null){
SysGlobalDictItemDTO fuelGrade = sysDictFeign.getDictByGroupCodeAndCode("fuleCode", loDeliverySettlementBos.get(i).getFuelGrade());
data.add(fuelGrade.getItemName()); //燃料标号
}else {
data.add("无");
}
if(loDeliverySettlementBos.get(i).getVehicleType() != null){
SysGlobalDictItemDTO vehicleType = sysDictFeign.getDictByGroupCodeAndCode("vehicleOrChassis", loDeliverySettlementBos.get(i).getVehicleType());
data.add(vehicleType.getItemName()); //车辆分类
}else {
data.add("无");
}
data.add(loDeliverySettlementBos.get(i).getTransportPrice());//单价
data.add(loDeliverySettlementBos.get(i).getStartCity());//起点
data.add(loDeliverySettlementBos.get(i).getEndCity());//终点
data.add(loDeliverySettlementBos.get(i).getMileage());//里程
String formatPattern = "yyyy-MM-dd";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern).withZone(ZoneId.systemDefault());
String d = formatter.format(loDeliverySettlementBos.get(i).getDeliveryMakeTime());
data.add(d);
ExpenseItemBO expenseItemBO = new ExpenseItemBO();
List<ExpenseItemBO> expenseItemBOS = expenseItemDomainService.list(expenseItemBO);
LoDeliverySettlementDetailBo loDeliverySettlementDetailBo = new LoDeliverySettlementDetailBo();
loDeliverySettlementDetailBo.setDeliveryId(loDeliverySettlementBos.get(i).getDeliveryId());
List<LoDeliverySettlementDetailBo> loDeliverySettlementDetailBos = loDeliverySettlementDetailDomainService.selectList(loDeliverySettlementDetailBo);
List<Object> item = ListUtils.newArrayList(Arrays.asList(new Integer[expenseItemBOS.size()]));
System.out.println(item.size());
for(int j = 0; j < expenseItemBOS.size(); j++){
if(CollectionUtils.isEmpty(loDeliverySettlementDetailBos)){
item.set(j,0);
}else{
for(int k = 0; k < loDeliverySettlementDetailBos.size(); k++){
if(expenseItemBOS.get(j).getExpenseItemId().equals(loDeliverySettlementDetailBos.get(k).getExpenseItemId())){
item.set(j,loDeliverySettlementDetailBos.get(k).getPrice());
break ;
}
else {
item.set(j,0);
}
}
}
}
data.addAll(item);
data.add(loDeliverySettlementBos.get(i).getSettlementPrice());//总价
dataList.add(data);
}
com.alibaba.excel.EasyExcel.write(outputStream).head(head()).sheet("sheet").doWrite(dataList);
} catch (IOException e) {
log.error("生成动态EXL失败,字段", e);
}
long endTime = System.currentTimeMillis();
log.info("动态导出耗时:{}", endTime - startTime);
}
public List<List<String>> head() {
List<List<String>> list = ListUtils.newArrayList();
List<String> head0 = ListUtils.newArrayList();
head0.add("序号");
List<String> head1 = ListUtils.newArrayList();
head1.add("送车公司");
List<String> heads = ListUtils.newArrayList();
heads.add("结算单号");
List<String> head2 = ListUtils.newArrayList();
head2.add("部门");
List<String> head3 = ListUtils.newArrayList();
head3.add("备车单号");
List<String> head4 = ListUtils.newArrayList();
head4.add("车架号");
List<String> head5 = ListUtils.newArrayList();
head5.add("车型号");
List<String> head6 = ListUtils.newArrayList();
head6.add("驱动形式");
List<String> head7 = ListUtils.newArrayList();
head7.add("车辆分类");
List<String> head8 = ListUtils.newArrayList();
head8.add("燃料种类");
List<String> head9 = ListUtils.newArrayList();
head9.add("燃料标号");
List<String> head10 = ListUtils.newArrayList();
head10.add("单价");
List<String> head11 = ListUtils.newArrayList();
head11.add("方向机位置");
List<String> head12 = ListUtils.newArrayList();
head12.add("运费油价");
List<String> head13 = ListUtils.newArrayList();
head13.add("排放");
List<String> head14 = ListUtils.newArrayList();
head14.add("品系");
List<String> head15 = ListUtils.newArrayList();
head15.add("挂车轴");
List<String> head16 = ListUtils.newArrayList();
head16.add("长");
List<String> head17 = ListUtils.newArrayList();
head17.add("宽");
List<String> head18 = ListUtils.newArrayList();
head18.add("高");
List<String> head19 = ListUtils.newArrayList();
head19.add("重量");
List<String> head20 = ListUtils.newArrayList();
head20.add("起点");
List<String> head21 = ListUtils.newArrayList();
head21.add("终点");
List<String> head22 = ListUtils.newArrayList();
head22.add("里程");
List<String> head23 = ListUtils.newArrayList();
head23.add("制单时间");
List<String> head24 = ListUtils.newArrayList();
head24.add("限达时间");
List<String> head25 = ListUtils.newArrayList();
head25.add("扫码出库时间");
List<String> head26 = ListUtils.newArrayList();
head26.add("提车确认时间");
List<String> head27 = ListUtils.newArrayList();
head27.add("送达确认时间");
List<String> head28 = ListUtils.newArrayList();
head28.add("接车确认时间");
list.add(head0);
list.add(head1);
list.add(heads);
list.add(head2);
list.add(head3);
list.add(head4);
list.add(head5);
list.add(head6);
list.add(head7);
list.add(head8);
list.add(head9);
list.add(head10);
list.add(head11);
list.add(head12);
list.add(head13);
list.add(head14);
list.add(head15);
list.add(head16);
list.add(head17);
list.add(head18);
list.add(head19);
list.add(head20);
list.add(head21);
list.add(head22);
list.add(head23);
list.add(head24);
list.add(head25);
list.add(head26);
list.add(head27);
list.add(head28);
ExpenseItemBO expenseItemBO = new ExpenseItemBO();
List<ExpenseItemBO> expenseItemBOS = expenseItemDomainService.list(expenseItemBO);
for (int i = 0; i < expenseItemBOS.size(); i++) {
List<String> head = ListUtils.newArrayList();
head.add(expenseItemBOS.get(i).getExpenseItemName());
list.add(head);
}
List<String> headend0 = ListUtils.newArrayList();
headend0.add("基础运费");
List<String> headend1 = ListUtils.newArrayList();
headend1.add("相关费用合计");
List<String> headend2 = ListUtils.newArrayList();
headend2.add("考核金额");
List<String> headend3 = ListUtils.newArrayList();
headend3.add("考核后金额");
List<String> headend4 = ListUtils.newArrayList();
headend4.add("制造单位");
List<String> headend5 = ListUtils.newArrayList();
headend5.add("结算时间");
list.add(headend0);
list.add(headend1);
list.add(headend2);
list.add(headend3);
list.add(headend4);
list.add(headend5);
return list;
}