feat(heli): 添加出入库日志管理功能

This commit is contained in:
zxy 2026-04-02 14:54:19 +08:00
parent fbf89da81a
commit 518cb94c07
14 changed files with 1222 additions and 70 deletions

View File

@ -0,0 +1,88 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.storagelog;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLogPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLogRespVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.service.storagelog.StorageLogService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import reactor.util.function.Tuple2;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 入/出库日志")
@RestController
@RequestMapping("/heli/xzd-storage-log")
@Validated
public class XzdStorageLogController {
@Resource
private StorageLogService storageLogService;
@GetMapping("/get")
@Operation(summary = "获得入/出库日志")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:storage-log:query')")
public CommonResult<StorageLogRespVO> getStorageLog(@RequestParam("id") Long id) {
StorageLogDO storageLog = storageLogService.getStorageLog(id);
return success(BeanUtils.toBean(storageLog, StorageLogRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得入/出库日志分页")
@PreAuthorize("@ss.hasPermission('heli:storage-log:query')")
public CommonResult<PageResult<StorageLogDO>> getStorageLogPage(@Valid StorageLogPageReqVO pageReqVO) {
PageResult<StorageLogDO> pageResult = storageLogService.getXzdStorageLogPage(pageReqVO);
return success(pageResult);
}
@PostMapping("/submitForm")
@Operation(summary = "生产导入新中大")
@PreAuthorize("@ss.hasPermission('heli:storage-log:update')")
public CommonResult<Boolean> submitForm( @RequestBody List<StorageLogDO> list) {
storageLogService.submitMatForm(list);
return success(true);
}
@PostMapping("/generateBill")
@Operation(summary = "生成入库单")
@PreAuthorize("@ss.hasPermission('heli:storage-log:update')")
public CommonResult<List<StorageLogDO>> generateBill(@RequestBody List<StorageLogDO> list) {
Tuple2<Integer, List<StorageLogDO>> objects = storageLogService.generateBill(list);
int flag = objects.getT1();
List<StorageLogDO> logDOList = objects.getT2();
String ids = logDOList.stream().map(StorageLogDO::getId).map(String::valueOf).collect(Collectors.joining(","));
if (flag == 1) {
return CommonResult.error(11110, ids);
}
if (flag == 2) {
return CommonResult.error(11111, ids);
}
if (flag == 3) {
return CommonResult.error(11112, ids);
}
if (flag == 4) {
return CommonResult.error(11113, ids);
}
if (flag == 5) {
return CommonResult.error(11114, ids);
}
if (flag == 6) {
return CommonResult.error(11115, ids);
}
return CommonResult.success(null);
}
}

View File

@ -1,12 +1,14 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo; package com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import java.math.BigDecimal; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -55,4 +57,10 @@ public class StorageLogPageReqVO extends PageParam {
@Schema(description = "获取物料信息id") @Schema(description = "获取物料信息id")
private List<Long> ids; private List<Long> ids;
} @Schema(description = "是否导出")
private Integer isExport;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -104,4 +104,15 @@ public class StorageLogDO extends BaseDO {
@TableField(updateStrategy = FieldStrategy.IGNORED) @TableField(updateStrategy = FieldStrategy.IGNORED)
private String incoiceCode; private String incoiceCode;
@TableField(exist = false)
private String priceType;
//供应商简称
@TableField(exist = false)
private String brief;
@TableField(exist = false)
private String supplierName;
} }

View File

@ -0,0 +1,58 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.wmsconfig;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
/**
* 导入新中大配置 DO
*
* @author 管理员
*/
@TableName("xzd_wms_config")
@KeySequence("xzd_wms_config_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsConfigDO extends BaseDO {
/**
* 主键id
*/
@TableId
private Long id;
/**
* 入库业务类型
*/
private String busiTypeIn;
/**
* 仓库
*/
private String whName;
/**
* 价格类型
*/
private String priceType;
/**
* 部门
*/
private String deptName;
/**
* 备注
*/
private String description;
/**
* 库位
*/
private String rgName;
/**
* 出库业务类型
*/
private String busiTypeOut;
}

View File

@ -1,20 +1,19 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog; package com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog;
import java.util.*;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.collection.ArrayUtils;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLogPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.pn.PnDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.pn.PnDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.rg.RgDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.rg.RgDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogAll.StorageLogAllDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.warehouse.WarehouseDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.warehouse.WarehouseDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.wmsstorage.WmsStorageDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/** /**
@ -49,4 +48,32 @@ public interface StorageLogMapper extends BaseMapperX<StorageLogDO> {
return selectPage(reqVO,query); return selectPage(reqVO,query);
} }
// PageResult<StorageLogAllDO> selectAllPage(StorageLogPageReqVO reqVO); // PageResult<StorageLogAllDO> selectAllPage(StorageLogPageReqVO reqVO);
}
default PageResult<StorageLogDO> selectXzdPage(StorageLogPageReqVO reqVO) {
MPJLambdaWrapper<StorageLogDO> query = new MPJLambdaWrapper<>();
query.selectAll(StorageLogDO.class)
.select("COALESCE(mat.name, t.mat_name) as matName", "mat.code as matCode", "mat.unit as matUnit", "wh.wh_name as whName", "rg.rg_name as rgName", "pn.pn_name as pnName")
.select("mat.spec as matSpec")
.select("ws.price_type as priceType,ws.incoice_code as incoiceCode")
.select("supplier.brief as brief,supplier.name as supplierName")
.leftJoin(MaterialDO.class, "mat", MaterialDO::getId, StorageLogDO::getMatId)
.leftJoin(WarehouseDO.class, "wh", WarehouseDO::getId, StorageLogDO::getWhId)
.leftJoin(RgDO.class, "rg", RgDO::getId, StorageLogDO::getRgId)
.leftJoin(PnDO.class, "pn", PnDO::getId, StorageLogDO::getPnId)
.leftJoin(WmsStorageDO.class, "ws", WmsStorageDO::getId, StorageLogDO::getXzdStockId)
.leftJoin(SupplierDO.class, "supplier", SupplierDO::getId, StorageLogDO::getSupplierId)
.disableSubLogicDel()
.orderByDesc(StorageLogDO::getId);
query
.like(!StringUtils.isEmpty(reqVO.getMatName()), StorageLogDO::getMatName, reqVO.getMatName())
.like(!StringUtils.isEmpty(reqVO.getMatCode()), MaterialDO::getCode, reqVO.getMatCode())
.eq(!StringUtils.isEmpty(reqVO.getStockType()), StorageLogDO::getStockType, reqVO.getStockType())
.eq(!StringUtils.isEmpty(reqVO.getIsExport()), StorageLogDO::getIsExport, reqVO.getIsExport())
// 查询单据时间
.between(reqVO.getCreateTime() != null, StorageLogDO::getCreateTime, ArrayUtils.get(reqVO.getCreateTime(), 0), ArrayUtils.get(reqVO.getCreateTime(), 1))
;
return selectPage(reqVO, query);
}
}

View File

@ -0,0 +1,17 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.wmsconfig;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.wmsconfig.WmsConfigDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 导入新中大配置 Mapper
*
* @author 管理员
*/
@Mapper
public interface WmsConfigMapper extends BaseMapperX<WmsConfigDO> {
}

View File

@ -1,16 +1,16 @@
package com.chanko.yunxi.mes.module.heli.service.storagelog; package com.chanko.yunxi.mes.module.heli.service.storagelog;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogAll.StorageLogAllDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLogPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLogSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageNowAllReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; import reactor.util.function.Tuple2;
import org.apache.poi.ss.usermodel.Workbook;
import javax.validation.Valid;
import java.util.List;
/** /**
* /出库日志 Service 接口 * /出库日志 Service 接口
@ -57,6 +57,8 @@ public interface StorageLogService {
*/ */
PageResult<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO); PageResult<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO);
PageResult<StorageLogDO> getXzdStorageLogPage(StorageLogPageReqVO pageReqVO);
PageResult<StorageLogNowDO> getStorageNowPage(StorageLogPageReqVO pageReqVO); PageResult<StorageLogNowDO> getStorageNowPage(StorageLogPageReqVO pageReqVO);
// List<StorageLogNowDO> getStorageNowPagesmall(StorageLogPageReqVO pageReqVO); // List<StorageLogNowDO> getStorageNowPagesmall(StorageLogPageReqVO pageReqVO);
@ -82,4 +84,8 @@ public interface StorageLogService {
void getMatCode(List<StorageLogDO> list); void getMatCode(List<StorageLogDO> list);
void submitForm(List<StorageLogDO> list); void submitForm(List<StorageLogDO> list);
void submitMatForm(List<StorageLogDO> list);
Tuple2<Integer,List<StorageLogDO>> generateBill(List<StorageLogDO> list);
} }

