Merge remote-tracking branch 'origin/master'

liweidong
qinyulong 2 months ago
commit 807c0817c5
  1. 5
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankTaskVO.java
  2. 9
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/StRealtimeStockClient.java
  3. 7
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/StRealtimeStockClientFallback.java
  4. 6
      blade-service/blade-desk/pom.xml
  5. 17
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankController.java
  6. 34
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java
  7. 177
      blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsNewController.java
  8. 20
      blade-service/blade-wms/src/main/java/org/springblade/wms/feign/StRealtimeStockClientImpl.java
  9. 55
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsNewService.java
  10. 201
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsNewServiceImpl.java

@ -76,6 +76,11 @@ public class LiquidTankTaskVO extends LiquidTankTask {
private String clearRecord;
@Schema(description = "药品计算公式(报告) 加药量[计算公式] 公式内容")
private String reportFormulaContent;
@Schema(description = "药品计算公式(报告) 理论值加药量[计算公式] 公式内容")
private String afterFormulaContent;
@Schema(description = "药品监督员签名(报告)")
private String drugSuUserSign;
@Schema(description = "药品监督员签名(报告)")

@ -4,10 +4,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.wms.pojo.entity.StGoods;
import org.springblade.wms.pojo.vo.StRealtimeStockVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 仓库实时结余远程调用
@ -23,10 +27,15 @@ public interface StRealtimeStockClient {
String MEASURING_TOOLS = API_PREFIX + "/pageToolsData";
String MEASURING_Id = API_PREFIX + "/getById";
/**
* 量具库存
*/
@GetMapping(MEASURING_TOOLS)
R<Page<StRealtimeStockVO>> getMeasuringTools(@SpringQueryMap StRealtimeStockVO stRealtimeStock, @SpringQueryMap Query query);
@PostMapping(MEASURING_Id)
R<StGoods> getById(@RequestBody StGoods stGoods);
}

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.wms.pojo.entity.StGoods;
import org.springblade.wms.pojo.vo.StRealtimeStockVO;
import org.springframework.stereotype.Component;
@ -20,4 +21,10 @@ public class StRealtimeStockClientFallback implements StRealtimeStockClient {
return R.fail("获取数据失败");
}
@Override
public R<StGoods> getById(StGoods stGoods) {
return null;
}
}

@ -129,6 +129,12 @@
<artifactId>barbecue</artifactId>
<version>1.5-beta1</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-wms-api</artifactId>
<version>4.6.0.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

@ -113,6 +113,23 @@ public class LiquidTankController extends BladeController {
return R.data(listVO);
}
/**
* [槽液] list下拉去重分析项目选择
*/
@GetMapping("/listForSelectDistinct")
@ApiOperationSupport(order = 22)
@Operation(summary = "list下拉选择", description = "")
public R<List<String>> listForSelectDistinct() {
List<LiquidTank> list = service.list();
List<String> distinctList = list.stream()
.map(LiquidTank::getTestElement)
.distinct()
.collect(Collectors.toList());
return R.data(distinctList);
}
/**
* [槽液] 新增一条
*/

