master:条码功能完善;

pull/1121/head
liujiang 2025-07-11 00:26:31 +08:00
parent b9f117069e
commit 7d7728766b
28 changed files with 697 additions and 40 deletions

View File

@ -1,6 +1,23 @@
package com.ruoyi.web.controller.xkt;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.XktBaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.web.controller.xkt.vo.storeProdColorSize.StoreSaleSnResVO;
import com.ruoyi.web.controller.xkt.vo.storeProdColorSize.StoreProdSnVO;
import com.ruoyi.web.controller.xkt.vo.storeProdColorSize.StoreSaleSnVO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSnDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnDTO;
import com.ruoyi.xkt.service.IStoreProductColorSizeService;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -10,8 +27,40 @@ import org.springframework.web.bind.annotation.RestController;
* @author ruoyi
* @date 2025-03-26
*/
@ApiModel(value = "商品条码处理")
@RestController
@RequiredArgsConstructor
@RequestMapping("/rest/v1/prod-color-sizes")
public class StoreProductColorSizeController extends XktBaseController {
final IStoreProductColorSizeService prodColorSizeService;
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()")
@Log(title = "[销售出库]根据条码查询商品信息", businessType = BusinessType.INSERT)
@ApiOperation(value = "[销售出库]根据条码查询商品信息", httpMethod = "POST", response = R.class)
@PostMapping("/sn/store-sale")
public R<StoreSaleSnResVO> storeSaleSn(@Validated @RequestBody StoreSaleSnVO snVO) {
return R.ok(BeanUtil.toBean(prodColorSizeService.storeSaleSn(BeanUtil.toBean(snVO, StoreSaleSnDTO.class)), StoreSaleSnResVO.class));
}
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()")
@Log(title = "[商品入库、库存盘点]根据条码查询商品信息", businessType = BusinessType.INSERT)
@ApiOperation(value = "[商品入库、库存盘点]根据条码查询商品信息", httpMethod = "POST", response = R.class)
@PostMapping("/sn")
public R<StoreSaleSnResVO> sn(@Validated @RequestBody StoreProdSnVO snVO) {
return R.ok(BeanUtil.toBean(prodColorSizeService.sn(BeanUtil.toBean(snVO, StoreProdSnDTO.class)), StoreSaleSnResVO.class));
}
// TODO 档口扫描货号,获取商品信息
// TODO 档口扫描货号,获取商品信息
// TODO 档口扫描货号,获取商品信息
// TODO 打印条码
// TODO 打印条码
// TODO 打印条码
}

View File

@ -39,12 +39,6 @@ public class StoreSaleController extends XktBaseController {
final IStoreSaleService storeSaleService;
// TODO 提醒杰、销售明细 增加 支付方式显示
// TODO 提醒杰、销售明细 增加 支付方式显示
// TODO 提醒杰、销售明细 增加 支付方式显示
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()")
@ApiOperation(value = "根据当前客户查询最近的销售业绩,以及欠款金额", httpMethod = "GET", response = R.class)
@GetMapping("/cus-overall")

View File

@ -0,0 +1,44 @@
package com.ruoyi.web.controller.xkt.vo.storeProdColorSize;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author liujiang
* @version v1.0
* @date 2025/3/27 15:12
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StoreProdSnResVO {
@ApiModelProperty(value = "错误列表")
List<String> failList;
@ApiModelProperty(value = "成功列表")
List<SPSDetailVO> successList;
@Data
public static class SPSDetailVO {
@ApiModelProperty(value = "档口商品ID")
private Long storeProdId;
@ApiModelProperty(value = "档口商品颜色尺码ID")
private Long storeProdColorId;
@ApiModelProperty(value = "颜色")
private String colorName;
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "销售条码")
private String sn;
@ApiModelProperty(value = "销售单价")
private BigDecimal price;
@ApiModelProperty(value = "档口客户优惠金额")
private BigDecimal discount;
}
}

View File

@ -0,0 +1,26 @@
package com.ruoyi.web.controller.xkt.vo.storeProdColorSize;
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 StoreProdSnVO {
@NotNull(message = "档口ID不能为空!")
@ApiModelProperty(value = "档口ID", required = true)
private String storeId;
@NotNull(message = "条码列表不能为空!")
@ApiModelProperty(value = "条码列表", required = true)
private List<String> snList;
}