View File

@ -1,44 +1,48 @@
package com.chanko.yunxi.mes.module.heli.service.storagelog; package com.chanko.yunxi.mes.module.heli.service.storagelog;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLogPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLogSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageNowAllReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogAll.StorageLogAllDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper; import com.chanko.yunxi.mes.module.heli.dal.dataobject.wmsconfig.WmsConfigDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.wmsstorage.WmsStorageDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.wmsstoragedetail.WmsStorageDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogAllMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogAllMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageMaterialMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageMaterialMapper;
import org.apache.poi.ss.usermodel.Sheet; import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsconfig.WmsConfigMapper;
import org.apache.poi.ss.usermodel.Workbook; import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsstorage.WmsStorageMapper;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsstoragedetail.WmsStorageDetailMapper;
import com.chanko.yunxi.mes.module.system.service.dict.DictDataService;
import com.chanko.yunxi.mes.module.system.service.dict.DictTypeService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import reactor.util.function.Tuple2;
import reactor.util.function.Tuples;
import java.io.FileInputStream; import javax.annotation.Resource;
import java.io.InputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.STORAGE_LOG_NOT_EXISTS;
/** /**
* /出库日志 Service 实现类 * /出库日志 Service 实现类
@ -61,8 +65,23 @@ public class StorageLogServiceImpl implements StorageLogService {
@Resource @Resource
private StorageMaterialMapper storageMaterialMapper; private StorageMaterialMapper storageMaterialMapper;
@Resource
private WmsStorageMapper wmsStorageMapper;
@Resource
private WmsStorageDetailMapper wmsStorageDetailMapper;
@Resource
private WmsConfigMapper wmsConfigMapper;
@Resource
private DictTypeService dictTypeService;
@Resource
private DictDataService dictDataService;
@Resource @Resource
private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper; private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper;
@Override @Override
public Long createStorageLog(StorageLogSaveReqVO createReqVO) { public Long createStorageLog(StorageLogSaveReqVO createReqVO) {
// 插入 // 插入
@ -99,21 +118,46 @@ public class StorageLogServiceImpl implements StorageLogService {
public StorageLogDO getStorageLog(Long id) { public StorageLogDO getStorageLog(Long id) {
return storageLogMapper.selectById(id); return storageLogMapper.selectById(id);
} }
@Override @Override
public int deleteByStockId(Long stockId){ public int deleteByStockId(Long stockId) {
return storageLogMapper.delete(StorageLogDO::getStockId,stockId); return storageLogMapper.delete(StorageLogDO::getStockId, stockId);
} }
@Override @Override
public PageResult<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO) { public PageResult<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO) {
// return storageLogAllMapper.selectPage(pageReqVO); // return storageLogAllMapper.selectPage(pageReqVO);
PageResult<StorageLogDO> pageResult = storageLogMapper.selectPage(pageReqVO); PageResult<StorageLogDO> pageResult = storageLogMapper.selectPage(pageReqVO);
Set<Long> idSet = Collections.unmodifiableSet(new HashSet<>()); Set<Long> idSet = Collections.unmodifiableSet(new HashSet<>());
if (ObjectUtil.isNotEmpty(pageReqVO.getIds())){ if (ObjectUtil.isNotEmpty(pageReqVO.getIds())) {
idSet = new HashSet<>(pageReqVO.getIds()); idSet = new HashSet<>(pageReqVO.getIds());
} }
for (StorageLogDO logDO : pageResult.getList()) { for (StorageLogDO logDO : pageResult.getList()) {
if (logDO.getGoodsType()==2){ if (logDO.getGoodsType() == 2) {
if (ObjectUtil.isNotEmpty(logDO.getMatName())){ if (ObjectUtil.isNotEmpty(logDO.getMatName())) {
LambdaQueryWrapper<MaterialDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MaterialDO::getName, logDO.getMatName());
List<MaterialDO> materialDOS = materialMapper.selectList(queryWrapper);
logDO.setMaterialDOList(materialDOS);
if (idSet.contains(logDO.getId()) && materialDOS.size() == 1) {
logDO.setMatId(materialDOS.get(0).getId());
}
}
}
}
return pageResult;
}
@Override
public PageResult<StorageLogDO> getXzdStorageLogPage(StorageLogPageReqVO pageReqVO) {
PageResult<StorageLogDO> pageResult = storageLogMapper.selectXzdPage(pageReqVO);
Set<Long> idSet = Collections.unmodifiableSet(new HashSet<>());
if (ObjectUtil.isNotEmpty(pageReqVO.getIds())) {
idSet = new HashSet<>(pageReqVO.getIds());
}
for (StorageLogDO logDO : pageResult.getList()) {
if (logDO.getGoodsType() == 2) {
if (ObjectUtil.isNotEmpty(logDO.getMatName())) {
LambdaQueryWrapper<MaterialDO> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MaterialDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MaterialDO::getName, logDO.getMatName()); queryWrapper.eq(MaterialDO::getName, logDO.getMatName());
List<MaterialDO> materialDOS = materialMapper.selectList(queryWrapper); List<MaterialDO> materialDOS = materialMapper.selectList(queryWrapper);
@ -183,14 +227,14 @@ public class StorageLogServiceImpl implements StorageLogService {
@Override @Override
public List<StorageLogNowDO> getStorageNowList(StorageNowAllReqVO queryReqVO) { public List<StorageLogNowDO> getStorageNowList(StorageNowAllReqVO queryReqVO) {
if(queryReqVO.getNoZero().equals(1)){ if (queryReqVO.getNoZero().equals(1)) {
// 根据仓库id排除库存为o的物料 // 根据仓库id排除库存为o的物料
return storageLogNowMapper.selectNoZero(queryReqVO); return storageLogNowMapper.selectNoZero(queryReqVO);
}else{ } else {
// 筛选全部的实时库存数据包含未分配仓库的物料信息和已分配仓库的物料信息 // 筛选全部的实时库存数据包含未分配仓库的物料信息和已分配仓库的物料信息
if(queryReqVO.isALL()){ if (queryReqVO.isALL()) {
return storageLogNowMapper.selectNowList(queryReqVO); return storageLogNowMapper.selectNowList(queryReqVO);
}else{ } else {
return storageLogNowMapper.selectNowList(queryReqVO); return storageLogNowMapper.selectNowList(queryReqVO);
} }
} }
@ -198,31 +242,28 @@ public class StorageLogServiceImpl implements StorageLogService {
} }
@Override @Override
public List<StorageLogNowDO> selectNowByMatPnId(Long matId,Long pnId) { public List<StorageLogNowDO> selectNowByMatPnId(Long matId, Long pnId) {
return storageLogNowMapper.selectNowByMatPnId(matId,pnId); return storageLogNowMapper.selectNowByMatPnId(matId, pnId);
} }
@Override @Override
public void createStorageLogBatch(List<StorageLogDO> storageLogDOs) { public void createStorageLogBatch(List<StorageLogDO> storageLogDOs) {
for (StorageLogDO storageLogDo : storageLogDOs){ for (StorageLogDO storageLogDo : storageLogDOs) {
storageLogMapper.insert(storageLogDo); storageLogMapper.insert(storageLogDo);
MaterialDO materialDO = materialMapper.selectById(storageLogDo.getMatId()); MaterialDO materialDO = materialMapper.selectById(storageLogDo.getMatId());
if(materialDO!=null){ if (materialDO != null) {
List<StorageLogNowDO> pageResult = storageLogNowMapper.selectPagesmallbyid(materialDO.getCode());//查询符合条件的值 List<StorageLogNowDO> pageResult = storageLogNowMapper.selectPagesmallbyid(materialDO.getCode());//查询符合条件的值
if(pageResult.size()==0){ if (pageResult.size() == 0) {
bdgzsomthingDO abc= new bdgzsomthingDO(); bdgzsomthingDO abc = new bdgzsomthingDO();
abc.setThingname("库存低于安全库存"); abc.setThingname("库存低于安全库存");
abc.setAttr3(materialDO.getCode()); abc.setAttr3(materialDO.getCode());
bdgzsomthingMapper.updateok(abc); bdgzsomthingMapper.updateok(abc);
} }
} }
} }
} }
@Override @Override
@ -233,20 +274,21 @@ public class StorageLogServiceImpl implements StorageLogService {
@Override @Override
public void updatePrice(StorageLogSaveReqVO updateReqVO) { public void updatePrice(StorageLogSaveReqVO updateReqVO) {
LambdaUpdateWrapper<MaterialDO> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<MaterialDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(MaterialDO::getCode,updateReqVO.getMatCode()); wrapper.eq(MaterialDO::getCode, updateReqVO.getMatCode());
wrapper.set(MaterialDO::getPrice,updateReqVO.getPrice()); wrapper.set(MaterialDO::getPrice, updateReqVO.getPrice());
materialMapper.update(wrapper); materialMapper.update(wrapper);
} }
@Override @Override
public PageResult<StorageLogNowDO> getSupplementPage(StorageLogPageReqVO pageReqVO) { public PageResult<StorageLogNowDO> getSupplementPage(StorageLogPageReqVO pageReqVO) {
return storageLogNowMapper.getSupplementPage(pageReqVO); } return storageLogNowMapper.getSupplementPage(pageReqVO);
}
@Override @Override
public void getMatCode(List<StorageLogDO> list) { public void getMatCode(List<StorageLogDO> list) {
for (StorageLogDO logDO : list) { for (StorageLogDO logDO : list) {
List<MaterialDO> materialDOList = materialMapper.selectName(logDO.getMatName()); List<MaterialDO> materialDOList = materialMapper.selectName(logDO.getMatName());
if (ObjectUtil.isNotEmpty(materialDOList)&&materialDOList.size()==1){ if (ObjectUtil.isNotEmpty(materialDOList) && materialDOList.size() == 1) {
MaterialDO materialDO = materialDOList.get(0); MaterialDO materialDO = materialDOList.get(0);
logDO.setMatId(materialDO.getId()); logDO.setMatId(materialDO.getId());
storageLogMapper.updateById(logDO); storageLogMapper.updateById(logDO);
@ -258,4 +300,217 @@ public class StorageLogServiceImpl implements StorageLogService {
public void submitForm(List<StorageLogDO> list) { public void submitForm(List<StorageLogDO> list) {
storageLogMapper.updateBatch(list); storageLogMapper.updateBatch(list);
} }
@Override
public void submitMatForm(List<StorageLogDO> list) {
// 只更新 matId ,其他字段不更新
for (StorageLogDO logDO : list) {
if (logDO.getId() != null && logDO.getMatId() != null) {
LambdaUpdateWrapper<StorageLogDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(StorageLogDO::getId, logDO.getId());
wrapper.set(StorageLogDO::getMatId, logDO.getMatId());
storageLogMapper.update(wrapper);
}
}
}
/**
* 生成单据
* Integer 错误类型
* 1 存在已删除的数据请刷新界面
* 2 已生成入库单的记录请刷新界面
* 3 价格类型没有输入请确认
* 4 价格类型是临时暂估价发票编码不空请确认
* 5 价格类型是3|实价发票编码为空
*
* @param list
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Tuple2<Integer, List<StorageLogDO>> generateBill(List<StorageLogDO> list) {
// 1 删除 4 价格类型是临时暂估价发票编码不空请确认
// 5 价格类型是3|实价发票编码为空
List<StorageLogDO> errorList = new ArrayList<>();
List<StorageLogDO> incoiceCodeList1 = new ArrayList<>();
List<StorageLogDO> incoiceCodeList2 = new ArrayList<>();
List<StorageLogDO> logList = new ArrayList<>();
for (StorageLogDO storageLogDO : list) {
StorageLogDO logDO = storageLogMapper.selectById(storageLogDO.getId());
if (logDO == null) {
errorList.add(storageLogDO);
}
logList.add(logDO);
}
if (!errorList.isEmpty()) {
return Tuples.of(1, errorList);
}
for (StorageLogDO storageLogDO : logList) {
if (storageLogDO.getIsExport() != null && storageLogDO.getIsExport() == 1) {
errorList.add(storageLogDO);
}
}
if (!errorList.isEmpty()) {
return Tuples.of(2, errorList);
}
for (StorageLogDO storageLogDO : list) {
if (storageLogDO.getMatCode() == null || storageLogDO.getMatCode().isEmpty()) {
errorList.add(storageLogDO);
}
}
if (!errorList.isEmpty()) {
return Tuples.of(6, errorList);
}
for (StorageLogDO storageLogDO : list) {
if (storageLogDO.getStockType() == 1) {
if (storageLogDO.getPriceType() == null || storageLogDO.getPriceType().isEmpty()) {
errorList.add(storageLogDO);
break;
}
if (storageLogDO.getPriceType().equals("1|临时暂估价")) {
if (storageLogDO.getIncoiceCode() != null && !storageLogDO.getIncoiceCode().isEmpty()) {
incoiceCodeList1.add(storageLogDO);
}
}
if (storageLogDO.getPriceType().equals("3|实价")) {
if (storageLogDO.getIncoiceCode() == null || storageLogDO.getIncoiceCode().isEmpty()) {
incoiceCodeList2.add(storageLogDO);
}
}
}
}
if (!errorList.isEmpty()) {
return Tuples.of(3, errorList);
}
if (!incoiceCodeList1.isEmpty()) {
return Tuples.of(4, incoiceCodeList1);
}
if (!incoiceCodeList2.isEmpty()) {
return Tuples.of(5, incoiceCodeList2);
}
extracted(list);
return Tuples.of(0, list);
}
private void extracted(List<StorageLogDO> logList) {
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
String userId = String.valueOf(loginUserId);
LocalDateTime now = LocalDateTime.now();
WmsConfigDO configDO = wmsConfigMapper.selectById(1);
// 根据入库类型分组处理
Map<Integer, List<StorageLogDO>> typeGroupMap = logList.stream()
.collect(Collectors.groupingBy(StorageLogDO::getStockType));
typeGroupMap.forEach((stockType, list) -> {
if (stockType == 1) {
processInStockType(list, configDO, userId, now);
} else if (stockType == 2) {
processOutStockType(list, configDO, userId, now);
}
});
}
private void processInStockType(List<StorageLogDO> logList, WmsConfigDO configDO, String userId, LocalDateTime now) {
// 根据价格类型供应商分组
Map<String, List<StorageLogDO>> groupMap = logList.stream()
.collect(Collectors.groupingBy(log ->
buildPriceSupplierKey(log.getPriceType(), log.getSupplierName())));
// 1|临时暂估价 价格类型是这样的 | 分割会有问题
groupMap.forEach((key, logs) -> {
String[] parts = key.split("/");
String priceType = parts[0];
String supplierName = parts[1]; // 1|临时暂估价 价格类型是这样的 | 分割会有问题
createAndSaveStorage(logs, configDO, userId, now, 1, priceType, supplierName);
});
}
private void processOutStockType(List<StorageLogDO> logList, WmsConfigDO configDO, String userId, LocalDateTime now) {
// 根据辅助项分组
Map<String, List<StorageLogDO>> groupMap = logList.stream()
.collect(Collectors.groupingBy(StorageLogDO::getAuItem));
groupMap.forEach((auItem, logs) -> {
StorageLogDO firstLog = logs.get(0);
createAndSaveStorage(logs, configDO, userId, now, 2,
firstLog.getPriceType(), firstLog.getSupplierName(), auItem);
});
}
private void createAndSaveStorage(List<StorageLogDO> logList, WmsConfigDO configDO,
String userId, LocalDateTime now, Integer stockType,
String priceType, String supplierName) {
createAndSaveStorage(logList, configDO, userId, now, stockType, priceType, supplierName, null);
}
private void createAndSaveStorage(List<StorageLogDO> logList, WmsConfigDO configDO,
String userId, LocalDateTime now, Integer stockType,
String priceType, String supplierName, String auItem) {
StorageLogDO firstLog = logList.get(0);
WmsStorageDO storageDO = new WmsStorageDO();
storageDO.setStockType(stockType);
storageDO.setBusiType(stockType == 1 ? configDO.getBusiTypeIn() : configDO.getBusiTypeOut());
storageDO.setWhName(configDO.getWhName());
storageDO.setStockNo(IdUtil.getSnowflakeNextIdStr());
storageDO.setBusiDate(LocalDate.now());
storageDO.setSupplierName(supplierName);
storageDO.setPriceType(priceType);
storageDO.setDeptName(configDO.getDeptName());
storageDO.setStatus(1);
storageDO.setStockTime(now);
storageDO.setStockEmp(userId);
storageDO.setIncoiceCode(firstLog.getIncoiceCode());
storageDO.setCreateTime(now);
storageDO.setUpdateTime(now);
storageDO.setCreator(userId);
storageDO.setUpdater(userId);
if (auItem != null) {
storageDO.setAuItem(auItem);
} else {
storageDO.setAuItem(firstLog.getAuItem());
}
wmsStorageMapper.insert(storageDO);
// 保存子表和更新日志
saveStorageDetailsAndLogs(logList, storageDO, configDO, userId, now);
}
private void saveStorageDetailsAndLogs(List<StorageLogDO> logList, WmsStorageDO storageDO,
WmsConfigDO configDO, String userId, LocalDateTime now) {
for (StorageLogDO logDO : logList) {
WmsStorageDetailDO detailDO = new WmsStorageDetailDO();
detailDO.setXzdWmsId(storageDO.getId());
detailDO.setStockNo(storageDO.getStockNo());
detailDO.setMatCode(logDO.getMatCode());
detailDO.setRgName(configDO.getRgName());
detailDO.setStockNum(logDO.getStorageOkQty());
detailDO.setPrice(logDO.getPrice());
detailDO.setCreateTime(now);
detailDO.setUpdateTime(now);
detailDO.setCreator(userId);
detailDO.setUpdater(userId);
wmsStorageDetailMapper.insert(detailDO);
logDO.setIsExport(1);
logDO.setXzdStockId(storageDO.getId());
logDO.setXzdStockNo(storageDO.getStockNo());
logDO.setUpdater(userId);
logDO.setUpdateTime(LocalDateTime.now());
storageLogMapper.updateById(logDO);
}
}
private String buildPriceSupplierKey(String priceType, String supplierName) {
return priceType + "/" + supplierName;
}
} }

View File

@ -0,0 +1,104 @@
import request from '@/config/axios'
export interface StorageLogVO {
id: number
stockId: number
matId: number
whId: number
rgId: number
pnId: number
storageOkQty: number
lotNo: string
description: string
noZero: number
matCode: string
matType:string
price:number
}
// 查询入/出库实时分页
export const getStorageNowList = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/all`, params })
}
// 查询物料信息结合库存信息
export const getStorageNowMaterialGroupPage = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/page-material-group`, params })
}
// 查询物料信息结合库存信息
export const getStorageNowMaterialPage = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/page-material`, params })
}
// 查询入/出库实时分页
export const getStorageNowAllPage = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/page-now-all`, params })
}
// 查询入/出库实时分页
export const getStorageNowPage = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/now`, params })
}
// 查询库存单价分页
export const getStorageNowPricePage = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/price`, params })
}
// 查询入/出库实时分页
export const getStorageNowPagesmall = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/nowsmall`, params })
}
// 查询入/出库日志分页
export const getStorageLogPage = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/page`, params })
}
// 查询入/出库日志详情
export const getStorageLog = async (id: number) => {
return await request.get({ url: `/heli/xzd-storage-log/get?id=` + id })
}
// 新增入/出库日志
export const createStorageLog = async (data: StorageLogVO) => {
return await request.post({ url: `/heli/xzd-storage-log/create`, data })
}
//修改物料单价
export const updatePrice = async (data: StorageLogVO) => {
return await request.post({ url: `/heli/xzd-storage-log/updatePrice`, data })
}
// 修改入/出库日志
export const updateStorageLog = async (data: StorageLogVO) => {
return await request.put({ url: `/heli/xzd-storage-log/update`, data })
}
// 删除入/出库日志
export const deleteStorageLog = async (id: number) => {
return await request.delete({ url: `/heli/xzd-storage-log/delete?id=` + id })
}
// 导出入/出库日志 Excel
export const exportStorageLog = async (params) => {
return await request.download({ url: `/heli/xzd-storage-log/export-excel`, params })
}
// 查询入/出库实时分页
export const getSupplementPage = async (params) => {
return await request.get({ url: `/heli/xzd-storage-log/getSupplementPage`, params })
}
export const submitForm = async (data) => {
return await request.post({ url: `/heli/xzd-storage-log/submitForm`, data })
}
export const generateBill = async (data) => {
return await request.post({ url: `/heli/xzd-storage-log/generateBill`, data },{ showErrorMessage: false })
}
/**
*
*/
export const HeliStorageIsExportDict = [
{ label: '未生成', value: 0 },
{ label: '已生成', value: 1 }
]

