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;
|
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -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;
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,10 +118,12 @@ 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);
|
||||||
@ -127,6 +148,29 @@ public class StorageLogServiceImpl implements StorageLogService {
|
|||||||
return pageResult;
|
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);
|
||||||
|
logDO.setMaterialDOList(materialDOS);
|
||||||
|
if (idSet.contains(logDO.getId()) && materialDOS.size() == 1) {
|
||||||
|
logDO.setMatId(materialDOS.get(0).getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pageResult;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<StorageLogNowDO> getStorageNowPage(StorageLogPageReqVO pageReqVO) {
|
public PageResult<StorageLogNowDO> getStorageNowPage(StorageLogPageReqVO pageReqVO) {
|
||||||
PageResult<StorageLogNowDO> storageLogNowDOPageResult = storageLogNowMapper.selectPage(pageReqVO);
|
PageResult<StorageLogNowDO> storageLogNowDOPageResult = storageLogNowMapper.selectPage(pageReqVO);
|
||||||
@ -220,9 +264,6 @@ public class StorageLogServiceImpl implements StorageLogService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -240,7 +281,8 @@ public class StorageLogServiceImpl implements StorageLogService {
|
|||||||
|
|
||||||
@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) {
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
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) {
|
} 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,
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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"
|
||||||
/>
|
/>
|
||||||
|
|||||||
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