@ -23,15 +23,21 @@ import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.desk.basic.pojo.entity.Formula;
import org.springblade.desk.basic.service.IFormulaService;
import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.basic.constant.BaseCol;
import org.springblade.desk.quality.constant.LiquidTankTaskConst;
import org.springblade.desk.quality.constant.QAModuleConst;
import org.springblade.desk.quality.excel.LiquidTankTaskExcel;
import org.springblade.desk.quality.pojo.entity.LiquidTank;
import org.springblade.desk.quality.pojo.entity.LiquidTankTask;
import org.springblade.desk.quality.pojo.vo.LiquidTankTaskVO;
import org.springblade.desk.quality.service.ILiquidTankService;
import org.springblade.desk.quality.service.ILiquidTankTaskService;
import org.springblade.desk.quality.wrapper.LiquidTankTaskWrapper;
import org.springblade.wms.feign.StRealtimeStockClient;
import org.springblade.wms.pojo.entity.StGoods;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -58,6 +64,15 @@ public class LiquidTankTaskController extends BladeController {
@Resource
private ILiquidTankTaskService service;
@Resource
private ILiquidTankService taskService;
@Resource
private IFormulaService formualaService;
@Resource
private final StRealtimeStockClient stRealtimeStockClient;
/**
* [槽液检测任务] 详情
*/
@ -151,6 +166,25 @@ public class LiquidTankTaskController extends BladeController {
qw.ne(BaseCol.STATUS, LiquidTankTaskConst.S_NOT_READY);
IPage<LiquidTankTask> pages = service.page(Condition.getPage(query), qw);
IPage<LiquidTankTaskVO> pagesVO = LiquidTankTaskWrapper.build().pageVO(pages);
List<LiquidTankTaskVO> list = pagesVO.getRecords();
for(LiquidTankTaskVO one : list){
LiquidTank tank = taskService.getById(one.getLiquidTankId());
Formula detail = formualaService.getById(tank.getAddDrugFormulaId());
if(null != detail){
one.setReportFormulaContent(detail.getContent());
}
Formula detailAfter = formualaService.getById(tank.getAfterTheoryFormulaId());
if(null != detailAfter){
one.setAfterFormulaContent(detailAfter.getContent());
}
Long goodId = tank.getDrugMaterialId();
StGoods good = new StGoods();
good.setId(goodId);
StGoods stGoods = stRealtimeStockClient.getById(good).getData();
one.setDrugMaterialCode(stGoods.getGoodsCode());
}
pagesVO.getRecords()
.stream()
.peek(service::setVOValue)

@ -0,0 +1,177 @@
package org.springblade.wms.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.annotation.IsAdmin;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.quality.pojo.entity.LiquidTank;
import org.springblade.wms.excel.StGoodsExcel;
import org.springblade.wms.pojo.entity.StGoods;
import org.springblade.wms.pojo.vo.StGoodsVO;
import org.springblade.wms.service.IStGoodsNewService;
import org.springblade.wms.wrapper.StGoodsWrapper;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGoodsController
* @description:
* @autor: WuSiYu
* @create 2025-12-10 11:39
**/
@RestController
@AllArgsConstructor
@RequestMapping("/stGoodsNew")
@Tag(name = "物料信息表", description = "物料信息表接口")
public class StGoodsNewController extends BladeController {
private final IStGoodsNewService stGoodsService;
/**
* 物料信息表 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@Operation(summary = "详情", description = "传入stGoods")
public R<StGoodsVO> detail(StGoods stGoods) {
StGoods detail = stGoodsService.getOne(Condition.getQueryWrapper(stGoods));
return R.data(StGoodsWrapper.build().entityVO(detail));
}
/**
* 物料信息表 分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 2)
@Operation(summary = "分页", description = "传入stGoods")
public R<IPage<StGoodsVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> stGoods, Query query) {
QueryWrapper<StGoods> wrapper = Condition.getQueryWrapper(stGoods, StGoods.class);
wrapper.eq("is_deleted", 0);
IPage<StGoods> pages = stGoodsService.page(Condition.getPage(query), Condition.getQueryWrapper(stGoods, StGoods.class));
return R.data(StGoodsWrapper.build().pageVO(pages));
}
/**
* 物料信息表 自定义分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入stGoods")
public R<IPage<StGoodsVO>> page(StGoodsVO stGoods, Query query) {
stGoods.setIsDeleted(0);
IPage<StGoodsVO> pages = stGoodsService.selectStGoodsPage(Condition.getPage(query), stGoods);
return R.data(pages);
}
/**
* 物料信息表 新增
*/
@PostMapping("/save")
@ApiOperationSupport(order = 4)
@Operation(summary = "新增", description = "传入stGoods")
public R save(@Valid @RequestBody String goodsCode) throws Exception{
stGoodsService.saveGoods(goodsCode);
return R.success();
}
@GetMapping("/listForStGoods")
@ApiOperationSupport(order = 22)
@Operation(summary = "list下拉选择", description = "")
public R<List<StGoods>> listForStGoods() {
List<StGoods> list = stGoodsService.list();
return R.data(list);
}
/**
* 物料信息表 修改
*/
@PostMapping("/update")
@ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入stGoods")
public R update(@Valid @RequestBody StGoods stGoods) {
return R.status(stGoodsService.updateById(stGoods));
}
/**
* 物料信息表 新增或修改
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 6)
@Operation(summary = "新增或修改", description = "传入stGoods")
public R submit(@Valid @RequestBody StGoods stGoods) {
return R.status(stGoodsService.saveOrUpdate(stGoods));
}
/**
* 物料信息表 删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 7)
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(stGoodsService.deleteLogic(Func.toLongList(ids)));
}
/**
* 设置物料状态
*/
@PostMapping("/setUsed")
@ApiOperationSupport(order = 8)
@Operation(summary = "设置物料状态", description = "传入goodsId(物料ID)和used(状态:true=启用,false=禁用)")
public R setUsed(@Validated @RequestBody StGoods stGoods) throws Exception {
stGoodsService.changeUsed(stGoods.getId(), stGoods.getUsed());
return R.success();
}
/**
* 根据物料编码查询物料
*/
@GetMapping("/getGoodsByGoodsCode")
@ApiOperationSupport(order = 9)
@Operation(summary = "根据物料编码查询物料", description = "传入物料编码goodsCode(路径参数)")
public R getGoodsByGoodsCode(
@Validated
@PathVariable(value = "goodsCode") String goodsCode
) throws Exception {
Object goods = stGoodsService.queryByCode(goodsCode);
return R.data(goods);
}
/**
* 导出数据
*/
@IsAdmin
@GetMapping("/export-stGoods")
@ApiOperationSupport(order = 10)
@Operation(summary = "导出数据", description = "传入stGoods")
public void exportStGoods(@Parameter(hidden = true) @RequestParam Map<String, Object> stGoods, BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<StGoods> queryWrapper = Condition.getQueryWrapper(stGoods, StGoods.class);
//if (!AuthUtil.isAdministrator()) {
// queryWrapper.lambda().eq(StGoods::getTenantId, bladeUser.getTenantId());
//}
//queryWrapper.lambda().eq(StGoodsEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<StGoodsExcel> list = stGoodsService.exportStGoods(queryWrapper);
ExcelUtil.export(response, "物料信息表数据" + DateUtil.time(), "物料信息表数据表", list, StGoodsExcel.class);
}
}

@ -11,7 +11,9 @@ import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.wms.pojo.entity.StGoods;
import org.springblade.wms.pojo.vo.StRealtimeStockVO;
import org.springblade.wms.service.IStGoodsNewService;
import org.springblade.wms.service.IStRealtimeStockService;
import org.springframework.web.bind.annotation.RestController;
@ -32,6 +34,8 @@ public class StRealtimeStockClientImpl implements StRealtimeStockClient {
private final IStRealtimeStockService stRealtimeStockService;
private final IStGoodsNewService stGoodsService;
@Override
public R<Page<StRealtimeStockVO>> getMeasuringTools(StRealtimeStockVO stRealtimeStock, Query query) {
@ -51,4 +55,20 @@ public class StRealtimeStockClientImpl implements StRealtimeStockClient {
return R.data(pages);
}
@Override
public R<StGoods> getById(StGoods good) {
Long goodId = good.getId();
if(goodId == null || goodId <= 0){
StGoods stGoods = new StGoods();
stGoods.setGoodsCode("");
return R.data(stGoods);
}
// StGoods stGoods = new StGoods();
// stGoods.setId(goodId);
StGoods detail = stGoodsService.getById(goodId);
return R.data(detail);
}
}

@ -0,0 +1,55 @@
package org.springblade.wms.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.wms.excel.StGoodsExcel;
import org.springblade.wms.pojo.entity.StGoods;
import org.springblade.wms.pojo.vo.StGoodsVO;
import java.util.List;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName IStGoodsService
* @description:
* @autor: WuSiYu
* @create 2025-12-12 14:18
**/
public interface IStGoodsNewService extends BaseService<StGoods> {
/**
* 自定义分页
*
* @param page 分页参数
* @param stGoods 查询参数
* @return IPage<StGoodsVO>
*/
IPage<StGoodsVO> selectStGoodsPage(IPage<StGoodsVO> page, StGoodsVO stGoods);
void changeUsed(Long id, Boolean used) throws Exception;
StGoods queryByCode(String goodsCode);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<StGoodsExcel>
*/
List<StGoodsExcel> exportStGoods(Wrapper<StGoods> queryWrapper);
void saveGoods(String goodsCode) throws Exception;
StGoods queryByCodeAndVersion(String prtno, String releaseNo);
void addOnthewayQuantity(Long goodsId, Double num);
void addCurQuantity(Long goodsId, Double quantity);
IPage<StGoodsVO> selectFindAllGoodsPage(IPage<StGoodsVO> page, StGoodsVO stGoods);
void addLockQuantity(Long goodsId, double v);
}

@ -0,0 +1,201 @@
package org.springblade.wms.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.wms.excel.StGoodsExcel;
//import org.springblade.wms.mapper.StGoodsClassMapper;
import org.springblade.wms.mapper.StGoodsMapper;
//import org.springblade.wms.pojo.dto.StPdmPartDTO;
import org.springblade.wms.pojo.entity.StGoods;
//import org.springblade.wms.pojo.entity.StGoodsExt;
import org.springblade.wms.pojo.vo.StGoodsVO;
//import org.springblade.wms.service.IStGoodsExtService;
import org.springblade.wms.service.IStGoodsNewService;
import org.springblade.wms.service.IStGoodsService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGoodsServiceImpl
* @description:
* @autor: WuSiYu
* @create 2025-12-12 14:21
**/
@Service
@Slf4j
public class StGoodsNewServiceImpl extends BaseServiceImpl<StGoodsMapper, StGoods> implements IStGoodsNewService {
// @Resource
// private StHttpRequestService stHttpRequestService;
// @Resource
// private IStGoodsExtService stGoodsExtService;
@Override
public IPage<StGoodsVO> selectStGoodsPage(IPage<StGoodsVO> page, StGoodsVO stGoods) {
return page.setRecords(baseMapper.selectStGoodsPage(page, stGoods));
}
@Override
public IPage<StGoodsVO> selectFindAllGoodsPage(IPage<StGoodsVO> page, StGoodsVO stGoods) {
return page.setRecords(baseMapper.selectFindAllGoodsPage(page, stGoods));
}
@Override
public void saveGoods(String goodsCode) throws Exception {
StGoods stGoods = baseMapper.queryByCode(goodsCode);
if (stGoods != null) {
throw new Exception("该物料已存在!");
} else {
List<String> prtnoList = new ArrayList<>();
prtnoList.add(goodsCode);
// saveGoodsInfo(prtnoList);
}
}
/*public void saveGoodsInfo(List<String> prtnoList) throws Exception {
StGoods goods = null;
//查询物料信息
List<StPdmPartDTO> pdmPartInfo = stHttpRequestService.getPdmPartInfo(prtnoList);
log.debug("pdmPartInfo:{}", pdmPartInfo);
if (pdmPartInfo != null) {
for (StPdmPartDTO dto : pdmPartInfo) {
//保存物料信息
goods = this.queryByCodeAndVersion(dto.getPrtno(), dto.getReleaseNo());
if (goods == null) {
goods = new StGoods();
// goods.setDept();
goods.setDrawingNo(dto.getDrwpartno());
goods.setGoodsCode(dto.getPrtno());
goods.setGoodsName(dto.getPrtdesc());
goods.setDensity(dto.getDensity());
goods.setPrtType(dto.getPrtType());
goods.setSourceByStr(dto.getSource());
goods.setSpecifications(dto.getMtlspcf());
goods.setUnitName(dto.getPrtum());
goods.setCavityNo(dto.getCavityNo());
goods.setProductCategory(dto.getProductCategory());
goods.setEcnNo(dto.getEcnNo());
goods.setEndItem(dto.getEndItem());
goods.setMaterialModel(dto.getMaterialModel());
goods.setPartLink(dto.getPartLink());
goods.setPriority(dto.getPriority());
goods.setPartRevisionStatus(dto.getPartRevisionStatus());
goods.setProductTechSpec(dto.getProductTechSpec());
goods.setWeight(dto.getWeight());
goods.setReleaseNo(dto.getReleaseNo());
goods.setRemark(dto.getRemark());
goods.setTradeMark(dto.getTradeMark());
goods.setUsed(Boolean.TRUE);
goods.setIsDeleted(0);
goods.setCreateTime(new Date());
goods.setReleaseNoTime(dto.getRcdchgdatd());
this.save(goods);
}
}
}
}*/
@Override
public StGoods queryByCodeAndVersion(String prtno, String releaseNo) {
return baseMapper.queryByCodeAndVersion(prtno, releaseNo);
}
@Override
public void changeUsed(Long id, Boolean used) throws Exception {
StGoods stGoods = this.getById(id);
if (stGoods == null) {
return;
}
stGoods.setUsed(used);
this.updateById(stGoods);
}
@Override
public StGoods queryByCode(String goodsCode) {
return baseMapper.queryByCode(goodsCode);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void addOnthewayQuantity(Long goodsId, Double num) {
StGoods coGoods = baseMapper.selectById(goodsId);
if (coGoods == null) {
throw new ServiceException("物料不存在或已停用:ID=" + goodsId);
}
// 累加在途数量(负值自动归零)
double ontheway = NumberUtil.add(
BigDecimal.valueOf(coGoods.getOnthewayQuantity()),
BigDecimal.valueOf(num)
).doubleValue();
if (ontheway < 0) {
ontheway = 0D;
}
coGoods.setOnthewayQuantity(ontheway);
baseMapper.updateById(coGoods);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void addCurQuantity(Long goodsId, Double num) {
StGoods stGoods = baseMapper.selectById(goodsId);
if (stGoods == null) {
throw new ServiceException("物料不存在:ID=" + goodsId);
}
// 累加当前库存(负值自动归零)
double curQuantity = NumberUtil.add(
BigDecimal.valueOf(stGoods.getCurrentQuantity()),
BigDecimal.valueOf(num)
).doubleValue();
if (curQuantity < 0) {
curQuantity = 0D;
}
stGoods.setCurrentQuantity(curQuantity);
baseMapper.updateById(stGoods);
// 同步更新物料扩展表二级库存
// StGoodsExt stGoodsExt = stGoodsExtService.getById(stGoods.getId());
// if (stGoodsExt != null) {
// stGoodsExt.setLastStore(curQuantity);
// stGoodsExtService.updateById(stGoodsExt);
// }
}
@Override
public void addLockQuantity(Long goodsId, double num) {
StGoods stGoods = this.getById(goodsId);
Double lockQuantity =
BigDecimal.valueOf(stGoods.getLockQuantity()).add(BigDecimal.valueOf(num)).doubleValue();
if (lockQuantity < 0) {
lockQuantity = 0d;
}
stGoods.setLockQuantity(lockQuantity);
}
@Override
public List<StGoodsExcel> exportStGoods(Wrapper<StGoods> queryWrapper) {
List<StGoodsExcel> stGoodsList = baseMapper.exportStGoods(queryWrapper);
//stGoodsList.forEach(stGoods -> {
// stGoods.setTypeName(DictCache.getValue(DictEnum.YES_NO, StGoods.getType()));
//});
return stGoodsList;
}
}
Loading…
Cancel
Save