diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/WarehouseOutController.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/WarehouseOutController.java new file mode 100644 index 0000000..3c99797 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/WarehouseOutController.java @@ -0,0 +1,102 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.yunxi.scm.framework.common.pojo.PageResult; +import com.yunxi.scm.framework.common.pojo.CommonResult; +import static com.yunxi.scm.framework.common.pojo.CommonResult.success; + +import com.yunxi.scm.framework.excel.core.util.ExcelUtils; + +import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog; +import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehouseout.WarehouseOutDO; +import com.yunxi.scm.module.xxjj.convert.warehouseout.WarehouseOutConvert; +import com.yunxi.scm.module.xxjj.service.warehouseout.WarehouseOutService; + +@Tag(name = "管理后台 - 领料单") +@RestController +@RequestMapping("/xxjj/warehouse-out") +@Validated +public class WarehouseOutController { + + @Resource + private WarehouseOutService warehouseOutService; + + @PostMapping("/create") + @Operation(summary = "创建领料单") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-out:create')") + public CommonResult createWarehouseOut(@Valid @RequestBody WarehouseOutCreateReqVO createReqVO) { + return success(warehouseOutService.createWarehouseOut(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新领料单") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-out:update')") + public CommonResult updateWarehouseOut(@Valid @RequestBody WarehouseOutUpdateReqVO updateReqVO) { + warehouseOutService.updateWarehouseOut(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除领料单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-out:delete')") + public CommonResult deleteWarehouseOut(@RequestParam("id") Long id) { + warehouseOutService.deleteWarehouseOut(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得领料单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-out:query')") + public CommonResult getWarehouseOut(@RequestParam("id") Long id) { + WarehouseOutDO warehouseOut = warehouseOutService.getWarehouseOut(id); + return success(WarehouseOutConvert.INSTANCE.convert(warehouseOut)); + } + + @GetMapping("/list") + @Operation(summary = "获得领料单列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-out:query')") + public CommonResult> getWarehouseOutList(@RequestParam("ids") Collection ids) { + List list = warehouseOutService.getWarehouseOutList(ids); + return success(WarehouseOutConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得领料单分页") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-out:query')") + public CommonResult> getWarehouseOutPage(@Valid WarehouseOutPageReqVO pageVO) { + PageResult pageResult = warehouseOutService.getWarehouseOutPage(pageVO); + return success(WarehouseOutConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出领料单 Excel") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-out:export')") + @OperateLog(type = EXPORT) + public void exportWarehouseOutExcel(@Valid WarehouseOutExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = warehouseOutService.getWarehouseOutList(exportReqVO); + // 导出 Excel + List datas = WarehouseOutConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "领料单.xls", "数据", WarehouseOutExcelVO.class, datas); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutBaseVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutBaseVO.java new file mode 100644 index 0000000..aa5cef0 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutBaseVO.java @@ -0,0 +1,51 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 领料单 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class WarehouseOutBaseVO { + + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "单据编号不能为空") + private String documentNo; + + @Schema(description = "领料仓库id", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "领料仓库id不能为空") + private Long warehouseOut; + + @Schema(description = "单据状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "单据状态不能为空") + private String status; + + @Schema(description = "领料原因", example = "不香") + private String reason; + + @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "领料数量不能为空") + private Integer outNum; + + @Schema(description = "领料时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "领料时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime outTime; + + @Schema(description = "完成时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "完成时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime finishTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutCreateReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutCreateReqVO.java new file mode 100644 index 0000000..b13cb11 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutCreateReqVO.java @@ -0,0 +1,14 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 领料单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseOutCreateReqVO extends WarehouseOutBaseVO { + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutExcelVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutExcelVO.java new file mode 100644 index 0000000..6b8038c --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutExcelVO.java @@ -0,0 +1,52 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.yunxi.scm.framework.excel.core.annotations.DictFormat; +import com.yunxi.scm.framework.excel.core.convert.DictConvert; + + +/** + * 领料单 Excel VO + * + * @author 长江云息 + */ +@Data +public class WarehouseOutExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("单据编号") + private String documentNo; + + @ExcelProperty("领料仓库id") + private Long warehouseOut; + + @ExcelProperty(value = "单据状态", converter = DictConvert.class) + @DictFormat("warehouse_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + private String status; + + @ExcelProperty("领料原因") + private String reason; + + @ExcelProperty("领料数量") + private Integer outNum; + + @ExcelProperty("领料时间") + private LocalDateTime outTime; + + @ExcelProperty("完成时间") + private LocalDateTime finishTime; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutExportReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutExportReqVO.java new file mode 100644 index 0000000..aa74a11 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutExportReqVO.java @@ -0,0 +1,43 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yunxi.scm.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 领料单 Excel 导出 Request VO,参数和 WarehouseOutPageReqVO 是一致的") +@Data +public class WarehouseOutExportReqVO { + + @Schema(description = "单据编号") + private String documentNo; + + @Schema(description = "领料仓库id") + private Long warehouseOut; + + @Schema(description = "单据状态", example = "1") + private String status; + + @Schema(description = "领料原因", example = "不香") + private String reason; + + @Schema(description = "领料数量") + private Integer outNum; + + @Schema(description = "领料时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] outTime; + + @Schema(description = "完成时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] finishTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutPageReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutPageReqVO.java new file mode 100644 index 0000000..a6adf06 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutPageReqVO.java @@ -0,0 +1,45 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yunxi.scm.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 领料单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseOutPageReqVO extends PageParam { + + @Schema(description = "单据编号") + private String documentNo; + + @Schema(description = "领料仓库id") + private Long warehouseOut; + + @Schema(description = "单据状态", example = "1") + private String status; + + @Schema(description = "领料原因", example = "不香") + private String reason; + + @Schema(description = "领料数量") + private Integer outNum; + + @Schema(description = "领料时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] outTime; + + @Schema(description = "完成时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] finishTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutRespVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutRespVO.java new file mode 100644 index 0000000..308f974 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutRespVO.java @@ -0,0 +1,19 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 领料单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseOutRespVO extends WarehouseOutBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "16399") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutUpdateReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutUpdateReqVO.java new file mode 100644 index 0000000..83c66d7 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehouseout/vo/WarehouseOutUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 领料单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseOutUpdateReqVO extends WarehouseOutBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "16399") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/WarehouseReceiptController.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/WarehouseReceiptController.java new file mode 100644 index 0000000..2c8d162 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/WarehouseReceiptController.java @@ -0,0 +1,102 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.yunxi.scm.framework.common.pojo.PageResult; +import com.yunxi.scm.framework.common.pojo.CommonResult; +import static com.yunxi.scm.framework.common.pojo.CommonResult.success; + +import com.yunxi.scm.framework.excel.core.util.ExcelUtils; + +import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog; +import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehousereceipt.WarehouseReceiptDO; +import com.yunxi.scm.module.xxjj.convert.warehousereceipt.WarehouseReceiptConvert; +import com.yunxi.scm.module.xxjj.service.warehousereceipt.WarehouseReceiptService; + +@Tag(name = "管理后台 - 入库单") +@RestController +@RequestMapping("/xxjj/warehouse-receipt") +@Validated +public class WarehouseReceiptController { + + @Resource + private WarehouseReceiptService warehouseReceiptService; + + @PostMapping("/create") + @Operation(summary = "创建入库单") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-receipt:create')") + public CommonResult createWarehouseReceipt(@Valid @RequestBody WarehouseReceiptCreateReqVO createReqVO) { + return success(warehouseReceiptService.createWarehouseReceipt(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新入库单") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-receipt:update')") + public CommonResult updateWarehouseReceipt(@Valid @RequestBody WarehouseReceiptUpdateReqVO updateReqVO) { + warehouseReceiptService.updateWarehouseReceipt(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除入库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-receipt:delete')") + public CommonResult deleteWarehouseReceipt(@RequestParam("id") Long id) { + warehouseReceiptService.deleteWarehouseReceipt(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得入库单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-receipt:query')") + public CommonResult getWarehouseReceipt(@RequestParam("id") Long id) { + WarehouseReceiptDO warehouseReceipt = warehouseReceiptService.getWarehouseReceipt(id); + return success(WarehouseReceiptConvert.INSTANCE.convert(warehouseReceipt)); + } + + @GetMapping("/list") + @Operation(summary = "获得入库单列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-receipt:query')") + public CommonResult> getWarehouseReceiptList(@RequestParam("ids") Collection ids) { + List list = warehouseReceiptService.getWarehouseReceiptList(ids); + return success(WarehouseReceiptConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得入库单分页") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-receipt:query')") + public CommonResult> getWarehouseReceiptPage(@Valid WarehouseReceiptPageReqVO pageVO) { + PageResult pageResult = warehouseReceiptService.getWarehouseReceiptPage(pageVO); + return success(WarehouseReceiptConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出入库单 Excel") + @PreAuthorize("@ss.hasPermission('xxjj:warehouse-receipt:export')") + @OperateLog(type = EXPORT) + public void exportWarehouseReceiptExcel(@Valid WarehouseReceiptExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = warehouseReceiptService.getWarehouseReceiptList(exportReqVO); + // 导出 Excel + List datas = WarehouseReceiptConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "入库单.xls", "数据", WarehouseReceiptExcelVO.class, datas); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptBaseVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptBaseVO.java new file mode 100644 index 0000000..a9d464f --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptBaseVO.java @@ -0,0 +1,46 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 入库单 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class WarehouseReceiptBaseVO { + + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "单据编号不能为空") + private String documentNo; + + @Schema(description = "入库仓库id", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "入库仓库id不能为空") + private Long warehouseReceipt; + + @Schema(description = "单据状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "单据状态不能为空") + private String status; + + @Schema(description = "单据类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "单据类型不能为空") + private String type; + + @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "入库数量不能为空") + private Integer receiptNum; + + @Schema(description = "入库时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "入库时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime receiptTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptCreateReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptCreateReqVO.java new file mode 100644 index 0000000..599f837 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptCreateReqVO.java @@ -0,0 +1,14 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 入库单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseReceiptCreateReqVO extends WarehouseReceiptBaseVO { + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptExcelVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptExcelVO.java new file mode 100644 index 0000000..a7955bd --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptExcelVO.java @@ -0,0 +1,49 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.yunxi.scm.framework.excel.core.annotations.DictFormat; +import com.yunxi.scm.framework.excel.core.convert.DictConvert; + + +/** + * 入库单 Excel VO + * + * @author 长江云息 + */ +@Data +public class WarehouseReceiptExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("单据编号") + private String documentNo; + + @ExcelProperty("入库仓库id") + private Long warehouseReceipt; + + @ExcelProperty(value = "单据状态", converter = DictConvert.class) + @DictFormat("warehouse_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + private String status; + + @ExcelProperty(value = "单据类型", converter = DictConvert.class) + @DictFormat("business_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + private String type; + + @ExcelProperty("入库数量") + private Integer receiptNum; + + @ExcelProperty("入库时间") + private LocalDateTime receiptTime; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptExportReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptExportReqVO.java new file mode 100644 index 0000000..d761bb9 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptExportReqVO.java @@ -0,0 +1,39 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yunxi.scm.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 入库单 Excel 导出 Request VO,参数和 WarehouseReceiptPageReqVO 是一致的") +@Data +public class WarehouseReceiptExportReqVO { + + @Schema(description = "单据编号") + private String documentNo; + + @Schema(description = "入库仓库id") + private Long warehouseReceipt; + + @Schema(description = "单据状态", example = "2") + private String status; + + @Schema(description = "单据类型", example = "2") + private String type; + + @Schema(description = "入库数量") + private Integer receiptNum; + + @Schema(description = "入库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] receiptTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptPageReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptPageReqVO.java new file mode 100644 index 0000000..e87389a --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptPageReqVO.java @@ -0,0 +1,41 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yunxi.scm.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 入库单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseReceiptPageReqVO extends PageParam { + + @Schema(description = "单据编号") + private String documentNo; + + @Schema(description = "入库仓库id") + private Long warehouseReceipt; + + @Schema(description = "单据状态", example = "2") + private String status; + + @Schema(description = "单据类型", example = "2") + private String type; + + @Schema(description = "入库数量") + private Integer receiptNum; + + @Schema(description = "入库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] receiptTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptRespVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptRespVO.java new file mode 100644 index 0000000..382e3cb --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptRespVO.java @@ -0,0 +1,19 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 入库单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseReceiptRespVO extends WarehouseReceiptBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24380") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptUpdateReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptUpdateReqVO.java new file mode 100644 index 0000000..77dfbd0 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/warehousereceipt/vo/WarehouseReceiptUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 入库单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseReceiptUpdateReqVO extends WarehouseReceiptBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24380") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/warehouseout/WarehouseOutConvert.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/warehouseout/WarehouseOutConvert.java new file mode 100644 index 0000000..b235fc3 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/warehouseout/WarehouseOutConvert.java @@ -0,0 +1,34 @@ +package com.yunxi.scm.module.xxjj.convert.warehouseout; + +import java.util.*; + +import com.yunxi.scm.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehouseout.WarehouseOutDO; + +/** + * 领料单 Convert + * + * @author 长江云息 + */ +@Mapper +public interface WarehouseOutConvert { + + WarehouseOutConvert INSTANCE = Mappers.getMapper(WarehouseOutConvert.class); + + WarehouseOutDO convert(WarehouseOutCreateReqVO bean); + + WarehouseOutDO convert(WarehouseOutUpdateReqVO bean); + + WarehouseOutRespVO convert(WarehouseOutDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/warehousereceipt/WarehouseReceiptConvert.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/warehousereceipt/WarehouseReceiptConvert.java new file mode 100644 index 0000000..a3fbd2c --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/warehousereceipt/WarehouseReceiptConvert.java @@ -0,0 +1,34 @@ +package com.yunxi.scm.module.xxjj.convert.warehousereceipt; + +import java.util.*; + +import com.yunxi.scm.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehousereceipt.WarehouseReceiptDO; + +/** + * 入库单 Convert + * + * @author 长江云息 + */ +@Mapper +public interface WarehouseReceiptConvert { + + WarehouseReceiptConvert INSTANCE = Mappers.getMapper(WarehouseReceiptConvert.class); + + WarehouseReceiptDO convert(WarehouseReceiptCreateReqVO bean); + + WarehouseReceiptDO convert(WarehouseReceiptUpdateReqVO bean); + + WarehouseReceiptRespVO convert(WarehouseReceiptDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/warehouseout/WarehouseOutDO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/warehouseout/WarehouseOutDO.java new file mode 100644 index 0000000..eb9473c --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/warehouseout/WarehouseOutDO.java @@ -0,0 +1,63 @@ +package com.yunxi.scm.module.xxjj.dal.dataobject.warehouseout; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO; + +/** + * 领料单 DO + * + * @author 长江云息 + */ +@TableName("xxjj_warehouse_out") +@KeySequence("xxjj_warehouse_out_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WarehouseOutDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 单据编号 + */ + private String documentNo; + /** + * 领料仓库id + */ + private Long warehouseOut; + /** + * 单据状态 + * + * 枚举 {@link TODO warehouse_type 对应的类} + */ + private String status; + /** + * 领料原因 + */ + private String reason; + /** + * 领料数量 + */ + private Integer outNum; + /** + * 领料时间 + */ + private LocalDateTime outTime; + /** + * 完成时间 + */ + private LocalDateTime finishTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/warehousereceipt/WarehouseReceiptDO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/warehousereceipt/WarehouseReceiptDO.java new file mode 100644 index 0000000..4a7c4d0 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/warehousereceipt/WarehouseReceiptDO.java @@ -0,0 +1,60 @@ +package com.yunxi.scm.module.xxjj.dal.dataobject.warehousereceipt; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO; + +/** + * 入库单 DO + * + * @author 长江云息 + */ +@TableName("xxjj_warehouse_receipt") +@KeySequence("xxjj_warehouse_receipt_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WarehouseReceiptDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 单据编号 + */ + private String documentNo; + /** + * 入库仓库id + */ + private Long warehouseReceipt; + /** + * 单据状态 + * + * 枚举 {@link TODO warehouse_type 对应的类} + */ + private String status; + /** + * 单据类型 + * + * 枚举 {@link TODO business_type 对应的类} + */ + private String type; + /** + * 入库数量 + */ + private Integer receiptNum; + /** + * 入库时间 + */ + private LocalDateTime receiptTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/warehouseout/WarehouseOutMapper.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/warehouseout/WarehouseOutMapper.java new file mode 100644 index 0000000..6a83e3a --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/warehouseout/WarehouseOutMapper.java @@ -0,0 +1,46 @@ +package com.yunxi.scm.module.xxjj.dal.mysql.warehouseout; + +import java.util.*; + +import com.yunxi.scm.framework.common.pojo.PageResult; +import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehouseout.WarehouseOutDO; +import org.apache.ibatis.annotations.Mapper; +import com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo.*; + +/** + * 领料单 Mapper + * + * @author 长江云息 + */ +@Mapper +public interface WarehouseOutMapper extends BaseMapperX { + + default PageResult selectPage(WarehouseOutPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WarehouseOutDO::getDocumentNo, reqVO.getDocumentNo()) + .eqIfPresent(WarehouseOutDO::getWarehouseOut, reqVO.getWarehouseOut()) + .eqIfPresent(WarehouseOutDO::getStatus, reqVO.getStatus()) + .eqIfPresent(WarehouseOutDO::getReason, reqVO.getReason()) + .eqIfPresent(WarehouseOutDO::getOutNum, reqVO.getOutNum()) + .betweenIfPresent(WarehouseOutDO::getOutTime, reqVO.getOutTime()) + .betweenIfPresent(WarehouseOutDO::getFinishTime, reqVO.getFinishTime()) + .betweenIfPresent(WarehouseOutDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WarehouseOutDO::getId)); + } + + default List selectList(WarehouseOutExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(WarehouseOutDO::getDocumentNo, reqVO.getDocumentNo()) + .eqIfPresent(WarehouseOutDO::getWarehouseOut, reqVO.getWarehouseOut()) + .eqIfPresent(WarehouseOutDO::getStatus, reqVO.getStatus()) + .eqIfPresent(WarehouseOutDO::getReason, reqVO.getReason()) + .eqIfPresent(WarehouseOutDO::getOutNum, reqVO.getOutNum()) + .betweenIfPresent(WarehouseOutDO::getOutTime, reqVO.getOutTime()) + .betweenIfPresent(WarehouseOutDO::getFinishTime, reqVO.getFinishTime()) + .betweenIfPresent(WarehouseOutDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WarehouseOutDO::getId)); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/warehousereceipt/WarehouseReceiptMapper.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/warehousereceipt/WarehouseReceiptMapper.java new file mode 100644 index 0000000..0bc5c22 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/warehousereceipt/WarehouseReceiptMapper.java @@ -0,0 +1,44 @@ +package com.yunxi.scm.module.xxjj.dal.mysql.warehousereceipt; + +import java.util.*; + +import com.yunxi.scm.framework.common.pojo.PageResult; +import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehousereceipt.WarehouseReceiptDO; +import org.apache.ibatis.annotations.Mapper; +import com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo.*; + +/** + * 入库单 Mapper + * + * @author 长江云息 + */ +@Mapper +public interface WarehouseReceiptMapper extends BaseMapperX { + + default PageResult selectPage(WarehouseReceiptPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WarehouseReceiptDO::getDocumentNo, reqVO.getDocumentNo()) + .eqIfPresent(WarehouseReceiptDO::getWarehouseReceipt, reqVO.getWarehouseReceipt()) + .eqIfPresent(WarehouseReceiptDO::getStatus, reqVO.getStatus()) + .eqIfPresent(WarehouseReceiptDO::getType, reqVO.getType()) + .eqIfPresent(WarehouseReceiptDO::getReceiptNum, reqVO.getReceiptNum()) + .betweenIfPresent(WarehouseReceiptDO::getReceiptTime, reqVO.getReceiptTime()) + .betweenIfPresent(WarehouseReceiptDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WarehouseReceiptDO::getId)); + } + + default List selectList(WarehouseReceiptExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(WarehouseReceiptDO::getDocumentNo, reqVO.getDocumentNo()) + .eqIfPresent(WarehouseReceiptDO::getWarehouseReceipt, reqVO.getWarehouseReceipt()) + .eqIfPresent(WarehouseReceiptDO::getStatus, reqVO.getStatus()) + .eqIfPresent(WarehouseReceiptDO::getType, reqVO.getType()) + .eqIfPresent(WarehouseReceiptDO::getReceiptNum, reqVO.getReceiptNum()) + .betweenIfPresent(WarehouseReceiptDO::getReceiptTime, reqVO.getReceiptTime()) + .betweenIfPresent(WarehouseReceiptDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WarehouseReceiptDO::getId)); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/enums/ErrorCodeConstants.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/enums/ErrorCodeConstants.java index 154e84b..bf4e021 100644 --- a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/enums/ErrorCodeConstants.java +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/enums/ErrorCodeConstants.java @@ -20,7 +20,16 @@ public interface ErrorCodeConstants { // ========== 工单 TODO 补充编号 ========== ErrorCode WORK_ORDER_NOT_EXISTS = new ErrorCode(1002025009, "工单不存在"); // ========== 供应商 TODO 补充编号 ========== - ErrorCode SUPPLIER_NOT_EXISTS = new ErrorCode(1002026009, "供应商不存在"); + ErrorCode SUPPLIER_NOT_EXISTS = new ErrorCode(1002026010, "供应商不存在"); + // ========== 业务线 TODO 补充编号 ========== + ErrorCode BUSINESS_LINE_NOT_EXISTS = new ErrorCode(1002025011, "业务线不存在"); + // ========== 仓库 TODO 补充编号 ========== + ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1002025012, "仓库不存在"); + // ========== 入库单 TODO 补充编号 ========== + ErrorCode WAREHOUSE_RECEIPT_NOT_EXISTS = new ErrorCode(1002025013, "入库单不存在"); + // ========== 领料单 TODO 补充编号 ========== + ErrorCode WAREHOUSE_OUT_NOT_EXISTS = new ErrorCode(1002025014, "领料单不存在"); + // ========== 部门模块 1002004000 ========== ErrorCode MaterialCategory_NAME_DUPLICATE = new ErrorCode(1002004000, "已经存在该名字的部门"); @@ -31,8 +40,4 @@ public interface ErrorCodeConstants { ErrorCode MaterialCategory_EXISTS_USER = new ErrorCode(1002004005, "部门中存在员工,无法删除"); ErrorCode MaterialCategory_NOT_ENABLE = new ErrorCode(1002004006, "部门({})不处于开启状态,不允许选择"); ErrorCode MaterialCategory_PARENT_IS_CHILD = new ErrorCode(1002004007, "不能设置自己的子部门为父部门"); - // ========== 业务线 TODO 补充编号 ========== - ErrorCode BUSINESS_LINE_NOT_EXISTS = new ErrorCode(1002025007, "业务线不存在"); - // ========== 仓库 TODO 补充编号 ========== - ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1002025008, "仓库不存在"); } diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutService.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutService.java new file mode 100644 index 0000000..a1fe9bd --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutService.java @@ -0,0 +1,70 @@ +package com.yunxi.scm.module.xxjj.service.warehouseout; + +import java.util.*; +import javax.validation.*; +import com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehouseout.WarehouseOutDO; +import com.yunxi.scm.framework.common.pojo.PageResult; + +/** + * 领料单 Service 接口 + * + * @author 长江云息 + */ +public interface WarehouseOutService { + + /** + * 创建领料单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWarehouseOut(@Valid WarehouseOutCreateReqVO createReqVO); + + /** + * 更新领料单 + * + * @param updateReqVO 更新信息 + */ + void updateWarehouseOut(@Valid WarehouseOutUpdateReqVO updateReqVO); + + /** + * 删除领料单 + * + * @param id 编号 + */ + void deleteWarehouseOut(Long id); + + /** + * 获得领料单 + * + * @param id 编号 + * @return 领料单 + */ + WarehouseOutDO getWarehouseOut(Long id); + + /** + * 获得领料单列表 + * + * @param ids 编号 + * @return 领料单列表 + */ + List getWarehouseOutList(Collection ids); + + /** + * 获得领料单分页 + * + * @param pageReqVO 分页查询 + * @return 领料单分页 + */ + PageResult getWarehouseOutPage(WarehouseOutPageReqVO pageReqVO); + + /** + * 获得领料单列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 领料单列表 + */ + List getWarehouseOutList(WarehouseOutExportReqVO exportReqVO); + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutServiceImpl.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutServiceImpl.java new file mode 100644 index 0000000..82a3399 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutServiceImpl.java @@ -0,0 +1,82 @@ +package com.yunxi.scm.module.xxjj.service.warehouseout; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehouseout.WarehouseOutDO; +import com.yunxi.scm.framework.common.pojo.PageResult; + +import com.yunxi.scm.module.xxjj.convert.warehouseout.WarehouseOutConvert; +import com.yunxi.scm.module.xxjj.dal.mysql.warehouseout.WarehouseOutMapper; + +import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*; + +/** + * 领料单 Service 实现类 + * + * @author 长江云息 + */ +@Service +@Validated +public class WarehouseOutServiceImpl implements WarehouseOutService { + + @Resource + private WarehouseOutMapper warehouseOutMapper; + + @Override + public Long createWarehouseOut(WarehouseOutCreateReqVO createReqVO) { + // 插入 + WarehouseOutDO warehouseOut = WarehouseOutConvert.INSTANCE.convert(createReqVO); + warehouseOutMapper.insert(warehouseOut); + // 返回 + return warehouseOut.getId(); + } + + @Override + public void updateWarehouseOut(WarehouseOutUpdateReqVO updateReqVO) { + // 校验存在 + validateWarehouseOutExists(updateReqVO.getId()); + // 更新 + WarehouseOutDO updateObj = WarehouseOutConvert.INSTANCE.convert(updateReqVO); + warehouseOutMapper.updateById(updateObj); + } + + @Override + public void deleteWarehouseOut(Long id) { + // 校验存在 + validateWarehouseOutExists(id); + // 删除 + warehouseOutMapper.deleteById(id); + } + + private void validateWarehouseOutExists(Long id) { + if (warehouseOutMapper.selectById(id) == null) { + throw exception(WAREHOUSE_OUT_NOT_EXISTS); + } + } + + @Override + public WarehouseOutDO getWarehouseOut(Long id) { + return warehouseOutMapper.selectById(id); + } + + @Override + public List getWarehouseOutList(Collection ids) { + return warehouseOutMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWarehouseOutPage(WarehouseOutPageReqVO pageReqVO) { + return warehouseOutMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseOutList(WarehouseOutExportReqVO exportReqVO) { + return warehouseOutMapper.selectList(exportReqVO); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptService.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptService.java new file mode 100644 index 0000000..7ee0a2c --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptService.java @@ -0,0 +1,70 @@ +package com.yunxi.scm.module.xxjj.service.warehousereceipt; + +import java.util.*; +import javax.validation.*; +import com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehousereceipt.WarehouseReceiptDO; +import com.yunxi.scm.framework.common.pojo.PageResult; + +/** + * 入库单 Service 接口 + * + * @author 长江云息 + */ +public interface WarehouseReceiptService { + + /** + * 创建入库单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWarehouseReceipt(@Valid WarehouseReceiptCreateReqVO createReqVO); + + /** + * 更新入库单 + * + * @param updateReqVO 更新信息 + */ + void updateWarehouseReceipt(@Valid WarehouseReceiptUpdateReqVO updateReqVO); + + /** + * 删除入库单 + * + * @param id 编号 + */ + void deleteWarehouseReceipt(Long id); + + /** + * 获得入库单 + * + * @param id 编号 + * @return 入库单 + */ + WarehouseReceiptDO getWarehouseReceipt(Long id); + + /** + * 获得入库单列表 + * + * @param ids 编号 + * @return 入库单列表 + */ + List getWarehouseReceiptList(Collection ids); + + /** + * 获得入库单分页 + * + * @param pageReqVO 分页查询 + * @return 入库单分页 + */ + PageResult getWarehouseReceiptPage(WarehouseReceiptPageReqVO pageReqVO); + + /** + * 获得入库单列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 入库单列表 + */ + List getWarehouseReceiptList(WarehouseReceiptExportReqVO exportReqVO); + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptServiceImpl.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptServiceImpl.java new file mode 100644 index 0000000..8cfc2f0 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptServiceImpl.java @@ -0,0 +1,82 @@ +package com.yunxi.scm.module.xxjj.service.warehousereceipt; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehousereceipt.WarehouseReceiptDO; +import com.yunxi.scm.framework.common.pojo.PageResult; + +import com.yunxi.scm.module.xxjj.convert.warehousereceipt.WarehouseReceiptConvert; +import com.yunxi.scm.module.xxjj.dal.mysql.warehousereceipt.WarehouseReceiptMapper; + +import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*; + +/** + * 入库单 Service 实现类 + * + * @author 长江云息 + */ +@Service +@Validated +public class WarehouseReceiptServiceImpl implements WarehouseReceiptService { + + @Resource + private WarehouseReceiptMapper warehouseReceiptMapper; + + @Override + public Long createWarehouseReceipt(WarehouseReceiptCreateReqVO createReqVO) { + // 插入 + WarehouseReceiptDO warehouseReceipt = WarehouseReceiptConvert.INSTANCE.convert(createReqVO); + warehouseReceiptMapper.insert(warehouseReceipt); + // 返回 + return warehouseReceipt.getId(); + } + + @Override + public void updateWarehouseReceipt(WarehouseReceiptUpdateReqVO updateReqVO) { + // 校验存在 + validateWarehouseReceiptExists(updateReqVO.getId()); + // 更新 + WarehouseReceiptDO updateObj = WarehouseReceiptConvert.INSTANCE.convert(updateReqVO); + warehouseReceiptMapper.updateById(updateObj); + } + + @Override + public void deleteWarehouseReceipt(Long id) { + // 校验存在 + validateWarehouseReceiptExists(id); + // 删除 + warehouseReceiptMapper.deleteById(id); + } + + private void validateWarehouseReceiptExists(Long id) { + if (warehouseReceiptMapper.selectById(id) == null) { + throw exception(WAREHOUSE_RECEIPT_NOT_EXISTS); + } + } + + @Override + public WarehouseReceiptDO getWarehouseReceipt(Long id) { + return warehouseReceiptMapper.selectById(id); + } + + @Override + public List getWarehouseReceiptList(Collection ids) { + return warehouseReceiptMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWarehouseReceiptPage(WarehouseReceiptPageReqVO pageReqVO) { + return warehouseReceiptMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseReceiptList(WarehouseReceiptExportReqVO exportReqVO) { + return warehouseReceiptMapper.selectList(exportReqVO); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/warehouseout/WarehouseOutMapper.xml b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/warehouseout/WarehouseOutMapper.xml new file mode 100644 index 0000000..3b526af --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/warehouseout/WarehouseOutMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/warehousereceipt/WarehouseReceiptMapper.xml b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/warehousereceipt/WarehouseReceiptMapper.xml new file mode 100644 index 0000000..d26fa24 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/warehousereceipt/WarehouseReceiptMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutServiceImplTest.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutServiceImplTest.java new file mode 100644 index 0000000..9bf69d3 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/warehouseout/WarehouseOutServiceImplTest.java @@ -0,0 +1,207 @@ +package com.yunxi.scm.module.xxjj.service.warehouseout; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest; + +import com.yunxi.scm.module.xxjj.controller.admin.warehouseout.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehouseout.WarehouseOutDO; +import com.yunxi.scm.module.xxjj.dal.mysql.warehouseout.WarehouseOutMapper; +import com.yunxi.scm.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*; +import static com.yunxi.scm.framework.test.core.util.AssertUtils.*; +import static com.yunxi.scm.framework.test.core.util.RandomUtils.*; +import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*; +import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*; +import static com.yunxi.scm.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link WarehouseOutServiceImpl} 的单元测试类 + * + * @author 长江云息 + */ +@Import(WarehouseOutServiceImpl.class) +public class WarehouseOutServiceImplTest extends BaseDbUnitTest { + + @Resource + private WarehouseOutServiceImpl warehouseOutService; + + @Resource + private WarehouseOutMapper warehouseOutMapper; + + @Test + public void testCreateWarehouseOut_success() { + // 准备参数 + WarehouseOutCreateReqVO reqVO = randomPojo(WarehouseOutCreateReqVO.class); + + // 调用 + Long warehouseOutId = warehouseOutService.createWarehouseOut(reqVO); + // 断言 + assertNotNull(warehouseOutId); + // 校验记录的属性是否正确 + WarehouseOutDO warehouseOut = warehouseOutMapper.selectById(warehouseOutId); + assertPojoEquals(reqVO, warehouseOut); + } + + @Test + public void testUpdateWarehouseOut_success() { + // mock 数据 + WarehouseOutDO dbWarehouseOut = randomPojo(WarehouseOutDO.class); + warehouseOutMapper.insert(dbWarehouseOut);// @Sql: 先插入出一条存在的数据 + // 准备参数 + WarehouseOutUpdateReqVO reqVO = randomPojo(WarehouseOutUpdateReqVO.class, o -> { + o.setId(dbWarehouseOut.getId()); // 设置更新的 ID + }); + + // 调用 + warehouseOutService.updateWarehouseOut(reqVO); + // 校验是否更新正确 + WarehouseOutDO warehouseOut = warehouseOutMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, warehouseOut); + } + + @Test + public void testUpdateWarehouseOut_notExists() { + // 准备参数 + WarehouseOutUpdateReqVO reqVO = randomPojo(WarehouseOutUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> warehouseOutService.updateWarehouseOut(reqVO), WAREHOUSE_OUT_NOT_EXISTS); + } + + @Test + public void testDeleteWarehouseOut_success() { + // mock 数据 + WarehouseOutDO dbWarehouseOut = randomPojo(WarehouseOutDO.class); + warehouseOutMapper.insert(dbWarehouseOut);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbWarehouseOut.getId(); + + // 调用 + warehouseOutService.deleteWarehouseOut(id); + // 校验数据不存在了 + assertNull(warehouseOutMapper.selectById(id)); + } + + @Test + public void testDeleteWarehouseOut_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> warehouseOutService.deleteWarehouseOut(id), WAREHOUSE_OUT_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWarehouseOutPage() { + // mock 数据 + WarehouseOutDO dbWarehouseOut = randomPojo(WarehouseOutDO.class, o -> { // 等会查询到 + o.setDocumentNo(null); + o.setWarehouseOut(null); + o.setStatus(null); + o.setReason(null); + o.setOutNum(null); + o.setOutTime(null); + o.setFinishTime(null); + o.setCreateTime(null); + }); + warehouseOutMapper.insert(dbWarehouseOut); + // 测试 documentNo 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setDocumentNo(null))); + // 测试 warehouseOut 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setWarehouseOut(null))); + // 测试 status 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setStatus(null))); + // 测试 reason 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setReason(null))); + // 测试 outNum 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setOutNum(null))); + // 测试 outTime 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setOutTime(null))); + // 测试 finishTime 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setFinishTime(null))); + // 测试 createTime 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setCreateTime(null))); + // 准备参数 + WarehouseOutPageReqVO reqVO = new WarehouseOutPageReqVO(); + reqVO.setDocumentNo(null); + reqVO.setWarehouseOut(null); + reqVO.setStatus(null); + reqVO.setReason(null); + reqVO.setOutNum(null); + reqVO.setOutTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setFinishTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = warehouseOutService.getWarehouseOutPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbWarehouseOut, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWarehouseOutList() { + // mock 数据 + WarehouseOutDO dbWarehouseOut = randomPojo(WarehouseOutDO.class, o -> { // 等会查询到 + o.setDocumentNo(null); + o.setWarehouseOut(null); + o.setStatus(null); + o.setReason(null); + o.setOutNum(null); + o.setOutTime(null); + o.setFinishTime(null); + o.setCreateTime(null); + }); + warehouseOutMapper.insert(dbWarehouseOut); + // 测试 documentNo 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setDocumentNo(null))); + // 测试 warehouseOut 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setWarehouseOut(null))); + // 测试 status 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setStatus(null))); + // 测试 reason 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setReason(null))); + // 测试 outNum 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setOutNum(null))); + // 测试 outTime 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setOutTime(null))); + // 测试 finishTime 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setFinishTime(null))); + // 测试 createTime 不匹配 + warehouseOutMapper.insert(cloneIgnoreId(dbWarehouseOut, o -> o.setCreateTime(null))); + // 准备参数 + WarehouseOutExportReqVO reqVO = new WarehouseOutExportReqVO(); + reqVO.setDocumentNo(null); + reqVO.setWarehouseOut(null); + reqVO.setStatus(null); + reqVO.setReason(null); + reqVO.setOutNum(null); + reqVO.setOutTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setFinishTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = warehouseOutService.getWarehouseOutList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbWarehouseOut, list.get(0)); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptServiceImplTest.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptServiceImplTest.java new file mode 100644 index 0000000..a197dc6 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/warehousereceipt/WarehouseReceiptServiceImplTest.java @@ -0,0 +1,199 @@ +package com.yunxi.scm.module.xxjj.service.warehousereceipt; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest; + +import com.yunxi.scm.module.xxjj.controller.admin.warehousereceipt.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.warehousereceipt.WarehouseReceiptDO; +import com.yunxi.scm.module.xxjj.dal.mysql.warehousereceipt.WarehouseReceiptMapper; +import com.yunxi.scm.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*; +import static com.yunxi.scm.framework.test.core.util.AssertUtils.*; +import static com.yunxi.scm.framework.test.core.util.RandomUtils.*; +import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*; +import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*; +import static com.yunxi.scm.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link WarehouseReceiptServiceImpl} 的单元测试类 + * + * @author 长江云息 + */ +@Import(WarehouseReceiptServiceImpl.class) +public class WarehouseReceiptServiceImplTest extends BaseDbUnitTest { + + @Resource + private WarehouseReceiptServiceImpl warehouseReceiptService; + + @Resource + private WarehouseReceiptMapper warehouseReceiptMapper; + + @Test + public void testCreateWarehouseReceipt_success() { + // 准备参数 + WarehouseReceiptCreateReqVO reqVO = randomPojo(WarehouseReceiptCreateReqVO.class); + + // 调用 + Long warehouseReceiptId = warehouseReceiptService.createWarehouseReceipt(reqVO); + // 断言 + assertNotNull(warehouseReceiptId); + // 校验记录的属性是否正确 + WarehouseReceiptDO warehouseReceipt = warehouseReceiptMapper.selectById(warehouseReceiptId); + assertPojoEquals(reqVO, warehouseReceipt); + } + + @Test + public void testUpdateWarehouseReceipt_success() { + // mock 数据 + WarehouseReceiptDO dbWarehouseReceipt = randomPojo(WarehouseReceiptDO.class); + warehouseReceiptMapper.insert(dbWarehouseReceipt);// @Sql: 先插入出一条存在的数据 + // 准备参数 + WarehouseReceiptUpdateReqVO reqVO = randomPojo(WarehouseReceiptUpdateReqVO.class, o -> { + o.setId(dbWarehouseReceipt.getId()); // 设置更新的 ID + }); + + // 调用 + warehouseReceiptService.updateWarehouseReceipt(reqVO); + // 校验是否更新正确 + WarehouseReceiptDO warehouseReceipt = warehouseReceiptMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, warehouseReceipt); + } + + @Test + public void testUpdateWarehouseReceipt_notExists() { + // 准备参数 + WarehouseReceiptUpdateReqVO reqVO = randomPojo(WarehouseReceiptUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> warehouseReceiptService.updateWarehouseReceipt(reqVO), WAREHOUSE_RECEIPT_NOT_EXISTS); + } + + @Test + public void testDeleteWarehouseReceipt_success() { + // mock 数据 + WarehouseReceiptDO dbWarehouseReceipt = randomPojo(WarehouseReceiptDO.class); + warehouseReceiptMapper.insert(dbWarehouseReceipt);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbWarehouseReceipt.getId(); + + // 调用 + warehouseReceiptService.deleteWarehouseReceipt(id); + // 校验数据不存在了 + assertNull(warehouseReceiptMapper.selectById(id)); + } + + @Test + public void testDeleteWarehouseReceipt_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> warehouseReceiptService.deleteWarehouseReceipt(id), WAREHOUSE_RECEIPT_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWarehouseReceiptPage() { + // mock 数据 + WarehouseReceiptDO dbWarehouseReceipt = randomPojo(WarehouseReceiptDO.class, o -> { // 等会查询到 + o.setDocumentNo(null); + o.setWarehouseReceipt(null); + o.setStatus(null); + o.setType(null); + o.setReceiptNum(null); + o.setReceiptTime(null); + o.setCreateTime(null); + }); + warehouseReceiptMapper.insert(dbWarehouseReceipt); + // 测试 documentNo 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setDocumentNo(null))); + // 测试 warehouseReceipt 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setWarehouseReceipt(null))); + // 测试 status 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setStatus(null))); + // 测试 type 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setType(null))); + // 测试 receiptNum 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setReceiptNum(null))); + // 测试 receiptTime 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setReceiptTime(null))); + // 测试 createTime 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setCreateTime(null))); + // 准备参数 + WarehouseReceiptPageReqVO reqVO = new WarehouseReceiptPageReqVO(); + reqVO.setDocumentNo(null); + reqVO.setWarehouseReceipt(null); + reqVO.setStatus(null); + reqVO.setType(null); + reqVO.setReceiptNum(null); + reqVO.setReceiptTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = warehouseReceiptService.getWarehouseReceiptPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbWarehouseReceipt, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetWarehouseReceiptList() { + // mock 数据 + WarehouseReceiptDO dbWarehouseReceipt = randomPojo(WarehouseReceiptDO.class, o -> { // 等会查询到 + o.setDocumentNo(null); + o.setWarehouseReceipt(null); + o.setStatus(null); + o.setType(null); + o.setReceiptNum(null); + o.setReceiptTime(null); + o.setCreateTime(null); + }); + warehouseReceiptMapper.insert(dbWarehouseReceipt); + // 测试 documentNo 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setDocumentNo(null))); + // 测试 warehouseReceipt 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setWarehouseReceipt(null))); + // 测试 status 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setStatus(null))); + // 测试 type 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setType(null))); + // 测试 receiptNum 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setReceiptNum(null))); + // 测试 receiptTime 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setReceiptTime(null))); + // 测试 createTime 不匹配 + warehouseReceiptMapper.insert(cloneIgnoreId(dbWarehouseReceipt, o -> o.setCreateTime(null))); + // 准备参数 + WarehouseReceiptExportReqVO reqVO = new WarehouseReceiptExportReqVO(); + reqVO.setDocumentNo(null); + reqVO.setWarehouseReceipt(null); + reqVO.setStatus(null); + reqVO.setType(null); + reqVO.setReceiptNum(null); + reqVO.setReceiptTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = warehouseReceiptService.getWarehouseReceiptList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbWarehouseReceipt, list.get(0)); + } + +} diff --git a/yunxi-ui-admin/src/api/xxjj/warehouseOut.js b/yunxi-ui-admin/src/api/xxjj/warehouseOut.js new file mode 100644 index 0000000..7e8e7b5 --- /dev/null +++ b/yunxi-ui-admin/src/api/xxjj/warehouseOut.js @@ -0,0 +1,54 @@ +import request from '@/utils/request' + +// 创建领料单 +export function createWarehouseOut(data) { + return request({ + url: '/xxjj/warehouse-out/create', + method: 'post', + data: data + }) +} + +// 更新领料单 +export function updateWarehouseOut(data) { + return request({ + url: '/xxjj/warehouse-out/update', + method: 'put', + data: data + }) +} + +// 删除领料单 +export function deleteWarehouseOut(id) { + return request({ + url: '/xxjj/warehouse-out/delete?id=' + id, + method: 'delete' + }) +} + +// 获得领料单 +export function getWarehouseOut(id) { + return request({ + url: '/xxjj/warehouse-out/get?id=' + id, + method: 'get' + }) +} + +// 获得领料单分页 +export function getWarehouseOutPage(query) { + return request({ + url: '/xxjj/warehouse-out/page', + method: 'get', + params: query + }) +} + +// 导出领料单 Excel +export function exportWarehouseOutExcel(query) { + return request({ + url: '/xxjj/warehouse-out/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/yunxi-ui-admin/src/api/xxjj/warehouseReceipt.js b/yunxi-ui-admin/src/api/xxjj/warehouseReceipt.js new file mode 100644 index 0000000..87eadef --- /dev/null +++ b/yunxi-ui-admin/src/api/xxjj/warehouseReceipt.js @@ -0,0 +1,54 @@ +import request from '@/utils/request' + +// 创建入库单 +export function createWarehouseReceipt(data) { + return request({ + url: '/xxjj/warehouse-receipt/create', + method: 'post', + data: data + }) +} + +// 更新入库单 +export function updateWarehouseReceipt(data) { + return request({ + url: '/xxjj/warehouse-receipt/update', + method: 'put', + data: data + }) +} + +// 删除入库单 +export function deleteWarehouseReceipt(id) { + return request({ + url: '/xxjj/warehouse-receipt/delete?id=' + id, + method: 'delete' + }) +} + +// 获得入库单 +export function getWarehouseReceipt(id) { + return request({ + url: '/xxjj/warehouse-receipt/get?id=' + id, + method: 'get' + }) +} + +// 获得入库单分页 +export function getWarehouseReceiptPage(query) { + return request({ + url: '/xxjj/warehouse-receipt/page', + method: 'get', + params: query + }) +} + +// 导出入库单 Excel +export function exportWarehouseReceiptExcel(query) { + return request({ + url: '/xxjj/warehouse-receipt/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/yunxi-ui-admin/src/views/xxjj/warehouseOut/index.vue b/yunxi-ui-admin/src/views/xxjj/warehouseOut/index.vue new file mode 100644 index 0000000..0ec4326 --- /dev/null +++ b/yunxi-ui-admin/src/views/xxjj/warehouseOut/index.vue @@ -0,0 +1,457 @@ + + + diff --git a/yunxi-ui-admin/src/views/xxjj/warehouseReceipt/index.vue b/yunxi-ui-admin/src/views/xxjj/warehouseReceipt/index.vue new file mode 100644 index 0000000..7885ec4 --- /dev/null +++ b/yunxi-ui-admin/src/views/xxjj/warehouseReceipt/index.vue @@ -0,0 +1,284 @@ + + +