View File

@ -0,0 +1,38 @@
package com.ruoyi.web.controller.xkt.vo.storeProdColorSize;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author liujiang
* @version v1.0
* @date 2025/3/27 15:12
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StoreSaleSnResVO {
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "档口商品ID")
private Long storeProdId;
@ApiModelProperty(value = "档口商品颜色尺码ID")
private Long storeProdColorId;
@ApiModelProperty(value = "颜色")
private String colorName;
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "销售条码")
private String sn;
@ApiModelProperty(value = "销售单价")
private BigDecimal price;
@ApiModelProperty(value = "档口客户优惠金额")
private BigDecimal discount;
}

View File

@ -0,0 +1,32 @@
package com.ruoyi.web.controller.xkt.vo.storeProdColorSize;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author liujiang
* @version v1.0
* @date 2025/3/27 15:12
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StoreSaleSnVO {
@NotNull(message = "档口ID不能为空!")
@ApiModelProperty(value = "档口ID", required = true)
private String storeId;
@NotNull(message = "档口客户ID不能为空!")
@ApiModelProperty(value = "档口客户ID", required = true)
private Long storeCusId;
@NotNull(message = "是否退货不能为空!")
@ApiModelProperty(value = "是否退货", required = true)
private Boolean refund;
@NotBlank(message = "条码不能为空!")
@ApiModelProperty(value = "条码")
private String sn;
}

View File

@ -47,6 +47,8 @@ public class StoreProdStockAndDiscountResVO {
public static class SPSADSizeVO {
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "是否是标准尺码")
private Integer standard;
@ApiModelProperty(value = "库存")
private Integer stock;
}

View File

@ -62,10 +62,12 @@ public class StoreSaleResVO {
private String colorName;
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "大小码加价 0 不加 1加价")
private Integer addOverPrice;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "销售条码")
private String sns;
private String sn;
@ApiModelProperty(value = "销售单价")
private BigDecimal price;
@ApiModelProperty(value = "给客户优惠后单价")

View File

