From 37be575f8e82f81e01d18ee2339481393eee400e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=98=8E=E6=A2=81?= <2429105222@qq.com> Date: Mon, 27 Feb 2023 19:53:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E9=83=A8=E7=A0=81=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/inv/InnerOrderController.java | 11 - .../inv/InvInnerOrderPrintController.java | 230 +++++++++++++++++ .../glxp/api/dao/inv/InnerOrderDetailDao.java | 2 + .../api/dao/inv/InvInnerOrderPrintDao.java | 8 + .../api/entity/basic/UdiProductEntity.java | 1 + .../inv/InvInnerOrderPdfTempEntity.java | 16 +- .../entity/inv/InvInnerOrderPrintEntity.java | 7 + .../api/req/inv/DeleteStPrintTempRequest.java | 11 + .../req/inv/FilterinnerOrderprintRequest.java | 26 ++ ...nnerOrderQRCodeTextPDFTemplateRequest.java | 27 ++ .../glxp/api/req/inv/PdfPrintCountEntity.java | 10 + .../api/req/inv/invInnerOrderprintReques.java | 10 + .../glxp/api/res/basic/UdiRlSupResponse.java | 1 + .../api/res/inv/innerOrderPrintRequest.java | 41 +++ .../service/inv/InnerOrderDetailService.java | 2 + .../inv/InvInnerOrderPdfTempService.java | 19 ++ .../inv/InvInnerOrderPrintService.java | 31 +++ .../glxp/api/service/inv/JaspaperService.java | 50 ++++ .../inv/impl/InnerOrderDetailServiceImpl.java | 5 + .../impl/InvInnerOrderPdfTempServiceImpl.java | 71 ++++++ .../impl/InvInnerOrderPrintServiceImpl.java | 239 ++++++++++++++++++ .../mybatis/mapper/basic/UdiRlSupDao.xml | 1 + .../mapper/inv/InnerOrderDetailDao.xml | 13 + .../mapper/inv/InvInnerOrderPrintDao.xml | 80 ++++++ 24 files changed, 887 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/glxp/api/controller/inv/InvInnerOrderPrintController.java create mode 100644 src/main/java/com/glxp/api/req/inv/DeleteStPrintTempRequest.java create mode 100644 src/main/java/com/glxp/api/req/inv/FilterinnerOrderprintRequest.java create mode 100644 src/main/java/com/glxp/api/req/inv/InnerOrderQRCodeTextPDFTemplateRequest.java create mode 100644 src/main/java/com/glxp/api/req/inv/PdfPrintCountEntity.java create mode 100644 src/main/java/com/glxp/api/req/inv/invInnerOrderprintReques.java create mode 100644 src/main/java/com/glxp/api/res/inv/innerOrderPrintRequest.java create mode 100644 src/main/java/com/glxp/api/service/inv/InvInnerOrderPdfTempService.java create mode 100644 src/main/java/com/glxp/api/service/inv/InvInnerOrderPrintService.java create mode 100644 src/main/java/com/glxp/api/service/inv/JaspaperService.java create mode 100644 src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPdfTempServiceImpl.java create mode 100644 src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPrintServiceImpl.java diff --git a/src/main/java/com/glxp/api/controller/inv/InnerOrderController.java b/src/main/java/com/glxp/api/controller/inv/InnerOrderController.java index 689525e6b..d059d9918 100644 --- a/src/main/java/com/glxp/api/controller/inv/InnerOrderController.java +++ b/src/main/java/com/glxp/api/controller/inv/InnerOrderController.java @@ -160,17 +160,6 @@ public class InnerOrderController { @PostMapping("/insertDetail") public BaseResponse detailAdd(@RequestBody InnerOrderDetailEntity innerOrderDetailEntity) { -// long userId = customerService.getUserId(); -// InnerOrderEntity innerOrderEntity=new InnerOrderEntity(); -//// innerOrderEntity.setPrintStatus(1); -//// innerOrderEntity.setGenStatus(1); -// innerOrderEntity.setCreateTime(new Date()); -// innerOrderEntity.setCreateUser(userId+""); -// innerOrderEntity.setStatus(1); -// innerOrderService.insert(innerOrderEntity); -// Integer id=innerOrderEntity.getId(); -// -// innerOrderDetailEntity.setOrderIdFk(id); innerOrderDetailService.insert(innerOrderDetailEntity); return ResultVOUtils.success(""); } diff --git a/src/main/java/com/glxp/api/controller/inv/InvInnerOrderPrintController.java b/src/main/java/com/glxp/api/controller/inv/InvInnerOrderPrintController.java new file mode 100644 index 000000000..9cee77e61 --- /dev/null +++ b/src/main/java/com/glxp/api/controller/inv/InvInnerOrderPrintController.java @@ -0,0 +1,230 @@ +package com.glxp.api.controller.inv; + +import cn.hutool.core.thread.ThreadUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageInfo; +import com.glxp.api.annotation.AuthRuleAnnotation; +import com.glxp.api.common.enums.ResultEnum; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import com.glxp.api.dao.inv.InvInnerOrderPdfTempDao; +import com.glxp.api.entity.inv.InvInnerOrderPrintEntity; +import com.glxp.api.entity.inv.InvInnerOrderPdfTempEntity; +import com.glxp.api.entity.system.SystemPDFModuleEntity; +import com.glxp.api.entity.system.SystemPDFTemplateEntity; +import com.glxp.api.req.inout.InspectionPDFTemplateRequest; +import com.glxp.api.req.inv.*; +import com.glxp.api.res.PageSimpleResponse; +import com.glxp.api.res.inv.innerOrderPrintRequest; +import com.glxp.api.service.auth.CustomerService; +import com.glxp.api.service.basic.UdiProductService; +import com.glxp.api.service.inv.InnerOrderDetailService; +import com.glxp.api.service.inv.InvInnerOrderPdfTempService; +import com.glxp.api.service.inv.InvInnerOrderPrintService; +import com.glxp.api.service.inv.JaspaperService; +import com.glxp.api.service.system.SystemPDFModuleService; +import com.glxp.api.service.system.SystemPDFTemplateService; +import com.glxp.api.util.CustomUtil; +import com.glxp.api.util.FileUtils; +import com.glxp.api.util.JasperUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.*; + +@RestController +public class InvInnerOrderPrintController { + + @Resource + private InvInnerOrderPrintService invInnerOrderPrintService; + + @Resource + SystemPDFModuleService systemPDFModuleService; + @Resource + SystemPDFTemplateService systemPDFTemplateService; + @Value("${file_path}") + private String dirPath; + @Resource + private JaspaperService jaspaperService; + @Resource + private InvInnerOrderPdfTempService innerOrderPdfTempService; + + + + /** + * 查询盘点单据详情 + * + * @return + */ + @GetMapping("/udiwms/innerOrderPrint/filter") + public BaseResponse filterList(FilterinnerOrderprintRequest filterinnerOrderprintRequest) { + List list = invInnerOrderPrintService.filterOrderPrintList(filterinnerOrderprintRequest); + PageInfo pageInfo = new PageInfo<>(list); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(pageInfo.getList()); + return ResultVOUtils.success(pageSimpleResponse); + } + + @PostMapping("/udiwms/innerOrderPrint/addOrderPrint") + public BaseResponse addOrderPrint(@RequestBody invInnerOrderprintReques invInnerOrderprintReques){ + + if(invInnerOrderprintReques.getOrderIdFk()!=null){ + invInnerOrderPrintService.addOrderList(invInnerOrderprintReques.getOrderIdFk()); + }else{ + return ResultVOUtils.error(999,"参数错误!"); + } + return ResultVOUtils.success(); + + } + //-----------打印码 + @AuthRuleAnnotation("") + @PostMapping("/udiwms/pdf/template/inspection/stock/qrcode/text/file") + public BaseResponse inspectionStockQRCodeTextPDFFromTemplateFile( + @RequestBody InspectionPDFTemplateRequest inspectionPDFTemplateRequest) throws Exception { + + + SystemPDFModuleEntity systemPDFModuleEntity = systemPDFModuleService.selectById(6 + ""); + if (systemPDFModuleEntity == null) return ResultVOUtils.error(ResultEnum.DATA_NOT, "所属模块错误"); + SystemPDFTemplateEntity systemPDFTemplateEntity = + systemPDFTemplateService.selectById(String.valueOf(systemPDFModuleEntity.getTemplateId())); + if (systemPDFTemplateEntity == null) return ResultVOUtils.error(ResultEnum.DATA_NOT, "模板错误"); + + return ResultVOUtils.success(); + } + + @AuthRuleAnnotation("") + @PostMapping("/udiwms/pdf/template/stock/qrcode/text/file") + public BaseResponse stockQRCodeTextPDFFromTemplateFile( + @RequestBody InnerOrderQRCodeTextPDFTemplateRequest stockQRCodeTextPDFTemplateRequest, + HttpServletRequest request, HttpServletResponse response) throws Exception { + SystemPDFModuleEntity systemPDFModuleEntity = systemPDFModuleService.selectById(6 + ""); + if (systemPDFModuleEntity == null) return null; + SystemPDFTemplateEntity systemPDFTemplateEntity = + systemPDFTemplateService.selectById(String.valueOf(systemPDFModuleEntity.getTemplateId())); + if (systemPDFTemplateEntity == null) return null; + List printEntities = new ArrayList<>(); + List mStockPrintEntities = new ArrayList<>(); + FilterinnerOrderprintRequest filterinnerOrderprintRequest = new FilterinnerOrderprintRequest(); + if (stockQRCodeTextPDFTemplateRequest.getOrderId() != null) { + filterinnerOrderprintRequest.setSOrderId(stockQRCodeTextPDFTemplateRequest.getOrderId()); + } else { + filterinnerOrderprintRequest.setId(stockQRCodeTextPDFTemplateRequest.getQueryId()); + } + List stockPrintEntities = invInnerOrderPrintService.filterJoinInnerPrint(filterinnerOrderprintRequest); + if (stockPrintEntities != null && stockPrintEntities.size() > 0) { + mStockPrintEntities.addAll(stockPrintEntities); + } + for (innerOrderPrintRequest innerOrderPrintRequest : mStockPrintEntities) { + PdfPrintCountEntity pdfPrintCount = getCount(stockQRCodeTextPDFTemplateRequest.getCountList(), innerOrderPrintRequest); + if (pdfPrintCount != null && pdfPrintCount.getRowCount() > 0) { + for (int i = 0; i < pdfPrintCount.getRowCount(); i++) { + innerOrderPrintRequest clone = new innerOrderPrintRequest(); + BeanUtils.copyProperties(innerOrderPrintRequest, clone); + printEntities.add(clone); + } + } else { + printEntities.add(innerOrderPrintRequest); + } + } + + if (printEntities.size() > 1000) { //如果标签打印数据大于1000,则切割生成多个文件 + if (!FileUtils.isFileExist(dirPath + "/pdfprint")) { + new File(dirPath + "/pdfprint").mkdirs(); + } + List> splits = CustomUtil.splitList(printEntities, 100); + int index = 0; + List stockPrintTempEntities = new ArrayList<>(); + for (int i = 0; i < splits.size(); i++) { + index++; + InvInnerOrderPdfTempEntity stockPrintTempEntity = new InvInnerOrderPdfTempEntity(); + if (stockQRCodeTextPDFTemplateRequest.getOrderId() != null) { + String fileName = stockQRCodeTextPDFTemplateRequest.getOrderId() + "__" + index + "__标签打印" + ".pdf"; + String filePath = dirPath + "\\pdfprint\\" + fileName; + stockPrintTempEntity.setFileName(fileName); + stockPrintTempEntity.setFilePath(filePath); + stockPrintTempEntity.setStockOrderFk(stockQRCodeTextPDFTemplateRequest.getOrderId()); + } else { + String fileName = stockQRCodeTextPDFTemplateRequest.getQueryId() + "__" + index + "__标签打印" + ".pdf"; + String filePath = dirPath + "\\pdfprint\\" + fileName; + stockPrintTempEntity.setFileName(fileName); + stockPrintTempEntity.setFilePath(filePath); + stockPrintTempEntity.setPrintCodeIdFk(stockQRCodeTextPDFTemplateRequest.getQueryId()); + } + stockPrintTempEntity.setStatus(0); + stockPrintTempEntity.setGenkey(CustomUtil.getId()); + innerOrderPdfTempService.insertStockPrintTempEntity(stockPrintTempEntity); + stockPrintTempEntities.add(stockPrintTempEntity); + } + jaspaperService.printPdfLocal(splits, stockPrintTempEntities, systemPDFTemplateEntity.getPath()); + PageInfo pageInfo; + pageInfo = new PageInfo<>(stockPrintTempEntities); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(stockPrintTempEntities); + return ResultVOUtils.success(pageSimpleResponse); + + } else { + Map data = new HashMap(); + data.put("data", printEntities); + JasperUtils.jasperReport(request, response, data, systemPDFTemplateEntity.getPath(), "pdf"); + + + } + for (innerOrderPrintRequest innerOrderPrintRequest : mStockPrintEntities) { + InvInnerOrderPrintEntity innerOrderPrintEntity=new InvInnerOrderPrintEntity(); + innerOrderPrintEntity.setStatus(1); + innerOrderPrintEntity.setId(innerOrderPrintRequest.getId()); + invInnerOrderPrintService.updateOrder(innerOrderPrintEntity); + } + return null; + + } + + public PdfPrintCountEntity getCount(List countList, innerOrderPrintRequest innerOrderPrintRequest) { + for (PdfPrintCountEntity pdfPrintCount : countList) { + if (pdfPrintCount.getQueryId().equals(innerOrderPrintRequest.getId() + "")) { + return pdfPrintCount; + } + } + return null; + } + + @AuthRuleAnnotation("") + @PostMapping("/udiwms/pdf/template/stock/qrcode/text/maxfile") + public BaseResponse stockQRCodeMaxTextPDFFromTemplateFile(@RequestBody InnerOrderQRCodeTextPDFTemplateRequest innerOrderQRCodeTextPDFTemplateRequest){ + + PageSimpleResponse pageSimpleResponse=invInnerOrderPrintService.print(innerOrderQRCodeTextPDFTemplateRequest); + + return ResultVOUtils.success(pageSimpleResponse); + + } + + @AuthRuleAnnotation("") + @GetMapping("/spms/stock/qrcode/filterTemp") + public BaseResponse filterTemp(DeleteStPrintTempRequest deleteStPrintTempRequest, + BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); + } + List stockQRCodeTextEntityList = innerOrderPdfTempService.filterStockPrintTempEntity(deleteStPrintTempRequest); + PageInfo pageInfo; + pageInfo = new PageInfo<>(stockQRCodeTextEntityList); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(stockQRCodeTextEntityList); + return ResultVOUtils.success(pageSimpleResponse); + } + +} diff --git a/src/main/java/com/glxp/api/dao/inv/InnerOrderDetailDao.java b/src/main/java/com/glxp/api/dao/inv/InnerOrderDetailDao.java index ae6f81b60..50d80f80d 100644 --- a/src/main/java/com/glxp/api/dao/inv/InnerOrderDetailDao.java +++ b/src/main/java/com/glxp/api/dao/inv/InnerOrderDetailDao.java @@ -21,4 +21,6 @@ public interface InnerOrderDetailDao { Boolean deleteByOrderId(@Param("orderIdFk") String orderIdFk); + List selectOrderList(@Param("orderIdFk") String orderIdFk); + } diff --git a/src/main/java/com/glxp/api/dao/inv/InvInnerOrderPrintDao.java b/src/main/java/com/glxp/api/dao/inv/InvInnerOrderPrintDao.java index 892706a02..053580089 100644 --- a/src/main/java/com/glxp/api/dao/inv/InvInnerOrderPrintDao.java +++ b/src/main/java/com/glxp/api/dao/inv/InvInnerOrderPrintDao.java @@ -2,6 +2,14 @@ package com.glxp.api.dao.inv; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.glxp.api.entity.inv.InvInnerOrderPrintEntity; +import com.glxp.api.req.inv.FilterinnerOrderprintRequest; +import com.glxp.api.res.inv.innerOrderPrintRequest; + +import java.util.List; public interface InvInnerOrderPrintDao extends BaseMapper { + + List filterOrderPrintList(FilterinnerOrderprintRequest filterinnerOrderprintRequest); + + List filterJoinInnerPrint(FilterinnerOrderprintRequest filterinnerOrderprintRequest); } \ No newline at end of file diff --git a/src/main/java/com/glxp/api/entity/basic/UdiProductEntity.java b/src/main/java/com/glxp/api/entity/basic/UdiProductEntity.java index 30bfda66b..d725ed770 100644 --- a/src/main/java/com/glxp/api/entity/basic/UdiProductEntity.java +++ b/src/main/java/com/glxp/api/entity/basic/UdiProductEntity.java @@ -71,6 +71,7 @@ public class UdiProductEntity { private String code; private Integer count; private String warehouseCode; + private String deptCode; private String udplatCode; private String relId;//关联ID主键 private Integer status; diff --git a/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPdfTempEntity.java b/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPdfTempEntity.java index 18bc972bf..6c722e4a3 100644 --- a/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPdfTempEntity.java +++ b/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPdfTempEntity.java @@ -23,7 +23,7 @@ public class InvInnerOrderPdfTempEntity { private String filePath; @TableField(value = "`status`") - private String status; + private Integer status; @TableField(value = "printCodeIdFk") private String printCodeIdFk; @@ -31,17 +31,5 @@ public class InvInnerOrderPdfTempEntity { @TableField(value = "stockOrderFk") private String stockOrderFk; - public static final String COL_ID = "id"; - public static final String COL_GENKEY = "genkey"; - - public static final String COL_FILENAME = "fileName"; - - public static final String COL_FILEPATH = "filePath"; - - public static final String COL_STATUS = "status"; - - public static final String COL_PRINTCODEIDFK = "printCodeIdFk"; - - public static final String COL_STOCKORDERFK = "stockOrderFk"; -} \ No newline at end of file +} diff --git a/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPrintEntity.java b/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPrintEntity.java index 76821447e..aa854b1f2 100644 --- a/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPrintEntity.java +++ b/src/main/java/com/glxp/api/entity/inv/InvInnerOrderPrintEntity.java @@ -63,6 +63,13 @@ public class InvInnerOrderPrintEntity { @TableField(value = "updateTime") private Date updateTime; + @TableField(value = "status") + private Integer status; + + @TableField(value = "expireDate") + private String expireDate; + + public static final String COL_ID = "id"; public static final String COL_ORDERIDFK = "orderIdFk"; diff --git a/src/main/java/com/glxp/api/req/inv/DeleteStPrintTempRequest.java b/src/main/java/com/glxp/api/req/inv/DeleteStPrintTempRequest.java new file mode 100644 index 000000000..c3c971de2 --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/DeleteStPrintTempRequest.java @@ -0,0 +1,11 @@ +package com.glxp.api.req.inv; + +import lombok.Data; + +@Data +public class DeleteStPrintTempRequest { + private String printCodeIdFk; + private String stockOrderFk; + private Integer id; + private String genKey; +} diff --git a/src/main/java/com/glxp/api/req/inv/FilterinnerOrderprintRequest.java b/src/main/java/com/glxp/api/req/inv/FilterinnerOrderprintRequest.java new file mode 100644 index 000000000..213486fcc --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/FilterinnerOrderprintRequest.java @@ -0,0 +1,26 @@ +package com.glxp.api.req.inv; + + +import com.glxp.api.util.page.ListPageRequest; +import lombok.Data; + +@Data +public class FilterinnerOrderprintRequest extends ListPageRequest { + private String nameCode; + private String printStatus; + private String udiCode; + private String cpmctymc; + private String thirdName; + private String thirdId; + private String batchNo; + private String udiRlIdFk; + private String warehouseCode; + private String spaceCode; + private String thirdSysFk; + private String genKeyFk; + private String sOrderId; + private String sDetailId; + private String id; + private String orderIdFk; + +} diff --git a/src/main/java/com/glxp/api/req/inv/InnerOrderQRCodeTextPDFTemplateRequest.java b/src/main/java/com/glxp/api/req/inv/InnerOrderQRCodeTextPDFTemplateRequest.java new file mode 100644 index 000000000..535eed371 --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/InnerOrderQRCodeTextPDFTemplateRequest.java @@ -0,0 +1,27 @@ +package com.glxp.api.req.inv; + +import lombok.Data; + +import java.util.List; + +@Data +public class InnerOrderQRCodeTextPDFTemplateRequest { + + private String id; + private String queryId; + private String orderId; + private String billNo; + private String detailId; + + private String actionName; + private String text; + + private String path; + private int rowCount; + private int qrcodeCount; + private List countList; + + private String orderName; + private Integer moduleId; + +} diff --git a/src/main/java/com/glxp/api/req/inv/PdfPrintCountEntity.java b/src/main/java/com/glxp/api/req/inv/PdfPrintCountEntity.java new file mode 100644 index 000000000..023e409ca --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/PdfPrintCountEntity.java @@ -0,0 +1,10 @@ +package com.glxp.api.req.inv; + +import lombok.Data; + +@Data +public class PdfPrintCountEntity { + + private String queryId; + private Integer rowCount; +} diff --git a/src/main/java/com/glxp/api/req/inv/invInnerOrderprintReques.java b/src/main/java/com/glxp/api/req/inv/invInnerOrderprintReques.java new file mode 100644 index 000000000..451c1fa0d --- /dev/null +++ b/src/main/java/com/glxp/api/req/inv/invInnerOrderprintReques.java @@ -0,0 +1,10 @@ +package com.glxp.api.req.inv; + + +import com.glxp.api.util.page.ListPageRequest; +import lombok.Data; + +@Data +public class invInnerOrderprintReques{ + private String orderIdFk; +} diff --git a/src/main/java/com/glxp/api/res/basic/UdiRlSupResponse.java b/src/main/java/com/glxp/api/res/basic/UdiRlSupResponse.java index c9c9df4fb..9e8edf8a7 100644 --- a/src/main/java/com/glxp/api/res/basic/UdiRlSupResponse.java +++ b/src/main/java/com/glxp/api/res/basic/UdiRlSupResponse.java @@ -71,6 +71,7 @@ public class UdiRlSupResponse { private String spmc; private Integer productType; private String price; + private String proId; //产品代理商 private String cpdls; diff --git a/src/main/java/com/glxp/api/res/inv/innerOrderPrintRequest.java b/src/main/java/com/glxp/api/res/inv/innerOrderPrintRequest.java new file mode 100644 index 000000000..1cda62c9c --- /dev/null +++ b/src/main/java/com/glxp/api/res/inv/innerOrderPrintRequest.java @@ -0,0 +1,41 @@ +package com.glxp.api.res.inv; + +import lombok.Data; + +import java.util.Date; + +@Data +public class innerOrderPrintRequest { + private Integer id; + private String udiRlIdFk; + private String udiCode; + private String nameCode; + private String cpmctymc; + private String batchNo; + private String productDate; + private String expireDate; + private String serialNo; + private String codeType; + private String thirdId; + private String thirdName; + private String printStatus; + private String ggxh; + private String ylqxzcrbarmc; + private String zczbhhzbapzbh; + private String warehouseName; + private String warehouseCode; + private String spaceCode; + private String spaceName; + private String thirdSysFk; + private String nnum; + private String genKeyFk; + + private String sOrderId; + private String sDetailId; + private Date updateTime; + + + private Integer count; + private String corpName; + +} diff --git a/src/main/java/com/glxp/api/service/inv/InnerOrderDetailService.java b/src/main/java/com/glxp/api/service/inv/InnerOrderDetailService.java index cbb07f392..72671103b 100644 --- a/src/main/java/com/glxp/api/service/inv/InnerOrderDetailService.java +++ b/src/main/java/com/glxp/api/service/inv/InnerOrderDetailService.java @@ -21,4 +21,6 @@ public interface InnerOrderDetailService { Boolean deleteByOrderId(@Param("orderIdFk") String orderIdFk); + List selectOrderList(String orderIdFk); + } diff --git a/src/main/java/com/glxp/api/service/inv/InvInnerOrderPdfTempService.java b/src/main/java/com/glxp/api/service/inv/InvInnerOrderPdfTempService.java new file mode 100644 index 000000000..7ff09351c --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/InvInnerOrderPdfTempService.java @@ -0,0 +1,19 @@ +package com.glxp.api.service.inv; + +import com.glxp.api.entity.inv.InvInnerOrderPdfTempEntity; +import com.glxp.api.req.inv.DeleteStPrintTempRequest; + +import java.util.List; + +public interface InvInnerOrderPdfTempService { + + List filterStockPrintTempEntity(DeleteStPrintTempRequest deleteStPrintTempRequest); + + boolean insertStockPrintTempEntity(InvInnerOrderPdfTempEntity invInnerOrderPdfTempEntity); + + boolean insertStockPrintTempList(List invInnerOrderPdfTempEntities); + + boolean delete(DeleteStPrintTempRequest deleteStPrintTempRequest); + + +} diff --git a/src/main/java/com/glxp/api/service/inv/InvInnerOrderPrintService.java b/src/main/java/com/glxp/api/service/inv/InvInnerOrderPrintService.java new file mode 100644 index 000000000..497d0c8f7 --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/InvInnerOrderPrintService.java @@ -0,0 +1,31 @@ +package com.glxp.api.service.inv; + +import com.glxp.api.entity.inv.InvInnerOrderPrintEntity; +import com.glxp.api.req.inv.DeleteStPrintTempRequest; +import com.glxp.api.req.inv.FilterinnerOrderprintRequest; +import com.glxp.api.req.inv.InnerOrderQRCodeTextPDFTemplateRequest; +import com.glxp.api.res.PageSimpleResponse; +import com.glxp.api.res.inv.innerOrderPrintRequest; + + +import java.util.List; + +public interface InvInnerOrderPrintService { + + List filterOrderPrintList(FilterinnerOrderprintRequest filterinnerOrderprintRequest); + + Boolean addOrderList(String orderIdFk); + + InvInnerOrderPrintEntity selectById(String id); + + List filterJoinInnerPrint(FilterinnerOrderprintRequest filterinnerOrderprintRequest); + + Boolean updateOrder(InvInnerOrderPrintEntity invInnerOrderPrintEntity); + + PageSimpleResponse print(InnerOrderQRCodeTextPDFTemplateRequest innerOrderQRCodeTextPDFTemplateRequest); + + + + + +} diff --git a/src/main/java/com/glxp/api/service/inv/JaspaperService.java b/src/main/java/com/glxp/api/service/inv/JaspaperService.java new file mode 100644 index 000000000..6d0fbaa0b --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/JaspaperService.java @@ -0,0 +1,50 @@ +package com.glxp.api.service.inv; + + +import cn.hutool.core.thread.ThreadUtil; +import com.glxp.api.dao.inv.InvInnerOrderPdfTempDao; +import com.glxp.api.entity.inv.InvInnerOrderPdfTempEntity; +import com.glxp.api.res.inv.innerOrderPrintRequest; +import com.glxp.api.util.JasperUtils; +import net.sf.jasperreports.engine.JRException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class JaspaperService { + @Value("${file_path}") + private String dirPath; + @Resource + private InvInnerOrderPdfTempDao innerOrderPdfTempDao; + + @Async + public void printPdfLocal(List> splits, List stockPrintTempEntities, String resource) { + + ThreadUtil.execAsync(() -> { + for (int i = 0; i < stockPrintTempEntities.size(); i++) { + InvInnerOrderPdfTempEntity stockPrintTempEntity = stockPrintTempEntities.get(i); + Map data = new HashMap(); + data.put("data", splits.get(i)); + try { + JasperUtils.jasperReportToFile(stockPrintTempEntity.getFilePath(), data, resource); + stockPrintTempEntity.setStatus(1); + } catch (IOException e) { + stockPrintTempEntity.setStatus(2); + e.printStackTrace(); + } catch (JRException e) { + stockPrintTempEntity.setStatus(2); + e.printStackTrace(); + } + innerOrderPdfTempDao.updateById(stockPrintTempEntity); + } + }); + } + +} diff --git a/src/main/java/com/glxp/api/service/inv/impl/InnerOrderDetailServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InnerOrderDetailServiceImpl.java index 2db6fb5be..3351de53f 100644 --- a/src/main/java/com/glxp/api/service/inv/impl/InnerOrderDetailServiceImpl.java +++ b/src/main/java/com/glxp/api/service/inv/impl/InnerOrderDetailServiceImpl.java @@ -49,4 +49,9 @@ public class InnerOrderDetailServiceImpl implements InnerOrderDetailService { public Boolean deleteByOrderId(String orderIdFk) { return innerOrderDetailDao.deleteByOrderId(orderIdFk); } + + @Override + public List selectOrderList(String orderIdFk) { + return innerOrderDetailDao.selectOrderList(orderIdFk); + } } diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPdfTempServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPdfTempServiceImpl.java new file mode 100644 index 000000000..e1b428e6f --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPdfTempServiceImpl.java @@ -0,0 +1,71 @@ +package com.glxp.api.service.inv.impl; + + +import cn.hutool.core.thread.ThreadUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.glxp.api.dao.inv.InvInnerOrderPdfTempDao; +import com.glxp.api.entity.inv.InvInnerOrderPdfTempEntity; +import com.glxp.api.req.inv.DeleteStPrintTempRequest; +import com.glxp.api.res.PageSimpleResponse; +import com.glxp.api.service.inv.InvInnerOrderPdfTempService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +@Service +@Transactional(rollbackFor = Exception.class) +public class InvInnerOrderPdfTempServiceImpl implements InvInnerOrderPdfTempService { + + @Resource + InvInnerOrderPdfTempDao innerOrderPdfTempDao; + + @Override + public List filterStockPrintTempEntity(DeleteStPrintTempRequest deleteStPrintTempRequest) { + + QueryWrapper ew=new QueryWrapper<>(); + if (deleteStPrintTempRequest.getStockOrderFk() != null) { + ew.eq("stockOrderFk", deleteStPrintTempRequest.getStockOrderFk()); + } + if (deleteStPrintTempRequest.getPrintCodeIdFk() != null) { + ew.eq("printCodeIdFk", deleteStPrintTempRequest.getPrintCodeIdFk()); + } + if (deleteStPrintTempRequest.getId() != null) { + ew.eq("id", deleteStPrintTempRequest.getId()); + } + List invInnerOrderPdfTempEntityList=innerOrderPdfTempDao.selectList(ew); + + return invInnerOrderPdfTempEntityList; + } + + @Override + public boolean insertStockPrintTempEntity(InvInnerOrderPdfTempEntity invInnerOrderPdfTempEntity) { + innerOrderPdfTempDao.insert(invInnerOrderPdfTempEntity); + return true; + } + + @Override + public boolean insertStockPrintTempList(List invInnerOrderPdfTempEntities) { + + + for (InvInnerOrderPdfTempEntity obj : invInnerOrderPdfTempEntities) { + innerOrderPdfTempDao.insert(obj); + } + + return true; + } + + @Override + public boolean delete(DeleteStPrintTempRequest deleteStPrintTempRequest) { + QueryWrapper ew = new QueryWrapper<>(); + if (deleteStPrintTempRequest.getStockOrderFk() != null) { + ew.eq("stockOrderFk", deleteStPrintTempRequest.getStockOrderFk()); + } + if (deleteStPrintTempRequest.getPrintCodeIdFk() != null) { + ew.eq("printCodeIdFk", deleteStPrintTempRequest.getPrintCodeIdFk()); + } + innerOrderPdfTempDao.delete(ew); + return true; + } +} diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPrintServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPrintServiceImpl.java new file mode 100644 index 000000000..837c68aae --- /dev/null +++ b/src/main/java/com/glxp/api/service/inv/impl/InvInnerOrderPrintServiceImpl.java @@ -0,0 +1,239 @@ +package com.glxp.api.service.inv.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.glxp.api.dao.basic.UdiRelevanceDao; +import com.glxp.api.dao.inv.InvInnerOrderPrintDao; +import com.glxp.api.entity.basic.UdiProductEntity; +import com.glxp.api.entity.inv.InnerOrderDetailEntity; +import com.glxp.api.entity.inv.InvInnerOrderPdfTempEntity; +import com.glxp.api.entity.inv.InvInnerOrderPrintEntity; +import com.glxp.api.entity.system.SystemPDFModuleEntity; +import com.glxp.api.entity.system.SystemPDFTemplateEntity; +import com.glxp.api.req.basic.FilterUdiRelRequest; +import com.glxp.api.req.inv.*; +import com.glxp.api.res.PageSimpleResponse; +import com.glxp.api.res.basic.UdiRelevanceResponse; +import com.glxp.api.res.inv.InvCountOrderDetailResponse; +import com.glxp.api.res.inv.innerOrderPrintRequest; +import com.glxp.api.service.auth.CustomerService; +import com.glxp.api.service.basic.UdiProductService; +import com.glxp.api.service.basic.UdiRelevanceService; +import com.glxp.api.service.inv.InnerOrderDetailService; +import com.glxp.api.service.inv.InvInnerOrderPdfTempService; +import com.glxp.api.service.inv.InvInnerOrderPrintService; +import com.glxp.api.service.inv.JaspaperService; +import com.glxp.api.service.system.SystemPDFModuleService; +import com.glxp.api.service.system.SystemPDFTemplateService; +import com.glxp.api.util.CustomUtil; +import com.glxp.api.util.FileUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +@Service +@Transactional(rollbackFor = Exception.class) +public class InvInnerOrderPrintServiceImpl implements InvInnerOrderPrintService { + + @Resource + InvInnerOrderPrintDao invInnerOrderPrintDao; + @Resource + private InnerOrderDetailService innerOrderDetailService; + @Resource + private CustomerService customerService; + @Resource + private UdiProductService udiProductService; + @Resource + private UdiRelevanceDao udiRelevanceDao; + @Resource + private InvInnerOrderPrintService invInnerOrderPrintService; + + @Value("${file_path}") + private String dirPath; + @Resource + private JaspaperService jaspaperService; + @Resource + private InvInnerOrderPdfTempService innerOrderPdfTempService; + @Resource + SystemPDFModuleService systemPDFModuleService; + @Resource + SystemPDFTemplateService systemPDFTemplateService; + + @Override + public List filterOrderPrintList(FilterinnerOrderprintRequest filterinnerOrderprintRequest) { + if (filterinnerOrderprintRequest == null) { + return Collections.emptyList(); + } + int offset = (filterinnerOrderprintRequest.getPage() - 1) * filterinnerOrderprintRequest.getLimit(); + PageHelper.offsetPage(offset, filterinnerOrderprintRequest.getLimit()); + List data = invInnerOrderPrintDao.filterOrderPrintList(filterinnerOrderprintRequest); + return data; + } + + @Override + public Boolean addOrderList(String orderIdFk) { + //先删除数据 + QueryWrapper ew=new QueryWrapper<>(); + ew.eq("orderIdFk",orderIdFk); + invInnerOrderPrintDao.delete(ew); + + List innerOrderDetailEntityList=innerOrderDetailService.selectOrderList(orderIdFk); + + for(InnerOrderDetailEntity obj:innerOrderDetailEntityList){ + InvInnerOrderPrintEntity innerOrderPrintEntity=new InvInnerOrderPrintEntity(); + innerOrderPrintEntity.setOrderIdFk(obj.getOrderIdFk()); + innerOrderPrintEntity.setProductId(obj.getProductId()); + innerOrderPrintEntity.setExpireDate(obj.getExpireDate()); + innerOrderPrintEntity.setProductDate(obj.getProductDate()); + innerOrderPrintEntity.setProductName(obj.getProductName()); + innerOrderPrintEntity.setCount(obj.getCount()); + innerOrderPrintEntity.setBatchNo(obj.getBatchNo()); + innerOrderPrintEntity.setCreateTime(new Date()); + innerOrderPrintEntity.setUpdateTime(new Date()); + innerOrderPrintEntity.setStatus(0); + innerOrderPrintEntity.setCreateUser(customerService.getUserId()+""); + innerOrderPrintEntity.setUpdateUser(customerService.getUserId()+""); + FilterUdiRelRequest filterUdiRelRequest=new FilterUdiRelRequest(); + filterUdiRelRequest.setId(Long.valueOf(obj.getProductId())); + //查询耗材字典信息 + UdiRelevanceResponse filterUdiRelevance=udiRelevanceDao.filterUdiRelevance(filterUdiRelRequest).get(0); + //查询产品信息 + UdiProductEntity udiProductEntity=udiProductService.findByNameCode(filterUdiRelevance.getNameCode()); + + String udiCode = "#" + udiProductEntity.getNameCode() + "#" + udiProductEntity.getProduceDate() + "#" + udiProductEntity.getExpireDate() + + "#" + udiProductEntity.getBatchNo() + "#" + udiProductEntity.getSerialNo() + "#" + udiProductEntity.getWarehouseCode() + "#" + udiProductEntity.getDeptCode(); + innerOrderPrintEntity.setUdiCode(udiCode); + invInnerOrderPrintDao.insert(innerOrderPrintEntity); + } + return true; + } + + @Override + public InvInnerOrderPrintEntity selectById(String id) { + return invInnerOrderPrintDao.selectById(id); + } + + @Override + public List filterJoinInnerPrint(FilterinnerOrderprintRequest filterinnerOrderprintRequest) { + if (filterinnerOrderprintRequest == null) { + return Collections.emptyList(); + } + if(filterinnerOrderprintRequest.getPage()!=null){ + int offset = (filterinnerOrderprintRequest.getPage() - 1) * filterinnerOrderprintRequest.getLimit(); + PageHelper.offsetPage(offset, filterinnerOrderprintRequest.getLimit()); + } + + List data = invInnerOrderPrintDao.filterJoinInnerPrint(filterinnerOrderprintRequest); + return data; + } + + @Override + public Boolean updateOrder(InvInnerOrderPrintEntity invInnerOrderPrintEntity) { + + invInnerOrderPrintDao.updateById(invInnerOrderPrintEntity); + return true; + } + + @Override + public PageSimpleResponse print(InnerOrderQRCodeTextPDFTemplateRequest innerOrderQRCodeTextPDFTemplateRequest) { + + SystemPDFModuleEntity systemPDFModuleEntity = systemPDFModuleService.selectById(6 + ""); + if (systemPDFModuleEntity == null) return null; + SystemPDFTemplateEntity systemPDFTemplateEntity = + systemPDFTemplateService.selectById(String.valueOf(systemPDFModuleEntity.getTemplateId())); + if (systemPDFTemplateEntity == null) return null; + List printEntities = new ArrayList<>(); + List mStockPrintEntities = new ArrayList<>(); + FilterinnerOrderprintRequest filterStockprintRequest = new FilterinnerOrderprintRequest(); + DeleteStPrintTempRequest deleteStPrintTempRequest = new DeleteStPrintTempRequest(); + if (innerOrderQRCodeTextPDFTemplateRequest.getOrderId() != null) { + filterStockprintRequest.setSOrderId(innerOrderQRCodeTextPDFTemplateRequest.getOrderId()); + deleteStPrintTempRequest.setStockOrderFk(innerOrderQRCodeTextPDFTemplateRequest.getOrderId() + ""); + + } else { + deleteStPrintTempRequest.setPrintCodeIdFk(innerOrderQRCodeTextPDFTemplateRequest.getQueryId()); + filterStockprintRequest.setId(innerOrderQRCodeTextPDFTemplateRequest.getQueryId()); + } + + innerOrderPdfTempService.delete(deleteStPrintTempRequest); + List stockPrintEntities = invInnerOrderPrintService.filterJoinInnerPrint(filterStockprintRequest); + if (stockPrintEntities != null && stockPrintEntities.size() > 0) { + mStockPrintEntities.addAll(stockPrintEntities); + } + for (innerOrderPrintRequest innerOrderPrintRequest : mStockPrintEntities) { + PdfPrintCountEntity pdfPrintCount = getCount(innerOrderQRCodeTextPDFTemplateRequest.getCountList(), innerOrderPrintRequest); + if (pdfPrintCount != null && pdfPrintCount.getRowCount() > 0) { + for (int i = 0; i < pdfPrintCount.getRowCount(); i++) { + innerOrderPrintRequest clone = new innerOrderPrintRequest(); + BeanUtils.copyProperties(innerOrderPrintRequest, clone); + printEntities.add(clone); + } + } else { + printEntities.add(innerOrderPrintRequest); + } + } + + if (!FileUtils.isFileExist(dirPath + "/pdfprint")) { + new File(dirPath + "/pdfprint").mkdirs(); + } + List> splits = CustomUtil.splitList(printEntities, 100); + int index = 0; + List stockPrintTempEntities = new ArrayList<>(); + for (int i = 0; i < splits.size(); i++) { + index++; + InvInnerOrderPdfTempEntity stockPrintTempEntity = new InvInnerOrderPdfTempEntity(); + if (innerOrderQRCodeTextPDFTemplateRequest.getOrderId() != null) { + String fileName = innerOrderQRCodeTextPDFTemplateRequest.getOrderId() + "__" + index + "__标签打印" + ".pdf"; + String filePath = dirPath + "\\pdfprint\\" + fileName; + stockPrintTempEntity.setFileName(fileName); + stockPrintTempEntity.setFilePath(filePath); + stockPrintTempEntity.setStockOrderFk(innerOrderQRCodeTextPDFTemplateRequest.getOrderId()); + } else { + String fileName = innerOrderQRCodeTextPDFTemplateRequest.getQueryId() + "__" + index + "__标签打印" + ".pdf"; + String filePath = dirPath + "\\pdfprint\\" + fileName; + stockPrintTempEntity.setFileName(fileName); + stockPrintTempEntity.setFilePath(filePath); + stockPrintTempEntity.setPrintCodeIdFk(innerOrderQRCodeTextPDFTemplateRequest.getQueryId()); + } + stockPrintTempEntity.setStatus(0); + stockPrintTempEntity.setGenkey(CustomUtil.getId()); + stockPrintTempEntities.add(stockPrintTempEntity); + } + jaspaperService.printPdfLocal(splits, stockPrintTempEntities, systemPDFTemplateEntity.getPath()); + + innerOrderPdfTempService.insertStockPrintTempList(stockPrintTempEntities); + + for (innerOrderPrintRequest innerOrderPrintRequest : mStockPrintEntities) { + InvInnerOrderPrintEntity innerOrderPrintEntity=new InvInnerOrderPrintEntity(); + innerOrderPrintEntity.setStatus(1); + innerOrderPrintEntity.setId(innerOrderPrintRequest.getId()); + invInnerOrderPrintService.updateOrder(innerOrderPrintEntity); + } + PageInfo pageInfo; + pageInfo = new PageInfo<>(stockPrintTempEntities); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(stockPrintTempEntities); + + return pageSimpleResponse; + } + + public PdfPrintCountEntity getCount(List countList, innerOrderPrintRequest innerOrderPrintRequest) { + for (PdfPrintCountEntity pdfPrintCount : countList) { + if (pdfPrintCount.getQueryId().equals(innerOrderPrintRequest.getId() + "")) { + return pdfPrintCount; + } + } + return null; + } +} diff --git a/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml b/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml index faa4d3c10..d4a62c9d7 100644 --- a/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml +++ b/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml @@ -43,6 +43,7 @@ basic_udirel.isLock, basic_udirel.mainId, basic_udirel.isAdavence, + basic_products.id AS proId, basic_products.originUuid, basic_products.nameCode, basic_products.deviceRecordKey, diff --git a/src/main/resources/mybatis/mapper/inv/InnerOrderDetailDao.xml b/src/main/resources/mybatis/mapper/inv/InnerOrderDetailDao.xml index 2929b743a..c24debf5a 100644 --- a/src/main/resources/mybatis/mapper/inv/InnerOrderDetailDao.xml +++ b/src/main/resources/mybatis/mapper/inv/InnerOrderDetailDao.xml @@ -79,4 +79,17 @@ WHERE id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/inv/InvInnerOrderPrintDao.xml b/src/main/resources/mybatis/mapper/inv/InvInnerOrderPrintDao.xml index e4795f5c6..d5773b9d4 100644 --- a/src/main/resources/mybatis/mapper/inv/InvInnerOrderPrintDao.xml +++ b/src/main/resources/mybatis/mapper/inv/InvInnerOrderPrintDao.xml @@ -22,4 +22,84 @@ id, orderIdFk, udiCode, productId, productName, `count`, productDate, batchNo, `createUser`, createTime, updateUser, updateTime + + + + + + + + + \ No newline at end of file