diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderInvoiceRecordController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderInvoiceRecordController.java index c265a029c..98ebbf1b3 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderInvoiceRecordController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderInvoiceRecordController.java @@ -10,6 +10,7 @@ import com.jsowell.pile.domain.OrderInvoiceRecord; import com.jsowell.pile.dto.GetInvoiceInfoDTO; import com.jsowell.pile.service.OrderInvoiceRecordService; import com.jsowell.pile.vo.web.OrderInvoiceRecordExportVO; +import com.jsowell.pile.vo.web.OrderInvoiceRecordImportVO; import com.jsowell.pile.vo.web.OrderInvoiceRecordVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -61,6 +63,22 @@ public class OrderInvoiceRecordController extends BaseController { util.exportExcel(response, list, "申请开票数据"); } + /** + * 导入开票结果 + */ + @PreAuthorize("@ss.hasPermi('order:invoice:edit')") + @Log(title = "申请开票", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file) throws Exception { + if (file == null || file.isEmpty()) { + return AjaxResult.error("上传文件不能为空"); + } + ExcelUtil util = new ExcelUtil(OrderInvoiceRecordImportVO.class); + List importList = util.importExcel(file.getInputStream()); + String message = orderInvoiceRecordService.importInvoiceImages(importList, getUsername()); + return AjaxResult.success(message); + } + /** * 获取申请开票详细信息 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderInvoiceRecord.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderInvoiceRecord.java index e626511e2..865c98655 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderInvoiceRecord.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderInvoiceRecord.java @@ -45,6 +45,11 @@ public class OrderInvoiceRecord extends BaseEntity { private String email; + /** + * 发票图片url + */ + private String invoiceUrl; + /** * 申请订单编号(逗号分割) */ @@ -154,6 +159,7 @@ public class OrderInvoiceRecord extends BaseEntity { .append("totalAmount", getTotalAmount()) .append("totalServiceAmount", getTotalServiceAmount()) .append("totalElecAmount", getTotalElecAmount()) + .append("invoiceUrl", getInvoiceUrl()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderInvoiceRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderInvoiceRecordService.java index 8c015f5c3..585cc5ced 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderInvoiceRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderInvoiceRecordService.java @@ -5,6 +5,7 @@ import com.jsowell.pile.dto.GetInvoiceInfoDTO; import com.jsowell.pile.dto.QueryInvoiceRecordDTO; import com.jsowell.pile.vo.web.InvoiceRecordVO; import com.jsowell.pile.vo.web.OrderInvoiceRecordExportVO; +import com.jsowell.pile.vo.web.OrderInvoiceRecordImportVO; import com.jsowell.pile.vo.web.OrderInvoiceRecordVO; import java.time.LocalDateTime; @@ -50,6 +51,15 @@ public interface OrderInvoiceRecordService { */ List getInvoiceExportListWithAuth(GetInvoiceInfoDTO dto); + /** + * 导入发票图片并更新申请开票记录 + * + * @param importList 导入数据 + * @param operName 操作人 + * @return 导入结果 + */ + String importInvoiceImages(List importList, String operName); + List selectInvoiceRecordList(QueryInvoiceRecordDTO memberId); List selectInvoiceVOList(QueryInvoiceRecordDTO memberId); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java index e617d1498..a5e56c315 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java @@ -2,6 +2,10 @@ package com.jsowell.pile.service.impl; import com.google.common.collect.Lists; import com.jsowell.common.core.domain.vo.AuthorizedDeptVO; +import com.jsowell.common.util.StringUtils; +import com.jsowell.common.util.file.AliyunOssUploadUtils; +import com.jsowell.common.util.file.FileUtils; +import com.jsowell.common.config.JsowellConfig; import com.jsowell.pile.domain.OrderInvoiceRecord; import com.jsowell.pile.dto.GetInvoiceInfoDTO; import com.jsowell.pile.dto.QueryInvoiceRecordDTO; @@ -14,14 +18,21 @@ import com.jsowell.pile.vo.base.OrderAmountDetailVO; import com.jsowell.pile.vo.uniapp.customer.InvoiceTitleVO; import com.jsowell.pile.vo.web.InvoiceRecordVO; import com.jsowell.pile.vo.web.OrderInvoiceRecordExportVO; +import com.jsowell.pile.vo.web.OrderInvoiceRecordImportVO; import com.jsowell.pile.vo.web.OrderInvoiceRecordVO; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.File; +import java.nio.file.Paths; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 申请开票Service业务层处理 @@ -70,6 +81,7 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService .memberId(vo.getMemberId()) .phoneNumber(vo.getPhoneNumber()) .status(vo.getStatus()) + .invoiceUrl(vo.getInvoiceUrl()) .invoiceTitle(invoiceTitleVO) .orderList(orderAmountDetailVOS) .createTime(vo.getCreateTime()) @@ -109,6 +121,78 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService return orderInvoiceRecordMapper.getInvoiceExportListWithAuth(dto); } + @Override + public String importInvoiceImages(List importList, String operName) { + if (CollectionUtils.isEmpty(importList)) { + return "导入数据为空"; + } + Set requestedIds = importList.stream() + .map(OrderInvoiceRecordImportVO::getId) + .filter(id -> id != null) + .collect(Collectors.toCollection(HashSet::new)); + if (CollectionUtils.isEmpty(requestedIds)) { + return "导入失败,文件中缺少申请记录ID"; + } + GetInvoiceInfoDTO dto = new GetInvoiceInfoDTO(); + dto.setIds(requestedIds.toArray(new Integer[0])); + Set authorizedIds = getInvoiceExportListWithAuth(dto).stream() + .map(OrderInvoiceRecordExportVO::getId) + .filter(id -> id != null) + .collect(Collectors.toCollection(HashSet::new)); + + int successNum = 0; + int skipNum = 0; + List messages = new ArrayList<>(); + for (int i = 0; i < importList.size(); i++) { + OrderInvoiceRecordImportVO item = importList.get(i); + int rowNum = i + 2; + if (item.getId() == null) { + messages.add("第" + rowNum + "行缺少申请记录ID"); + continue; + } + if (!authorizedIds.contains(item.getId())) { + messages.add("第" + rowNum + "行申请记录无权限或不存在"); + continue; + } + if (StringUtils.isEmpty(item.getInvoiceImage())) { + skipNum++; + continue; + } + + String absolutePath = buildAbsoluteImportPath(item.getInvoiceImage()); + try { + byte[] imageBytes = java.nio.file.Files.readAllBytes(Paths.get(absolutePath)); + String url = AliyunOssUploadUtils.upload2OSS(imageBytes, new File(absolutePath).getName()); + OrderInvoiceRecord updateRecord = new OrderInvoiceRecord(); + updateRecord.setId(item.getId()); + updateRecord.setInvoiceUrl(url); + updateRecord.setStatus("1"); + updateRecord.setUpdateBy(operName); + updateRecord.setUpdateTime(new Date()); + if (orderInvoiceRecordMapper.updateOrderInvoiceRecord(updateRecord) > 0) { + successNum++; + } else { + messages.add("第" + rowNum + "行更新失败"); + } + } catch (Exception e) { + messages.add("第" + rowNum + "行导入失败:" + e.getMessage()); + } finally { + FileUtils.deleteFile(absolutePath); + } + } + + StringBuilder result = new StringBuilder(); + result.append("成功导入").append(successNum).append("条发票数据"); + if (skipNum > 0) { + result.append(",跳过未贴图记录").append(skipNum).append("条"); + } + if (CollectionUtils.isNotEmpty(messages)) { + result.append(",失败").append(messages.size()).append("条:
") + .append(String.join("
", messages)); + } + return result.toString(); + } + private boolean fillAuthorizedMerchantDeptIds(GetInvoiceInfoDTO dto) { // 获取登录账号信息 AuthorizedDeptVO authorizedMap = UserUtils.getAuthorizedMap(); @@ -122,6 +206,17 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService return true; } + private String buildAbsoluteImportPath(String relativePath) { + if (StringUtils.isEmpty(relativePath)) { + return relativePath; + } + File file = new File(relativePath); + if (file.isAbsolute()) { + return relativePath; + } + return Paths.get(JsowellConfig.getProfile(), relativePath).toString(); + } + @Override public List selectInvoiceRecordList(QueryInvoiceRecordDTO dto) { return orderInvoiceRecordMapper.selectInvoiceRecordList(dto); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/InvoiceRecordVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/InvoiceRecordVO.java index 296ddac53..89bc0a68a 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/InvoiceRecordVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/InvoiceRecordVO.java @@ -44,6 +44,11 @@ public class InvoiceRecordVO { */ private String updateTime; + /** + * 发票图片url + */ + private String invoiceUrl; + /** * 发票抬头信息 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordExportVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordExportVO.java index 58b86f416..b1e403479 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordExportVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordExportVO.java @@ -1,6 +1,7 @@ package com.jsowell.pile.vo.web; import com.jsowell.common.annotation.Excel; +import com.jsowell.common.annotation.Excel.ColumnType; import lombok.Data; import java.math.BigDecimal; @@ -10,6 +11,9 @@ import java.math.BigDecimal; */ @Data public class OrderInvoiceRecordExportVO { + @Excel(name = "申请记录ID") + private Integer id; + @Excel(name = "会员ID") private String memberId; @@ -63,4 +67,7 @@ public class OrderInvoiceRecordExportVO { @Excel(name = "开票时间") private String updateTime; + + @Excel(name = "发票图片", cellType = ColumnType.IMAGE, width = 30, height = 80) + private String invoiceImage; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordImportVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordImportVO.java new file mode 100644 index 000000000..7521e1f3f --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordImportVO.java @@ -0,0 +1,17 @@ +package com.jsowell.pile.vo.web; + +import com.jsowell.common.annotation.Excel; +import com.jsowell.common.annotation.Excel.ColumnType; +import lombok.Data; + +/** + * 申请开票导入对象 + */ +@Data +public class OrderInvoiceRecordImportVO { + @Excel(name = "申请记录ID") + private Integer id; + + @Excel(name = "发票图片", cellType = ColumnType.IMAGE) + private String invoiceImage; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordVO.java index b59a027da..0e70ee9bf 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderInvoiceRecordVO.java @@ -18,6 +18,7 @@ public class OrderInvoiceRecordVO { private String merchantName; private String titleId; private String email; + private String invoiceUrl; private String orderCodes; private String status; private String createTime; diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderInvoiceRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderInvoiceRecordMapper.xml index ea5b92da9..486b5c0e2 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderInvoiceRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderInvoiceRecordMapper.xml @@ -11,6 +11,7 @@ + @@ -25,7 +26,7 @@ - id, member_id, merchant_id, title_id, phone_number, email, order_codes, status, total_amount, total_service_amount, total_elec_amount, + id, member_id, merchant_id, title_id, phone_number, email, invoice_url, order_codes, status, total_amount, total_service_amount, total_elec_amount, create_by, create_time, update_by, update_time, del_flag @@ -59,6 +60,7 @@ title_id, phone_number, email, + invoice_url, order_codes, status, total_amount, @@ -76,6 +78,7 @@ #{titleId}, #{phoneNumber}, #{email}, + #{invoiceUrl}, #{orderCodes}, #{status}, #{totalAmount}, @@ -94,6 +97,10 @@ member_id = #{memberId}, merchant_id = #{merchantId}, + title_id = #{titleId}, + phone_number = #{phoneNumber}, + email = #{email}, + invoice_url = #{invoiceUrl}, order_codes = #{orderCodes}, status = #{status}, total_amount = #{totalAmount}, @@ -145,6 +152,7 @@ t2.merchant_name as merchantName, t1.title_id as titleId, t1.email as email, + t1.invoice_url as invoiceUrl, t1.order_codes as orderCodes, t1.STATUS as status, t1.create_time as createTime, @@ -171,6 +179,7 @@