@ -71,7 +71,7 @@ public class StoreSaleVO {
@NotBlank(message = "商品货号不能为空!")
private String prodArtNum;
@ApiModelProperty(value = "销售条码")
private String sns;
private String sn;
@NotNull(message = "销售单价不能为空!")
@ApiModelProperty(value = "销售单价", required = true)
private BigDecimal price;

View File

@ -617,4 +617,43 @@ INSERT INTO `sys_product_category` VALUES (47, '人字拖', 8, 3, '0', 'https://
INSERT INTO `sys_product_category` VALUES (48, '一字拖', 8, 4, '0', 'https://pics1.baidu.com/feed/6609c93d70cf3bc758366c966adb10aecc112a85.png@f_auto?token=89fe04971fb0579147e9ccc52683a013', '', 0, '0', '', '2025-04-15 19:57:04', '', '2025-04-15 19:57:04');
INSERT INTO `sys_product_category` VALUES (49, '其他拖鞋', 8, 5, '0', 'https://pics1.baidu.com/feed/6609c93d70cf3bc758366c966adb10aecc112a85.png@f_auto?token=89fe04971fb0579147e9ccc52683a013', '', 0, '0', '', '2025-04-15 19:57:12', '', '2025-04-15 19:57:12');
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Table structure for store
-- ----------------------------
DROP TABLE IF EXISTS `store`;
CREATE TABLE `store` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '档口ID',
`user_id` bigint UNSIGNED NOT NULL COMMENT '档口负责人ID',
`store_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '档口名称',
`store_weight` int NULL DEFAULT NULL COMMENT '权重',
`store_logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '档口logo',
`brand_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '品牌名称',
`contact_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系人',
`contact_phone` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`contact_back_phone` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备选联系电话',
`wechat_account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信账号',
`qq_account` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'QQ账号',
`alipay_account` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '支付宝账号',
`operate_years` int UNSIGNED NULL DEFAULT NULL COMMENT '经营年限',
`store_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '档口地址',
`fac_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工厂地址',
`prod_scale` tinyint UNSIGNED NULL DEFAULT NULL COMMENT '生产规模',
`integrity_gold` decimal(10, 2) NULL DEFAULT NULL COMMENT '保证金',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
`trial_end_time` date NULL DEFAULT NULL COMMENT '试用截止时间',
`storage_usage` decimal(10, 3) NULL DEFAULT NULL COMMENT '已使用文件大小',
`template_num` int UNSIGNED NULL DEFAULT NULL COMMENT '档口模板ID',
`store_status` tinyint UNSIGNED NULL DEFAULT NULL COMMENT '档口状态',
`reject_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 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 = 10001 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '档口' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

View File

@ -44,35 +44,22 @@ public class StoreProductColorSize extends XktBaseEntity {
@Excel(name = "商品尺码")
private Integer size;
/**
*
* 1000100000001 xxxx
*/
@Excel(name = "档口商品颜色尺码的前缀")
private String barcodePrefix;
private String snPrefix;
/**
* 4260003836 xxx
*/
private String otherSnPrefix;
/**
*
*/
private Integer nextBarcode;
private Integer nextSn;
/**
* 0 1
*/
@Excel(name = "是否是标准尺码", readConverterExp = "0=不是,1=是")
private Integer standard;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("storeColorId", getStoreColorId())
.append("storeProdId", getStoreProdId())
.append("size", getSize())
.append("barcodePrefix", getBarcodePrefix())
.append("standard", getStandard())
.append("version", getVersion())
.append("delFlag", getDelFlag())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -35,6 +35,15 @@ public class StoreSaleDetail extends XktBaseEntity {
*/
@Excel(name = "档口商品销售ID")
private Long storeSaleId;
/**
* ID
*/
@Excel(name = "档口客户ID")
private Long storeCusId;
/**
*
*/
private String storeCusName;
/**
* ID
*/
@ -96,7 +105,7 @@ public class StoreSaleDetail extends XktBaseEntity {
*
*/
@Excel(name = "条码")
private String sns;
private String sn;
/**
*
*/

View File

@ -0,0 +1,23 @@
package com.ruoyi.xkt.dto.storeProdColorSize;
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 StoreProdSnDTO {
@ApiModelProperty(value = "档口ID")
private String storeId;
@ApiModelProperty(value = "条码列表")
private List<String> snList;
}

View File

@ -0,0 +1,48 @@
package com.ruoyi.xkt.dto.storeProdColorSize;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.List;
/**
* @author liujiang
* @version v1.0
* @date 2025/3/27 15:12
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StoreProdSnResDTO {
@ApiModelProperty(value = "错误列表")
List<String> failList;
@ApiModelProperty(value = "成功列表")
List<SPSDetailDTO> successList;
@Data
@Accessors(chain = true)
public static class SPSDetailDTO {
@ApiModelProperty(value = "档口商品ID")
private Long storeProdId;
@ApiModelProperty(value = "档口商品颜色尺码ID")
private Long storeProdColorId;
@ApiModelProperty(value = "颜色")
private String colorName;
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "条码前缀")
private String snPrefix;
@ApiModelProperty(value = "销售条码")
private String sn;
@ApiModelProperty(value = "销售单价")
private BigDecimal price;
@ApiModelProperty(value = "档口客户优惠金额")
private BigDecimal discount;
}
}

View File

@ -0,0 +1,27 @@
package com.ruoyi.xkt.dto.storeProdColorSize;
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 StoreSaleSnDTO {
@ApiModelProperty(value = "档口ID")
private String storeId;
@ApiModelProperty(value = "档口客户ID")
private Long storeCusId;
@ApiModelProperty(value = "是否退货")
private Boolean refund;
@ApiModelProperty(value = "条码")
private String sn;
}

View File

@ -0,0 +1,40 @@
package com.ruoyi.xkt.dto.storeProdColorSize;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.List;
/**
* @author liujiang
* @version v1.0
* @date 2025/3/27 15:12
*/
@Data
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StoreSaleSnResDTO {
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "档口商品ID")
private Long storeProdId;
@ApiModelProperty(value = "档口商品颜色尺码ID")
private Long storeProdColorId;
@ApiModelProperty(value = "颜色")
private String colorName;
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "销售条码")
private String sn;
@ApiModelProperty(value = "销售单价")
private BigDecimal price;
@ApiModelProperty(value = "档口客户优惠金额")
private BigDecimal discount;
}

View File

@ -47,6 +47,8 @@ public class StoreProdStockAndDiscountResDTO {
public static class SPSADSizeDTO {
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "是否是标准尺码")
private Integer standard;
@ApiModelProperty(value = "库存")
private Integer stock;
}

View File

@ -55,7 +55,7 @@ public class StoreSaleDTO {
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "销售条码")
private String sns;
private String sn;
@ApiModelProperty(value = "销售单价")
private BigDecimal price;
@ApiModelProperty(value = "给客户优惠后单价")

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
@ -51,6 +52,7 @@ public class StoreSaleResDTO {
private List<SSDetailDTO> detailList;
@Data
@Accessors(chain = true)
public static class SSDetailDTO {
@ApiModelProperty(value = "档口商品ID")
private Long storeProdId;
@ -62,10 +64,12 @@ public class StoreSaleResDTO {
private String colorName;
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "大小码加价 0 不加 1加价")
private Integer addOverPrice;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "销售条码")
private String sns;
private String sn;
@ApiModelProperty(value = "销售单价")
private BigDecimal price;
@ApiModelProperty(value = "给客户优惠后单价")

View File

@ -2,8 +2,10 @@ package com.ruoyi.xkt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.StoreProductColorSize;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdColorSizeDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSizeDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSnResDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnResDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@ -17,6 +19,11 @@ import java.util.List;
@Repository
public interface StoreProductColorSizeMapper extends BaseMapper<StoreProductColorSize> {
/**
*
*
* @param storeProdId ID
*/
void updateDelFlagByStoreProdId(Long storeProdId);
/**
@ -27,4 +34,31 @@ public interface StoreProductColorSizeMapper extends BaseMapper<StoreProductColo
*/
List<StoreProdSizeDTO> selectListByStoreProdId(Long storeProdId);
/**
*
*
* @param snPrefix
* @param storeId ID
* @param storeCusId ID
* @return StoreSaleBarcodeResDTO
*/
StoreSaleSnResDTO selectSn(@Param("snPrefix") String snPrefix, @Param("storeId") String storeId, @Param("storeCusId") Long storeCusId);
/**
*
*
* @param snPrefix
* @param storeId ID
* @param storeCusId ID
* @return StoreSaleBarcodeResDTO
*/
StoreSaleSnResDTO selectOtherSn(@Param("snPrefix") String snPrefix, @Param("storeId") String storeId, @Param("storeCusId") Long storeCusId);
/**
*
*
* @param snList
* @return List<StoreProdSnsResDTO.SPSDetailDTO>
*/
List<StoreProdSnResDTO.SPSDetailDTO> selectSnList(@Param("snList") List<String> snList, @Param("storeId") String storeId);
}

View File

@ -2,6 +2,8 @@ package com.ruoyi.xkt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.StoreSaleDetail;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnResDTO;
/**
* Mapper
@ -11,4 +13,10 @@ import com.ruoyi.xkt.domain.StoreSaleDetail;
*/
public interface StoreSaleDetailMapper extends BaseMapper<StoreSaleDetail> {
/**
*
* @param barcodeDTO
* @return
*/
StoreSaleSnResDTO selectBySn(StoreSaleSnDTO barcodeDTO);
}

View File

@ -1,5 +1,10 @@
package com.ruoyi.xkt.service;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSnDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSnResDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnResDTO;
/**
* Service
*
@ -8,4 +13,19 @@ package com.ruoyi.xkt.service;
*/
public interface IStoreProductColorSizeService {
/**
*
*
* @param barcodeDTO
* @return StoreProdColorSizeBarcodeResDTO
*/
StoreSaleSnResDTO storeSaleSn(StoreSaleSnDTO barcodeDTO);
/**
*
*
* @param snsDTO
* @return StoreProdSnsResDTO
*/
StoreProdSnResDTO sn(StoreProdSnDTO snsDTO);
}

View File

@ -1,7 +1,24 @@
package com.ruoyi.xkt.service.impl;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSnDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSnResDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnResDTO;
import com.ruoyi.xkt.mapper.StoreProductColorSizeMapper;
import com.ruoyi.xkt.mapper.StoreSaleDetailMapper;
import com.ruoyi.xkt.service.IStoreProductColorSizeService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* Service
@ -10,6 +27,121 @@ import org.springframework.stereotype.Service;
* @date 2025-03-26
*/
@Service
@RequiredArgsConstructor
public class StoreProductColorSizeServiceImpl implements IStoreProductColorSizeService {
final StoreProductColorSizeMapper prodColorSizeMapper;
final StoreSaleDetailMapper saleDetailMapper;
// 纯数字
private static final Pattern POSITIVE_PATTERN = Pattern.compile("^\\d+$");
/**
*
*
* @param snDTO
* @return StoreProdColorSizeBarcodeResDTO
*/
@Override
@Transactional(readOnly = true)
public StoreSaleSnResDTO storeSaleSn(StoreSaleSnDTO snDTO) {
// 非纯数字,则直接返回
if (!POSITIVE_PATTERN.matcher(snDTO.getSn()).matches()) {
return new StoreSaleSnResDTO().setSuccess(Boolean.FALSE).setSn(snDTO.getSn());
}
// 销售出库[退货]
if (snDTO.getRefund()) {
// 先查storeSaleDetail中的sns条码是否存在[可能同一个条码,被一个客户多次销售、退货,则取最近的一条]
StoreSaleSnResDTO barcodeResDTO = this.saleDetailMapper.selectBySn(snDTO);
if (ObjectUtils.isNotEmpty(barcodeResDTO)) {
return barcodeResDTO.setSuccess(Boolean.TRUE);
} else {
// 若是没查询到数据,则走正常条码查询流程
return this.getSnInfo(snDTO);
}
// 销售出库[销售] 正常条码查询流程
} else {
return this.getSnInfo(snDTO);
}
}
/**
*
*
* @param snDTO
* @return StoreProdSnsResDTO
*/
@Override
@Transactional(readOnly = true)
public StoreProdSnResDTO sn(StoreProdSnDTO snDTO) {
// 非纯数字的条码
List<String> failList = snDTO.getSnList().stream().filter(s -> !POSITIVE_PATTERN.matcher(s).matches()).collect(Collectors.toList());
List<StoreProdSnResDTO.SPSDetailDTO> successList = new ArrayList<>();
// 步橘网系统的条码
List<String> snList = snDTO.getSnList().stream().filter(s -> POSITIVE_PATTERN.matcher(s).matches())
.filter(x -> x.startsWith(snDTO.getStoreId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(snList)) {
// 截取前13位 作为条码查询条件
Set<String> pre13SnSet = snList.stream().map(x -> x.substring(0, 13)).collect(Collectors.toSet());
List<StoreProdSnResDTO.SPSDetailDTO> existList = prodColorSizeMapper.selectSnList(new ArrayList<>(pre13SnSet), snDTO.getStoreId());
Map<String, StoreProdSnResDTO.SPSDetailDTO> existMap = existList.stream().collect(Collectors.toMap(StoreProdSnResDTO.SPSDetailDTO::getSn, x -> x));
snList.forEach(sn -> {
String snPrefix = sn.substring(0, 13);
StoreProdSnResDTO.SPSDetailDTO exist = existMap.get(snPrefix);
if (ObjectUtils.isNotEmpty(exist)) {
successList.add( exist.setSn(sn));
} else {
failList.add( sn);
}
});
}
// 其它系统的条码
List<String> otherSnList = snDTO.getSnList().stream().filter(s -> POSITIVE_PATTERN.matcher(s).matches())
.filter(x -> !x.startsWith(snDTO.getStoreId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(otherSnList)) {
// 从系统设置中获取,根据系统迁移时的配置
final Integer otherSysEndIndex = 9;
// 截取前 xxx 位 作为条码查询条件
Set<String> preIndexSnSet = snList.stream().map(x -> x.substring(0, otherSysEndIndex)).collect(Collectors.toSet());
}
return null;
}
/**
*
*
* @param snDTO
* @return StoreSaleBarcodeResDTO
*/
private StoreSaleSnResDTO getSnInfo(StoreSaleSnDTO snDTO) {
StoreSaleSnResDTO barcodeResDTO;
// 步橘网生成的条码
if (snDTO.getSn().startsWith(snDTO.getStoreId())) {
final String snsPrefix = snDTO.getSn().substring(0, 13);
// 查询数据库 获取条码对应的商品信息
barcodeResDTO = prodColorSizeMapper.selectSn(snsPrefix, snDTO.getStoreId(), snDTO.getStoreCusId());
} else {
// 从系统设置中获取,根据系统迁移时的配置
final Integer otherSysEndIndex = 9;
final String snsPrefix = snDTO.getSn().substring(0, otherSysEndIndex);
// 查询数据库 获取条码对应的商品信息
barcodeResDTO = prodColorSizeMapper.selectOtherSn(snsPrefix, snDTO.getStoreId(), snDTO.getStoreCusId());
}
return ObjectUtils.isEmpty(barcodeResDTO) ? new StoreSaleSnResDTO().setSuccess(Boolean.FALSE).setSn(snDTO.getSn())
: barcodeResDTO.setSuccess(Boolean.TRUE).setSn(snDTO.getSn());
}
}

View File

@ -473,6 +473,9 @@ public class StoreProductServiceImpl implements IStoreProductService {
this.storeProdColorPriceMapper.insert(prodColorPriceList);
this.storeProdColorSizeMapper.insert(prodColorSizeList);
this.storeProdColorMapper.insert(prodColorList);
// 设置档口商品价格尺码的barcode_prefix
prodColorSizeList.forEach(x -> x.setSnPrefix(storeId + String.format("%08d", x.getId())));
this.storeProdColorSizeMapper.updateById(prodColorSizeList);
// 设置了档口商品全部优惠的客户,新增商品优惠
this.createStoreCusDiscount(prodColorList, storeProdId);
}

View File

@ -115,7 +115,7 @@ public class StoreProductStockServiceImpl implements IStoreProductStockService {
.eq(StoreProductColorSize::getStoreProdId, basicInfoDTO.getStoreProdId()).eq(StoreProductColorSize::getStoreColorId, basicInfoDTO.getStoreColorId())
.eq(StoreProductColorSize::getDelFlag, Constants.UNDELETED));
List<StoreProdStockAndDiscountResDTO.SPSADSizeDTO> sizeStockList = prodColorSizeList.stream().map(size -> new StoreProdStockAndDiscountResDTO.SPSADSizeDTO()
.setSize(size.getSize()).setStock(this.getSizeStock(size.getSize(), stock))).collect(Collectors.toList());
.setSize(size.getSize()).setStandard(size.getStandard()).setStock(this.getSizeStock(size.getSize(), stock))).collect(Collectors.toList());
return basicInfoDTO.setStoreCusId(dto.getStoreCusId()).setStoreId(dto.getStoreId()).setSizeStockList(sizeStockList);
}

View File

@ -55,6 +55,7 @@ public class StoreSaleServiceImpl implements IStoreSaleService {
final StoreSaleRefundRecordMapper refundRecordMapper;
final StoreSaleRefundRecordDetailMapper refundRecordDetailMapper;
final IStoreProductStockService storeProdStockService;
final StoreProductMapper storeProdMapper;
/**
*
@ -268,8 +269,8 @@ public class StoreSaleServiceImpl implements IStoreSaleService {
int count = storeSaleMapper.insert(storeSale);
// 处理订单明细
List<StoreSaleDetail> saleDetailList = storeSaleDTO.getDetailList().stream().map(x -> {
StoreSaleDetail saleDetail = BeanUtil.toBean(x, StoreSaleDetail.class).setStoreSaleId(storeSale.getId())
.setStoreId(storeSale.getStoreId()).setVoucherDate(voucherDate);
StoreSaleDetail saleDetail = BeanUtil.toBean(x, StoreSaleDetail.class).setStoreSaleId(storeSale.getId()).setStoreId(storeSale.getStoreId())
.setVoucherDate(voucherDate).setStoreCusId(storeSale.getStoreCusId()).setStoreCusName(storeSale.getStoreCusName());
saleDetail.setCreateBy(loginUser.getUsername());
return saleDetail;
}).collect(Collectors.toList());
@ -311,12 +312,12 @@ public class StoreSaleServiceImpl implements IStoreSaleService {
// 若为返单,则将之前数据记录到返单记录表中
if (Objects.equals(storeSaleDTO.getRefund(), Boolean.TRUE)) {
// 订单记录到StoreSaleRefundRecord
StoreSaleRefundRecord refundRecord = BeanUtil.toBean(storeSale, StoreSaleRefundRecord.class).setStoreSaleId(storeSale.getId())
.setOperatorId(loginUser.getUserId()).setOperatorName(loginUser.getUsername());
StoreSaleRefundRecord refundRecord = BeanUtil.toBean(storeSale, StoreSaleRefundRecord.class).setId(null)
.setStoreSaleId(storeSale.getId()).setOperatorId(loginUser.getUserId()).setOperatorName(loginUser.getUsername());
this.refundRecordMapper.insert(refundRecord);
// 明细记录到StoreSaleRefundRecordDetail
List<StoreSaleRefundRecordDetail> refundDetailRecordList = saleDetailList.stream().map(x -> BeanUtil.toBean(x, StoreSaleRefundRecordDetail.class)
.setStoreSaleRefundRecordId(refundRecord.getId())).collect(Collectors.toList());
.setId(null).setStoreSaleRefundRecordId(refundRecord.getId())).collect(Collectors.toList());
this.refundRecordDetailMapper.insert(refundDetailRecordList);
}
// 更新档口销售数据
@ -337,7 +338,8 @@ public class StoreSaleServiceImpl implements IStoreSaleService {
this.storeSaleDetailMapper.updateById(saleDetailList.stream().peek(x -> x.setDelFlag(Constants.DELETED)).collect(Collectors.toList()));
// 再新增档口销售出库明细数据
List<StoreSaleDetail> detailList = storeSaleDTO.getDetailList().stream().map(x -> BeanUtil.toBean(x, StoreSaleDetail.class)
.setStoreSaleId(storeSale.getId()).setStoreId(storeSale.getStoreId()).setVoucherDate(voucherDate))
.setStoreSaleId(storeSale.getId()).setStoreId(storeSale.getStoreId()).setStoreCusId(storeSale.getStoreCusId())
.setStoreCusName(storeSale.getStoreCusName()).setVoucherDate(voucherDate))
.collect(Collectors.toList());
this.storeSaleDetailMapper.insert(detailList);
// 汇总编辑的存货总数量
@ -374,7 +376,11 @@ public class StoreSaleServiceImpl implements IStoreSaleService {
// 查询销售出库明细
List<StoreSaleDetail> saleDetailList = this.storeSaleDetailMapper.selectList(new LambdaQueryWrapper<StoreSaleDetail>()
.eq(StoreSaleDetail::getStoreSaleId, storeSaleId).eq(StoreSaleDetail::getDelFlag, Constants.UNDELETED));
storeSaleDTO.setDetailList(saleDetailList.stream().map(x -> BeanUtil.toBean(x, StoreSaleResDTO.SSDetailDTO.class)).collect(Collectors.toList()));
List<StoreProduct> storeProdList = this.storeProdMapper.selectByIds(saleDetailList.stream().map(StoreSaleDetail::getStoreProdId).collect(Collectors.toList()));
Map<Long, StoreProduct> storeProdMap = storeProdList.stream().collect(Collectors.toMap(StoreProduct::getId, x -> x));
storeSaleDTO.setDetailList(saleDetailList.stream().map(x -> BeanUtil.toBean(x, StoreSaleResDTO.SSDetailDTO.class)
.setAddOverPrice(ObjectUtils.isNotEmpty(storeProdMap.get(x.getStoreProdId())) ? storeProdMap.get(x.getStoreProdId()).getOverPrice() : 0))
.collect(Collectors.toList()));
return storeSaleDTO;
}

View File

@ -19,6 +19,71 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND spcs.store_prod_id = #{storeProdId}
ORDER BY
spcs.size
</select>
<select id="selectSn" resultType="com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnResDTO">
SELECT
spcs.store_prod_id,
spc.id AS storeProdColorId,
spc.color_name,
spcs.size,
sp.prod_art_num,
spcp.price,
( SELECT discount FROM store_customer_product_discount WHERE store_cus_id = #{storeCusId} AND store_prod_color_id = spc.id AND del_flag = 0 ) AS discount
FROM
store_product_color_size spcs
LEFT JOIN store_product_color_price spcp ON spcs.store_prod_id = spcp.store_prod_id AND spcs.store_color_id = spcp.store_color_id AND spcp.del_flag = 0
LEFT JOIN store_product sp ON spcs.store_prod_id = sp.id
LEFT JOIN store_product_color spc ON spcs.store_color_id = spc.store_color_id AND spcs.store_prod_id = spc.store_prod_id AND spc.del_flag = 0
WHERE
spcs.del_flag = 0
AND spcs.sn_prefix = #{snPrefix}
AND sp.store_id = #{storeId}
</select>
<select id="selectOtherSn" resultType="com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnResDTO">
SELECT
spcs.store_prod_id,
spc.id AS storeProdColorId,
spc.color_name,
spcs.size,
sp.prod_art_num,
spcp.price,
( SELECT discount FROM store_customer_product_discount WHERE store_cus_id = #{storeCusId} AND store_prod_color_id = spc.id AND del_flag = 0 ) AS discount
FROM
store_product_color_size spcs
LEFT JOIN store_product_color_price spcp ON spcs.store_prod_id = spcp.store_prod_id AND spcs.store_color_id = spcp.store_color_id AND spcp.del_flag = 0
LEFT JOIN store_product sp ON spcs.store_prod_id = sp.id
LEFT JOIN store_product_color spc ON spcs.store_color_id = spc.store_color_id AND spcs.store_prod_id = spc.store_prod_id AND spc.del_flag = 0
WHERE
spcs.del_flag = 0
AND spcs.other_sn_prefix = #{snPrefix}
AND sp.store_id = #{storeId}
</select>
<select id="selectSnList">
SELECT
spcs.store_prod_id,
spc.id AS storeProdColorId,
spc.color_name,
spcs.size,
sp.prod_art_num,
spcp.price,
spcs.sn_prefix,
( SELECT discount FROM store_customer_product_discount WHERE store_cus_id = #{storeCusId} AND store_prod_color_id = spc.id AND del_flag = 0 ) AS discount
FROM
store_product_color_size spcs
LEFT JOIN store_product_color_price spcp ON spcs.store_prod_id = spcp.store_prod_id AND spcs.store_color_id = spcp.store_color_id AND spcp.del_flag = 0
LEFT JOIN store_product sp ON spcs.store_prod_id = sp.id
LEFT JOIN store_product_color spc ON spcs.store_color_id = spc.store_color_id AND spcs.store_prod_id = spc.store_prod_id AND spc.del_flag = 0
WHERE
spcs.del_flag = 0
AND sp.store_id = #{storeId}
AND spcs.sn_prefix IN
<foreach item="item" index="index" collection="snList" separator="," open="(" close=")" >
#{item}
</foreach>
</select>

View File

@ -4,5 +4,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.xkt.mapper.StoreSaleDetailMapper">
<select id="selectBySn" resultType="com.ruoyi.xkt.dto.storeProdColorSize.StoreSaleSnResDTO">
SELECT
ssd.store_prod_id,
ssd.store_prod_color_id,
ssd.color_name,
ssd.size,
ssd.prod_art_num,
ssd.price,
ssd.discounted_price,
ssd.quantity,
ssd.amount,
ssd.other_discount
FROM
store_sale_detail ssd
WHERE
ssd.del_flag = 0
AND ssd.sn = #{sn}
AND ssd.store_id = #{storeId}
AND ssd.store_cus_id = #{storeCusId}
ORDER BY
ssd.update_time DESC
LIMIT 1
</select>
</mapper>