diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ShoppingCartController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ShoppingCartController.java index 825dab21e..5bab92cf3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ShoppingCartController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ShoppingCartController.java @@ -32,6 +32,13 @@ public class ShoppingCartController extends XktBaseController { final IShoppingCartService shopCartService; + @PreAuthorize("@ss.hasRole('seller')") + @ApiOperation(value = "获取用户进货车各状态数量", httpMethod = "GET", response = R.class) + @GetMapping("/status/num") + public R getStatusNum() { + return R.ok(BeanUtil.toBean(shopCartService.getStatusNum(), ShopCartStatusCountResVO.class)); + } + @PreAuthorize("@ss.hasRole('seller')") @ApiOperation(value = "电商卖家添加商品到进货车", httpMethod = "POST", response = R.class) @Log(title = "电商卖家添加商品到进货车", businessType = BusinessType.INSERT) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreProductDemandController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreProductDemandController.java index 8b2a09ee9..4c877f153 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreProductDemandController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreProductDemandController.java @@ -6,6 +6,8 @@ import com.ruoyi.common.core.controller.XktBaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.Page; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.web.controller.xkt.vo.storeProductDemand.*; import com.ruoyi.xkt.dto.storeProductDemand.*; import com.ruoyi.xkt.service.IStoreProductDemandService; @@ -16,6 +18,9 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.List; /** @@ -69,11 +74,6 @@ public class StoreProductDemandController extends XktBaseController { @PutMapping public R updateWorkingStatus(@Validated @RequestBody StoreProdDemandWorkingVO workingVO) { return R.ok(storeProdDemandService.updateWorkingStatus(BeanUtil.toBean(workingVO, StoreProdDemandWorkingDTO.class))); - - // TODO 是否需要导出excel表格 - // TODO 是否需要导出excel表格 - // TODO 是否需要导出excel表格 - } @PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()") @@ -84,4 +84,18 @@ public class StoreProductDemandController extends XktBaseController { return R.ok(storeProdDemandService.deleteByStoreProdDemandIds(BeanUtil.toBean(deleteVO, StoreProdDemandDeleteDTO.class))); } + @PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()") + @ApiOperation(value = "导出生产需求", httpMethod = "POST", response = R.class) + @Log(title = "导出生产需求", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, @Validated @RequestBody StoreProdDemandExportVO exportVO) throws UnsupportedEncodingException { + List downloadList = storeProdDemandService.export(BeanUtil.toBean(exportVO, StoreProdDemandExportDTO.class)); + ExcelUtil util = new ExcelUtil<>(StoreProdDemandDownloadDTO.class); + // 设置下载excel名 + String encodedFileName = URLEncoder.encode("生产需求" + DateUtils.getDate(), "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename=" + encodedFileName + ".xlsx"); + util.exportExcel(response, downloadList, "生产需求记录"); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeCertificate/StoreCertVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeCertificate/StoreCertVO.java index a23c0d9c7..4aea17d83 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeCertificate/StoreCertVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeCertificate/StoreCertVO.java @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; @@ -39,6 +40,7 @@ public class StoreCertVO { @NotBlank(message = "身份证号不能为空") @Pattern(regexp = "(^\\d{15}$)|(^\\d{17}([0-9]|X|x)$)", message = "身份证号格式不正确,请输入有效的15位或18位身份证号") private String idCard; + @Valid @ApiModelProperty(value = "认证文件列表", required = true) @NotNull(message = "认证文件列表不能为空") private List fileList; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandExportVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandExportVO.java new file mode 100644 index 000000000..40c6a04f4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandExportVO.java @@ -0,0 +1,26 @@ +package com.ruoyi.web.controller.xkt.vo.storeProductDemand; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class StoreProdDemandExportVO { + + @ApiModelProperty(value = "档口ID", required = true) + @NotNull(message = "档口ID不能为空") + private Long storeId; + @NotNull(message = "档口需求明细ID不能为空") + @ApiModelProperty(value = "档口需求明细ID", required = true) + private List storeProdDemandDetailIdList; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandVO.java index 006cd0447..dbb7c039e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandVO.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.List; @@ -24,6 +25,7 @@ public class StoreProdDemandVO { @ApiModelProperty(value = "档口工厂ID", required = true) private Long storeFactoryId; @NotNull(message = "需求列表不能为空") + @Valid @ApiModelProperty(value = "新增需求列表", required = true) private List detailList; @@ -41,10 +43,11 @@ public class StoreProdDemandVO { @NotBlank(message = "颜色不能为空") @ApiModelProperty(value = "颜色", required = true) private String colorName; - @NotBlank(message = "是否紧急单不能为空") - @ApiModelProperty(value = "是否紧急单:2=正常,1=紧急", required = true) + @NotNull(message = "是否紧急单不能为空") + @ApiModelProperty(value = "是否紧急单:0=正常,1=紧急", required = true) private Integer emergency; - @ApiModelProperty(value = "总的数量") + @ApiModelProperty(value = "总的数量", required = true) + @NotNull(message = "总数量不能为空") private Integer quantity; @ApiModelProperty(value = "尺码30") private Integer size30; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandWorkingVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandWorkingVO.java index a4efc6c4a..2fc71746d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandWorkingVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProductDemand/StoreProdDemandWorkingVO.java @@ -17,11 +17,11 @@ public class StoreProdDemandWorkingVO { @ApiModelProperty(value = "档口ID", required = true) @NotNull(message = "档口ID不能为空") private Long storeId; - @NotNull(message = "档口需求明细ID不能为空") - @ApiModelProperty(value = "档口需求明细ID", required = true) + @NotNull(message = "档口需求明细ID列表不能为空") + @ApiModelProperty(value = "档口需求明细ID列表", required = true) private List storeProdDemandDetailIdList; - @NotNull(message = "是否导出生产单不能为空") - @ApiModelProperty(value = "是否导出生产单", required = true) - private Boolean download; + @NotNull(message = "档口需求ID列表不能为空") + @ApiModelProperty(value = "档口需求ID列表", required = true) + private List storeProdDemandIdList; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userShoppingCart/ShopCartStatusCountResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userShoppingCart/ShopCartStatusCountResVO.java new file mode 100644 index 000000000..420261bc8 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userShoppingCart/ShopCartStatusCountResVO.java @@ -0,0 +1,21 @@ +package com.ruoyi.web.controller.xkt.vo.userShoppingCart; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ShopCartStatusCountResVO { + + @ApiModelProperty(value = "在售数量") + private Integer onSaleNum; + @ApiModelProperty(value = "已失效数量") + private Integer expiredNum; + +} diff --git a/sql/ry_20240629.sql b/sql/ry_20240629.sql index d9a4e2d20..e374ef06c 100644 --- a/sql/ry_20240629.sql +++ b/sql/ry_20240629.sql @@ -516,6 +516,36 @@ create table gen_table_column ( ) engine=innodb auto_increment=1 comment = '代码生成业务表字段'; + +DROP TABLE IF EXISTS `voucher_sequence`; +CREATE TABLE `voucher_sequence` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '单据编号ID', + `store_id` bigint UNSIGNED NOT NULL COMMENT '档口ID', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '单据类型', + `date_format` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '单据格式化类型', + `next_sequence` int NOT NULL COMMENT '下一个单据编号', + `prefix` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '单据编号前缀', + `sequence_format` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '格式化类型', + `version` bigint UNSIGNED NOT NULL COMMENT '版本号', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统code生成规则' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of voucher_sequence +-- ---------------------------- +INSERT INTO `voucher_sequence` VALUES (1, 1, 'STORE_SALE', 'yyyy-MM-dd', 1, 'SD', '%04d', 0, '0', '', '2025-03-30 16:09:23', '', '2025-03-30 16:09:26'); +INSERT INTO `voucher_sequence` VALUES (2, 1, 'STORAGE', 'yyyy-MM-dd', 1, 'RK', '%04d', 0, '0', '', '2025-03-30 16:09:23', '', '2025-03-30 16:09:26'); +INSERT INTO `voucher_sequence` VALUES (3, 1, 'DEMAND', 'yyyy-MM-dd', 1, 'XQ', '%04d', 0, '0', '', '2025-03-30 16:09:23', '', '2025-03-30 16:09:26'); +INSERT INTO `voucher_sequence` VALUES (4, 1, 'STORE_ORDER', 'yyyy-MM-dd', 1, 'DF', '%04d', 0, '0', '', '2025-03-30 16:09:23', '', '2025-05-15 01:54:15'); + +SET FOREIGN_KEY_CHECKS = 1; + + DROP TABLE IF EXISTS `sys_product_category`; CREATE TABLE `sys_product_category` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品分类ID', diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemand.java b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemand.java index 693e38659..6f8059a3a 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemand.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemand.java @@ -9,6 +9,8 @@ import lombok.experimental.Accessors; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; +import java.util.Date; + /** * 档口商品需求单对象 store_product_demand * @@ -48,13 +50,11 @@ public class StoreProductDemand extends XktBaseEntity { */ @Excel(name = "需求状态") private Integer demandStatus; - /** * 备注 */ private String remark; - @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemandDetail.java b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemandDetail.java index 2ddc19fbe..107ad01f5 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemandDetail.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreProductDemandDetail.java @@ -62,9 +62,9 @@ public class StoreProductDemandDetail extends XktBaseEntity { private Long storeProdId; /** - * 是否紧急单(2正常 1紧急) + * 是否紧急单(0正常 1紧急) */ - @Excel(name = "是否紧急单", readConverterExp = "2=正常,1=紧急") + @Excel(name = "是否紧急单", readConverterExp = "0=正常,1=紧急") private Integer emergency; /** diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandDownloadDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandDownloadDTO.java new file mode 100644 index 000000000..c658f8ca1 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandDownloadDTO.java @@ -0,0 +1,55 @@ +package com.ruoyi.xkt.dto.storeProductDemand; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@Data +@Accessors(chain = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class StoreProdDemandDownloadDTO { + + @Excel(name = "序号", cellType = Excel.ColumnType.NUMERIC, needMerge = true) + private Integer orderNum; + @Excel(name = "货号", needMerge = true) + private String prodArtNum; + @Excel(name = "颜色", needMerge = true) + private String colorName; + @Excel(name = "30") + private Integer size30Quantity; + @Excel(name = "31") + private Integer size31Quantity; + @Excel(name = "32") + private Integer size32Quantity; + @Excel(name = "33") + private Integer size33Quantity; + @Excel(name = "34") + private Integer size34Quantity; + @Excel(name = "35") + private Integer size35Quantity; + @Excel(name = "36") + private Integer size36Quantity; + @Excel(name = "37") + private Integer size37Quantity; + @Excel(name = "38") + private Integer size38Quantity; + @Excel(name = "39") + private Integer size39Quantity; + @Excel(name = "40") + private Integer size40Quantity; + @Excel(name = "41") + private Integer size41Quantity; + @Excel(name = "42") + private Integer size42Quantity; + @Excel(name = "43") + private Integer size43Quantity; + @Excel(name = "合计") + private Integer totalQuantity; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandExportDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandExportDTO.java new file mode 100644 index 000000000..a2b987ce7 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandExportDTO.java @@ -0,0 +1,23 @@ +package com.ruoyi.xkt.dto.storeProductDemand; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class StoreProdDemandExportDTO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "档口需求明细ID") + private List storeProdDemandDetailIdList; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandWorkingDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandWorkingDTO.java index b1d822107..4eb078feb 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandWorkingDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProductDemand/StoreProdDemandWorkingDTO.java @@ -3,6 +3,7 @@ package com.ruoyi.xkt.dto.storeProductDemand; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; import java.util.List; /** @@ -17,6 +18,8 @@ public class StoreProdDemandWorkingDTO { private Long storeId; @ApiModelProperty(value = "档口需求明细ID") private List storeProdDemandDetailIdList; + @ApiModelProperty(value = "档口需求ID列表") + private List storeProdDemandIdList; @ApiModelProperty(value = "是否导出生产单") private Boolean download; diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/userShoppingCart/ShopCartStatusCountResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/userShoppingCart/ShopCartStatusCountResDTO.java new file mode 100644 index 000000000..4c83fcaf3 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/userShoppingCart/ShopCartStatusCountResDTO.java @@ -0,0 +1,21 @@ +package com.ruoyi.xkt.dto.userShoppingCart; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ShopCartStatusCountResDTO { + + @ApiModelProperty(value = "在售数量") + private Integer onSaleNum; + @ApiModelProperty(value = "已失效数量") + private Integer expiredNum; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/enums/EmergencyType.java b/xkt/src/main/java/com/ruoyi/xkt/enums/EmergencyType.java index 8e700e800..6db0c02b4 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/enums/EmergencyType.java +++ b/xkt/src/main/java/com/ruoyi/xkt/enums/EmergencyType.java @@ -12,7 +12,7 @@ import lombok.Getter; public enum EmergencyType { PROD_STORAGE(1, "紧急单"), - OTHER_STORAGE(2, "正常单"); + OTHER_STORAGE(0, "正常单"); private final Integer value; private final String label; diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/ShoppingCartMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/ShoppingCartMapper.java index 7257fdae2..7bc591bff 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/ShoppingCartMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/ShoppingCartMapper.java @@ -5,6 +5,7 @@ import com.ruoyi.xkt.domain.ShoppingCart; import com.ruoyi.xkt.dto.userShoppingCart.ShopCartPageDTO; import com.ruoyi.xkt.dto.userShoppingCart.ShopCartPageDetailResDTO; import com.ruoyi.xkt.dto.userShoppingCart.ShopCartPageResDTO; +import com.ruoyi.xkt.dto.userShoppingCart.ShopCartStatusCountResDTO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -19,6 +20,7 @@ public interface ShoppingCartMapper extends BaseMapper { /** * 查询用户进货车列表 + * * @param pageDTO 进货单列表查询入参 * @return List */ @@ -27,9 +29,18 @@ public interface ShoppingCartMapper extends BaseMapper { /** * 根据进货车ID列表查询详情列表 + * * @param shoppingCartIdList 进货车ID列表 * @return */ List selectDetailList(@Param("shoppingCartIdList") List shoppingCartIdList); + /** + * 获取用户进货车各状态数量 + * + * @param userId 用户ID + * @return ShopCartStatusCountResDTO + */ + ShopCartStatusCountResDTO getStatusNum(@Param("userId") Long userId); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductDemandMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductDemandMapper.java index 53aa49cfa..145ad0be9 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductDemandMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductDemandMapper.java @@ -13,53 +13,6 @@ import java.util.List; * @date 2025-03-26 */ public interface StoreProductDemandMapper extends BaseMapper { - /** - * 查询档口商品需求单 - * - * @param id 档口商品需求单主键 - * @return 档口商品需求单 - */ - public StoreProductDemand selectStoreProductDemandByStoreProdDemandId(Long id); - - /** - * 查询档口商品需求单列表 - * - * @param storeProductDemand 档口商品需求单 - * @return 档口商品需求单集合 - */ - public List selectStoreProductDemandList(StoreProductDemand storeProductDemand); - - /** - * 新增档口商品需求单 - * - * @param storeProductDemand 档口商品需求单 - * @return 结果 - */ - public int insertStoreProductDemand(StoreProductDemand storeProductDemand); - - /** - * 修改档口商品需求单 - * - * @param storeProductDemand 档口商品需求单 - * @return 结果 - */ - public int updateStoreProductDemand(StoreProductDemand storeProductDemand); - - /** - * 删除档口商品需求单 - * - * @param id 档口商品需求单主键 - * @return 结果 - */ - public int deleteStoreProductDemandByStoreProdDemandId(Long id); - - /** - * 批量删除档口商品需求单 - * - * @param storeProdDemandIds 需要删除的数据主键集合 - * @return 结果 - */ - public int deleteStoreProductDemandByStoreProdDemandIds(Long[] storeProdDemandIds); /** * 修改状态为已完成 @@ -68,10 +21,9 @@ public interface StoreProductDemandMapper extends BaseMapper */ void updateStatusByIds(@Param("demandIdList") List demandIdList); - /** * 删除指定的需求列表 - * + *

* 通过此方法可以批量删除需求,每个需求通过其唯一的ID来标识 * 此方法接收一个需求ID列表,将根据这些ID删除对应的需求 * diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IShoppingCartService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IShoppingCartService.java index 4b35f050d..99a911ca7 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IShoppingCartService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IShoppingCartService.java @@ -61,4 +61,11 @@ public interface IShoppingCartService { */ List getList(ShopCartListDTO listDTO); + /** + * 获取用户进货车各状态数量 + * + * @return ShopCartStatusCountResDTO + */ + ShopCartStatusCountResDTO getStatusNum(); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreProductDemandService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreProductDemandService.java index 95534e102..bab495730 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreProductDemandService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreProductDemandService.java @@ -19,7 +19,7 @@ public interface IStoreProductDemandService { * @param deleteDTO 需要删除的档口商品需求单主键集合 * @return 结果 */ - public int deleteByStoreProdDemandIds(StoreProdDemandDeleteDTO deleteDTO); + int deleteByStoreProdDemandIds(StoreProdDemandDeleteDTO deleteDTO); /** * 获取指定门店及商品的库存和生产数量 @@ -68,5 +68,12 @@ public interface IStoreProductDemandService { * @return 返回一个包含校验结果的DTO对象,包括是否存在以及相关的验证信息 */ StoreProdDemandVerifyResDTO verifyDemandExist(StoreProdDemandVerifyDTO demandVerifyDTO); + /** + * 导出生产需求单 + * + * @param exportDTO 导出入参 + * @return List + */ + List export(StoreProdDemandExportDTO exportDTO); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ShoppingCartServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ShoppingCartServiceImpl.java index ddb261ba2..956815f75 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ShoppingCartServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ShoppingCartServiceImpl.java @@ -13,6 +13,7 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.xkt.domain.*; import com.ruoyi.xkt.dto.storeProductFile.StoreProdMainPicDTO; import com.ruoyi.xkt.dto.userShoppingCart.*; +import com.ruoyi.xkt.enums.EProductStatus; import com.ruoyi.xkt.enums.FileType; import com.ruoyi.xkt.enums.ProductSizeStatus; import com.ruoyi.xkt.mapper.*; @@ -304,6 +305,17 @@ public class ShoppingCartServiceImpl implements IShoppingCartService { }).collect(Collectors.toList()); } + /** + * 获取用户进货车各状态数量 + * + * @return ShopCartStatusCountResDTO + */ + @Override + @Transactional(readOnly = true) + public ShopCartStatusCountResDTO getStatusNum() { + return this.shopCartMapper.getStatusNum(SecurityUtils.getUserId()); + } + /** * 获取档口商品颜色尺码的库存 * diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductDemandServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductDemandServiceImpl.java index 73ccddbd3..2b8c2b38f 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductDemandServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductDemandServiceImpl.java @@ -75,7 +75,8 @@ public class StoreProductDemandServiceImpl implements IStoreProductDemandService List storeProdColorIdList = prodColorList.stream().map(StoreProductColor::getId).collect(Collectors.toList()); // 根据各个颜色查询库存信息 List prodStockList = this.storeProdStockMapper.selectList(new LambdaQueryWrapper() - .in(StoreProductStock::getStoreProdColorId, storeProdColorIdList).eq(StoreProductStock::getDelFlag, Constants.UNDELETED).eq(StoreProductStock::getStoreId, storeId)); + .in(StoreProductStock::getStoreProdColorId, storeProdColorIdList).eq(StoreProductStock::getDelFlag, Constants.UNDELETED) + .eq(StoreProductStock::getStoreId, storeId)); // 将库存信息封装成Map Map stockMap = prodStockList.stream().collect(Collectors .toMap(StoreProductStock::getStoreProdColorId, x -> BeanUtil.toBean(x, StoreProdStockDTO.class))); @@ -144,32 +145,21 @@ public class StoreProductDemandServiceImpl implements IStoreProductDemandService StoreProductDemand demand = new StoreProductDemand(); // 生成code demand.setCode(this.sequenceService.generateCode(demandDTO.getStoreId(), EVoucherSequenceType.DEMAND.getValue(), DateUtils.parseDateToStr(DateUtils.YYYYMMDD, new Date()))) - .setDemandStatus(1).setStoreId(demandDTO.getStoreId()).setStoreFactoryId(demandDTO.getStoreFactoryId()); + .setDemandStatus(1).setStoreId(demandDTO.getStoreId()).setStoreFactoryId(demandDTO.getStoreFactoryId()).setCreateBy(SecurityUtils.getUsername()); int count = this.storeProdDemandMapper.insert(demand); // 生产需求详情 - List detailList = demandDTO.getDetailList().stream() - .map(x -> BeanUtil.toBean(x, StoreProductDemandDetail.class).setStoreId(demandDTO.getStoreId()) - .setStoreProdDemandId(demand.getId()).setDetailStatus(1)).collect(Collectors.toList()); + List detailList = demandDTO.getDetailList().stream().map(x -> { + StoreProductDemandDetail detail = BeanUtil.toBean(x, StoreProductDemandDetail.class).setStoreId(demandDTO.getStoreId()) + .setStoreProdDemandId(demand.getId()).setDetailStatus(1); + detail.setCreateBy(SecurityUtils.getUsername()); + return detail; + }).collect(Collectors.toList()); this.storeProdDemandDetailMapper.insert(detailList); return count; } - /** - * 根据需求选择页面 - * 此方法用于根据提供的页面查询条件,返回相应的页面数据 - * 主要用于处理分页查询请求,以便在界面上展示特定的需求信息 - * - * @param pageDTO 包含页面查询条件的DTO对象,如页码、每页条数等 - * @return 返回一个对象,该对象包含了根据查询条件筛选出的页面数据 - */ @Override @Transactional(readOnly = true) - /** - * 根据页面查询条件查询门店生产需求信息 - * - * @param pageDTO 页面查询条件对象,包含页码和页面大小等信息 - * @return 返回一个包含查询结果的分页对象 - */ public Page selectPage(StoreProdDemandPageDTO pageDTO) { // 用户是否为档口管理者或子账户 if (!SecurityUtils.isAdmin() && !SecurityUtils.isStoreManagerOrSub(pageDTO.getStoreId())) { @@ -202,8 +192,6 @@ public class StoreProductDemandServiceImpl implements IStoreProductDemandService /** * 更新产品的生产状态 - * 此方法通过接收一个包含产品生产信息的DTO对象来更新数据库中对应产品的生产状态 - * 主要用于在生产流程中更新产品当前的加工状态或者生产阶段 * * @param workingDTO 包含产品生产信息的数据传输对象用于更新产品生产状态 * @return @@ -217,10 +205,22 @@ public class StoreProductDemandServiceImpl implements IStoreProductDemandService } List demandDetailList = Optional.ofNullable(this.storeProdDemandDetailMapper.selectList(new LambdaQueryWrapper() .eq(StoreProductDemandDetail::getStoreId, workingDTO.getStoreId()).eq(StoreProductDemandDetail::getDelFlag, Constants.UNDELETED) - .in(StoreProductDemandDetail::getId, workingDTO.getStoreProdDemandDetailIdList()))) + .in(StoreProductDemandDetail::getStoreProdDemandId, workingDTO.getStoreProdDemandIdList()))) .orElseThrow(() -> new ServiceException("需求单明细不存在!", HttpStatus.ERROR)); - demandDetailList.forEach(x -> x.setDetailStatus(DemandStatus.IN_PRODUCTION.getValue())); + // 更新需求明细单的状态为 生产中 + demandDetailList.stream().filter(x -> workingDTO.getStoreProdDemandDetailIdList().contains(x.getId())) + .forEach(x -> x.setDetailStatus(DemandStatus.IN_PRODUCTION.getValue())); List list = this.storeProdDemandDetailMapper.updateById(demandDetailList); + Map> detailMap = demandDetailList.stream().collect(Collectors.groupingBy(StoreProductDemandDetail::getStoreProdDemandId)); + // 所有的需求单 + List demandList = this.storeProdDemandMapper.selectByIds(workingDTO.getStoreProdDemandIdList()); + demandList.forEach(demand -> { + List detailList = detailMap.get(demand.getId()); + if (CollectionUtils.isNotEmpty(detailList) && detailList.stream().allMatch(x -> Objects.equals(x.getDetailStatus(), DemandStatus.IN_PRODUCTION.getValue()))) { + demand.setDemandStatus(DemandStatus.IN_PRODUCTION.getValue()); + } + }); + this.storeProdDemandMapper.updateById(demandList); return list.size(); } @@ -368,6 +368,31 @@ public class StoreProductDemandServiceImpl implements IStoreProductDemandService }}; } + /** + * 导出生产需求单 + * + * @param exportDTO 导出入参 + * @return List + */ + @Override + @Transactional(readOnly = true) + public List export(StoreProdDemandExportDTO exportDTO) { + List demandDetailList = this.storeProdDemandDetailMapper.selectList(new LambdaQueryWrapper() + .eq(StoreProductDemandDetail::getStoreId, exportDTO.getStoreId()).eq(StoreProductDemandDetail::getDelFlag, Constants.UNDELETED) + .in(StoreProductDemandDetail::getId, exportDTO.getStoreProdDemandDetailIdList())); + List downLoadList = demandDetailList.stream().sorted(Comparator.comparing(StoreProductDemandDetail::getProdArtNum)) + .map(x -> new StoreProdDemandDownloadDTO() + .setProdArtNum(x.getProdArtNum()).setColorName(x.getColorName()).setSize30Quantity(x.getSize30()).setSize31Quantity(x.getSize31()) + .setSize32Quantity(x.getSize32()).setSize33Quantity(x.getSize33()).setSize34Quantity(x.getSize34()).setSize35Quantity(x.getSize35()) + .setSize36Quantity(x.getSize36()).setSize37Quantity(x.getSize37()).setSize38Quantity(x.getSize38()).setSize39Quantity(x.getSize39()) + .setSize40Quantity(x.getSize40()).setSize41Quantity(x.getSize41()).setSize42Quantity(x.getSize42()).setSize43Quantity(x.getSize43())) + .collect(Collectors.toList()); + for (int i = 0; i < downLoadList.size(); i++) { + downLoadList.get(i).setOrderNum(i + 1); + } + return downLoadList; + } + /** * 批量删除档口商品需求单 * @@ -381,10 +406,12 @@ public class StoreProductDemandServiceImpl implements IStoreProductDemandService if (!SecurityUtils.isAdmin() && !SecurityUtils.isStoreManagerOrSub(deleteDTO.getStoreId())) { throw new ServiceException("当前用户非档口管理者或子账号,无权限操作!", HttpStatus.ERROR); } - List demandDetailList = Optional.ofNullable(this.storeProdDemandDetailMapper.selectList(new LambdaQueryWrapper() - .eq(StoreProductDemandDetail::getStoreId, deleteDTO.getStoreId()).eq(StoreProductDemandDetail::getDelFlag, Constants.UNDELETED) - .in(StoreProductDemandDetail::getId, deleteDTO.getStoreProdDemandDetailIdList()))) - .orElseThrow(() -> new ServiceException("需求单明细不存在!", HttpStatus.ERROR)); + List demandDetailList = this.storeProdDemandDetailMapper.selectList(new LambdaQueryWrapper() + .eq(StoreProductDemandDetail::getStoreId, deleteDTO.getStoreId()).eq(StoreProductDemandDetail::getDelFlag, Constants.UNDELETED) + .in(StoreProductDemandDetail::getId, deleteDTO.getStoreProdDemandDetailIdList())); + if (CollectionUtils.isEmpty(demandDetailList)) { + throw new ServiceException("需求单明细不存在!", HttpStatus.ERROR); + } // 根据需求明细ID能否找到对应的入库与需求抵扣关系数据 List deductList = this.storageDemandDeductMapper.selectList(new LambdaQueryWrapper() .in(StoreProductStorageDemandDeduct::getStoreProdDemandDetailId, deleteDTO.getStoreProdDemandDetailIdList()) diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java index 0b68aa1f6..cd3cbe664 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java @@ -948,11 +948,18 @@ public class StoreProductServiceImpl implements IStoreProductService { * @throws IOException */ private void deleteESDoc(List storeProdIdList) throws IOException { - List list = storeProdIdList.stream().map(x -> new BulkOperation.Builder().delete( - d -> d.id(String.valueOf(x)).index(Constants.ES_IDX_PRODUCT_INFO)).build()).collect(Collectors.toList()); - // 调用bulk方法执行批量插入操作 - BulkResponse bulkResponse = esClientWrapper.getEsClient().bulk(e -> e.index(Constants.ES_IDX_PRODUCT_INFO).operations(list)); - System.out.println("bulkResponse.items() = " + bulkResponse.items()); + try { + // 删除ES索引文档 + List list = storeProdIdList.stream().map(x -> new BulkOperation.Builder().delete( + d -> d.id(String.valueOf(x)).index(Constants.ES_IDX_PRODUCT_INFO)).build()).collect(Collectors.toList()); + // 调用bulk方法执行批量插入操作 + BulkResponse bulkResponse = esClientWrapper.getEsClient().bulk(e -> e.index(Constants.ES_IDX_PRODUCT_INFO).operations(list)); + log.info("bulkResponse.items() = {}", bulkResponse.items()); + } catch (IOException | RuntimeException e) { + // 记录日志并抛出或处理异常 + log.error("删除ES文档失败,商品ID: {}, 错误信息: {}", storeProdIdList, e.getMessage(), e); + throw e; // 或者做其他补偿处理,比如异步重试 + } } /** diff --git a/xkt/src/main/resources/mapper/ShoppingCartMapper.xml b/xkt/src/main/resources/mapper/ShoppingCartMapper.xml index e513f6afe..874bcb4c2 100644 --- a/xkt/src/main/resources/mapper/ShoppingCartMapper.xml +++ b/xkt/src/main/resources/mapper/ShoppingCartMapper.xml @@ -66,5 +66,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sc.id DESC + + \ No newline at end of file diff --git a/xkt/src/main/resources/mapper/StoreProductColorMapper.xml b/xkt/src/main/resources/mapper/StoreProductColorMapper.xml index ed5eaae7d..4d4576c85 100644 --- a/xkt/src/main/resources/mapper/StoreProductColorMapper.xml +++ b/xkt/src/main/resources/mapper/StoreProductColorMapper.xml @@ -36,9 +36,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" spc.create_time AS createTime, sf.file_url AS mainPicUrl, CONCAT( - ( SELECT MIN( size ) FROM store_product_color_size WHERE store_color_id = spc.id AND del_flag = 0 AND standard = 1 ), + ( SELECT MIN( size ) FROM store_product_color_size WHERE store_color_id = spc.store_color_id AND store_prod_id = spc.store_prod_id AND del_flag = 0 AND standard = 1 ), '-', - ( SELECT MAX( size ) FROM store_product_color_size WHERE store_color_id = spc.id AND del_flag = 0 AND standard = 1 ) + ( SELECT MAX( size ) FROM store_product_color_size WHERE store_color_id = spc.store_color_id AND store_prod_id = spc.store_prod_id AND del_flag = 0 AND standard = 1 ) ) AS standard FROM store_product_color spc diff --git a/xkt/src/main/resources/mapper/StoreProductMapper.xml b/xkt/src/main/resources/mapper/StoreProductMapper.xml index 26ab41349..749899032 100644 --- a/xkt/src/main/resources/mapper/StoreProductMapper.xml +++ b/xkt/src/main/resources/mapper/StoreProductMapper.xml @@ -281,7 +281,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sp.id AS storeProdId, sp.store_id, s.store_name, - sp.prod_name, sp.prod_art_num, sp.prod_title, sp.create_time,