From 518cb94c0739a597c1e139588e3a5345fbe6ade2 Mon Sep 17 00:00:00 2001 From: zxy Date: Thu, 2 Apr 2026 14:54:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(heli):=20=E6=B7=BB=E5=8A=A0=E5=87=BA?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E6=97=A5=E5=BF=97=E7=AE=A1=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../storagelog/XzdStorageLogController.java | 88 +++ .../storagelog/vo/StorageLogPageReqVO.java | 18 +- .../dataobject/storagelog/StorageLogDO.java | 11 + .../dal/dataobject/wmsconfig/WmsConfigDO.java | 58 ++ .../mysql/storagelog/StorageLogMapper.java | 39 +- .../dal/mysql/wmsconfig/WmsConfigMapper.java | 17 + .../service/storagelog/StorageLogService.java | 22 +- .../storagelog/StorageLogServiceImpl.java | 353 +++++++++-- .../resources/template/wms-storage-out.xls | Bin 19968 -> 19968 bytes .../src/api/heli/xzdstoragelog/index.ts | 104 ++++ .../src/config/axios/service.ts | 3 + .../views/heli/wmsstorage/WmsStorageForm.vue | 9 +- .../src/views/heli/wmsstorage/index.vue | 2 +- .../src/views/heli/xzdstoragelog/index.vue | 568 ++++++++++++++++++ 14 files changed, 1222 insertions(+), 70 deletions(-) create mode 100644 mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/XzdStorageLogController.java create mode 100644 mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/wmsconfig/WmsConfigDO.java create mode 100644 mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/wmsconfig/WmsConfigMapper.java create mode 100644 mes-ui/mes-ui-admin-vue3/src/api/heli/xzdstoragelog/index.ts create mode 100644 mes-ui/mes-ui-admin-vue3/src/views/heli/xzdstoragelog/index.vue diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/XzdStorageLogController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/XzdStorageLogController.java new file mode 100644 index 00000000..1aa27149 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/XzdStorageLogController.java @@ -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 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> getStorageLogPage(@Valid StorageLogPageReqVO pageReqVO) { + PageResult pageResult = storageLogService.getXzdStorageLogPage(pageReqVO); + return success(pageResult); + } + + @PostMapping("/submitForm") + @Operation(summary = "生产导入新中大") + @PreAuthorize("@ss.hasPermission('heli:storage-log:update')") + public CommonResult submitForm( @RequestBody List list) { + storageLogService.submitMatForm(list); + return success(true); + } + + @PostMapping("/generateBill") + @Operation(summary = "生成入库单") + @PreAuthorize("@ss.hasPermission('heli:storage-log:update')") + public CommonResult> generateBill(@RequestBody List list) { + Tuple2> objects = storageLogService.generateBill(list); + int flag = objects.getT1(); + List 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); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogPageReqVO.java index 8b26bcc4..b87e6276 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogPageReqVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogPageReqVO.java @@ -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 ids; -} \ No newline at end of file + @Schema(description = "是否导出") + private Integer isExport; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagelog/StorageLogDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagelog/StorageLogDO.java index 21c5f400..5fa7d8e0 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagelog/StorageLogDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagelog/StorageLogDO.java @@ -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; + + } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/wmsconfig/WmsConfigDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/wmsconfig/WmsConfigDO.java new file mode 100644 index 00000000..78cec130 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/wmsconfig/WmsConfigDO.java @@ -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; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagelog/StorageLogMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagelog/StorageLogMapper.java index ae56d9b5..4d291d18 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagelog/StorageLogMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagelog/StorageLogMapper.java @@ -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 { return selectPage(reqVO,query); } // PageResult selectAllPage(StorageLogPageReqVO reqVO); -} \ No newline at end of file + + default PageResult selectXzdPage(StorageLogPageReqVO reqVO) { + MPJLambdaWrapper 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); + } +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/wmsconfig/WmsConfigMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/wmsconfig/WmsConfigMapper.java new file mode 100644 index 00000000..6f22d748 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/wmsconfig/WmsConfigMapper.java @@ -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 { + + + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogService.java index 78c88646..0377b7c0 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogService.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogService.java @@ -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 getStorageLogPage(StorageLogPageReqVO pageReqVO); + PageResult getXzdStorageLogPage(StorageLogPageReqVO pageReqVO); + PageResult getStorageNowPage(StorageLogPageReqVO pageReqVO); // List getStorageNowPagesmall(StorageLogPageReqVO pageReqVO); @@ -82,4 +84,8 @@ public interface StorageLogService { void getMatCode(List list); void submitForm(List list); + + void submitMatForm(List list); + + Tuple2> generateBill(List list); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogServiceImpl.java index 52fd6809..eaa78727 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogServiceImpl.java @@ -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 getStorageLogPage(StorageLogPageReqVO pageReqVO) { // return storageLogAllMapper.selectPage(pageReqVO); PageResult pageResult = storageLogMapper.selectPage(pageReqVO); Set 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MaterialDO::getName, logDO.getMatName()); + List 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 getXzdStorageLogPage(StorageLogPageReqVO pageReqVO) { + PageResult pageResult = storageLogMapper.selectXzdPage(pageReqVO); + Set 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 queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MaterialDO::getName, logDO.getMatName()); List materialDOS = materialMapper.selectList(queryWrapper); @@ -183,14 +227,14 @@ public class StorageLogServiceImpl implements StorageLogService { @Override public List 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 selectNowByMatPnId(Long matId,Long pnId) { - return storageLogNowMapper.selectNowByMatPnId(matId,pnId); + public List selectNowByMatPnId(Long matId, Long pnId) { + return storageLogNowMapper.selectNowByMatPnId(matId, pnId); } @Override public void createStorageLogBatch(List storageLogDOs) { - for (StorageLogDO storageLogDo : storageLogDOs){ + for (StorageLogDO storageLogDo : storageLogDOs) { storageLogMapper.insert(storageLogDo); MaterialDO materialDO = materialMapper.selectById(storageLogDo.getMatId()); - if(materialDO!=null){ - List 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 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 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 getSupplementPage(StorageLogPageReqVO pageReqVO) { - return storageLogNowMapper.getSupplementPage(pageReqVO); } + return storageLogNowMapper.getSupplementPage(pageReqVO); + } @Override public void getMatCode(List list) { for (StorageLogDO logDO : list) { List 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 list) { storageLogMapper.updateBatch(list); } + + @Override + public void submitMatForm(List list) { + // 只更新 matId ,其他字段不更新 + for (StorageLogDO logDO : list) { + if (logDO.getId() != null && logDO.getMatId() != null) { + LambdaUpdateWrapper 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> generateBill(List list) { + // 1 删除 4 价格类型是‘临时暂估价’,发票编码不空,请确认。 + // 5 价格类型是‘3|实价’,发票编码为空 + List errorList = new ArrayList<>(); + List incoiceCodeList1 = new ArrayList<>(); + List incoiceCodeList2 = new ArrayList<>(); + List 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 logList) { + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + String userId = String.valueOf(loginUserId); + LocalDateTime now = LocalDateTime.now(); + WmsConfigDO configDO = wmsConfigMapper.selectById(1); + + // 根据入库类型分组处理 + Map> 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 logList, WmsConfigDO configDO, String userId, LocalDateTime now) { + // 根据价格类型、供应商分组 + Map> 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 logList, WmsConfigDO configDO, String userId, LocalDateTime now) { + // 根据辅助项分组 + Map> 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 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 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 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; + } + + } diff --git a/mes-server/src/main/resources/template/wms-storage-out.xls b/mes-server/src/main/resources/template/wms-storage-out.xls index d5ac77aa21326db701df9419076c89325f813a2d..8d225f1df1c647b4fb189e3ac0ae75623d5b6511 100644 GIT binary patch delta 1071 zcmZuxT}TvB6h3!$X54Y5`E}M^(N@BW#h)=SCn2p-bRLKqn-)S`{sj8_^{6|3p$m_Zt zvtuA8akHM~7!K*%a9CFoYM8SOsg6{K4X~K{02ZjYzA2udTAyJ`*QaCC#L(!WI=<55 z3FALh@lX@j3AI9W8IBNhGGs2tdLwR9BcJ&(E%*@Ac+!aD2}8zZ!@#emjI-qL8ghb4 zH{@1&eUkW;Dq1ar)!{u_{VAH8405Z?xX0KKFb|l;nEf3j@qCbdHOQVXnjLb#-@sjM z$;?ydTTf$!r*Xt8)-@ey{I}~%t4`uKA>&7@R_=leec#SFTKSb)+urRR7+XDn1A~{F z4^4mupECHcCEN8GT7jhGx^)4!_VnUd&jaau MJN+4)roFGlzq8-ko&W#< delta 715 zcmZpe!`Lu~aYGIZo58HKsfP|sE@Ek8nrt)q7fT&u(B?{3ai+~H*iASY*(U$x6Q6uX zKyk9DAU`7~n5QCWIk{Aje{znX`sCGuoQ!-RQAYmBX9dM21sE6@zWxW2Qv?O~%kP(G zVBu7Fz#zgPIQcJ7RtPSemIjeE2g?di))f+$6oJWJVMugPFpywiH~^Lvog6D9E-VI< z-2!BQ0E_PAd?E44^Mu%hfl48^!sQGm&j-q#6JndZL`Z0|p9mYH#N@X?Q!rJUf>r7X zLsZ5IgH-woV^e7kR@nztxeu&zEmoDrC}sj(h|^3nuu7o&CclBZGgkzg?UrDbc~Bog zY(FdFJXu3jh|P&1$t409(Z zSX*f_zL@Z0D#w2<2G0NN44ljiQhp1As%yH#AwmocQVgs>$i^Tw`J}ZY+fNe)1|EjV z4;}TG+RP^lI{lbzVY`Umk%1X#&tC>EP)sm5PJU@C%Vx(U#ITQj@ zBoHz&%>?pvIX5v10hPkQe<0W#ZNG(yNz!JspwoNC$v3^SCqM8?fnw85E@DjVVoYpP ln)#eI%eo0NO*ZrJnry(rF}cBGE$heMQw|;2Y~*>41psXVyb1sS diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/xzdstoragelog/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/xzdstoragelog/index.ts new file mode 100644 index 00000000..48d41072 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/xzdstoragelog/index.ts @@ -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 } +] diff --git a/mes-ui/mes-ui-admin-vue3/src/config/axios/service.ts b/mes-ui/mes-ui-admin-vue3/src/config/axios/service.ts index e01109ce..b6bef4a8 100644 --- a/mes-ui/mes-ui-admin-vue3/src/config/axios/service.ts +++ b/mes-ui/mes-ui-admin-vue3/src/config/axios/service.ts @@ -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, diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/WmsStorageForm.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/WmsStorageForm.vue index d09be8a0..fd541803 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/WmsStorageForm.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/WmsStorageForm.vue @@ -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 } diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/index.vue index 8eb1da0b..1aecdc02 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/index.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/wmsstorage/index.vue @@ -105,7 +105,7 @@ diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/xzdstoragelog/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/xzdstoragelog/index.vue new file mode 100644 index 00000000..43dc35cb --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/xzdstoragelog/index.vue @@ -0,0 +1,568 @@ + + +