View File

@ -171,6 +171,9 @@ service.interceptors.response.use(
} else if (code === 10010 || code === 10011) { } else if (code === 10010 || code === 10011) {
// 导出校验失败,不显示错误提示,直接返回完整数据 // 导出校验失败,不显示错误提示,直接返回完整数据
return Promise.reject(data) return Promise.reject(data)
} else if (code === 11110 || code === 11111 || code === 11112 || code === 11113 || code === 11114 || code === 11115) {
// 生成单据校验失败,不显示错误提示,直接返回完整数据
return Promise.reject(data)
} else if (code === 901) { } else if (code === 901) {
ElMessage.error({ ElMessage.error({
offset: 300, offset: 300,

View File

@ -88,7 +88,14 @@ const open = async (type: string, id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await WmsStorageApi.getWmsStorage(id) const data = await WmsStorageApi.getWmsStorage(id)
console.log('获取到的详情数据:', data)
console.log('detailList:', data.detailList)
formData.value = {
...formData.value,
...data,
detailList: data.detailList || []
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }

View File

@ -105,7 +105,7 @@
<el-table-column <el-table-column
label="单据编号" label="单据编号"
fixed="left" fixed="left"
min-width="190" min-width="220"
align="center" align="center"
prop="stockNo" prop="stockNo"
/> />

View File

@ -0,0 +1,568 @@
<template>
<el-card class="hl-card">
<!-- <template #header>-->
<!-- <span>入出库单据生成</span>-->
<!-- </template>-->
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="120px"
>
<el-form-item label="单据日期" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
class="!w-280px"
end-placeholder="结束日期"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item label="物料编号" prop="matCode">
<el-input
v-model="queryParams.matCode"
placeholder="物料编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物料名称" prop="matName">
<el-input
v-model="queryParams.matName"
placeholder="物料名称"
clearable
@keyup.enter="handleQuery"
class="!w-260px"
/>
</el-form-item>
<el-form-item label="单据类型" prop="stockType">
<el-select
v-model="queryParams.stockType"
placeholder="请选择单据类型"
clearable
class="!w-260px"
>
<el-option
v-for="item in HeliStockTypeDict"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="单据状态" prop="isExport">
<el-select
v-model="queryParams.isExport"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option
v-for="item in HeliStorageIsExportDict"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
重置
</el-button>
<el-checkbox style="margin-left: 18px" v-model="queryParams.isSameMat">
相同物料
</el-checkbox>
<el-button style="margin-left: 18px" @click="getMatCode()" type="primary" size="large">
获取编码
</el-button>
<el-button
style="margin-left: 18px"
@click="submitForm()"
type="primary"
size="large"
:disabled="!multipleSelection || multipleSelection.length === 0"
>
保存编码
</el-button>
<el-button
style="margin-left: 18px"
@click="generateBill()"
type="primary"
size="large"
:disabled="!multipleSelection || multipleSelection.length === 0"
>
单据生成
</el-button>
<el-button style="margin-left: 18px" @click="submitForm()" type="primary" size="large">
新增物料
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<div class="section-title">出入库单据信息</div>
<el-table
v-loading="loading"
:data="list"
:show-overflow-tooltip="true"
class="hl-table"
ref="multipleTable"
height="calc(100vh - 410px)"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="50" :selectable="checkSelectable" />
<el-table-column type="index" width="60" label="序号" align="center" fixd="left" />
<el-table-column
label="单据类型"
align="center"
prop="stockMode"
min-width="110"
fixd="left"
>
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_STORAGE_TYPE" :value="scope.row.stockType" />
</template>
</el-table-column>
<el-table-column
label="单据状态"
align="center"
prop="stockMode"
min-width="110"
fixd="left"
>
<template #default="scope">
<el-tag v-if="scope.row.isExport == 0 || scope.row.isExport == null" type="danger">
未生成
</el-tag>
<el-tag v-else-if="scope.row.isExport == 1" type="success">已生成</el-tag>
<el-tag v-else type="success">其他</el-tag>
</template>
</el-table-column>
<el-table-column
label="单据编号"
align="center"
prop="xzdStockNo"
min-width="220"
fixd="left"
/>
<el-table-column label="物料编码" align="center" prop="matCode" min-width="200">
<template #default="scope">
<template v-if="scope.row.goodsType == 2">
<el-form-item class="mb-0px!">
<el-select
v-model="scope.row.matId"
placeholder=""
style="width: 100%"
filterable
clearable
@change="(val) => handleMatIdChange(val, scope.row)"
>
<el-option
v-for="dict in scope.row.materialDOList"
:key="dict.id"
:label="dict.code + ' ' + dict.name"
:value="dict.id"
/>
</el-select>
</el-form-item>
</template>
<template v-else>
{{ scope.row.matCode }}
</template>
</template>
</el-table-column>
<el-table-column label="价格类型" align="center" prop="priceType" min-width="150">
<template #default="scope">
<el-select v-model="scope.row.priceType" placeholder="请选择" class="!w-full" clearable>
<el-option
v-for="item in priceTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="发票编码" align="center" prop="incoiceCode" min-width="160">
<template #default="scope">
<el-input
v-model="scope.row.incoiceCode"
placeholder="请输入发票编码"
clearable
class="!w-full"
/>
</template>
</el-table-column>
<el-table-column label="物料名称" align="center" prop="matName" min-width="120" />
<el-table-column label="单价" align="center" prop="price" min-width="120" />
<el-table-column label="供应商简称" align="center" prop="brief" min-width="200" />
<el-table-column label="数量" align="center" prop="storageOkQty" min-width="140" />
<!-- <el-table-column label="单据类型" align="center" prop="stockMode" min-width="180" >-->
<!-- <template #default="scope">-->
<!-- <dict-tag :type="DICT_TYPE.HELI_STOCK_MODE" :value="scope.row.stockMode" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="规格型号" align="center" prop="matSpec" min-width="100" />
<el-table-column label="仓库" align="center" prop="whName" min-width="100" />
<!-- <el-table-column label="库区" align="center" prop="rgName" min-width="100" />-->
<el-table-column label="库区/库位" align="center" prop="pnName" min-width="140" />
<el-table-column label="单位" align="center" prop="matUnit" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.matUnit" />
</template>
</el-table-column>
<el-table-column label="出入库单号" align="center" prop="codeNo" min-width="180" />
<el-table-column
label="入/出库日期"
align="center"
prop="createTime"
:formatter="dateFormatter1"
min-width="170"
/>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</el-card>
</template>
<script setup lang="ts">
import * as StorageLogApi from '@/api/heli/xzdstoragelog'
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as WarehouseApi from '@/api/heli/warehouse'
import routeParamsCache from '@/utils/routeParamsCache'
import { ElButton, ElTableColumn } from 'element-plus'
import { ref } from 'vue'
import { HeliStockTypeDict, HeliStorageStatusDict } from '@/api/heli/wmsstorage'
import { HeliStorageIsExportDict } from '@/api/heli/xzdstoragelog'
import { dateFormatter, dateFormatter1 } from '@/utils/formatTime'
defineOptions({ name: 'Xzdstoragelog' })
const whList = ref([])
const multipleSelection = ref([])
const priceTypeOptions = ref([
{ value: '1|临时暂估价', label: '1|临时暂估价' },
{ value: '3|实价', label: '3|实价' }
])
const message = useMessage() //
const { t } = useI18n() //
const exportLoading = ref(false) //
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
matCode: undefined,
matName: undefined,
matType: undefined,
whId: undefined,
lotNo: undefined,
pnId: undefined,
stockNo: undefined,
stockType: undefined,
isExport: undefined,
createTime: [],
ids: []
})
const queryFormRef = ref() //
const handleSelectionChange = (val) => {
// multipleSelection
multipleSelection.value = val
}
//
const checkSelectable = (row) => {
return row.isExport == 0 || row.isExport == null
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await StorageLogApi.getStorageLogPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
queryParams.createTime = getDefaultDateRange()
handleQuery()
}
//
const init_page_wh = async () => {
whList.value = await WarehouseApi.getSimpList()
}
// //
// const init_page_rg = (async ()=>{
// rgList.value = await RgApi.getSimpList()
// })
// //
// const init_page_pn = (async ()=>{
// pnList.value = await PnApi.getSimpList()
// })
const getMatCode = async () => {
try {
const selectedList = multipleSelection.value || [] //
// 1.
if (!selectedList || selectedList.length == null) {
message.error('提交明细不能为空,请确认')
return
}
queryParams.ids = selectedList.map((item) => item.id)
// supplierName
const currentSelections = selectedList.map((row) => ({
id: row.id,
matId: row.matId,
priceType: row.priceType,
incoiceCode: row.incoiceCode,
supplierName: row.supplierName
}))
await getList()
// supplierName
currentSelections.forEach((selection) => {
const row = list.value.find((r) => r.id === selection.id)
if (row) {
row.matId = selection.matId
row.priceType = selection.priceType
row.incoiceCode = selection.incoiceCode
row.supplierName = selection.supplierName
}
})
queryParams.ids = []
message.success('获取成功')
emit('success')
} catch (error) {
console.error('获取失败:', error)
// message.error(`: ${error.message || ""}`);
} finally {
loading.value = false
}
}
const generateBill = async () => {
// 1.
if (multipleSelection.value.length === 0) {
message.warning('请选择要生成的数据')
return
}
// 2.
if (
multipleSelection.value.some((row) => row.stockType !== multipleSelection.value[0].stockType)
) {
message.warning('请选择同一单据类型的数据')
return
}
try {
// 3.
await StorageLogApi.generateBill(multipleSelection.value)
message.success(`成功生成 ${multipleSelection.value.length} 条单据`)
// 4.
await getList()
} catch (e: any) {
// ID
let code = 0
let idStr = ''
if (typeof e === 'string') {
idStr = e
} else if (e.code) {
code = e.code
idStr = e.msg || ''
} else if (e.response?.data) {
code = e.response.data.code
idStr = e.response.data.msg || ''
}
// msg
idStr = idStr.replace('存在', '')
// msgID
const msg = idStr.split(',')
// listID
const errorIndices = msg
.map((id) => {
const index = list.value.findIndex((row) => row.id === parseInt(id))
if (index === -1) return 0 // 0
// 使
return index + 1
})
.filter((index) => index > 0) //
// errorIndices
errorIndices.sort((a, b) => a - b)
const errorIndicesStr = errorIndices.join(',')
//
if (code === 11115) {
message.error(`${errorIndicesStr} )没有选择物料编码,请确认!`)
} else if (code === 11111) {
message.error(`${errorIndicesStr} )存在已删除的数据,请刷新界面!`)
} else if (code === 111102) {
message.error(`${errorIndicesStr} )已生成入库单的记录,请刷新界面。`)
} else if (code === 11112) {
message.error(`${errorIndicesStr} )价格类型没有输入,请确认。`)
} else if (code === 11113) {
message.error(`${errorIndicesStr} )价格类型是'临时暂估价',发票编码不空,请确认。`)
} else if (code === 11114) {
message.error(`${errorIndicesStr} )价格类型是'3|实价',发票编码为空,请确认`)
} else {
message.error(`${errorIndicesStr} )存在异常数据,请刷新界面。`)
}
//
return
}
}
const submitForm = async () => {
try {
const selectedList = multipleSelection.value || [] //
// 1.
if (!selectedList || selectedList.length == null) {
message.error('提交明细不能为空,请确认')
return
}
// 2. 使
if (selectedList.some((row) => !row.matId)) {
const rowWithoutMatId = selectedList.find((row) => !row.matId)
const tableRowIndex = list.value.findIndex((r) => r.id === rowWithoutMatId.id) + 1
message.error(`${tableRowIndex} )没有选择物料编码,请确认!`)
return
}
loading.value = true
// 5.
const res = await Promise.race([
StorageLogApi.submitForm(selectedList),
new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), 30000))
])
message.success('保存成功')
//
//
await getList() //
// emit('success')
} catch (error) {
console.error('获取失败:', error)
// message.error(`: ${error.message || ""}`);
} finally {
loading.value = false
}
}
/** 初始化 **/
const route = useRoute()
const routeValue = ref('')
onMounted(async () => {
let params = routeParamsCache.get(route.path)
routeValue.value = route.path
if (params) {
Object.assign(queryParams, params)
}
await init_page_wh()
// await init_page_rg()
// await init_page_pn()
await getList()
})
onBeforeUnmount(() => {
const plainParams = JSON.parse(JSON.stringify(queryParams))
routeParamsCache.set(routeValue.value, plainParams)
})
window.addEventListener('beforeunload', () => {
const plainParams = JSON.parse(JSON.stringify(queryParams))
routeParamsCache.set(routeValue.value, plainParams)
})
/** 初始化 **/
onMounted(() => {
// 1
queryParams.createTime = getDefaultDateRange()
//
// getList()
})
/** 获取默认日期范围 */
const getDefaultDateRange = () => {
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
const startDate = `${year}-${month}-01 00:00:00`
const endDate = `${year}-${month}-${day} 23:59:59`
return [startDate, endDate]
}
/** 物料编码变更处理 */
const handleMatIdChange = (val, row) => {
if (val && queryParams.isSameMat) {
// ""
const selectedIds = multipleSelection.value.map(item => item.id)
list.value.forEach(item => {
if (selectedIds.includes(item.id)) {
// ID
item.matId = val
// "1|"
if (!item.priceType) {
item.priceType = '1|临时暂估价'
}
//
const selectedMat = item.materialDOList?.find(m => m.id === val)
if (selectedMat) {
item.matCode = selectedMat.code
item.matName = selectedMat.name
}
}
})
} else if (val) {
// ""
const selectedMat = row.materialDOList?.find(m => m.id === val)
if (selectedMat) {
row.matCode = selectedMat.code
row.matName = selectedMat.name
}
// "1|"
if (!row.priceType) {
row.priceType = '1|临时暂估价'
}
}
}
</script>