From 061f7f275cdfca7e2a08baf980ec0b244b9704ac Mon Sep 17 00:00:00 2001 From: NiuZiYuan Date: Thu, 15 May 2025 17:16:07 +0800 Subject: [PATCH 1/3] dev --- .../entity/social/SocialDirectoryMongodb.java | 45 ++++++ .../social/SocialDirectoryService.java | 139 ++++++++++++++++-- 2 files changed, 169 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/syjiaer/clinic/server/entity/social/SocialDirectoryMongodb.java diff --git a/src/main/java/com/syjiaer/clinic/server/entity/social/SocialDirectoryMongodb.java b/src/main/java/com/syjiaer/clinic/server/entity/social/SocialDirectoryMongodb.java new file mode 100644 index 0000000..204e627 --- /dev/null +++ b/src/main/java/com/syjiaer/clinic/server/entity/social/SocialDirectoryMongodb.java @@ -0,0 +1,45 @@ +package com.syjiaer.clinic.server.entity.social; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 医保目录 + *

+ * + * @author NiuZiYuan + * @since 2025-04-17 + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("social_directory") +@ApiModel(value = "SocialDirectory对象", description = "医保目录") +public class SocialDirectoryMongodb{ + + + @ApiModelProperty("医保目录编码") + private String code; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("检索关键词") + private String keyword; + + @ApiModelProperty("类型") + private Integer type; + + @ApiModelProperty("生产企业") + private String producer; +} diff --git a/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java b/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java index a467056..ed56f32 100644 --- a/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java +++ b/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java @@ -13,7 +13,15 @@ import com.syjiaer.clinic.server.entity.social.vo.SocialDirectoryView; import com.syjiaer.clinic.server.mapper.goods.GoodsMapper; import com.syjiaer.clinic.server.mapper.social.*; import com.syjiaer.clinic.server.service.BaseService; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.index.Index; +import org.springframework.data.mongodb.core.index.IndexInfo; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,6 +55,9 @@ public class SocialDirectoryService extends BaseService { @Autowired private SocialDirectoryVersionService socialDirectoryVersionService; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired private GoodsMapper goodsMapper; @@ -157,11 +168,53 @@ public class SocialDirectoryService extends BaseService { if(list.isEmpty()){ return null; } - socialDirectoryMapper.insert(list, 100); + socialDirectoryMapper.insert(list, 100); + initMongoDb(); + saveListToMongoDb(list); return next_version_name; } + private void saveToMongoDb(SocialDirectory socialDirectory){ + SocialDirectoryMongodb socialDirectoryMongodb = new SocialDirectoryMongodb(); + BeanUtils.copyProperties(socialDirectory, socialDirectoryMongodb); + Query query = new Query(Criteria.where("code").is(socialDirectoryMongodb.getCode())); + if (mongoTemplate.exists(query, SocialDirectoryMongodb.class,"social_directory")) { + + Update update = new Update(); + update.set("name", socialDirectoryMongodb.getName()); + update.set("keyword", socialDirectoryMongodb.getKeyword()); + update.set("type", socialDirectoryMongodb.getType()); + update.set("producer", socialDirectoryMongodb.getProducer()); + mongoTemplate.updateFirst(query, update, SocialDirectoryMongodb.class,"social_directory"); + }else{ + mongoTemplate.insert(socialDirectoryMongodb, "social_directory"); + } + } + + + private void saveListToMongoDb(List list){ + for(SocialDirectory socialDirectory:list){ + saveToMongoDb(socialDirectory); + } + } + + private void initMongoDb(){ + if (!mongoTemplate.collectionExists("social_directory")) { + System.out.println("创建了social_directory集合"); + mongoTemplate.createCollection("social_directory"); + } + + List indexInfos = mongoTemplate.indexOps("social_directory").getIndexInfo(); + //判断索引是否存在 + if (indexInfos.stream().noneMatch(index -> index.getName().equals("code_uni"))) { + System.out.println("创建了code索引"); + Index index = new Index().on("code", Sort.Direction.ASC).named("code_uni").unique(); + mongoTemplate.indexOps("social_directory").ensureIndex(index); + } + } + + /* * 搜索接口 * @param keyword 关键字 @@ -175,6 +228,13 @@ public class SocialDirectoryService extends BaseService { * @param keyword 关键字 */ public Page search(String keyword, List typeList, int pageNum, int pageSize) { + + //mongodb分页 + + + + + QueryWrapper codeqw = new QueryWrapper<>(); if (typeList.size() == 1) { codeqw.eq("type", typeList.get(0)); @@ -310,10 +370,50 @@ public class SocialDirectoryService extends BaseService { */ public List fullList(List codeList) { List socialDirectoryViewList = new ArrayList<>(); - for (String code : codeList) { - SocialDirectoryView socialDirectoryView = fullInfo(code); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.in("code",codeList); + List socialDirectoryList = socialDirectoryMapper.selectList(queryWrapper); + List socialDirectoryUpinfoList = socialDirectoryUpinfoMapper.selectList(queryWrapper); + List socialDirectoryLimitList = socialDirectoryLimitMapper.selectList(queryWrapper); + List socialDirectorySelfList = socialDirectorySelfMapper.selectList(queryWrapper); + Map upinfoMap = socialDirectoryUpinfoList.stream() + .collect(Collectors.toMap(SocialDirectoryUpinfo::getCode, upinfo -> upinfo)); + Map limitMap = socialDirectoryLimitList.stream() + .collect(Collectors.toMap(SocialDirectoryLimit::getCode, limit -> limit)); + Map selfMap = socialDirectorySelfList.stream() + .collect(Collectors.toMap(SocialDirectorySelf::getCode, self -> self)); + + for(SocialDirectory socialDirectory : socialDirectoryList){ + SocialDirectoryView socialDirectoryView = new SocialDirectoryView(); + socialDirectoryView.setJson(JSONObject.parseObject(socialDirectory.getData())); + socialDirectoryView.setData(null); + BeanUtils.copyProperties(socialDirectory, socialDirectoryView); + // 合并 SocialDirectoryUpinfo 数据 + SocialDirectoryUpinfo upinfo = upinfoMap.get(socialDirectory.getCode()); + if (upinfo != null) { + socialDirectoryView.setBegndate(upinfo.getBegndate()); + socialDirectoryView.setEnddate(upinfo.getEnddate()); + socialDirectoryView.setWubi(upinfo.getWubi()); + socialDirectoryView.setPinyin(upinfo.getPinyin()); + } + + // 合并 SocialDirectoryLimit 数据 + SocialDirectoryLimit limit = limitMap.get(socialDirectory.getCode()); + if (limit != null) { + socialDirectoryView.setHilistLmtpricType(limit.getHilistLmtpricType()); + socialDirectoryView.setHilistPricUplmtAmt(limit.getHilistPricUplmtAmt()); + } + + // 合并 SocialDirectorySelf 数据 + SocialDirectorySelf self = selfMap.get(socialDirectory.getCode()); + if (self != null) { + socialDirectoryView.setSelfpayPropType(self.getSelfpayPropType()); + socialDirectoryView.setSelfpayProp(self.getSelfpayProp()); + } socialDirectoryViewList.add(socialDirectoryView); } + + return socialDirectoryViewList; } @@ -383,22 +483,31 @@ public class SocialDirectoryService extends BaseService { } public Page getDocList(int type, int page, int size, String keyword) { - QueryWrapper codeqw = new QueryWrapper<>(); - codeqw.eq("type", type); + + Query query = new Query(); + query.addCriteria(Criteria.where("type").is(type)); + + if (!keyword.trim().isEmpty()) { + query.addCriteria(new Criteria().orOperator( + Criteria.where("code").regex(keyword, "i"), + Criteria.where("name").regex(keyword, "i"), + Criteria.where("keyword").regex(keyword, "i"), + Criteria.where("producer").regex(keyword, "i") + )); + } + long count = mongoTemplate.count(query, SocialDirectoryMongodb.class,"social_directory"); + query.skip((long) (page - 1) * size).limit(size); + List mongodbList = mongoTemplate.find(query, SocialDirectoryMongodb.class,"social_directory"); + List codeList=new ArrayList<>(); + for(SocialDirectoryMongodb mongodb:mongodbList){ + codeList.add(mongodb.getCode()); + } + //模糊搜索 - if (!keyword.trim().isEmpty()) { - codeqw.like("name", keyword); - codeqw.or().like("code", keyword); - codeqw.or().like("keyword", keyword); - } +// // 执行查询 - codeqw.select("code"); - long count = socialDirectoryMapper.selectCount(codeqw); - - codeqw.last("LIMIT " + size + " OFFSET " + (page - 1) * size); - List codeList = listObjs(codeqw, socialDirectoryMapper, obj -> obj.toString()); Page result = new Page<>(); if (!codeList.isEmpty()) { List list = fullList(codeList); From bb48e4d67384febb1c54e9fc88791573a4f636ad Mon Sep 17 00:00:00 2001 From: NiuZiYuan Date: Thu, 15 May 2025 17:26:47 +0800 Subject: [PATCH 2/3] dev --- .../clinic/server/service/social/SocialDirectoryService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java b/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java index ed56f32..e9a255c 100644 --- a/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java +++ b/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java @@ -504,10 +504,6 @@ public class SocialDirectoryService extends BaseService { } - //模糊搜索 -// - // 执行查询 - Page result = new Page<>(); if (!codeList.isEmpty()) { List list = fullList(codeList); From 78d9cea941b56fdf4a187950c521ec7fb060099b Mon Sep 17 00:00:00 2001 From: NiuZiYuan Date: Fri, 16 May 2025 10:28:13 +0800 Subject: [PATCH 3/3] dev --- pom.xml | 8 ++-- .../inventory/InventoryPurchaseService.java | 45 +++++++++++++++++- .../excelTemplate/PurchasingTemplate.xlsx | Bin 0 -> 9720 bytes 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/excelTemplate/PurchasingTemplate.xlsx diff --git a/pom.xml b/pom.xml index 02629d5..7140ddc 100644 --- a/pom.xml +++ b/pom.xml @@ -85,8 +85,6 @@ - - org.projectlombok @@ -129,7 +127,11 @@ org.springframework.boot spring-boot-starter-data-mongodb - + + org.apache.poi + poi-ooxml + 5.2.3 + diff --git a/src/main/java/com/syjiaer/clinic/server/service/inventory/InventoryPurchaseService.java b/src/main/java/com/syjiaer/clinic/server/service/inventory/InventoryPurchaseService.java index c62c783..d763dab 100644 --- a/src/main/java/com/syjiaer/clinic/server/service/inventory/InventoryPurchaseService.java +++ b/src/main/java/com/syjiaer/clinic/server/service/inventory/InventoryPurchaseService.java @@ -18,17 +18,20 @@ import com.syjiaer.clinic.server.mapper.inventory.*; import com.syjiaer.clinic.server.mapper.manager.ManagerUserMapper; import com.syjiaer.clinic.server.service.BaseService; import com.syjiaer.clinic.server.service.goods.GoodsService; +import jakarta.annotation.Resource; +import org.apache.poi.ss.usermodel.*; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ResourceUtils; +import java.io.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; - @Service public class InventoryPurchaseService extends BaseService { @Autowired @@ -52,6 +55,7 @@ public class InventoryPurchaseService extends BaseService { @Autowired private InventoryPurchaseLogMapper inventoryPurchaseLogMapper; + /* * 创建采购订单 * @param inventoryPurchase 采购订单 @@ -417,4 +421,43 @@ public class InventoryPurchaseService extends BaseService { inventoryPurchaseMapper.update(null, updateOrder); } } + public String toExcel(List cateIdList){ + + try { + + + ClassLoader classLoader = getClass().getClassLoader(); + // 资源文件的路径 + InputStream inputStream = classLoader.getResourceAsStream("excelTemplate/PurchasingTemplate.xlsx"); + Workbook workbook = WorkbookFactory.create(inputStream); + + // 2. 获取第一个Sheet + Sheet sheet = workbook.getSheetAt(0); + + // 3. 修改内容(例如在A1单元格写入新内容) + Row row = sheet.getRow(10); + if (row == null) { + row = sheet.createRow(10); + } + Cell cell = row.getCell(0); + if (cell == null) { + cell = row.createCell(0); + } + cell.setCellValue("你好"); + + // 4. 保存为新文件 + FileOutputStream outFile = new FileOutputStream("D:\\new_excel.xlsx"); + workbook.write(outFile); + + // 5. 关闭流 + outFile.close(); + inputStream.close(); + + System.out.println("Excel文件生成成功!"); + } catch (IOException e) { + e.printStackTrace(); + } + + return ""; + } } diff --git a/src/main/resources/excelTemplate/PurchasingTemplate.xlsx b/src/main/resources/excelTemplate/PurchasingTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a73c8eeb5f5765b2b47ff2a8121ab906c621a065 GIT binary patch literal 9720 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