diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java index bfbcedde5..077c57b4c 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java @@ -1,6 +1,5 @@ package com.czg.controller.admin; -import com.czg.annotation.SaStaffCheckPermission; import com.czg.log.annotation.OperationLog; import com.czg.product.dto.ConsStockFlowDTO; import com.czg.product.param.ConsCheckStockParam; @@ -41,10 +40,21 @@ public class ConsStockFlowController { * @throws IOException */ @PostMapping("/ocr") - public CzgResult ocr(@RequestParam MultipartFile file) throws IOException { + public CzgResult ocr(@RequestParam MultipartFile file) throws IOException { return CzgResult.success(consStockFlowService.ocr(file.getOriginalFilename(), file.getInputStream())); } + /** + * ocr识别结果 + * @param id ocrId + * @return 识别结果 + */ + @GetMapping("/ocrResult") + public CzgResult ocrResult(@RequestParam Long id) { + return CzgResult.success(consStockFlowService.ocrDetail(id)); + } + + /** * 耗材入库 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkOcrDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkOcrDTO.java new file mode 100644 index 000000000..4feceff8b --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkOcrDTO.java @@ -0,0 +1,43 @@ + +package com.czg.market.dto; + +import java.io.Serializable; +import java.time.LocalDateTime; +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.experimental.Accessors; +import java.io.Serial; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ocr识别结果 实体类。 + * + * @author zs + * @since 2025-11-26 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class MkOcrDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Integer id; + + /** + * 响应内容 + */ + private String resp; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + private Integer shopId; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkOcr.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkOcr.java new file mode 100644 index 000000000..636bdb1f0 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkOcr.java @@ -0,0 +1,49 @@ +package com.czg.market.entity; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; +import java.time.LocalDateTime; + +import java.io.Serial; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ocr识别结果 实体类。 + * + * @author zs + * @since 2025-11-26 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("mk_ocr") +public class MkOcr implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Auto) + private Integer id; + + /** + * 响应内容 + */ + private String resp; + + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + + private Long shopId; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkOcrService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkOcrService.java new file mode 100644 index 000000000..a1918fa25 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkOcrService.java @@ -0,0 +1,14 @@ +package com.czg.market.service; + +import com.mybatisflex.core.service.IService; +import com.czg.market.entity.MkOcr; + +/** + * ocr识别结果 服务层。 + * + * @author zs + * @since 2025-11-26 + */ +public interface MkOcrService extends IService { + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java index 77faab791..aca4cb621 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java @@ -78,5 +78,7 @@ public interface ConsStockFlowService extends IService { */ void saveFlow(ConsStockFlow entity); - ConsInOutStockHeadParam ocr(String originalFilename, InputStream inputStream); + Integer ocr(String originalFilename, InputStream inputStream); + + ConsInOutStockHeadParam ocrDetail(Long id); } diff --git a/cash-service/code-generator/src/main/java/com/czg/Main.java b/cash-service/code-generator/src/main/java/com/czg/Main.java index 2c2e58900..2a7f179b6 100644 --- a/cash-service/code-generator/src/main/java/com/czg/Main.java +++ b/cash-service/code-generator/src/main/java/com/czg/Main.java @@ -29,13 +29,13 @@ public class Main { // orSqlTest(); - String packageName = "system"; +// String packageName = "system"; // String packageName = "account"; // String packageName = "product"; -// String packageName = "market"; + String packageName = "market"; // tableName 指定需要生成的表 - String tableName = "sys_devices"; - String author = "ww"; + String tableName = "mk_ocr"; + String author = "zs"; //是否生成DTO实体 默认生成 boolean isGenerateDto = true; diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkOcrMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkOcrMapper.java new file mode 100644 index 000000000..abc5ef710 --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkOcrMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.market.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.market.entity.MkOcr; + +/** + * ocr识别结果 映射层。 + * + * @author zs + * @since 2025-11-26 + */ +public interface MkOcrMapper extends BaseMapper { + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkOcrServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkOcrServiceImpl.java new file mode 100644 index 000000000..d3046f1e8 --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkOcrServiceImpl.java @@ -0,0 +1,18 @@ +package com.czg.service.market.service.impl; + +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.market.entity.MkOcr; +import com.czg.market.service.MkOcrService; +import com.czg.service.market.mapper.MkOcrMapper; +import org.springframework.stereotype.Service; + +/** + * ocr识别结果 服务层实现。 + * + * @author zs + * @since 2025-11-26 + */ +@Service +public class MkOcrServiceImpl extends ServiceImpl implements MkOcrService{ + +} diff --git a/cash-service/market-service/src/main/resources/mapper/MkOcrMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkOcrMapper.xml new file mode 100644 index 000000000..4f8e5a62d --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkOcrMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index 6156d523e..102bc59ba 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -1729,9 +1729,12 @@ public class OrderInfoServiceImpl extends ServiceImpl { + String infoStr = AliOcrUtil.appCall(inputStream, originalFilename); + SaleOrderDTO saleOrderDTO = JSONObject.parseObject(infoStr, SaleOrderDTO.class); - ArrayList bodyList = new ArrayList<>(); - Set nameList = saleOrderDTO.getItems().stream().map(SaleOrderDTO.Item::getConName).collect(Collectors.toSet()); - Map consInfoMap = new HashMap<>(); - if (!nameList.isEmpty()) { - consInfoMap = consInfoMapper.selectListByQuery(new QueryWrapper().in(ConsInfo::getConName, nameList)) - .stream().collect(Collectors.toMap(ConsInfo::getConName, consInfo -> consInfo)); - } - ArrayList unInCons = new ArrayList<>(); - for (SaleOrderDTO.Item item : saleOrderDTO.getItems()) { - ConsInfo consInfo = consInfoMap.get(item.getConName()); - if (consInfo == null) { - unInCons.add(item); - continue; + ArrayList bodyList = new ArrayList<>(); + Set nameList = saleOrderDTO.getItems().stream().map(SaleOrderDTO.Item::getConName).collect(Collectors.toSet()); + Map consInfoMap = new HashMap<>(); + if (!nameList.isEmpty()) { + consInfoMap = consInfoMapper.selectListByQuery(new QueryWrapper().in(ConsInfo::getConName, nameList)) + .stream().collect(Collectors.toMap(ConsInfo::getConName, consInfo -> consInfo)); + } + ArrayList unInCons = new ArrayList<>(); + for (SaleOrderDTO.Item item : saleOrderDTO.getItems()) { + ConsInfo consInfo = consInfoMap.get(item.getConName()); + if (consInfo == null) { + unInCons.add(item); + continue; + } + bodyList.add(new ConsInOutStockBodyParam() + .setConId(consInfo.getId().toString()) + .setConName(consInfo.getConName()) + .setPurchasePrice(new BigDecimal(item.getPurchasePrice())) + .setUnitName(item.getUnitName()) + .setSubTotal(new BigDecimal(item.getSubTotal())) + .setInOutNumber(new BigDecimal(item.getInOutNumber()))); } - bodyList.add(new ConsInOutStockBodyParam() - .setConId(consInfo.getId().toString()) - .setConName(consInfo.getConName()) - .setPurchasePrice(new BigDecimal(item.getPurchasePrice())) - .setUnitName(item.getUnitName()) - .setSubTotal(new BigDecimal(item.getSubTotal())) - .setInOutNumber(new BigDecimal(item.getInOutNumber()))); - } - ConsInOutStockHeadParam headParam = new ConsInOutStockHeadParam(); - headParam.setBatchNo(saleOrderDTO.getOrderNumber()) - .setInOutDate(LocalDate.parse(saleOrderDTO.getDate())) - .setAmountPayable(new BigDecimal(saleOrderDTO.getTotalAmount())) - .setBodyList(bodyList) - .setUnInCons(unInCons) - .setOcrSaleOrder(saleOrderDTO); - return headParam; + ConsInOutStockHeadParam headParam = new ConsInOutStockHeadParam(); + headParam.setBatchNo(saleOrderDTO.getOrderNumber()) + .setInOutDate(LocalDate.parse(saleOrderDTO.getDate())) + .setAmountPayable(new BigDecimal(saleOrderDTO.getTotalAmount())) + .setBodyList(bodyList) + .setUnInCons(unInCons) + .setOcrSaleOrder(saleOrderDTO); + + mkOcr.setResp(JSON.toJSONString(headParam)); + ocrService.updateById(mkOcr); + }); + + return mkOcr.getId(); + } + + @Override + public ConsInOutStockHeadParam ocrDetail(Long id) { + MkOcr mkOcr = ocrService.getOne(new QueryWrapper().eq(MkOcr::getShopId, StpKit.USER.getShopId()).eq(MkOcr::getId, id)); + if (StrUtil.isNotBlank(mkOcr.getResp())) { + return JSONObject.parseObject(mkOcr.getResp(), ConsInOutStockHeadParam.class); + } + return null; } }