物料分类、物料信息导入及对应模板下载

This commit is contained in:
1378012178@qq.com 2026-03-26 15:15:26 +08:00
parent 057b3d7fdd
commit 11b01b9d0b
8 changed files with 1515 additions and 215 deletions

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nu.modules.ConfigMaterial.entity.ConfigMaterialInfo;
import com.nu.modules.ConfigMaterial.entity.ConfigMaterialTypeImportEntity;
import com.nu.modules.ConfigMaterial.service.IConfigMaterialInfoService;
import com.nu.modules.configSuppliersInfo.service.IConfigSuppliersInfoService;
import com.nu.modules.utils.PinyinUtils;
@ -17,46 +18,53 @@ import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
/**
* @Description: 物料信息
* @Author: jeecg-boot
* @Date: 2025-03-13
* @Date: 2025-03-13
* @Version: V1.0
*/
@Api(tags="物料信息")
@Api(tags = "物料信息")
@RestController
//@RequestMapping("/configMaterialInfo/configMaterialInfo")
@RequestMapping("/invoicing/configMaterialInfo")
@Slf4j
public class ConfigMaterialInfoController extends JeecgController<ConfigMaterialInfo, IConfigMaterialInfoService> {
@Autowired
private IConfigMaterialInfoService configMaterialInfoService;
/**
* 分页列表查询
*
* @param configMaterialInfo
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "物料信息-分页列表查询")
@ApiOperation(value="物料信息-分页列表查询", notes="物料信息-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<ConfigMaterialInfo>> queryPageList(ConfigMaterialInfo configMaterialInfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
@Autowired
private IConfigMaterialInfoService configMaterialInfoService;
/**
* 分页列表查询
*
* @param configMaterialInfo
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "物料信息-分页列表查询")
@ApiOperation(value = "物料信息-分页列表查询", notes = "物料信息-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<ConfigMaterialInfo>> queryPageList(ConfigMaterialInfo configMaterialInfo,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
// 自定义查询规则
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
// 自定义多选的查询规则为LIKE_WITH_OR
@ -66,165 +74,182 @@ public class ConfigMaterialInfoController extends JeecgController<ConfigMaterial
// customeRuleMap.put("izEnabled", QueryRuleEnum.LIKE_WITH_OR);
QueryWrapper<ConfigMaterialInfo> queryWrapper = QueryGenerator.initQueryWrapper(configMaterialInfo, req.getParameterMap(),customeRuleMap);
if(StringUtils.isNotBlank(configMaterialInfo.getTreeId())){
queryWrapper.apply(" (category_id = '"+configMaterialInfo.getTreeId()+"' or type_id = '"+configMaterialInfo.getTreeId()+"' or medication_id = '"+configMaterialInfo.getTreeId()+"' )");
}
if (StringUtils.isNotBlank(configMaterialInfo.getKeyWord())) {
String value = configMaterialInfo.getKeyWord();
queryWrapper.and(c -> c.like("material_name", value).or().like("pinyin", value).or().like("material_no", value));
}
Page<ConfigMaterialInfo> page = new Page<ConfigMaterialInfo>(pageNo, pageSize);
IPage<ConfigMaterialInfo> pageList = configMaterialInfoService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param configMaterialInfo
* @return
*/
@AutoLog(value = "物料信息-添加")
@ApiOperation(value="物料信息-添加", notes="物料信息-添加")
@RequiresPermissions("configMaterialInfo:config_material_info:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody ConfigMaterialInfo configMaterialInfo) {
String chinese = configMaterialInfo.getMaterialName();
String firstLetter = PinyinUtils.getFirstLetter(chinese);
configMaterialInfo.setPinyin(firstLetter);
configMaterialInfoService.save(configMaterialInfo);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param configMaterialInfo
* @return
*/
@AutoLog(value = "物料信息-编辑")
@ApiOperation(value="物料信息-编辑", notes="物料信息-编辑")
@RequiresPermissions("configMaterialInfo:config_material_info:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody ConfigMaterialInfo configMaterialInfo) {
if(StringUtils.isNotBlank(configMaterialInfo.getMaterialName())){
String chinese = configMaterialInfo.getMaterialName();
String firstLetter = PinyinUtils.getFirstLetter(chinese);
configMaterialInfo.setPinyin(firstLetter);
}
configMaterialInfoService.updateById(configMaterialInfo);
return Result.OK("操作成功!");
}
@AutoLog(value = "物料信息-编辑")
@ApiOperation(value="物料信息-编辑", notes="物料信息-编辑")
@RequiresPermissions("configMaterialInfo:config_material_info:edit")
@RequestMapping(value = "/editInfo", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> editInfo(@RequestBody ConfigMaterialInfo configMaterialInfo) {
if(StringUtils.isNotBlank(configMaterialInfo.getMaterialName())){
String chinese = configMaterialInfo.getMaterialName();
String firstLetter = PinyinUtils.getFirstLetter(chinese);
configMaterialInfo.setPinyin(firstLetter);
}
configMaterialInfoService.updateOneTwoPrice(configMaterialInfo);
configMaterialInfoService.updateById(configMaterialInfo);
return Result.OK("操作成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "物料信息-通过id删除")
@ApiOperation(value="物料信息-通过id删除", notes="物料信息-通过id删除")
@RequiresPermissions("configMaterialInfo:config_material_info:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
configMaterialInfoService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "物料信息-批量删除")
@ApiOperation(value="物料信息-批量删除", notes="物料信息-批量删除")
@RequiresPermissions("configMaterialInfo:config_material_info:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.configMaterialInfoService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "物料信息-通过id查询")
@ApiOperation(value="物料信息-通过id查询", notes="物料信息-通过id查询")
@GetMapping(value = "/queryById")
public Result<ConfigMaterialInfo> queryById(@RequestParam(name="id",required=true) String id) {
ConfigMaterialInfo configMaterialInfo = configMaterialInfoService.getById(id);
if(configMaterialInfo==null) {
return Result.error("未找到对应数据");
}
return Result.OK(configMaterialInfo);
}
/**
* 导出excel
*
* @param request
* @param configMaterialInfo
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, ConfigMaterialInfo configMaterialInfo) {
return super.exportXls(request, configMaterialInfo, ConfigMaterialInfo.class, "物料信息");
QueryWrapper<ConfigMaterialInfo> queryWrapper = QueryGenerator.initQueryWrapper(configMaterialInfo, req.getParameterMap(), customeRuleMap);
if (StringUtils.isNotBlank(configMaterialInfo.getTreeId())) {
queryWrapper.apply(" (category_id = '" + configMaterialInfo.getTreeId() + "' or type_id = '" + configMaterialInfo.getTreeId() + "' or medication_id = '" + configMaterialInfo.getTreeId() + "' )");
}
if (StringUtils.isNotBlank(configMaterialInfo.getKeyWord())) {
String value = configMaterialInfo.getKeyWord();
queryWrapper.and(c -> c.like("material_name", value).or().like("pinyin", value).or().like("material_no", value));
}
Page<ConfigMaterialInfo> page = new Page<ConfigMaterialInfo>(pageNo, pageSize);
IPage<ConfigMaterialInfo> pageList = configMaterialInfoService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequiresPermissions("configMaterialInfo:config_material_info:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, ConfigMaterialInfo.class);
* 添加
*
* @param configMaterialInfo
* @return
*/
@AutoLog(value = "物料信息-添加")
@ApiOperation(value = "物料信息-添加", notes = "物料信息-添加")
@RequiresPermissions("configMaterialInfo:config_material_info:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody ConfigMaterialInfo configMaterialInfo) {
String chinese = configMaterialInfo.getMaterialName();
String firstLetter = PinyinUtils.getFirstLetter(chinese);
configMaterialInfo.setPinyin(firstLetter);
configMaterialInfoService.save(configMaterialInfo);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param configMaterialInfo
* @return
*/
@AutoLog(value = "物料信息-编辑")
@ApiOperation(value = "物料信息-编辑", notes = "物料信息-编辑")
@RequiresPermissions("configMaterialInfo:config_material_info:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody ConfigMaterialInfo configMaterialInfo) {
if (StringUtils.isNotBlank(configMaterialInfo.getMaterialName())) {
String chinese = configMaterialInfo.getMaterialName();
String firstLetter = PinyinUtils.getFirstLetter(chinese);
configMaterialInfo.setPinyin(firstLetter);
}
configMaterialInfoService.updateById(configMaterialInfo);
return Result.OK("操作成功!");
}
@AutoLog(value = "物料信息-编辑")
@ApiOperation(value = "物料信息-编辑", notes = "物料信息-编辑")
@RequiresPermissions("configMaterialInfo:config_material_info:edit")
@RequestMapping(value = "/editInfo", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> editInfo(@RequestBody ConfigMaterialInfo configMaterialInfo) {
if (StringUtils.isNotBlank(configMaterialInfo.getMaterialName())) {
String chinese = configMaterialInfo.getMaterialName();
String firstLetter = PinyinUtils.getFirstLetter(chinese);
configMaterialInfo.setPinyin(firstLetter);
}
configMaterialInfoService.updateOneTwoPrice(configMaterialInfo);
configMaterialInfoService.updateById(configMaterialInfo);
return Result.OK("操作成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "物料信息-通过id删除")
@ApiOperation(value = "物料信息-通过id删除", notes = "物料信息-通过id删除")
@RequiresPermissions("configMaterialInfo:config_material_info:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
configMaterialInfoService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "物料信息-批量删除")
@ApiOperation(value = "物料信息-批量删除", notes = "物料信息-批量删除")
@RequiresPermissions("configMaterialInfo:config_material_info:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.configMaterialInfoService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "物料信息-通过id查询")
@ApiOperation(value = "物料信息-通过id查询", notes = "物料信息-通过id查询")
@GetMapping(value = "/queryById")
public Result<ConfigMaterialInfo> queryById(@RequestParam(name = "id", required = true) String id) {
ConfigMaterialInfo configMaterialInfo = configMaterialInfoService.getById(id);
if (configMaterialInfo == null) {
return Result.error("未找到对应数据");
}
return Result.OK(configMaterialInfo);
}
/**
* 导出类型excel模板
*
*/
@RequestMapping(value = "/exportTypeExcel")
public ModelAndView exportTypeExcel() {
return configMaterialInfoService.exportTypeExcel();
}
/**
* 导出物料信息excel模板
*
*/
@RequestMapping(value = "/exportMateriallInfoExcel")
public ModelAndView exportMateriallInfoExcel() {
return configMaterialInfoService.exportMateriallInfoExcel();
}
/**
* 通过excel导入物料信息数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importMateriallInfo", method = RequestMethod.POST)
public Result<?> importMateriallInfo(HttpServletRequest request, HttpServletResponse response) {
return configMaterialInfoService.importMateriallInfo(request);
}
/**
* 导入物料类别
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importType", method = RequestMethod.POST)
public Result<?> importType(HttpServletRequest request, HttpServletResponse response) {
return configMaterialInfoService.importType(request);
}
@AutoLog(value = "物料信息-单个物料迁移")
@ApiOperation(value="物料信息-单个物料迁移", notes="物料信息-单个物料迁移")
@RequiresPermissions("configMaterialInfo:config_material_info:edit")
@RequestMapping(value = "/wlqianyi", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> wlqianyi(@RequestBody ConfigMaterialInfo configMaterialInfo) {
configMaterialInfoService.wlqianyi(configMaterialInfo);
return Result.OK("操作成功!");
}
@AutoLog(value = "物料信息-单个物料迁移")
@ApiOperation(value = "物料信息-单个物料迁移", notes = "物料信息-单个物料迁移")
@RequiresPermissions("configMaterialInfo:config_material_info:edit")
@RequestMapping(value = "/wlqianyi", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> wlqianyi(@RequestBody ConfigMaterialInfo configMaterialInfo) {
configMaterialInfoService.wlqianyi(configMaterialInfo);
return Result.OK("操作成功!");
}
@ApiOperation(value="可配置物料的列表", notes="可配置物料的列表")
@GetMapping(value = "/getConfiguredList")
public Result<IPage<ConfigMaterialInfo>> getConfiguredList(ConfigMaterialInfo configMaterialInfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
// 自定义查询规则
Page<ConfigMaterialInfo> page = new Page<ConfigMaterialInfo>(pageNo, pageSize);
IPage<ConfigMaterialInfo> pageList = configMaterialInfoService.getConfiguredList(page, configMaterialInfo);
return Result.OK(pageList);
}
@ApiOperation(value = "可配置物料的列表", notes = "可配置物料的列表")
@GetMapping(value = "/getConfiguredList")
public Result<IPage<ConfigMaterialInfo>> getConfiguredList(ConfigMaterialInfo configMaterialInfo,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
// 自定义查询规则
Page<ConfigMaterialInfo> page = new Page<ConfigMaterialInfo>(pageNo, pageSize);
IPage<ConfigMaterialInfo> pageList = configMaterialInfoService.getConfiguredList(page, configMaterialInfo);
return Result.OK(pageList);
}
}

View File

@ -36,79 +36,75 @@ public class ConfigMaterialInfo implements Serializable {
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "id")
private java.lang.String id;
/**物料类别*/
@Excel(name = "物料类别", width = 15, dictTable = "nu_config_material_category", dicText = "category_name", dicCode = "id")
/**一级分类*/
@Excel(name = "一级分类", width = 15, dictTable = "nu_config_material_category", dicText = "category_name", dicCode = "id")
@Dict(dictTable = "nu_config_material_category", dicText = "category_name", dicCode = "id")
@ApiModelProperty(value = "物料类别")
@ApiModelProperty(value = "一级分类")
private java.lang.String categoryId;
/**物料类型*/
@Excel(name = "物料类型", width = 15, dictTable = "nu_config_material_type", dicText = "type_name", dicCode = "id")
/**二级分类*/
@Excel(name = "二级分类", width = 15, dictTable = "nu_config_material_type", dicText = "type_name", dicCode = "id")
@Dict(dictTable = "nu_config_material_type", dicText = "type_name", dicCode = "id")
@ApiModelProperty(value = "物料类型")
@ApiModelProperty(value = "二级分类")
private java.lang.String typeId;
/**用药类型*/
@Excel(name = "用药类型", width = 15, dictTable = "nu_config_material_medication", dicText = "medication_name", dicCode = "id")
/**三级分类*/
@Excel(name = "三级分类", width = 15, dictTable = "nu_config_material_medication", dicText = "medication_name", dicCode = "id")
@Dict(dictTable = "nu_config_material_medication", dicText = "medication_name", dicCode = "id")
@ApiModelProperty(value = "用药类型")
@ApiModelProperty(value = "三级分类")
private java.lang.String medicationId;
/**货品名称*/
@Excel(name = "货品名称", width = 15)
@ApiModelProperty(value = "货品名称")
/**物料名称*/
@Excel(name = "物料名称", width = 15)
@ApiModelProperty(value = "物料名称")
private java.lang.String materialName;
/**货品编码*/
@Excel(name = "货品编码", width = 15)
@ApiModelProperty(value = "货品编码")
/**物料编码*/
@Excel(name = "物料编码", width = 15)
@ApiModelProperty(value = "物料编码")
private java.lang.String materialNo;
/**规格型号*/
@Excel(name = "规格型号", width = 15)
@ApiModelProperty(value = "规格型号")
private java.lang.String specificationModel;
/**品牌型号*/
@Excel(name = "品牌型号", width = 15)
@ApiModelProperty(value = "品牌型号")
private String brandType;
/**生产厂家*/
@Excel(name = "生产厂家", width = 15)
@ApiModelProperty(value = "生产厂家")
private String manufacturer;
/**销售单价*/
@Excel(name = "销售单价", width = 15)
@ApiModelProperty(value = "销售单价")
private java.math.BigDecimal salesUnitPrice;
/**参考单价*/
@Excel(name = "参考单价", width = 15)
@ApiModelProperty(value = "参考单价")
private java.math.BigDecimal referenceUnitPrice;
/**货品单位*/
@Excel(name = "货品单位", width = 15)
@ApiModelProperty(value = "货品单位")
private java.lang.String materialUnits;
/**多单位开关 0关 1开*/
@Excel(name = "多单位开关", width = 15,replace = {"开_Y","关_N"} )
@ApiModelProperty(value = "多单位开关 0关 1开")
private java.lang.String multiUnitSwitch;
/**父级单位*/
@Excel(name = "父级单位", width = 15)
@ApiModelProperty(value = "父级单位")
private java.lang.String oneUnit;
/**父级单位兑换比例*/
@Excel(name = "父级单位兑换比例", width = 15)
@ApiModelProperty(value = "父级单位兑换比例")
private java.lang.Integer oneUnitProportion;
/**父级单位价格*/
@Excel(name = "父级单位价格", width = 15)
@ApiModelProperty(value = "父级单位价格")
private java.math.BigDecimal oneUnitPrice;
/**爷级单位*/
@Excel(name = "爷级单位", width = 15)
@ApiModelProperty(value = "爷级单位")
private java.lang.String twoUnit;
/**爷级单位兑换比例*/
@Excel(name = "爷级单位兑换比例", width = 15)
@ApiModelProperty(value = "爷级单位兑换比例")
private java.lang.Integer twoUnitProportion;
/**爷级单位价格*/
@Excel(name = "爷级单位价格", width = 15)
@ApiModelProperty(value = "爷级单位价格")
private java.math.BigDecimal twoUnitPrice;
/**多单位采购默认使用 0子集 1父级 2爷级*/
@Excel(name = "多单位采购默认使用", width = 15)
@ApiModelProperty(value = "多单位采购默认使用 0子集 1父级 2爷级")
private java.lang.String multiUnitType;
/**供应商*/
@Excel(name = "供应商", width = 15,dictTable = "nu_config_suppliers_info" , dicCode = "id" , dicText = "suppliers_name")
@ApiModelProperty(value = "供应商")
@Dict(dictTable = "nu_config_suppliers_info" , dicCode = "id" , dicText = "suppliers_name")
private java.lang.String suppliers;
@ -155,9 +151,6 @@ public class ConfigMaterialInfo implements Serializable {
@Dict(dicCode = "wl_tag_type")
private String tagType;
private String brandType;//品牌
private String manufacturer;//生产厂家
/**是否医保报销 0否 1是*/
@Dict(dicCode = "yn")
private java.lang.String izYbbx;

View File

@ -0,0 +1,195 @@
package com.nu.modules.ConfigMaterial.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description: 物料信息
* @Author: jeecg-boot
* @Date: 2025-03-13
* @Version: V1.0
*/
@Data
@TableName("nu_config_material_info")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="config_material_info对象", description="物料信息")
public class ConfigMaterialInfoImportEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**id*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "id")
private String id;
/**一级分类*/
@Excel(name = "一级分类", width = 15)
@Dict(dictTable = "nu_config_material_category", dicText = "category_name", dicCode = "id")
@ApiModelProperty(value = "一级分类")
private String categoryId;
/**二级分类*/
@Excel(name = "二级分类", width = 15)
@Dict(dictTable = "nu_config_material_type", dicText = "type_name", dicCode = "id")
@ApiModelProperty(value = "二级分类")
private String typeId;
/**三级分类*/
@Excel(name = "三级分类", width = 15)
@Dict(dictTable = "nu_config_material_medication", dicText = "medication_name", dicCode = "id")
@ApiModelProperty(value = "三级分类")
private String medicationId;
/**物料名称*/
@Excel(name = "物料名称", width = 15)
@ApiModelProperty(value = "物料名称")
private String materialName;
/**物料编码*/
@Excel(name = "物料编码", width = 15)
@ApiModelProperty(value = "物料编码")
private String materialNo;
/**规格型号*/
@Excel(name = "规格型号", width = 15)
@ApiModelProperty(value = "规格型号")
private String specificationModel;
/**品牌型号*/
@Excel(name = "品牌型号", width = 15)
@ApiModelProperty(value = "品牌型号")
private String brandType;
/**生产厂家*/
@Excel(name = "生产厂家", width = 15)
@ApiModelProperty(value = "生产厂家")
private String manufacturer;
/**销售单价*/
@ApiModelProperty(value = "销售单价")
private BigDecimal salesUnitPrice;
/**参考单价*/
@ApiModelProperty(value = "参考单价")
private BigDecimal referenceUnitPrice;
/**货品单位*/
@ApiModelProperty(value = "货品单位")
private String materialUnits;
/**多单位开关 0关 1开*/
@ApiModelProperty(value = "多单位开关 0关 1开")
private String multiUnitSwitch;
/**父级单位*/
@ApiModelProperty(value = "父级单位")
private String oneUnit;
/**父级单位兑换比例*/
@ApiModelProperty(value = "父级单位兑换比例")
private Integer oneUnitProportion;
/**父级单位价格*/
@ApiModelProperty(value = "父级单位价格")
private BigDecimal oneUnitPrice;
/**爷级单位*/
@ApiModelProperty(value = "爷级单位")
private String twoUnit;
/**爷级单位兑换比例*/
@ApiModelProperty(value = "爷级单位兑换比例")
private Integer twoUnitProportion;
/**爷级单位价格*/
@ApiModelProperty(value = "爷级单位价格")
private BigDecimal twoUnitPrice;
/**多单位采购默认使用 0子集 1父级 2爷级*/
@ApiModelProperty(value = "多单位采购默认使用 0子集 1父级 2爷级")
private String multiUnitType;
/**供应商*/
@ApiModelProperty(value = "供应商")
@Dict(dictTable = "nu_config_suppliers_info" , dicCode = "id" , dicText = "suppliers_name")
private String suppliers;
/**物料图片*/
@ApiModelProperty(value = "物料图片")
private String materialImg;
/**物料标识*/
@ApiModelProperty(value = "物料标识")
private String materialIdent;
/**是否启用 Y启用 N未启用*/
@Dict(dicCode = "iz_enabled")
@ApiModelProperty(value = "是否启用 Y启用 N未启用")
private String izEnabled;
/**是否删除 0未删除 1删除*/
@ApiModelProperty(value = "是否删除 0未删除 1删除")
@TableLogic
private String delFlag;
/**创建人*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建日期")
private Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新日期")
private Date updateTime;
/**所属部门*/
@ApiModelProperty(value = "所属部门")
private String sysOrgCode;
/**拼音*/
private String pinyin;
/**物料上限*/
private String upperLimit;
/**物料下县*/
private String lowerLimit;
/**物料标签*/
@Dict(dicCode = "wl_tag_type")
private String tagType;
/**是否医保报销 0否 1是*/
@Dict(dicCode = "yn")
private String izYbbx;
/**是否机构优惠 0否 1是*/
@Dict(dicCode = "yn")
private String izJgyh;
@TableField(exist = false)
private String izYbbxName;
@TableField(exist = false)
private String izJgyhName;
@TableField(exist = false)
private String izEnabledName;
@TableField(exist = false)
private String treeId;//树id用于查询
@TableField(exist = false)
private String kcsl;//库存数量
@TableField(exist = false)
private String checkId;//当前选择的物料id主要用于物料分配的时候当前选择的物料
@TableField(exist = false)
private String paramWlxx;//选择物料的时候物料查询信息
@TableField(exist = false)
private String categoryName;
@TableField(exist = false)
private String typeName;
@TableField(exist = false)
private String medicationName;
@TableField(exist = false)
private String tagName;
//综合搜索
@TableField(exist = false)
private String keyWord;
@TableField(exist = false)
private String suppliersName;
@TableField(exist = false)
private Integer wlNum;//累计入库物料数量
@TableField(exist = false)
private Integer qlNum;//购物车请领数量
}

View File

@ -0,0 +1,149 @@
package com.nu.modules.ConfigMaterial.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description: 物料信息
* @Author: jeecg-boot
* @Date: 2025-03-13
* @Version: V1.0
*/
@Data
@TableName("nu_config_material_info")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="config_material_info对象", description="物料分类")
public class ConfigMaterialTypeImportEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**id*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "id")
private String id;
/**一级分类*/
@Excel(name = "一级分类", width = 15)
@Dict(dictTable = "nu_config_material_category", dicText = "category_name", dicCode = "id")
@ApiModelProperty(value = "一级分类")
private String categoryId;
/**二级分类*/
@Excel(name = "二级分类", width = 15)
@Dict(dictTable = "nu_config_material_type", dicText = "type_name", dicCode = "id")
@ApiModelProperty(value = "二级分类")
private String typeId;
/**三级分类*/
@Excel(name = "三级分类", width = 15)
@Dict(dictTable = "nu_config_material_medication", dicText = "medication_name", dicCode = "id")
@ApiModelProperty(value = "三级分类")
private String medicationId;
/**货品名称*/
@ApiModelProperty(value = "货品名称")
private String materialName;
/**货品编码*/
@ApiModelProperty(value = "货品编码")
private String materialNo;
/**规格型号*/
@ApiModelProperty(value = "规格型号")
private String specificationModel;
/**销售单价*/
@ApiModelProperty(value = "销售单价")
private BigDecimal salesUnitPrice;
/**参考单价*/
@ApiModelProperty(value = "参考单价")
private BigDecimal referenceUnitPrice;
/**货品单位*/
@ApiModelProperty(value = "货品单位")
private String materialUnits;
/**多单位开关 0关 1开*/
@ApiModelProperty(value = "多单位开关 0关 1开")
private String multiUnitSwitch;
/**父级单位*/
@ApiModelProperty(value = "父级单位")
private String oneUnit;
/**父级单位兑换比例*/
@ApiModelProperty(value = "父级单位兑换比例")
private Integer oneUnitProportion;
/**父级单位价格*/
@ApiModelProperty(value = "父级单位价格")
private BigDecimal oneUnitPrice;
/**爷级单位*/
@ApiModelProperty(value = "爷级单位")
private String twoUnit;
/**爷级单位兑换比例*/
@ApiModelProperty(value = "爷级单位兑换比例")
private Integer twoUnitProportion;
/**爷级单位价格*/
@ApiModelProperty(value = "爷级单位价格")
private BigDecimal twoUnitPrice;
/**多单位采购默认使用 0子集 1父级 2爷级*/
@ApiModelProperty(value = "多单位采购默认使用 0子集 1父级 2爷级")
private String multiUnitType;
/**供应商*/
@ApiModelProperty(value = "供应商")
@Dict(dictTable = "nu_config_suppliers_info" , dicCode = "id" , dicText = "suppliers_name")
private String suppliers;
/**物料图片*/
@ApiModelProperty(value = "物料图片")
private String materialImg;
/**物料标识*/
@ApiModelProperty(value = "物料标识")
private String materialIdent;
/**是否启用 Y启用 N未启用*/
@Dict(dicCode = "iz_enabled")
@ApiModelProperty(value = "是否启用 Y启用 N未启用")
private String izEnabled;
/**是否删除 0未删除 1删除*/
@ApiModelProperty(value = "是否删除 0未删除 1删除")
@TableLogic
private String delFlag;
/**创建人*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建日期")
private Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新日期")
private Date updateTime;
/**所属部门*/
@ApiModelProperty(value = "所属部门")
private String sysOrgCode;
/**拼音*/
private String pinyin;
/**物料上限*/
private String upperLimit;
/**物料下县*/
private String lowerLimit;
/**物料标签*/
@Dict(dicCode = "wl_tag_type")
private String tagType;
private String brandType;//品牌
private String manufacturer;//生产厂家
/**是否医保报销 0否 1是*/
@Dict(dicCode = "yn")
private String izYbbx;
/**是否机构优惠 0否 1是*/
@Dict(dicCode = "yn")
private String izJgyh;
}

View File

@ -40,4 +40,10 @@ public interface ConfigMaterialInfoMapper extends BaseMapper<ConfigMaterialInfo>
void updateOneTwoPrice(@Param("params") ConfigMaterialInfo configMaterialInfo);
List<ConfigMaterialInfo> queryByWlids(@Param("ids") List<String> ids);
List<ConfigMaterialInfo> selectAllErType();
List<ConfigMaterialInfo> selectAllSanType();
List<ConfigMaterialInfo> selectAllData();
}

View File

@ -140,4 +140,42 @@
</foreach>
</where>
</select>
<select id="selectAllErType" resultType="com.nu.modules.ConfigMaterial.entity.ConfigMaterialInfo">
select yi.id as categoryId,
yi.category_name as categoryName,
er.id as typeId,
er.type_name as typeName
from nu_config_material_type er
left join nu_config_material_category yi on er.category_id = yi.id
</select>
<select id="selectAllSanType" resultType="com.nu.modules.ConfigMaterial.entity.ConfigMaterialInfo">
select yi.id as categoryId,
yi.category_name as categoryName,
er.id as typeId,
er.type_name as typeName,
san.id as medicationId,
san.medication_name as medicationName
from nu_config_material_medication san
left join nu_config_material_type er on san.type_id = er.id
left join nu_config_material_category yi on san.category_id = yi.id
</select>
<select id="selectAllData" resultType="com.nu.modules.ConfigMaterial.entity.ConfigMaterialInfo">
select info.material_name,
info.material_no,
info.specification_model,
info.brand_type,
info.manufacturer,
yi.id as categoryId,
yi.category_name as categoryName,
er.id as typeId,
er.type_name as typeName,
san.id as medicationId,
san.medication_name as medicationName
from nu_config_material_info info
left join nu_config_material_medication san on info.medication_id = san.id
left join nu_config_material_type er on info.type_id = er.id
left join nu_config_material_category yi on info.category_id = yi.id
</select>
</mapper>

View File

@ -4,6 +4,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nu.modules.ConfigMaterial.entity.ConfigMaterialInfo;
import org.apache.poi.ss.formula.functions.T;
import org.jeecg.common.api.vo.Result;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* @Description: 物料信息
@ -18,4 +23,12 @@ public interface IConfigMaterialInfoService extends IService<ConfigMaterialInfo>
IPage<ConfigMaterialInfo> getConfiguredList(Page<ConfigMaterialInfo> page, ConfigMaterialInfo configMaterialInfo);
void updateOneTwoPrice(ConfigMaterialInfo configMaterialInfo);
Result<?> importMateriallInfo(HttpServletRequest request);
Result<?> importType(HttpServletRequest request);
ModelAndView exportTypeExcel();
ModelAndView exportMateriallInfoExcel();
}

View File

@ -1,42 +1,923 @@
package com.nu.modules.ConfigMaterial.service.impl;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nu.modules.ConfigMaterial.entity.ConfigMaterialInfo;
import com.nu.modules.ConfigMaterial.mapper.ConfigMaterialInfoMapper;
import com.nu.modules.ConfigMaterial.service.IConfigMaterialInfoService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nu.modules.ConfigMaterial.entity.*;
import com.nu.modules.ConfigMaterial.mapper.ConfigMaterialInfoMapper;
import com.nu.modules.ConfigMaterial.service.IConfigMaterialCategoryService;
import com.nu.modules.ConfigMaterial.service.IConfigMaterialInfoService;
import com.nu.modules.ConfigMaterial.service.IConfigMaterialMedicationService;
import com.nu.modules.ConfigMaterial.service.IConfigMaterialTypeService;
import com.nu.modules.utils.PinyinUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.config.JeecgBaseConfig;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*;
/**
* @Description: 物料信息
* @Author: jeecg-boot
* @Date: 2025-03-13
* @Date: 2025-03-13
* @Version: V1.0
*/
@Service
public class ConfigMaterialInfoServiceImpl extends ServiceImpl<ConfigMaterialInfoMapper, ConfigMaterialInfo> implements IConfigMaterialInfoService {
@Autowired
private IConfigMaterialMedicationService medicationService;
@Autowired
private IConfigMaterialCategoryService categoryService;
@Autowired
private IConfigMaterialTypeService typeService;
@Resource
private JeecgBaseConfig jeecgBaseConfig;
@Override
public void wlqianyi(ConfigMaterialInfo configMaterialInfo) {
if (StringUtils.isEmpty(configMaterialInfo.getTypeId())){
if (StringUtils.isEmpty(configMaterialInfo.getTypeId())) {
configMaterialInfo.setTypeId("");
}
if (StringUtils.isEmpty(configMaterialInfo.getMedicationId())){
configMaterialInfo.setMedicationId( "");
if (StringUtils.isEmpty(configMaterialInfo.getMedicationId())) {
configMaterialInfo.setMedicationId("");
}
baseMapper.updateById(configMaterialInfo);
}
@Override
public IPage<ConfigMaterialInfo> getConfiguredList(Page<ConfigMaterialInfo> page, ConfigMaterialInfo configMaterialInfo) {
return baseMapper.getConfiguredList(page,configMaterialInfo);
return baseMapper.getConfiguredList(page, configMaterialInfo);
}
@Override
public void updateOneTwoPrice(ConfigMaterialInfo configMaterialInfo) {
baseMapper.updateOneTwoPrice(configMaterialInfo);
}
/**
* 一级没有的话直接新增
* 二级需要看 一级+二级组合是否存在 不存在才新增
* 三级需要看 一级+二级+三级组合是否存在 不存在才新增
* 物料前三级+物料名称+物料编码+规格型号组合是否存在 不存在才新增
*
* @param request
* @return
*/
@Override
public Result<?> importMateriallInfo(HttpServletRequest request) {
// 查询现有的所有分类组合数据
List<ConfigMaterialInfo> currErTypes = baseMapper.selectAllErType();
List<ConfigMaterialInfo> currSanTypes = baseMapper.selectAllSanType();
// 查询现有的所有物料信息
List<ConfigMaterialInfo> currWl = baseMapper.selectAllData();
// 查询现有的所有分类
List<ConfigMaterialCategory> yiHasList = categoryService.list();
// 构建缓存Map
Map<String, String> existingCategoryMap = new HashMap<>();
int maxCategorySort = 0;
for (ConfigMaterialCategory category : yiHasList) {
if (category.getCategoryName() != null) {
existingCategoryMap.put(category.getCategoryName(), category.getId());
}
if (category.getSort() != null && category.getSort() > maxCategorySort) {
maxCategorySort = category.getSort();
}
}
// 二级分类一级分类名称|二级分类名称 -> ID
Map<String, String> existingTypeMap = new HashMap<>();
for (ConfigMaterialInfo info : currErTypes) {
String categoryName = info.getCategoryName() != null ? info.getCategoryName() : "";
if (info.getTypeName() != null && info.getTypeId() != null) {
String typeKey = categoryName + "|" + info.getTypeName();
existingTypeMap.put(typeKey, info.getTypeId());
}
}
// 三级分类一级分类名称|二级分类名称|三级分类名称 -> ID
Map<String, String> existingMedicationMap = new HashMap<>();
for (ConfigMaterialInfo info : currSanTypes) {
String categoryName = info.getCategoryName() != null ? info.getCategoryName() : "";
String typeName = info.getTypeName() != null ? info.getTypeName() : "";
if (info.getMedicationName() != null && info.getMedicationId() != null) {
String medicationKey = categoryName + "|" + typeName + "|" + info.getMedicationName();
existingMedicationMap.put(medicationKey, info.getMedicationId());
}
}
// 构建物料缓存Map一级分类名称|二级分类名称|三级分类名称|物料名称|物料编码|规格型号 -> 物料ID
Map<String, String> existingMaterialMap = new HashMap<>();
for (ConfigMaterialInfo material : currWl) {
if (material.getMaterialName() != null && material.getMaterialNo() != null && material.getSpecificationModel() != null) {
String categoryName = material.getCategoryName() != null ? material.getCategoryName() : "";
String typeName = material.getTypeName() != null ? material.getTypeName() : "";
String medicationName = material.getMedicationName() != null ? material.getMedicationName() : "";
String materialKey = categoryName + "|" + typeName + "|" + medicationName + "|"
+ material.getMaterialName() + "|" + material.getMaterialNo() + "|"
+ material.getSpecificationModel();
existingMaterialMap.put(materialKey, material.getId());
}
}
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();
if (file == null) {
break;
}
ImportParams params = new ImportParams();
params.setTitleRows(2);
params.setHeadRows(1);
params.setNeedSave(true);
try {
List<ConfigMaterialInfoImportEntity> list = ExcelImportUtil.importExcel(
file.getInputStream(), ConfigMaterialInfoImportEntity.class, params);
// 校验数据
List<String> errorMessages = new ArrayList<>();
int rowNum = 4;
for (ConfigMaterialInfoImportEntity importEntity : list) {
String categoryName = importEntity.getCategoryId();
String typeName = importEntity.getTypeId();
String medicationName = importEntity.getMedicationId();
String materialName = importEntity.getMaterialName();
String materialNo = importEntity.getMaterialNo();
String specificationModel = importEntity.getSpecificationModel();
String errorMsg = validateAllData(categoryName, typeName, medicationName,
materialName, materialNo, specificationModel, rowNum);
if (errorMsg != null) {
errorMessages.add(errorMsg);
}
rowNum++;
}
if (!errorMessages.isEmpty()) {
return Result.error("文件导入失败,请检查以下数据:\n" + String.join("\n", errorMessages));
}
// 收集需要新增的数据
Map<String, ConfigMaterialCategory> newCategoryMap = new LinkedHashMap<>();
Map<String, ConfigMaterialType> newTypeMap = new LinkedHashMap<>();
Map<String, ConfigMaterialMedication> newMedicationMap = new LinkedHashMap<>();
List<ConfigMaterialInfo> newMaterialList = new ArrayList<>();
// 临时存储新增的一级分类ID
Map<String, String> tempCategoryIdMap = new HashMap<>();
rowNum = 3;
for (ConfigMaterialInfoImportEntity importEntity : list) {
String categoryName = importEntity.getCategoryId();
String typeName = importEntity.getTypeId();
String medicationName = importEntity.getMedicationId();
String materialName = importEntity.getMaterialName();
String materialNo = importEntity.getMaterialNo();
String specificationModel = importEntity.getSpecificationModel();
String brandType = importEntity.getBrandType();
String manufacturer = importEntity.getManufacturer();
// 处理空值
if (brandType == null || brandType.trim().isEmpty()) {
brandType = "";
}
if (manufacturer == null) {
manufacturer = "";
}
String categoryId = null;
String typeId = null;
String medicationId = null;
// 处理空值
String safeCategoryName = categoryName != null ? categoryName : "";
String safeTypeName = typeName != null ? typeName : "";
String safeMedicationName = medicationName != null ? medicationName : "";
// 1. 处理一级分类完全复制importType的逻辑
if (categoryName != null && !categoryName.trim().isEmpty()) {
if (existingCategoryMap.containsKey(categoryName)) {
categoryId = existingCategoryMap.get(categoryName);
} else if (tempCategoryIdMap.containsKey(categoryName)) {
categoryId = tempCategoryIdMap.get(categoryName);
} else {
ConfigMaterialCategory newCategory = new ConfigMaterialCategory();
newCategory.setId(IdUtil.simpleUUID());
newCategory.setCategoryName(categoryName);
newCategory.setIzEnabled("Y");
newCategory.setCreateTime(new Date());
newCategory.setSort(++maxCategorySort);
newCategoryMap.put(categoryName, newCategory);
categoryId = newCategory.getId();
tempCategoryIdMap.put(categoryName, categoryId);
}
}
// 2. 处理二级分类完全复制importType的逻辑
if (typeName != null && !typeName.trim().isEmpty() && categoryId != null) {
String typeKey = safeCategoryName + "|" + safeTypeName;
if (existingTypeMap.containsKey(typeKey)) {
typeId = existingTypeMap.get(typeKey);
} else {
// 检查是否已经在本次新增中
boolean found = false;
for (ConfigMaterialType newType : newTypeMap.values()) {
String newTypeCategoryName = "";
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(newType.getCategoryId())) {
newTypeCategoryName = entry.getKey();
break;
}
}
String newTypeKey = newTypeCategoryName + "|" + newType.getTypeName();
if (newTypeKey.equals(typeKey)) {
typeId = newType.getId();
found = true;
break;
}
}
if (!found) {
ConfigMaterialType newType = new ConfigMaterialType();
newType.setId(IdUtil.simpleUUID());
newType.setCategoryId(categoryId);
newType.setTypeName(typeName);
newType.setIzEnabled("Y");
newType.setCreateTime(new Date());
newTypeMap.put(typeKey, newType);
typeId = newType.getId();
}
}
}
// 3. 处理三级分类完全复制importType的逻辑
if (medicationName != null && !medicationName.trim().isEmpty() && categoryId != null && typeId != null) {
String medicationKey = safeCategoryName + "|" + safeTypeName + "|" + safeMedicationName;
if (!existingMedicationMap.containsKey(medicationKey)) {
// 检查是否已经在本次新增中
boolean found = false;
for (ConfigMaterialMedication newMedication : newMedicationMap.values()) {
String newMedicationCategoryName = "";
String newMedicationTypeName = "";
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(newMedication.getCategoryId())) {
newMedicationCategoryName = entry.getKey();
break;
}
}
for (ConfigMaterialType newType : newTypeMap.values()) {
if (newType.getId().equals(newMedication.getTypeId())) {
newMedicationTypeName = newType.getTypeName();
break;
}
}
String newKey = newMedicationCategoryName + "|" + newMedicationTypeName + "|" + newMedication.getMedicationName();
if (newKey.equals(medicationKey)) {
medicationId = newMedication.getId();
found = true;
break;
}
}
if (!found) {
ConfigMaterialMedication newMedication = new ConfigMaterialMedication();
newMedication.setId(IdUtil.simpleUUID());
newMedication.setCategoryId(categoryId);
newMedication.setTypeId(typeId);
newMedication.setMedicationName(medicationName);
newMedication.setIzEnabled("Y");
newMedication.setCreateTime(new Date());
newMedicationMap.put(medicationKey, newMedication);
medicationId = newMedication.getId();
}
} else {
medicationId = existingMedicationMap.get(medicationKey);
}
}
// 4. 处理物料信息新增的部分
String materialKey = safeCategoryName + "|" + safeTypeName + "|" + safeMedicationName + "|"
+ materialName + "|" + materialNo + "|" + specificationModel;
if (!existingMaterialMap.containsKey(materialKey)) {
// 检查是否已经在本次新增中
boolean materialExists = false;
for (ConfigMaterialInfo newMaterial : newMaterialList) {
String newMaterialKey = (newMaterial.getCategoryName() != null ? newMaterial.getCategoryName() : "") + "|"
+ (newMaterial.getTypeName() != null ? newMaterial.getTypeName() : "") + "|"
+ (newMaterial.getMedicationName() != null ? newMaterial.getMedicationName() : "") + "|"
+ newMaterial.getMaterialName() + "|" + newMaterial.getMaterialNo() + "|"
+ newMaterial.getSpecificationModel();
if (newMaterialKey.equals(materialKey)) {
materialExists = true;
break;
}
}
if (!materialExists) {
ConfigMaterialInfo newMaterial = new ConfigMaterialInfo();
newMaterial.setId(IdUtil.simpleUUID());
newMaterial.setCategoryId(categoryId);
newMaterial.setTypeId(typeId);
newMaterial.setMedicationId(medicationId);
newMaterial.setCategoryName(categoryName);
newMaterial.setTypeName(typeName);
newMaterial.setMedicationName(medicationName);
newMaterial.setMaterialName(materialName);
newMaterial.setPinyin(PinyinUtils.getFirstLetter(materialName));
newMaterial.setMaterialNo(materialNo);
newMaterial.setSpecificationModel(specificationModel);
newMaterial.setBrandType(brandType);
newMaterial.setManufacturer(manufacturer);
newMaterial.setIzEnabled("Y");
newMaterial.setDelFlag("0");
newMaterial.setCreateTime(new Date());
newMaterialList.add(newMaterial);
}
}
rowNum++;
}
// 批量保存一级分类完全复制importType的逻辑
if (!newCategoryMap.isEmpty()) {
List<ConfigMaterialCategory> categoryList = new ArrayList<>(newCategoryMap.values());
categoryService.saveBatch(categoryList);
for (ConfigMaterialCategory category : categoryList) {
existingCategoryMap.put(category.getCategoryName(), category.getId());
tempCategoryIdMap.put(category.getCategoryName(), category.getId());
}
}
// 批量保存二级分类完全复制importType的逻辑
if (!newTypeMap.isEmpty()) {
List<ConfigMaterialType> typeList = new ArrayList<>(newTypeMap.values());
for (ConfigMaterialType type : typeList) {
String oldCategoryId = type.getCategoryId();
if (tempCategoryIdMap.containsValue(oldCategoryId)) {
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(oldCategoryId)) {
type.setCategoryId(entry.getValue());
break;
}
}
}
}
typeService.saveBatch(typeList);
for (ConfigMaterialType type : typeList) {
String categoryName = null;
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(type.getCategoryId())) {
categoryName = entry.getKey();
break;
}
}
if (categoryName != null) {
String typeKey = categoryName + "|" + type.getTypeName();
existingTypeMap.put(typeKey, type.getId());
}
}
}
// 批量保存三级分类完全复制importType的逻辑
if (!newMedicationMap.isEmpty()) {
List<ConfigMaterialMedication> medicationList = new ArrayList<>(newMedicationMap.values());
for (ConfigMaterialMedication medication : medicationList) {
String oldCategoryId = medication.getCategoryId();
if (tempCategoryIdMap.containsValue(oldCategoryId)) {
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(oldCategoryId)) {
medication.setCategoryId(entry.getValue());
break;
}
}
}
String oldTypeId = medication.getTypeId();
for (ConfigMaterialType type : newTypeMap.values()) {
if (type.getId().equals(oldTypeId)) {
medication.setTypeId(type.getId());
break;
}
}
}
medicationService.saveBatch(medicationList);
}
// 批量保存物料信息
int savedMaterialCount = 0;
if (!newMaterialList.isEmpty()) {
// 更新物料中的分类ID为真实ID
for (ConfigMaterialInfo material : newMaterialList) {
// 更新categoryId
String oldCategoryId = material.getCategoryId();
if (oldCategoryId != null && tempCategoryIdMap.containsValue(oldCategoryId)) {
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(oldCategoryId)) {
material.setCategoryId(entry.getValue());
break;
}
}
}
// 更新typeId
String oldTypeId = material.getTypeId();
if (oldTypeId != null) {
for (ConfigMaterialType type : newTypeMap.values()) {
if (type.getId().equals(oldTypeId)) {
material.setTypeId(type.getId());
break;
}
}
// 如果在新类型中没找到尝试在现有类型中查找
if (material.getTypeId() == null) {
for (Map.Entry<String, String> entry : existingTypeMap.entrySet()) {
if (entry.getValue().equals(oldTypeId)) {
material.setTypeId(entry.getValue());
break;
}
}
}
}
// 更新medicationId
String oldMedicationId = material.getMedicationId();
if (oldMedicationId != null) {
for (ConfigMaterialMedication medication : newMedicationMap.values()) {
if (medication.getId().equals(oldMedicationId)) {
material.setMedicationId(medication.getId());
break;
}
}
// 如果在新三级分类中没找到尝试在现有三级分类中查找
if (material.getMedicationId() == null) {
for (Map.Entry<String, String> entry : existingMedicationMap.entrySet()) {
if (entry.getValue().equals(oldMedicationId)) {
material.setMedicationId(entry.getValue());
break;
}
}
}
}
}
saveBatch(newMaterialList);
savedMaterialCount = newMaterialList.size();
}
String resultMsg = String.format("文件导入成功!新增一级分类:%d个新增二级分类%d个新增三级分类%d个新增物料%d个",
newCategoryMap.size(), newTypeMap.size(), newMedicationMap.size(), savedMaterialCount);
return Result.ok(resultMsg);
} catch (Exception e) {
String msg = e.getMessage();
log.error(msg, e);
if (msg != null && msg.indexOf("Duplicate entry") >= 0) {
return Result.error("文件导入失败:有重复数据!");
} else {
return Result.error("文件导入失败:" + e.getMessage());
}
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return Result.error("文件导入失败!");
}
/**
* 校验所有数据包括分类和物料信息
*/
private String validateAllData(String categoryName, String typeName, String medicationName,
String materialName, String materialNo, String specificationModel, int rowNum) {
boolean hasCategory = categoryName != null && !categoryName.trim().isEmpty();
boolean hasType = typeName != null && !typeName.trim().isEmpty();
boolean hasMedication = medicationName != null && !medicationName.trim().isEmpty();
boolean hasMaterialName = materialName != null && !materialName.trim().isEmpty();
boolean hasMaterialNo = materialNo != null && !materialNo.trim().isEmpty();
boolean hasSpecificationModel = specificationModel != null && !specificationModel.trim().isEmpty();
// 必须有一级分类
if (!hasCategory) {
return String.format("第%d行缺少一级分类", rowNum);
}
// 必须有二级分类
if (!hasType) {
return String.format("第%d行缺少二级分类", rowNum);
}
// 必须有三级分类
if (!hasMedication) {
return String.format("第%d行缺少三级分类", rowNum);
}
// 物料名称必须有值
if (!hasMaterialName) {
return String.format("第%d行缺少物料名称", rowNum);
}
// 物料编码必须有值
if (!hasMaterialNo) {
return String.format("第%d行缺少物料编码", rowNum);
}
// 规格型号必须有值
if (!hasSpecificationModel) {
return String.format("第%d行缺少规格型号", rowNum);
}
return null;
}
/**
* 一级没有的话直接新增
* 二级需要看 一级+二级组合是否存在 才新增
* 三级需要看 一级+二级+三级组合是否存在 才新增
*
* @param request
* @return
*/
@Override
public Result<?> importType(HttpServletRequest request) {
// 查询现有的所有分类组合数据
List<ConfigMaterialInfo> currErTypes = baseMapper.selectAllErType();
List<ConfigMaterialInfo> currSanTypes = baseMapper.selectAllSanType();
// 查询现有的所有分类
List<ConfigMaterialCategory> yiHasList = categoryService.list();
// 构建缓存Map
Map<String, String> existingCategoryMap = new HashMap<>();
int maxCategorySort = 0;
for (ConfigMaterialCategory category : yiHasList) {
if (category.getCategoryName() != null) {
existingCategoryMap.put(category.getCategoryName(), category.getId());
}
if (category.getSort() != null && category.getSort() > maxCategorySort) {
maxCategorySort = category.getSort();
}
}
// 二级分类一级分类名称|二级分类名称 -> ID
Map<String, String> existingTypeMap = new HashMap<>();
for (ConfigMaterialInfo info : currErTypes) {
String categoryName = info.getCategoryName() != null ? info.getCategoryName() : "";
if (info.getTypeName() != null && info.getTypeId() != null) {
String typeKey = categoryName + "|" + info.getTypeName();
existingTypeMap.put(typeKey, info.getTypeId());
}
}
// 三级分类一级分类名称|二级分类名称|三级分类名称 -> ID
Map<String, String> existingMedicationMap = new HashMap<>();
for (ConfigMaterialInfo info : currSanTypes) {
String categoryName = info.getCategoryName() != null ? info.getCategoryName() : "";
String typeName = info.getTypeName() != null ? info.getTypeName() : "";
if (info.getMedicationName() != null && info.getMedicationId() != null) {
String medicationKey = categoryName + "|" + typeName + "|" + info.getMedicationName();
existingMedicationMap.put(medicationKey, info.getMedicationId());
}
}
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();
if (file == null) {
break;
}
ImportParams params = new ImportParams();
params.setTitleRows(2);
params.setHeadRows(1);
params.setNeedSave(true);
try {
List<ConfigMaterialTypeImportEntity> list = ExcelImportUtil.importExcel(
file.getInputStream(), ConfigMaterialTypeImportEntity.class, params);
// 校验数据
List<String> errorMessages = new ArrayList<>();
int rowNum = 4;
for (ConfigMaterialTypeImportEntity importEntity : list) {
String categoryName = importEntity.getCategoryId();
String typeName = importEntity.getTypeId();
String medicationName = importEntity.getMedicationId();
String errorMsg = validateCategoryLevel(categoryName, typeName, medicationName, rowNum);
if (errorMsg != null) {
errorMessages.add(errorMsg);
}
rowNum++;
}
if (!errorMessages.isEmpty()) {
return Result.error("文件导入失败,请检查以下数据:\n" + String.join("\n", errorMessages));
}
// 收集需要新增的数据
Map<String, ConfigMaterialCategory> newCategoryMap = new LinkedHashMap<>();
Map<String, ConfigMaterialType> newTypeMap = new LinkedHashMap<>();
Map<String, ConfigMaterialMedication> newMedicationMap = new LinkedHashMap<>();
// 临时存储新增的一级分类ID
Map<String, String> tempCategoryIdMap = new HashMap<>();
rowNum = 3;
for (ConfigMaterialTypeImportEntity importEntity : list) {
String categoryName = importEntity.getCategoryId();
String typeName = importEntity.getTypeId();
String medicationName = importEntity.getMedicationId();
String categoryId = null;
String typeId = null;
// 处理空值
String safeCategoryName = categoryName != null ? categoryName : "";
String safeTypeName = typeName != null ? typeName : "";
// 1. 处理一级分类
if (categoryName != null && !categoryName.trim().isEmpty()) {
if (existingCategoryMap.containsKey(categoryName)) {
categoryId = existingCategoryMap.get(categoryName);
} else if (tempCategoryIdMap.containsKey(categoryName)) {
categoryId = tempCategoryIdMap.get(categoryName);
} else {
ConfigMaterialCategory newCategory = new ConfigMaterialCategory();
newCategory.setId(IdUtil.simpleUUID());
newCategory.setCategoryName(categoryName);
newCategory.setIzEnabled("Y");
newCategory.setCreateTime(new Date());
newCategory.setSort(++maxCategorySort);
newCategoryMap.put(categoryName, newCategory);
categoryId = newCategory.getId();
tempCategoryIdMap.put(categoryName, categoryId);
}
}
// 2. 处理二级分类按一级分类名称+二级分类名称组合判断
if (typeName != null && !typeName.trim().isEmpty() && categoryId != null) {
String typeKey = safeCategoryName + "|" + safeTypeName;
if (existingTypeMap.containsKey(typeKey)) {
typeId = existingTypeMap.get(typeKey);
} else {
// 检查是否已经在本次新增中
boolean found = false;
for (ConfigMaterialType newType : newTypeMap.values()) {
// 获取新类型的分类名称
String newTypeCategoryName = "";
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(newType.getCategoryId())) {
newTypeCategoryName = entry.getKey();
break;
}
}
String newTypeKey = newTypeCategoryName + "|" + newType.getTypeName();
if (newTypeKey.equals(typeKey)) {
typeId = newType.getId();
found = true;
break;
}
}
if (!found) {
ConfigMaterialType newType = new ConfigMaterialType();
newType.setId(IdUtil.simpleUUID());
newType.setCategoryId(categoryId);
newType.setTypeName(typeName);
newType.setIzEnabled("Y");
newType.setCreateTime(new Date());
newTypeMap.put(typeKey, newType);
typeId = newType.getId();
}
}
}
// 3. 处理三级分类按一级分类名称+二级分类名称+三级分类名称组合判断
if (medicationName != null && !medicationName.trim().isEmpty() && categoryId != null && typeId != null) {
String medicationKey = safeCategoryName + "|" + safeTypeName + "|" + medicationName;
if (!existingMedicationMap.containsKey(medicationKey)) {
// 检查是否已经在本次新增中
boolean found = false;
for (ConfigMaterialMedication newMedication : newMedicationMap.values()) {
// 获取新三级分类的分类名称和类型名称
String newMedicationCategoryName = "";
String newMedicationTypeName = "";
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(newMedication.getCategoryId())) {
newMedicationCategoryName = entry.getKey();
break;
}
}
for (ConfigMaterialType newType : newTypeMap.values()) {
if (newType.getId().equals(newMedication.getTypeId())) {
newMedicationTypeName = newType.getTypeName();
break;
}
}
String newKey = newMedicationCategoryName + "|" + newMedicationTypeName + "|" + newMedication.getMedicationName();
if (newKey.equals(medicationKey)) {
found = true;
break;
}
}
if (!found) {
ConfigMaterialMedication newMedication = new ConfigMaterialMedication();
newMedication.setId(IdUtil.simpleUUID());
newMedication.setCategoryId(categoryId);
newMedication.setTypeId(typeId);
newMedication.setMedicationName(medicationName);
newMedication.setIzEnabled("Y");
newMedication.setCreateTime(new Date());
newMedicationMap.put(medicationKey, newMedication);
}
}
}
rowNum++;
}
// 批量保存一级分类
if (!newCategoryMap.isEmpty()) {
List<ConfigMaterialCategory> categoryList = new ArrayList<>(newCategoryMap.values());
categoryService.saveBatch(categoryList);
for (ConfigMaterialCategory category : categoryList) {
existingCategoryMap.put(category.getCategoryName(), category.getId());
tempCategoryIdMap.put(category.getCategoryName(), category.getId());
}
}
// 批量保存二级分类
if (!newTypeMap.isEmpty()) {
List<ConfigMaterialType> typeList = new ArrayList<>(newTypeMap.values());
// 更新categoryId为真实ID
for (ConfigMaterialType type : typeList) {
String oldCategoryId = type.getCategoryId();
if (tempCategoryIdMap.containsValue(oldCategoryId)) {
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(oldCategoryId)) {
type.setCategoryId(entry.getValue());
break;
}
}
}
}
typeService.saveBatch(typeList);
// 更新缓存
for (ConfigMaterialType type : typeList) {
String categoryName = null;
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(type.getCategoryId())) {
categoryName = entry.getKey();
break;
}
}
if (categoryName != null) {
String typeKey = categoryName + "|" + type.getTypeName();
existingTypeMap.put(typeKey, type.getId());
}
}
}
// 批量保存三级分类
if (!newMedicationMap.isEmpty()) {
List<ConfigMaterialMedication> medicationList = new ArrayList<>(newMedicationMap.values());
// 更新categoryId和typeId为真实ID
for (ConfigMaterialMedication medication : medicationList) {
// 更新categoryId
String oldCategoryId = medication.getCategoryId();
if (tempCategoryIdMap.containsValue(oldCategoryId)) {
for (Map.Entry<String, String> entry : tempCategoryIdMap.entrySet()) {
if (entry.getValue().equals(oldCategoryId)) {
medication.setCategoryId(entry.getValue());
break;
}
}
}
// 更新typeId
String oldTypeId = medication.getTypeId();
for (ConfigMaterialType type : newTypeMap.values()) {
if (type.getId().equals(oldTypeId)) {
medication.setTypeId(type.getId());
break;
}
}
}
medicationService.saveBatch(medicationList);
}
String resultMsg = String.format("文件导入成功!新增一级分类:%d个新增二级分类%d个新增三级分类%d个",
newCategoryMap.size(), newTypeMap.size(), newMedicationMap.size());
return Result.ok(resultMsg);
} catch (Exception e) {
String msg = e.getMessage();
log.error(msg, e);
if (msg != null && msg.indexOf("Duplicate entry") >= 0) {
return Result.error("文件导入失败:有重复数据!");
} else {
return Result.error("文件导入失败:" + e.getMessage());
}
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return Result.error("文件导入失败!");
}
@Override
public ModelAndView exportTypeExcel() {
String title = "物料分类导入模板";
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<ConfigMaterialTypeImportEntity> exportList = List.of();
// Step.3 AutoPoi 导出Excel
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
//此处设置的filename无效 ,前端会重更新设置一下
mv.addObject(NormalExcelConstants.FILE_NAME, title);
mv.addObject(NormalExcelConstants.CLASS, ConfigMaterialTypeImportEntity.class);
//update-begin--Author:liusq Date:20210126 for图片导出报错ImageBasePath未设置--------------------
ExportParams exportParams = new ExportParams(title, "下载人:" + sysUser.getRealname(), title);
exportParams.setImageBasePath(jeecgBaseConfig.getPath().getUpload());
//update-end--Author:liusq Date:20210126 for图片导出报错ImageBasePath未设置----------------------
mv.addObject(NormalExcelConstants.PARAMS, exportParams);
mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
return mv;
}
@Override
public ModelAndView exportMateriallInfoExcel() {
String title = "物料信息导入模板";
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<ConfigMaterialInfoImportEntity> exportList = List.of();
// Step.3 AutoPoi 导出Excel
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
//此处设置的filename无效 ,前端会重更新设置一下
mv.addObject(NormalExcelConstants.FILE_NAME, title);
mv.addObject(NormalExcelConstants.CLASS, ConfigMaterialInfoImportEntity.class);
//update-begin--Author:liusq Date:20210126 for图片导出报错ImageBasePath未设置--------------------
ExportParams exportParams = new ExportParams(title, "下载人:" + sysUser.getRealname(), title);
exportParams.setImageBasePath(jeecgBaseConfig.getPath().getUpload());
//update-end--Author:liusq Date:20210126 for图片导出报错ImageBasePath未设置----------------------
mv.addObject(NormalExcelConstants.PARAMS, exportParams);
mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
return mv;
}
/**
* 校验分类层级关系返回错误信息如果没有错误返回null
*/
private String validateCategoryLevel(String categoryName, String typeName, String medicationName, int rowNum) {
boolean hasCategory = categoryName != null && !categoryName.trim().isEmpty();
boolean hasType = typeName != null && !typeName.trim().isEmpty();
boolean hasMedication = medicationName != null && !medicationName.trim().isEmpty();
// 必须有一级分类
if (!hasCategory) {
return String.format("第%d行缺少一级分类", rowNum);
}
// 有三级分类但缺少二级分类
if (hasMedication && !hasType) {
return String.format("第%d行缺少二级分类", rowNum);
}
return null;
}
}