feat(heli): 添加出入库日志管理功能
This commit is contained in:
parent
fbf89da81a
commit
518cb94c07
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,12 +1,14 @@
|
||||
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 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 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;
|
||||
|
||||
@ -55,4 +57,10 @@ public class StorageLogPageReqVO extends PageParam {
|
||||
@Schema(description = "获取物料信息id")
|
||||
private List<Long> ids;
|
||||
|
||||
}
|
||||
@Schema(description = "是否导出")
|
||||
private Integer isExport;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
}
|
||||
|
||||
@ -104,4 +104,15 @@ public class StorageLogDO extends BaseDO {
|
||||
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||
private String incoiceCode;
|
||||
|
||||
@TableField(exist = false)
|
||||
private String priceType;
|
||||
|
||||
//供应商简称
|
||||
@TableField(exist = false)
|
||||
private String brief;
|
||||
|
||||
@TableField(exist = false)
|
||||
private String supplierName;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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;
|
||||
|
||||
}
|
||||
@ -1,20 +1,19 @@
|
||||
package com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
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.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.pn.PnDO;
|
||||
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.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.wmsstorage.WmsStorageDO;
|
||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||
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;
|
||||
|
||||
/**
|
||||
@ -49,4 +48,32 @@ public interface StorageLogMapper extends BaseMapperX<StorageLogDO> {
|
||||
return selectPage(reqVO,query);
|
||||
}
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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> {
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -1,16 +1,16 @@
|
||||
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.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.StorageMaterialDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import reactor.util.function.Tuple2;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 入/出库日志 Service 接口
|
||||
@ -57,6 +57,8 @@ public interface StorageLogService {
|
||||
*/
|
||||
PageResult<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO);
|
||||
|
||||
PageResult<StorageLogDO> getXzdStorageLogPage(StorageLogPageReqVO pageReqVO);
|
||||
|
||||
PageResult<StorageLogNowDO> getStorageNowPage(StorageLogPageReqVO pageReqVO);
|
||||
// List<StorageLogNowDO> getStorageNowPagesmall(StorageLogPageReqVO pageReqVO);
|
||||
|
||||
@ -82,4 +84,8 @@ public interface StorageLogService {
|
||||
void getMatCode(List<StorageLogDO> list);
|
||||
|
||||
void submitForm(List<StorageLogDO> list);
|
||||
|
||||
void submitMatForm(List<StorageLogDO> list);
|
||||
|
||||
Tuple2<Integer,List<StorageLogDO>> generateBill(List<StorageLogDO> list);
|
||||
}
|
||||
|
||||
@ -1,44 +1,48 @@
|
||||
package com.chanko.yunxi.mes.module.heli.service.storagelog;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
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.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.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.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.StorageMaterialMapper;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsconfig.WmsConfigMapper;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.wmsstorage.WmsStorageMapper;
|
||||
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 javax.annotation.Resource;
|
||||
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
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 java.io.InputStream;
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
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.module.heli.enums.ErrorCodeConstants.*;
|
||||
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.STORAGE_LOG_NOT_EXISTS;
|
||||
|
||||
/**
|
||||
* 入/出库日志 Service 实现类
|
||||
@ -61,8 +65,23 @@ public class StorageLogServiceImpl implements StorageLogService {
|
||||
|
||||
@Resource
|
||||
private StorageMaterialMapper storageMaterialMapper;
|
||||
@Resource
|
||||
private WmsStorageMapper wmsStorageMapper;
|
||||
@Resource
|
||||
private WmsStorageDetailMapper wmsStorageDetailMapper;
|
||||
|
||||
@Resource
|
||||
private WmsConfigMapper wmsConfigMapper;
|
||||
|
||||
@Resource
|
||||
private DictTypeService dictTypeService;
|
||||
|
||||
@Resource
|
||||
private DictDataService dictDataService;
|
||||
|
||||
@Resource
|
||||
private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper;
|
||||
|
||||
@Override
|
||||
public Long createStorageLog(StorageLogSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
@ -99,21 +118,46 @@ public class StorageLogServiceImpl implements StorageLogService {
|
||||
public StorageLogDO getStorageLog(Long id) {
|
||||
return storageLogMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int deleteByStockId(Long stockId){
|
||||
return storageLogMapper.delete(StorageLogDO::getStockId,stockId);
|
||||
public int deleteByStockId(Long stockId) {
|
||||
return storageLogMapper.delete(StorageLogDO::getStockId, stockId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO) {
|
||||
// return storageLogAllMapper.selectPage(pageReqVO);
|
||||
PageResult<StorageLogDO> pageResult = storageLogMapper.selectPage(pageReqVO);
|
||||
Set<Long> idSet = Collections.unmodifiableSet(new HashSet<>());
|
||||
if (ObjectUtil.isNotEmpty(pageReqVO.getIds())){
|
||||
idSet = new HashSet<>(pageReqVO.getIds());
|
||||
if (ObjectUtil.isNotEmpty(pageReqVO.getIds())) {
|
||||
idSet = new HashSet<>(pageReqVO.getIds());
|
||||
}
|
||||
for (StorageLogDO logDO : pageResult.getList()) {
|
||||
if (logDO.getGoodsType()==2){
|
||||
if (ObjectUtil.isNotEmpty(logDO.getMatName())){
|
||||
if (logDO.getGoodsType() == 2) {
|
||||
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<>();
|
||||
queryWrapper.eq(MaterialDO::getName, logDO.getMatName());
|
||||
List<MaterialDO> materialDOS = materialMapper.selectList(queryWrapper);
|
||||
@ -183,14 +227,14 @@ public class StorageLogServiceImpl implements StorageLogService {
|
||||
|
||||
@Override
|
||||
public List<StorageLogNowDO> getStorageNowList(StorageNowAllReqVO queryReqVO) {
|
||||
if(queryReqVO.getNoZero().equals(1)){
|
||||
if (queryReqVO.getNoZero().equals(1)) {
|
||||
// 根据仓库id排除库存为o的物料
|
||||
return storageLogNowMapper.selectNoZero(queryReqVO);
|
||||
}else{
|
||||
} else {
|
||||
// 筛选全部的实时库存数据,包含未分配仓库的物料信息和已分配仓库的物料信息
|
||||
if(queryReqVO.isALL()){
|
||||
if (queryReqVO.isALL()) {
|
||||
return storageLogNowMapper.selectNowList(queryReqVO);
|
||||
}else{
|
||||
} else {
|
||||
return storageLogNowMapper.selectNowList(queryReqVO);
|
||||
}
|
||||
}
|
||||
@ -198,31 +242,28 @@ public class StorageLogServiceImpl implements StorageLogService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<StorageLogNowDO> selectNowByMatPnId(Long matId,Long pnId) {
|
||||
return storageLogNowMapper.selectNowByMatPnId(matId,pnId);
|
||||
public List<StorageLogNowDO> selectNowByMatPnId(Long matId, Long pnId) {
|
||||
return storageLogNowMapper.selectNowByMatPnId(matId, pnId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createStorageLogBatch(List<StorageLogDO> storageLogDOs) {
|
||||
for (StorageLogDO storageLogDo : storageLogDOs){
|
||||
for (StorageLogDO storageLogDo : storageLogDOs) {
|
||||
storageLogMapper.insert(storageLogDo);
|
||||
MaterialDO materialDO = materialMapper.selectById(storageLogDo.getMatId());
|
||||
if(materialDO!=null){
|
||||
List<StorageLogNowDO> pageResult = storageLogNowMapper.selectPagesmallbyid(materialDO.getCode());//查询符合条件的值
|
||||
if(pageResult.size()==0){
|
||||
bdgzsomthingDO abc= new bdgzsomthingDO();
|
||||
abc.setThingname("库存低于安全库存");
|
||||
abc.setAttr3(materialDO.getCode());
|
||||
bdgzsomthingMapper.updateok(abc);
|
||||
}
|
||||
}
|
||||
if (materialDO != null) {
|
||||
List<StorageLogNowDO> pageResult = storageLogNowMapper.selectPagesmallbyid(materialDO.getCode());//查询符合条件的值
|
||||
if (pageResult.size() == 0) {
|
||||
bdgzsomthingDO abc = new bdgzsomthingDO();
|
||||
abc.setThingname("库存低于安全库存");
|
||||
abc.setAttr3(materialDO.getCode());
|
||||
bdgzsomthingMapper.updateok(abc);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -233,20 +274,21 @@ public class StorageLogServiceImpl implements StorageLogService {
|
||||
@Override
|
||||
public void updatePrice(StorageLogSaveReqVO updateReqVO) {
|
||||
LambdaUpdateWrapper<MaterialDO> wrapper = new LambdaUpdateWrapper<>();
|
||||
wrapper.eq(MaterialDO::getCode,updateReqVO.getMatCode());
|
||||
wrapper.set(MaterialDO::getPrice,updateReqVO.getPrice());
|
||||
wrapper.eq(MaterialDO::getCode, updateReqVO.getMatCode());
|
||||
wrapper.set(MaterialDO::getPrice, updateReqVO.getPrice());
|
||||
materialMapper.update(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<StorageLogNowDO> getSupplementPage(StorageLogPageReqVO pageReqVO) {
|
||||
return storageLogNowMapper.getSupplementPage(pageReqVO); }
|
||||
return storageLogNowMapper.getSupplementPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getMatCode(List<StorageLogDO> list) {
|
||||
for (StorageLogDO logDO : list) {
|
||||
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);
|
||||
logDO.setMatId(materialDO.getId());
|
||||
storageLogMapper.updateById(logDO);
|
||||
@ -258,4 +300,217 @@ public class StorageLogServiceImpl implements StorageLogService {
|
||||
public void submitForm(List<StorageLogDO> 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Binary file not shown.
104
mes-ui/mes-ui-admin-vue3/src/api/heli/xzdstoragelog/index.ts
Normal file
104
mes-ui/mes-ui-admin-vue3/src/api/heli/xzdstoragelog/index.ts
Normal 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 }
|
||||
]
|
||||
@ -171,6 +171,9 @@ service.interceptors.response.use(
|
||||
} else if (code === 10010 || code === 10011) {
|
||||
// 导出校验失败,不显示错误提示,直接返回完整数据
|
||||
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) {
|
||||
ElMessage.error({
|
||||
offset: 300,
|
||||
|
||||
@ -88,7 +88,14 @@ const open = async (type: string, id?: number) => {
|
||||
if (id) {
|
||||
formLoading.value = true
|
||||
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 {
|
||||
formLoading.value = false
|
||||
}
|
||||
|
||||
@ -105,7 +105,7 @@
|
||||
<el-table-column
|
||||
label="单据编号"
|
||||
fixed="left"
|
||||
min-width="190"
|
||||
min-width="220"
|
||||
align="center"
|
||||
prop="stockNo"
|
||||
/>
|
||||
|
||||
568
mes-ui/mes-ui-admin-vue3/src/views/heli/xzdstoragelog/index.vue
Normal file
568
mes-ui/mes-ui-admin-vue3/src/views/heli/xzdstoragelog/index.vue
Normal 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('存在', '')
|
||||
|
||||
// 分割msg,获取ID数组
|
||||
const msg = idStr.split(',')
|
||||
// 在list中找到对应ID的序号集合(当前页的行号)
|
||||
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>
|
||||
Loading…
Reference in New Issue
Block a user