package com.ruoyi.web.controller.api; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.ImportParams; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.utils.WebUtils; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.dto.TErpGoodsAddDto; import com.ruoyi.system.dto.TErpGoodsInfoSaveDto; import com.ruoyi.system.dto.TErpGoodsUpdateStatusDto; import com.ruoyi.system.importExcel.TErpGoodsExcel; import com.ruoyi.system.model.*; import com.ruoyi.system.query.TErpGoodsQuery; import com.ruoyi.system.service.*; import com.ruoyi.system.vo.TErpGoodsVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** *

* erp商品 前端控制器 *

* * @author xiaochen * @since 2025-08-20 */ @RestController @RequestMapping("/t-erp-goods") @Api(tags = "供应商商品管理") public class TErpGoodsController { private final TErpGoodsService erpGoodsService; private final TokenService tokenService; private final TErpGoodsTypeService erpGoodsTypeService; private final TErpGoodsUnitService erpGoodsUnitService; private final TErpSupplierWarehousingBatchService erpSupplierWarehousingBatchService; private final TErpSupplierWarehousingService erpSupplierWarehousingService; private final TErpSupplierOutboundGoodsService erpSupplierOutboundGoodsService; private final TErpMaintenanceReminderService erpMaintenanceReminderService; private final TCrmClinicService crmClinicService; private final TCrmSupplierService crmSupplierService; @Autowired public TErpGoodsController(TErpGoodsService erpGoodsService, TokenService tokenService, TErpGoodsTypeService erpGoodsTypeService, TErpGoodsUnitService erpGoodsUnitService, TErpSupplierWarehousingBatchService erpSupplierWarehousingBatchService, TErpSupplierWarehousingService erpSupplierWarehousingService, TErpSupplierOutboundGoodsService erpSupplierOutboundGoodsService, TErpMaintenanceReminderService erpMaintenanceReminderService, TCrmClinicService crmClinicService, TCrmSupplierService crmSupplierService) { this.erpGoodsService = erpGoodsService; this.tokenService = tokenService; this.erpGoodsTypeService = erpGoodsTypeService; this.erpGoodsUnitService = erpGoodsUnitService; this.erpSupplierWarehousingBatchService = erpSupplierWarehousingBatchService; this.erpSupplierWarehousingService = erpSupplierWarehousingService; this.erpSupplierOutboundGoodsService = erpSupplierOutboundGoodsService; this.erpMaintenanceReminderService = erpMaintenanceReminderService; this.crmClinicService = crmClinicService; this.crmSupplierService = crmSupplierService; } /** * 获取erp问题上报管理列表 */ @ApiOperation(value = "供应商获取商品分页列表") @PostMapping(value = "/pageList") public R> pageList(@RequestBody TErpGoodsQuery query) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if(roleType == 4){ // 供应商 TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class) .eq(TCrmSupplier::getUserId, user.getUserId()) .last("LIMIT 1")); query.setSupplierClinicId(crmSupplier.getId()); } if(roleType == 5){ // 诊所 TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class) .eq(TCrmClinic::getUserId, user.getUserId()) .last("LIMIT 1")); query.setSupplierClinicId(crmClinic.getId()); } return R.ok(erpGoodsService.pageList(query,user)); } @ApiOperation(value = "供应商添加商品") @PostMapping(value = "/add") public R add(@Validated @RequestBody TErpGoodsAddDto dto) { SysUser user = tokenService.getLoginUser().getUser(); if (erpGoodsService.isExit(dto.getGoodsIdCode(), dto.getQuasiNumber())) { return R.fail("erp商品已存在"); } Integer roleType = user.getRoleType(); TErpGoods goods = new TErpGoods(); if(roleType == 4){ // 供应商 TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class) .eq(TCrmSupplier::getUserId, user.getUserId()) .last("LIMIT 1")); goods.setSupplierClinicId(crmSupplier.getId()); goods.setGoodsSource(1); } if(roleType == 5){ // 诊所 TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class) .eq(TCrmClinic::getUserId, user.getUserId()) .last("LIMIT 1")); goods.setSupplierClinicId(crmClinic.getId()); goods.setGoodsSource(2); } goods.setCreateId(user.getUserId().toString()); goods.setGoodsIdCode(dto.getGoodsIdCode()); goods.setQuasiNumber(dto.getQuasiNumber()); goods.setManufacturer(dto.getManufacturer()); goods.setFormulationSpec(dto.getFormulationSpec()); goods.setPackingSpec(dto.getPackingSpec()); goods.setGoodsName(dto.getGoodsName()); return R.ok(erpGoodsService.save(goods)); } @ApiOperation(value = "供应商删除商品") @DeleteMapping(value = "/delete/{id}") public R delete(@PathVariable String id) { return R.ok(erpGoodsService.removeById(id)); } /** * 启用 停用 */ @ApiOperation(value = "供应商启用 停用商品") @PostMapping(value = "/updateStatus") public R updateStatus(@RequestBody TErpGoodsUpdateStatusDto dto) { TErpGoods goods = erpGoodsService.getById(dto.getId()); if(dto.getState()==1 && goods.getTypeId()==null){ return R.fail("操作失败,请先完善商品信息"); } if(dto.getState()==1 && goods.getClinicPurchasePrice()==null){ return R.fail("操作失败,请设置供应商分佣比例后再启用"); } goods.setState(dto.getState()); boolean b = erpGoodsService.updateById(goods); return R.ok(b); } @ApiOperation(value = "供应商完善商品") @PostMapping(value = "/saveDataInfo") public R saveDataInfo(@RequestBody @Valid TErpGoodsInfoSaveDto dto) { SysUser user = tokenService.getLoginUser().getUser(); TErpGoods goods = erpGoodsService.getById(dto.getId()); BeanUtils.copyProperties(dto,goods); if(goods.getMaintenanceInterval()!=null){ List list = erpSupplierWarehousingService.list(new LambdaQueryWrapper().eq(TErpSupplierWarehousing::getGoodsId, dto.getId())); if(!list.isEmpty()){ List tErpSupplierWarehousingBatches = erpSupplierWarehousingBatchService.list(new LambdaQueryWrapper().in(TErpSupplierWarehousingBatch::getWarehousingId, list.stream().map(TErpSupplierWarehousing::getId).collect(Collectors.toList()))); for (TErpSupplierWarehousingBatch tErpSupplierWarehousingBatch : tErpSupplierWarehousingBatches) { List list1 = erpSupplierOutboundGoodsService.list(new LambdaQueryWrapper().eq(TErpSupplierOutboundGoods::getWarehousingBatchId, tErpSupplierWarehousingBatch.getId())); if(!list1.isEmpty()){ int sum = list1.stream().mapToInt(TErpSupplierOutboundGoods::getOutboundCount).sum(); if (tErpSupplierWarehousingBatch.getWarehousingNumber()-sum>0) { // 生成保养单 TErpMaintenanceReminder tErpMaintenanceReminder = new TErpMaintenanceReminder(); tErpMaintenanceReminder.setClinicSupplierId(user.getUserId().toString()); tErpMaintenanceReminder.setMaintenanceType(1); tErpMaintenanceReminder.setWarehousingBatchId(tErpSupplierWarehousingBatch.getId()); Integer day = Integer.valueOf(goods.getMaintenanceInterval()); // 当前时间+day天 LocalDateTime time1 = LocalDateTime.now().plusDays(day); tErpMaintenanceReminder.setMaintenanceTime(time1); erpMaintenanceReminderService.save(tErpMaintenanceReminder); } } } } } return R.ok(erpGoodsService.updateById(goods)); } @ApiOperation(value = "供应商商品详情") @GetMapping(value = "/detail/{id}") public R detail( @PathVariable String id) { TErpGoods goods = erpGoodsService.getById(id); return R.ok(goods); } @ApiOperation(value = "商品管理信息导出--导出") @PostMapping("/export") public void listExport(@RequestBody TErpGoodsQuery query) { SysUser user = tokenService.getLoginUser().getUser(); List pageList = erpGoodsService.listExport(query,user); Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TErpGoodsVO.class, pageList); HttpServletResponse response = WebUtils.response(); assert response != null; response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ServletOutputStream outputStream = null; try { String fileName = URLEncoder.encode("商品管理信息导出.xls", "utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } @ApiOperation(value = "商品管理信息导入") @PostMapping("/importFile") public AjaxResult importFile(@RequestParam(value = "file") MultipartFile file ) { SysUser user = tokenService.getLoginUser().getUser(); JSONObject jsonObject = new JSONObject(); ImportParams params = new ImportParams(); params.setHeadRows(1); //表头行数 InputStream inputStream = null; ArrayList names = new ArrayList<>(); ArrayList tErpGoods = new ArrayList<>(); try { inputStream = file.getInputStream(); List carAnnuallyImportExcels = ExcelImportUtil.importExcel(inputStream, TErpGoodsExcel.class, params); Set collect = carAnnuallyImportExcels.stream().map(TErpGoodsExcel::getGoodsIdCode).collect(Collectors.toSet()); if (collect.size() != carAnnuallyImportExcels.size()) { return AjaxResult.error("导入数据中商品标识码重复"); } for (TErpGoodsExcel erpGoodsExcel : carAnnuallyImportExcels) { TErpGoods goods = new TErpGoods(); goods.setSupplierClinicId(user.getUserId().toString()); goods.setGoodsSource(1); // 判空 if(erpGoodsExcel.getGoodsName()==null || erpGoodsExcel.getGoodsName().isEmpty()){ names.add("商品名称不能为空"); continue; } if(erpGoodsExcel.getGoodsIdCode()==null || erpGoodsExcel.getGoodsIdCode().isEmpty() || erpGoodsExcel.getQuasiNumber() ==null || erpGoodsExcel.getQuasiNumber().isEmpty() || erpGoodsExcel.getManufacturer()==null || erpGoodsExcel.getManufacturer().isEmpty() || erpGoodsExcel.getFormulationSpec()==null || erpGoodsExcel.getFormulationSpec().isEmpty() || erpGoodsExcel.getPackingSpec()==null || erpGoodsExcel.getPackingSpec().isEmpty() || erpGoodsExcel.getClinicPurchasePrice()==null|| erpGoodsExcel.getClinicPurchasePrice().isEmpty() || erpGoodsExcel.getWarningInventory()==null|| erpGoodsExcel.getWarningInventory().isEmpty() || erpGoodsExcel.getTypeName()==null|| erpGoodsExcel.getTypeName().isEmpty()){ names.add(erpGoodsExcel.getGoodsName()+" :信息有误,请检查后重新提交。"); continue; } goods.setGoodsName(erpGoodsExcel.getGoodsName()); // 判断数据是否正确 // 判断标识码是否重复 long count = erpGoodsService.count(new QueryWrapper().eq("goods_id_code", erpGoodsExcel.getGoodsIdCode())); if(count>0){ names.add(erpGoodsExcel.getGoodsName() + " :标识码重复"); continue; } goods.setGoodsIdCode(erpGoodsExcel.getGoodsIdCode()); goods.setQuasiNumber(erpGoodsExcel.getQuasiNumber()); goods.setManufacturer(erpGoodsExcel.getManufacturer()); goods.setFormulationSpec(erpGoodsExcel.getFormulationSpec()); goods.setPackingSpec(erpGoodsExcel.getPackingSpec()); // 商品类型 TErpGoodsType one = erpGoodsTypeService.getOne(new LambdaQueryWrapper().eq(TErpGoodsType::getTypeName, erpGoodsExcel.getTypeName())); if(one==null){ names.add(erpGoodsExcel.getGoodsName() + " :商品类型不存在"); continue; } goods.setTypeId(one.getId()); // 采购价 try { goods.setClinicPurchasePrice(new BigDecimal(erpGoodsExcel.getClinicPurchasePrice()).setScale(2, RoundingMode.HALF_UP)); }catch (Exception e){ names.add(erpGoodsExcel.getGoodsName() + " :采购价有误"); continue; } // 预警库存 try { goods.setWarningInventory(Integer.valueOf(erpGoodsExcel.getWarningInventory())); }catch (Exception e){ names.add(erpGoodsExcel.getGoodsName() + " :预警库存有误"); continue; } goods.setGoodsYards(erpGoodsExcel.getGoodsYards()); try { if(erpGoodsExcel.getMaintenanceInterval()!=null && !erpGoodsExcel.getMaintenanceInterval().isEmpty()){ Integer i = Integer.valueOf(erpGoodsExcel.getMaintenanceInterval()); } }catch (Exception e){ names.add(erpGoodsExcel.getGoodsName() + " :保养周期有误"); continue; } goods.setMaintenanceInterval(erpGoodsExcel.getMaintenanceInterval()); try { if(erpGoodsExcel.getLowPurchaseQuantity()!=null && !erpGoodsExcel.getLowPurchaseQuantity().isEmpty()){ goods.setLowPurchaseQuantity(Integer.valueOf(erpGoodsExcel.getLowPurchaseQuantity())); } }catch (Exception e){ names.add(erpGoodsExcel.getGoodsName() + " :最低采购数量有误"); continue; } if(erpGoodsExcel.getLowUnitName()!=null && !erpGoodsExcel.getLowUnitName().isEmpty()){ TErpGoodsUnit one1 = erpGoodsUnitService.getOne(new LambdaQueryWrapper().eq(TErpGoodsUnit::getUnitName, erpGoodsExcel.getLowUnitName())); if (one1 == null) { names.add(erpGoodsExcel.getGoodsName() + " :最低采购单位有误"); continue; } goods.setLowUnitId(one1.getId()); } if(erpGoodsExcel.getIsPrescriptionDrug() !=null && !erpGoodsExcel.getIsPrescriptionDrug().isEmpty()){ if(erpGoodsExcel.getIsPrescriptionDrug().equals("是")){ goods.setIsPrescriptionDrug(1); }else if (erpGoodsExcel.getIsPrescriptionDrug().equals("否")){ goods.setIsPrescriptionDrug(2); }else { names.add(erpGoodsExcel.getGoodsName() + " :是否为处方药有误"); continue; } } if(erpGoodsExcel.getPackingUnitName() !=null && !erpGoodsExcel.getPackingUnitName().isEmpty()){ TErpGoodsUnit unit = erpGoodsUnitService.getOne(new LambdaQueryWrapper().eq(TErpGoodsUnit::getUnitName, erpGoodsExcel.getPackingUnitName())); if(unit != null){ goods.setPackingUnitId(unit.getId()); }else { names.add(erpGoodsExcel.getGoodsName() + " :包装单位有误"); continue; } } goods.setInstructionsUse(erpGoodsExcel.getInstructionsUse()); goods.setSideEffect(erpGoodsExcel.getSideEffect()); goods.setSimplifiedCode(erpGoodsExcel.getSimplifiedCode()); goods.setDosageForm(erpGoodsExcel.getDosageForm()); goods.setUsageClassification(erpGoodsExcel.getUsageClassification()); goods.setProductBrand(erpGoodsExcel.getProductBrand()); goods.setPlaceOfOrigin(erpGoodsExcel.getPlaceOfOrigin()); goods.setIngredient(erpGoodsExcel.getIngredient()); goods.setTrait(erpGoodsExcel.getTrait()); goods.setIndication(erpGoodsExcel.getIndication()); goods.setTaboo(erpGoodsExcel.getTaboo()); goods.setPrecautions(erpGoodsExcel.getPrecautions()); goods.setInteraction(erpGoodsExcel.getInteraction()); goods.setStorage(erpGoodsExcel.getStorage()); tErpGoods.add( goods); } } catch (Exception e) { e.printStackTrace(); return AjaxResult.error("记录导入失败!"); }finally { try { inputStream.close(); } catch (IOException e) { throw new ServiceException(e.getMessage()); } } if(names.size()>0){ return AjaxResult.error("导入失败记录如下:",names); } erpGoodsService.saveBatch(tErpGoods); return AjaxResult.success(); } }