qiuhongwu 1 year ago
commit 26dfb38388

@ -78,6 +78,8 @@ public interface ErrorCodeConstants {
// ========== 主体跟进管理 TODO 补充编号 ==========
ErrorCode SUBJECT_FOLLOW_MANAGEMENT_NOT_EXISTS = new ErrorCode(1002004018, "主体跟进管理不存在");
// ========== 商品表 TODO 补充编号 ==========
ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1002004019, "商品不存在");
/**
* 使 1-005-000-000

@ -0,0 +1,102 @@
package com.yunxi.scm.module.xxjj.controller.admin.product;
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.product.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.product.ProductDO;
import com.yunxi.scm.module.xxjj.convert.product.ProductConvert;
import com.yunxi.scm.module.xxjj.service.product.ProductService;
@Tag(name = "管理后台 - 商品")
@RestController
@RequestMapping("/xxjj/product")
@Validated
public class ProductController {
@Resource
private ProductService productService;
@PostMapping("/create")
@Operation(summary = "创建商品")
@PreAuthorize("@ss.hasPermission('xxjj:product:create')")
public CommonResult<Long> createProduct(@Valid @RequestBody ProductCreateReqVO createReqVO) {
return success(productService.createProduct(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新商品")
@PreAuthorize("@ss.hasPermission('xxjj:product:update')")
public CommonResult<Boolean> updateProduct(@Valid @RequestBody ProductUpdateReqVO updateReqVO) {
productService.updateProduct(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除商品")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('xxjj:product:delete')")
public CommonResult<Boolean> deleteProduct(@RequestParam("id") Long id) {
productService.deleteProduct(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得商品")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('xxjj:product:query')")
public CommonResult<ProductRespVO> getProduct(@RequestParam("id") Long id) {
ProductDO product = productService.getProduct(id);
return success(ProductConvert.INSTANCE.convert(product));
}
@GetMapping("/list")
@Operation(summary = "获得商品列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
@PreAuthorize("@ss.hasPermission('xxjj:product:query')")
public CommonResult<List<ProductRespVO>> getProductList(@RequestParam("ids") Collection<Long> ids) {
List<ProductDO> list = productService.getProductList(ids);
return success(ProductConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@Operation(summary = "获得商品分页")
@PreAuthorize("@ss.hasPermission('xxjj:product:query')")
public CommonResult<PageResult<ProductRespVO>> getProductPage(@Valid ProductPageReqVO pageVO) {
PageResult<ProductDO> pageResult = productService.getProductPage(pageVO);
return success(ProductConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@Operation(summary = "导出商品 Excel")
@PreAuthorize("@ss.hasPermission('xxjj:product:export')")
@OperateLog(type = EXPORT)
public void exportProductExcel(@Valid ProductExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<ProductDO> list = productService.getProductList(exportReqVO);
// 导出 Excel
List<ProductExcelVO> datas = ProductConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "商品.xls", "数据", ProductExcelVO.class, datas);
}
}

@ -0,0 +1,290 @@
package com.yunxi.scm.module.xxjj.controller.admin.product.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 java.time.LocalDateTime;
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 ProductBaseVO {
@Schema(description = "商品图片")
private String photo;
@Schema(description = "商品编码")
private String code;
@Schema(description = "商品名称", example = "芋艿")
private String name;
@Schema(description = "商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)不能为空")
private String productStatus;
@Schema(description = "商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)", example = "2")
private String productType;
@Schema(description = "商品简称", example = "王五")
private String shortName;
@Schema(description = "商品条码")
private String barCode;
@Schema(description = "箱面号")
private String boxSurfaceNum;
@Schema(description = "商品规格")
private String spec;
@Schema(description = "存货类型(1:原材料 2:半成品 3:产成品)", example = "2")
private String inventoryType;
@Schema(description = "品牌id", example = "18685")
private Long brandId;
@Schema(description = "地区")
private String area;
@Schema(description = "关联商品分类id", example = "2990")
private String productTypeId;
@Schema(description = "商品类目")
private String areaCategory;
@Schema(description = "危险品(0:否 1:是)")
private String dangerousFlag;
@Schema(description = "进口商品(0:否 1:是)")
private String importedFlag;
@Schema(description = "关联一级供应商id", example = "25211")
private Long firstSupplierId;
@Schema(description = "结算主体")
private String settlementEntity;
@Schema(description = "销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String outputTaxRate;
@Schema(description = "进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String inputTaxRate;
@Schema(description = "配送方式(1:仓配 2:直送 3:直达)", example = "1")
private String deliveryType;
@Schema(description = "开启多单位(0:否 1:是)")
private String manyUnitFlag;
@Schema(description = "库存单位", example = "7634")
private Long inventoryUnitId;
@Schema(description = "订货主单位", example = "31591")
private Long orderMainUnitId;
@Schema(description = "其他订货单位", example = "8935")
private String orderOtherUnitId;
@Schema(description = "销售主单位", example = "25267")
private Long salesMainUnitId;
@Schema(description = "其他销售单位", example = "27531")
private String salesOtherUnitId;
@Schema(description = "操作单位", example = "16932")
private Long operateUnitId;
@Schema(description = "计价单位", example = "30762")
private Long pricingUnitId;
@Schema(description = "采购订货量下限")
private String purchaseOrderQuantityDown;
@Schema(description = "采购订货量上限")
private String purchaseOrderQuantityUpper;
@Schema(description = "采购订货倍数")
private String purchaseOrderMultiple;
@Schema(description = "采购起订金额")
private String purchaseInitialAmount;
@Schema(description = "允许超收比例")
private String purchaseAllowOverchargingRatio;
@Schema(description = "采购订货时间开始")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime purchaseOrderStart;
@Schema(description = "采购订货时间结束")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime purchaseOrderEnd;
@Schema(description = "采购模式(1:以采定销 2:以销定采)")
private String purchaseMode;
@Schema(description = "销售订货量下限")
private String salesOrderQuantityDown;
@Schema(description = "销售订货量上限")
private String salesOrderQuantityUpper;
@Schema(description = "销售订货倍数")
private String salesOrderMultiple;
@Schema(description = "销售起订金额")
private String salesInitialAmount;
@Schema(description = "允许超收比例")
private String salesAllowOverchargingRatio;
@Schema(description = "销售时间开始")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime salesStart;
@Schema(description = "销售时间结束")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime salesEnd;
@Schema(description = "开售模式(1:立即开售 2:定时开售)")
private String salesModeStart;
@Schema(description = "售卖方式(1:现货 2:预售)")
private String salesMode;
@Schema(description = "送货时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime deliverGoodsDate;
@Schema(description = "下单成功后几天后送货")
private String delayNum;
@Schema(description = "安全库存")
private String safetyStock;
@Schema(description = "库存天数下限")
private String inventoryDayDown;
@Schema(description = "库存天数上限")
private String inventoryDayUpper;
@Schema(description = "库存下限")
private String inventoryDown;
@Schema(description = "库存上限")
private String inventoryUpper;
@Schema(description = "固定补货数量")
private String fixedReplenishmentQuantity;
@Schema(description = "可售库存")
private String availableInventory;
@Schema(description = "使用在途库存(0:不使用 1:使用)")
private String transitInventory;
@Schema(description = "管理库存(0:关闭 1:开启)")
private String manageInventory;
@Schema(description = "追溯(0:关闭 1:开启)")
private String fromInventory;
@Schema(description = "批次管理(0:关闭 1:开启)")
private String manageBatches;
@Schema(description = "层数/板(运输)")
private String transportStoreyBoardNum;
@Schema(description = "箱数/层(运输)")
private String transportBoxStoreyNum;
@Schema(description = "箱数/板(运输)")
private String transportBoxBoardNum;
@Schema(description = "温层(运输)(1:常温 2:恒温 3:冷藏 4:冷冻)")
private String transportTemperature;
@Schema(description = "运输温度下限")
private String transportTemperatureDown;
@Schema(description = "运输温度上限")
private String transportTemperatureUpper;
@Schema(description = "层数/板(存储)")
private String storageStoreyBoardNum;
@Schema(description = "层数/板(存储)")
private String storageBoxStoreyNum;
@Schema(description = "层数/板(存储)")
private String storageBoxBoardNum;
@Schema(description = "温层(存储)(1:常温 2:恒温 3:冷藏 4:冷冻)")
private String storageTemperature;
@Schema(description = "存储温度下限")
private String storageTemperatureDown;
@Schema(description = "存储温度上限")
private String storageTemperatureUpper;
@Schema(description = "质检比例")
private String qualityInspectionRatio;
@Schema(description = "质检频次")
private String qualityInspectionFrequency;
@Schema(description = "质检报告")
private String qualityInspectionReport;
@Schema(description = "质检报告有效期开始")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime qualityInspectionReportStart;
@Schema(description = "质检报告有效期结束")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime qualityInspectionReportEnd;
@Schema(description = "质量控制(0:关闭 1:开启)")
private String qualityControl;
@Schema(description = "质检标准")
private String qualityInspectionStandards;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "预留字段1")
private String reservedFields1;
@Schema(description = "预留字段2")
private String reservedFields2;
@Schema(description = "预留字段3")
private String reservedFields3;
@Schema(description = "预留字段4")
private String reservedFields4;
@Schema(description = "预留字段5")
private String reservedFields5;
@Schema(description = "预留字段6")
private String reservedFields6;
}

@ -0,0 +1,14 @@
package com.yunxi.scm.module.xxjj.controller.admin.product.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 ProductCreateReqVO extends ProductBaseVO {
}

@ -0,0 +1,306 @@
package com.yunxi.scm.module.xxjj.controller.admin.product.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 java.time.LocalDateTime;
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 ProductExcelVO {
@ExcelProperty("编号")
private Long id;
@ExcelProperty("商品图片")
private String photo;
@ExcelProperty("商品编码")
private String code;
@ExcelProperty("商品名称")
private String name;
@ExcelProperty(value = "商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)", converter = DictConvert.class)
@DictFormat("product_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String productStatus;
@ExcelProperty(value = "商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)", converter = DictConvert.class)
@DictFormat("product_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String productType;
@ExcelProperty("商品简称")
private String shortName;
@ExcelProperty("商品条码")
private String barCode;
@ExcelProperty("箱面号")
private String boxSurfaceNum;
@ExcelProperty("商品规格")
private String spec;
@ExcelProperty(value = "存货类型(1:原材料 2:半成品 3:产成品)", converter = DictConvert.class)
@DictFormat("save_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String inventoryType;
@ExcelProperty("品牌id")
private Long brandId;
@ExcelProperty("地区")
private String area;
@ExcelProperty("关联商品分类id")
private String productTypeId;
@ExcelProperty("商品类目")
private String areaCategory;
@ExcelProperty(value = "危险品(0:否 1:是)", converter = DictConvert.class)
@DictFormat("dangerous_flag") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String dangerousFlag;
@ExcelProperty(value = "进口商品(0:否 1:是)", converter = DictConvert.class)
@DictFormat("imported_flag") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String importedFlag;
@ExcelProperty("关联一级供应商id")
private Long firstSupplierId;
@ExcelProperty("结算主体")
private String settlementEntity;
@ExcelProperty("销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String outputTaxRate;
@ExcelProperty("进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String inputTaxRate;
@ExcelProperty("配送方式(1:仓配 2:直送 3:直达)")
private String deliveryType;
@ExcelProperty(value = "开启多单位(0:否 1:是)", converter = DictConvert.class)
@DictFormat("many_unit_flag") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String manyUnitFlag;
@ExcelProperty("库存单位")
private Long inventoryUnitId;
@ExcelProperty("订货主单位")
private Long orderMainUnitId;
@ExcelProperty("其他订货单位")
private String orderOtherUnitId;
@ExcelProperty("销售主单位")
private Long salesMainUnitId;
@ExcelProperty("其他销售单位")
private String salesOtherUnitId;
@ExcelProperty("操作单位")
private Long operateUnitId;
@ExcelProperty("计价单位")
private Long pricingUnitId;
@ExcelProperty("采购订货量下限")
private String purchaseOrderQuantityDown;
@ExcelProperty("采购订货量上限")
private String purchaseOrderQuantityUpper;
@ExcelProperty("采购订货倍数")
private String purchaseOrderMultiple;
@ExcelProperty("采购起订金额")
private String purchaseInitialAmount;
@ExcelProperty("允许超收比例")
private String purchaseAllowOverchargingRatio;
@ExcelProperty("采购订货时间开始")
private LocalDateTime purchaseOrderStart;
@ExcelProperty("采购订货时间结束")
private LocalDateTime purchaseOrderEnd;
@ExcelProperty(value = "采购模式(1:以采定销 2:以销定采)", converter = DictConvert.class)
@DictFormat("purchase_way") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String purchaseMode;
@ExcelProperty("销售订货量下限")
private String salesOrderQuantityDown;
@ExcelProperty("销售订货量上限")
private String salesOrderQuantityUpper;
@ExcelProperty("销售订货倍数")
private String salesOrderMultiple;
@ExcelProperty("销售起订金额")
private String salesInitialAmount;
@ExcelProperty("允许超收比例")
private String salesAllowOverchargingRatio;
@ExcelProperty("销售时间开始")
private LocalDateTime salesStart;
@ExcelProperty("销售时间结束")
private LocalDateTime salesEnd;
@ExcelProperty(value = "开售模式(1:立即开售 2:定时开售)", converter = DictConvert.class)
@DictFormat("sales_mode_start") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String salesModeStart;
@ExcelProperty(value = "售卖方式(1:现货 2:预售)", converter = DictConvert.class)
@DictFormat("sales_mode") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String salesMode;
@ExcelProperty("送货时间")
private LocalDateTime deliverGoodsDate;
@ExcelProperty("下单成功后几天后送货")
private String delayNum;
@ExcelProperty("安全库存")
private String safetyStock;
@ExcelProperty("库存天数下限")
private String inventoryDayDown;
@ExcelProperty("库存天数上限")
private String inventoryDayUpper;
@ExcelProperty("库存下限")
private String inventoryDown;
@ExcelProperty("库存上限")
private String inventoryUpper;
@ExcelProperty("固定补货数量")
private String fixedReplenishmentQuantity;
@ExcelProperty("可售库存")
private String availableInventory;
@ExcelProperty(value = "使用在途库存(0:不使用 1:使用)", converter = DictConvert.class)
@DictFormat("transit_inventory") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String transitInventory;
@ExcelProperty(value = "管理库存(0:关闭 1:开启)", converter = DictConvert.class)
@DictFormat("manage_inventory") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String manageInventory;
@ExcelProperty(value = "追溯(0:关闭 1:开启)", converter = DictConvert.class)
@DictFormat("manage_inventory") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String fromInventory;
@ExcelProperty(value = "批次管理(0:关闭 1:开启)", converter = DictConvert.class)
@DictFormat("manage_inventory") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String manageBatches;
@ExcelProperty("层数/板(运输)")
private String transportStoreyBoardNum;
@ExcelProperty("箱数/层(运输)")
private String transportBoxStoreyNum;
@ExcelProperty("箱数/板(运输)")
private String transportBoxBoardNum;
@ExcelProperty(value = "温层(运输)(1:常温 2:恒温 3:冷藏 4:冷冻)", converter = DictConvert.class)
@DictFormat("transport_temperature") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String transportTemperature;
@ExcelProperty("运输温度下限")
private String transportTemperatureDown;
@ExcelProperty("运输温度上限")
private String transportTemperatureUpper;
@ExcelProperty("层数/板(存储)")
private String storageStoreyBoardNum;
@ExcelProperty("层数/板(存储)")
private String storageBoxStoreyNum;
@ExcelProperty("层数/板(存储)")
private String storageBoxBoardNum;
@ExcelProperty(value = "温层(存储)(1:常温 2:恒温 3:冷藏 4:冷冻)", converter = DictConvert.class)
@DictFormat("transport_temperature") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String storageTemperature;
@ExcelProperty("存储温度下限")
private String storageTemperatureDown;
@ExcelProperty("存储温度上限")
private String storageTemperatureUpper;
@ExcelProperty("质检比例")
private String qualityInspectionRatio;
@ExcelProperty("质检频次")
private String qualityInspectionFrequency;
@ExcelProperty("质检报告")
private String qualityInspectionReport;
@ExcelProperty("质检报告有效期开始")
private LocalDateTime qualityInspectionReportStart;
@ExcelProperty("质检报告有效期结束")
private LocalDateTime qualityInspectionReportEnd;
@ExcelProperty(value = "质量控制(0:关闭 1:开启)", converter = DictConvert.class)
@DictFormat("manage_inventory") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String qualityControl;
@ExcelProperty("质检标准")
private String qualityInspectionStandards;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("预留字段1")
private String reservedFields1;
@ExcelProperty("预留字段2")
private String reservedFields2;
@ExcelProperty("预留字段3")
private String reservedFields3;
@ExcelProperty("预留字段4")
private String reservedFields4;
@ExcelProperty("预留字段5")
private String reservedFields5;
@ExcelProperty("预留字段6")
private String reservedFields6;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,276 @@
package com.yunxi.scm.module.xxjj.controller.admin.product.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参数和 ProductPageReqVO 是一致的")
@Data
public class ProductExportReqVO {
@Schema(description = "商品图片")
private String photo;
@Schema(description = "商品编码")
private String code;
@Schema(description = "商品名称", example = "芋艿")
private String name;
@Schema(description = "商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)", example = "1")
private String productStatus;
@Schema(description = "商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)", example = "2")
private String productType;
@Schema(description = "商品简称", example = "王五")
private String shortName;
@Schema(description = "商品条码")
private String barCode;
@Schema(description = "箱面号")
private String boxSurfaceNum;
@Schema(description = "商品规格")
private String spec;
@Schema(description = "存货类型(1:原材料 2:半成品 3:产成品)", example = "2")
private String inventoryType;
@Schema(description = "品牌id", example = "18685")
private Long brandId;
@Schema(description = "地区")
private String area;
@Schema(description = "关联商品分类id", example = "2990")
private String productTypeId;
@Schema(description = "商品类目")
private String areaCategory;
@Schema(description = "危险品(0:否 1:是)")
private String dangerousFlag;
@Schema(description = "进口商品(0:否 1:是)")
private String importedFlag;
@Schema(description = "关联一级供应商id", example = "25211")
private Long firstSupplierId;
@Schema(description = "结算主体")
private String settlementEntity;
@Schema(description = "销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String outputTaxRate;
@Schema(description = "进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String inputTaxRate;
@Schema(description = "配送方式(1:仓配 2:直送 3:直达)", example = "1")
private String deliveryType;
@Schema(description = "开启多单位(0:否 1:是)")
private String manyUnitFlag;
@Schema(description = "库存单位", example = "7634")
private Long inventoryUnitId;
@Schema(description = "订货主单位", example = "31591")
private Long orderMainUnitId;
@Schema(description = "其他订货单位", example = "8935")
private String orderOtherUnitId;
@Schema(description = "销售主单位", example = "25267")
private Long salesMainUnitId;
@Schema(description = "其他销售单位", example = "27531")
private String salesOtherUnitId;
@Schema(description = "操作单位", example = "16932")
private Long operateUnitId;
@Schema(description = "计价单位", example = "30762")
private Long pricingUnitId;
@Schema(description = "采购订货量下限")
private String purchaseOrderQuantityDown;
@Schema(description = "采购订货量上限")
private String purchaseOrderQuantityUpper;
@Schema(description = "采购订货倍数")
private String purchaseOrderMultiple;
@Schema(description = "采购起订金额")
private String purchaseInitialAmount;
@Schema(description = "允许超收比例")
private String purchaseAllowOverchargingRatio;
@Schema(description = "采购订货时间开始")
private LocalDateTime purchaseOrderStart;
@Schema(description = "采购订货时间结束")
private LocalDateTime purchaseOrderEnd;
@Schema(description = "采购模式(1:以采定销 2:以销定采)")
private String purchaseMode;
@Schema(description = "销售订货量下限")
private String salesOrderQuantityDown;
@Schema(description = "销售订货量上限")
private String salesOrderQuantityUpper;
@Schema(description = "销售订货倍数")
private String salesOrderMultiple;
@Schema(description = "销售起订金额")
private String salesInitialAmount;
@Schema(description = "允许超收比例")
private String salesAllowOverchargingRatio;
@Schema(description = "销售时间开始")
private LocalDateTime salesStart;
@Schema(description = "销售时间结束")
private LocalDateTime salesEnd;
@Schema(description = "开售模式(1:立即开售 2:定时开售)")
private String salesModeStart;
@Schema(description = "售卖方式(1:现货 2:预售)")
private String salesMode;
@Schema(description = "送货时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] deliverGoodsDate;
@Schema(description = "下单成功后几天后送货")
private String delayNum;
@Schema(description = "安全库存")
private String safetyStock;
@Schema(description = "库存天数下限")
private String inventoryDayDown;
@Schema(description = "库存天数上限")
private String inventoryDayUpper;
@Schema(description = "库存下限")
private String inventoryDown;
@Schema(description = "库存上限")
private String inventoryUpper;
@Schema(description = "固定补货数量")
private String fixedReplenishmentQuantity;
@Schema(description = "可售库存")
private String availableInventory;
@Schema(description = "使用在途库存(0:不使用 1:使用)")
private String transitInventory;
@Schema(description = "管理库存(0:关闭 1:开启)")
private String manageInventory;
@Schema(description = "追溯(0:关闭 1:开启)")
private String fromInventory;
@Schema(description = "批次管理(0:关闭 1:开启)")
private String manageBatches;
@Schema(description = "层数/板(运输)")
private String transportStoreyBoardNum;
@Schema(description = "箱数/层(运输)")
private String transportBoxStoreyNum;
@Schema(description = "箱数/板(运输)")
private String transportBoxBoardNum;
@Schema(description = "温层(运输)(1:常温 2:恒温 3:冷藏 4:冷冻)")
private String transportTemperature;
@Schema(description = "运输温度下限")
private String transportTemperatureDown;
@Schema(description = "运输温度上限")
private String transportTemperatureUpper;
@Schema(description = "层数/板(存储)")
private String storageStoreyBoardNum;
@Schema(description = "层数/板(存储)")
private String storageBoxStoreyNum;
@Schema(description = "层数/板(存储)")
private String storageBoxBoardNum;
@Schema(description = "温层(存储)(1:常温 2:恒温 3:冷藏 4:冷冻)")
private String storageTemperature;
@Schema(description = "存储温度下限")
private String storageTemperatureDown;
@Schema(description = "存储温度上限")
private String storageTemperatureUpper;
@Schema(description = "质检比例")
private String qualityInspectionRatio;
@Schema(description = "质检频次")
private String qualityInspectionFrequency;
@Schema(description = "质检报告")
private String qualityInspectionReport;
@Schema(description = "质检报告有效期开始")
private LocalDateTime qualityInspectionReportStart;
@Schema(description = "质检报告有效期结束")
private LocalDateTime qualityInspectionReportEnd;
@Schema(description = "质量控制(0:关闭 1:开启)")
private String qualityControl;
@Schema(description = "质检标准")
private String qualityInspectionStandards;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "预留字段1")
private String reservedFields1;
@Schema(description = "预留字段2")
private String reservedFields2;
@Schema(description = "预留字段3")
private String reservedFields3;
@Schema(description = "预留字段4")
private String reservedFields4;
@Schema(description = "预留字段5")
private String reservedFields5;
@Schema(description = "预留字段6")
private String reservedFields6;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,278 @@
package com.yunxi.scm.module.xxjj.controller.admin.product.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 ProductPageReqVO extends PageParam {
@Schema(description = "商品图片")
private String photo;
@Schema(description = "商品编码")
private String code;
@Schema(description = "商品名称", example = "芋艿")
private String name;
@Schema(description = "商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)", example = "1")
private String productStatus;
@Schema(description = "商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)", example = "2")
private String productType;
@Schema(description = "商品简称", example = "王五")
private String shortName;
@Schema(description = "商品条码")
private String barCode;
@Schema(description = "箱面号")
private String boxSurfaceNum;
@Schema(description = "商品规格")
private String spec;
@Schema(description = "存货类型(1:原材料 2:半成品 3:产成品)", example = "2")
private String inventoryType;
@Schema(description = "品牌id", example = "18685")
private Long brandId;
@Schema(description = "地区")
private String area;
@Schema(description = "关联商品分类id", example = "2990")
private String productTypeId;
@Schema(description = "商品类目")
private String areaCategory;
@Schema(description = "危险品(0:否 1:是)")
private String dangerousFlag;
@Schema(description = "进口商品(0:否 1:是)")
private String importedFlag;
@Schema(description = "关联一级供应商id", example = "25211")
private Long firstSupplierId;
@Schema(description = "结算主体")
private String settlementEntity;
@Schema(description = "销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String outputTaxRate;
@Schema(description = "进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)")
private String inputTaxRate;
@Schema(description = "配送方式(1:仓配 2:直送 3:直达)", example = "1")
private String deliveryType;
@Schema(description = "开启多单位(0:否 1:是)")
private String manyUnitFlag;
@Schema(description = "库存单位", example = "7634")
private Long inventoryUnitId;
@Schema(description = "订货主单位", example = "31591")
private Long orderMainUnitId;
@Schema(description = "其他订货单位", example = "8935")
private String orderOtherUnitId;
@Schema(description = "销售主单位", example = "25267")
private Long salesMainUnitId;
@Schema(description = "其他销售单位", example = "27531")
private String salesOtherUnitId;
@Schema(description = "操作单位", example = "16932")
private Long operateUnitId;
@Schema(description = "计价单位", example = "30762")
private Long pricingUnitId;
@Schema(description = "采购订货量下限")
private String purchaseOrderQuantityDown;
@Schema(description = "采购订货量上限")
private String purchaseOrderQuantityUpper;
@Schema(description = "采购订货倍数")
private String purchaseOrderMultiple;
@Schema(description = "采购起订金额")
private String purchaseInitialAmount;
@Schema(description = "允许超收比例")
private String purchaseAllowOverchargingRatio;
@Schema(description = "采购订货时间开始")
private LocalDateTime purchaseOrderStart;
@Schema(description = "采购订货时间结束")
private LocalDateTime purchaseOrderEnd;
@Schema(description = "采购模式(1:以采定销 2:以销定采)")
private String purchaseMode;
@Schema(description = "销售订货量下限")
private String salesOrderQuantityDown;
@Schema(description = "销售订货量上限")
private String salesOrderQuantityUpper;
@Schema(description = "销售订货倍数")
private String salesOrderMultiple;
@Schema(description = "销售起订金额")
private String salesInitialAmount;
@Schema(description = "允许超收比例")
private String salesAllowOverchargingRatio;
@Schema(description = "销售时间开始")
private LocalDateTime salesStart;
@Schema(description = "销售时间结束")
private LocalDateTime salesEnd;
@Schema(description = "开售模式(1:立即开售 2:定时开售)")
private String salesModeStart;
@Schema(description = "售卖方式(1:现货 2:预售)")
private String salesMode;
@Schema(description = "送货时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] deliverGoodsDate;
@Schema(description = "下单成功后几天后送货")
private String delayNum;
@Schema(description = "安全库存")
private String safetyStock;
@Schema(description = "库存天数下限")
private String inventoryDayDown;
@Schema(description = "库存天数上限")
private String inventoryDayUpper;
@Schema(description = "库存下限")
private String inventoryDown;
@Schema(description = "库存上限")
private String inventoryUpper;
@Schema(description = "固定补货数量")
private String fixedReplenishmentQuantity;
@Schema(description = "可售库存")
private String availableInventory;
@Schema(description = "使用在途库存(0:不使用 1:使用)")
private String transitInventory;
@Schema(description = "管理库存(0:关闭 1:开启)")
private String manageInventory;
@Schema(description = "追溯(0:关闭 1:开启)")
private String fromInventory;
@Schema(description = "批次管理(0:关闭 1:开启)")
private String manageBatches;
@Schema(description = "层数/板(运输)")
private String transportStoreyBoardNum;
@Schema(description = "箱数/层(运输)")
private String transportBoxStoreyNum;
@Schema(description = "箱数/板(运输)")
private String transportBoxBoardNum;
@Schema(description = "温层(运输)(1:常温 2:恒温 3:冷藏 4:冷冻)")
private String transportTemperature;
@Schema(description = "运输温度下限")
private String transportTemperatureDown;
@Schema(description = "运输温度上限")
private String transportTemperatureUpper;
@Schema(description = "层数/板(存储)")
private String storageStoreyBoardNum;
@Schema(description = "层数/板(存储)")
private String storageBoxStoreyNum;
@Schema(description = "层数/板(存储)")
private String storageBoxBoardNum;
@Schema(description = "温层(存储)(1:常温 2:恒温 3:冷藏 4:冷冻)")
private String storageTemperature;
@Schema(description = "存储温度下限")
private String storageTemperatureDown;
@Schema(description = "存储温度上限")
private String storageTemperatureUpper;
@Schema(description = "质检比例")
private String qualityInspectionRatio;
@Schema(description = "质检频次")
private String qualityInspectionFrequency;
@Schema(description = "质检报告")
private String qualityInspectionReport;
@Schema(description = "质检报告有效期开始")
private LocalDateTime qualityInspectionReportStart;
@Schema(description = "质检报告有效期结束")
private LocalDateTime qualityInspectionReportEnd;
@Schema(description = "质量控制(0:关闭 1:开启)")
private String qualityControl;
@Schema(description = "质检标准")
private String qualityInspectionStandards;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "预留字段1")
private String reservedFields1;
@Schema(description = "预留字段2")
private String reservedFields2;
@Schema(description = "预留字段3")
private String reservedFields3;
@Schema(description = "预留字段4")
private String reservedFields4;
@Schema(description = "预留字段5")
private String reservedFields5;
@Schema(description = "预留字段6")
private String reservedFields6;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,19 @@
package com.yunxi.scm.module.xxjj.controller.admin.product.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 ProductRespVO extends ProductBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25337")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

@ -0,0 +1,18 @@
package com.yunxi.scm.module.xxjj.controller.admin.product.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 ProductUpdateReqVO extends ProductBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25337")
@NotNull(message = "编号不能为空")
private Long id;
}

@ -0,0 +1,34 @@
package com.yunxi.scm.module.xxjj.convert.product;
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.product.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.product.ProductDO;
/**
* Convert
*
* @author
*/
@Mapper
public interface ProductConvert {
ProductConvert INSTANCE = Mappers.getMapper(ProductConvert.class);
ProductDO convert(ProductCreateReqVO bean);
ProductDO convert(ProductUpdateReqVO bean);
ProductRespVO convert(ProductDO bean);
List<ProductRespVO> convertList(List<ProductDO> list);
PageResult<ProductRespVO> convertPage(PageResult<ProductDO> page);
List<ProductExcelVO> convertList02(List<ProductDO> list);
}

@ -0,0 +1,410 @@
package com.yunxi.scm.module.xxjj.dal.dataobject.product;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
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_product")
@KeySequence("xxjj_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private String photo;
/**
*
*/
private String code;
/**
*
*/
private String name;
/**
* (0 1 2 3 4)
*
* {@link TODO product_status }
*/
private String productStatus;
/**
* (1: 2: 3: 4:/ 5:/)
*
* {@link TODO product_type }
*/
private String productType;
/**
*
*/
private String shortName;
/**
*
*/
private String barCode;
/**
*
*/
private String boxSurfaceNum;
/**
*
*/
private String spec;
/**
* (1: 2: 3:)
*
* {@link TODO save_type }
*/
private String inventoryType;
/**
* id
*/
private Long brandId;
/**
*
*/
private String area;
/**
* id
*/
private String productTypeId;
/**
*
*/
private String areaCategory;
/**
* (0: 1:)
*
* {@link TODO dangerous_flag }
*/
private String dangerousFlag;
/**
* (0: 1:)
*
* {@link TODO imported_flag }
*/
private String importedFlag;
/**
* id
*/
private Long firstSupplierId;
/**
*
*/
private String settlementEntity;
/**
* (1:0% 2:1% 3:2% 4:3% 5:4%)
*/
private String outputTaxRate;
/**
* (1:0% 2:1% 3:2% 4:3% 5:4%)
*/
private String inputTaxRate;
/**
* (1: 2: 3:)
*/
private String deliveryType;
/**
* (0: 1:)
*
* {@link TODO many_unit_flag }
*/
private String manyUnitFlag;
/**
*
*/
private Long inventoryUnitId;
/**
*
*/
private Long orderMainUnitId;
/**
*
*/
private String orderOtherUnitId;
/**
*
*/
private Long salesMainUnitId;
/**
*
*/
private String salesOtherUnitId;
/**
*
*/
private Long operateUnitId;
/**
*
*/
private Long pricingUnitId;
/**
*
*/
private String purchaseOrderQuantityDown;
/**
*
*/
private String purchaseOrderQuantityUpper;
/**
*
*/
private String purchaseOrderMultiple;
/**
*
*/
private String purchaseInitialAmount;
/**
*
*/
private String purchaseAllowOverchargingRatio;
/**
*
*/
private LocalDateTime purchaseOrderStart;
/**
*
*/
private LocalDateTime purchaseOrderEnd;
/**
* (1: 2:)
*
* {@link TODO purchase_way }
*/
private String purchaseMode;
/**
*
*/
private String salesOrderQuantityDown;
/**
*
*/
private String salesOrderQuantityUpper;
/**
*
*/
private String salesOrderMultiple;
/**
*
*/
private String salesInitialAmount;
/**
*
*/
private String salesAllowOverchargingRatio;
/**
*
*/
private LocalDateTime salesStart;
/**
*
*/
private LocalDateTime salesEnd;
/**
* (1: 2:)
*
* {@link TODO sales_mode_start }
*/
private String salesModeStart;
/**
* (1: 2:)
*
* {@link TODO sales_mode }
*/
private String salesMode;
/**
*
*/
private LocalDateTime deliverGoodsDate;
/**
*
*/
private String delayNum;
/**
*
*/
private String safetyStock;
/**
*
*/
private String inventoryDayDown;
/**
*
*/
private String inventoryDayUpper;
/**
*
*/
private String inventoryDown;
/**
*
*/
private String inventoryUpper;
/**
*
*/
private String fixedReplenishmentQuantity;
/**
*
*/
private String availableInventory;
/**
* 使(0:使 1:使)
*
* {@link TODO transit_inventory }
*/
private String transitInventory;
/**
* (0: 1:)
*
* {@link TODO manage_inventory }
*/
private String manageInventory;
/**
* (0: 1:)
*
* {@link TODO manage_inventory }
*/
private String fromInventory;
/**
* (0: 1:)
*
* {@link TODO manage_inventory }
*/
private String manageBatches;
/**
* /
*/
private String transportStoreyBoardNum;
/**
* /
*/
private String transportBoxStoreyNum;
/**
* /
*/
private String transportBoxBoardNum;
/**
* (1: 2: 3: 4:)
*
* {@link TODO transport_temperature }
*/
private String transportTemperature;
/**
*
*/
private String transportTemperatureDown;
/**
*
*/
private String transportTemperatureUpper;
/**
* /
*/
private String storageStoreyBoardNum;
/**
* /
*/
private String storageBoxStoreyNum;
/**
* /
*/
private String storageBoxBoardNum;
/**
* (1: 2: 3: 4:)
*
* {@link TODO transport_temperature }
*/
private String storageTemperature;
/**
*
*/
private String storageTemperatureDown;
/**
*
*/
private String storageTemperatureUpper;
/**
*
*/
private String qualityInspectionRatio;
/**
*
*/
private String qualityInspectionFrequency;
/**
*
*/
private String qualityInspectionReport;
/**
*
*/
private LocalDateTime qualityInspectionReportStart;
/**
*
*/
private LocalDateTime qualityInspectionReportEnd;
/**
* (0: 1:)
*
* {@link TODO manage_inventory }
*/
private String qualityControl;
/**
*
*/
private String qualityInspectionStandards;
/**
*
*/
private String remark;
/**
* 1
*/
private String reservedFields1;
/**
* 2
*/
private String reservedFields2;
/**
* 3
*/
private String reservedFields3;
/**
* 4
*/
private String reservedFields4;
/**
* 5
*/
private String reservedFields5;
/**
* 6
*/
private String reservedFields6;
}

@ -0,0 +1,202 @@
package com.yunxi.scm.module.xxjj.dal.mysql.product;
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.product.ProductDO;
import org.apache.ibatis.annotations.Mapper;
import com.yunxi.scm.module.xxjj.controller.admin.product.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface ProductMapper extends BaseMapperX<ProductDO> {
default PageResult<ProductDO> selectPage(ProductPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProductDO>()
.eqIfPresent(ProductDO::getPhoto, reqVO.getPhoto())
.eqIfPresent(ProductDO::getCode, reqVO.getCode())
.likeIfPresent(ProductDO::getName, reqVO.getName())
.eqIfPresent(ProductDO::getProductStatus, reqVO.getProductStatus())
.eqIfPresent(ProductDO::getProductType, reqVO.getProductType())
.likeIfPresent(ProductDO::getShortName, reqVO.getShortName())
.eqIfPresent(ProductDO::getBarCode, reqVO.getBarCode())
.eqIfPresent(ProductDO::getBoxSurfaceNum, reqVO.getBoxSurfaceNum())
.eqIfPresent(ProductDO::getSpec, reqVO.getSpec())
.eqIfPresent(ProductDO::getInventoryType, reqVO.getInventoryType())
.eqIfPresent(ProductDO::getBrandId, reqVO.getBrandId())
.eqIfPresent(ProductDO::getArea, reqVO.getArea())
.eqIfPresent(ProductDO::getProductTypeId, reqVO.getProductTypeId())
.eqIfPresent(ProductDO::getAreaCategory, reqVO.getAreaCategory())
.eqIfPresent(ProductDO::getDangerousFlag, reqVO.getDangerousFlag())
.eqIfPresent(ProductDO::getImportedFlag, reqVO.getImportedFlag())
.eqIfPresent(ProductDO::getFirstSupplierId, reqVO.getFirstSupplierId())
.eqIfPresent(ProductDO::getSettlementEntity, reqVO.getSettlementEntity())
.eqIfPresent(ProductDO::getOutputTaxRate, reqVO.getOutputTaxRate())
.eqIfPresent(ProductDO::getInputTaxRate, reqVO.getInputTaxRate())
.eqIfPresent(ProductDO::getDeliveryType, reqVO.getDeliveryType())
.eqIfPresent(ProductDO::getManyUnitFlag, reqVO.getManyUnitFlag())
.eqIfPresent(ProductDO::getInventoryUnitId, reqVO.getInventoryUnitId())
.eqIfPresent(ProductDO::getOrderMainUnitId, reqVO.getOrderMainUnitId())
.eqIfPresent(ProductDO::getOrderOtherUnitId, reqVO.getOrderOtherUnitId())
.eqIfPresent(ProductDO::getSalesMainUnitId, reqVO.getSalesMainUnitId())
.eqIfPresent(ProductDO::getSalesOtherUnitId, reqVO.getSalesOtherUnitId())
.eqIfPresent(ProductDO::getOperateUnitId, reqVO.getOperateUnitId())
.eqIfPresent(ProductDO::getPricingUnitId, reqVO.getPricingUnitId())
.eqIfPresent(ProductDO::getPurchaseOrderQuantityDown, reqVO.getPurchaseOrderQuantityDown())
.eqIfPresent(ProductDO::getPurchaseOrderQuantityUpper, reqVO.getPurchaseOrderQuantityUpper())
.eqIfPresent(ProductDO::getPurchaseOrderMultiple, reqVO.getPurchaseOrderMultiple())
.eqIfPresent(ProductDO::getPurchaseInitialAmount, reqVO.getPurchaseInitialAmount())
.eqIfPresent(ProductDO::getPurchaseAllowOverchargingRatio, reqVO.getPurchaseAllowOverchargingRatio())
.eqIfPresent(ProductDO::getPurchaseOrderStart, reqVO.getPurchaseOrderStart())
.eqIfPresent(ProductDO::getPurchaseOrderEnd, reqVO.getPurchaseOrderEnd())
.eqIfPresent(ProductDO::getPurchaseMode, reqVO.getPurchaseMode())
.eqIfPresent(ProductDO::getSalesOrderQuantityDown, reqVO.getSalesOrderQuantityDown())
.eqIfPresent(ProductDO::getSalesOrderQuantityUpper, reqVO.getSalesOrderQuantityUpper())
.eqIfPresent(ProductDO::getSalesOrderMultiple, reqVO.getSalesOrderMultiple())
.eqIfPresent(ProductDO::getSalesInitialAmount, reqVO.getSalesInitialAmount())
.eqIfPresent(ProductDO::getSalesAllowOverchargingRatio, reqVO.getSalesAllowOverchargingRatio())
.eqIfPresent(ProductDO::getSalesStart, reqVO.getSalesStart())
.eqIfPresent(ProductDO::getSalesEnd, reqVO.getSalesEnd())
.eqIfPresent(ProductDO::getSalesModeStart, reqVO.getSalesModeStart())
.eqIfPresent(ProductDO::getSalesMode, reqVO.getSalesMode())
.betweenIfPresent(ProductDO::getDeliverGoodsDate, reqVO.getDeliverGoodsDate())
.eqIfPresent(ProductDO::getDelayNum, reqVO.getDelayNum())
.eqIfPresent(ProductDO::getSafetyStock, reqVO.getSafetyStock())
.eqIfPresent(ProductDO::getInventoryDayDown, reqVO.getInventoryDayDown())
.eqIfPresent(ProductDO::getInventoryDayUpper, reqVO.getInventoryDayUpper())
.eqIfPresent(ProductDO::getInventoryDown, reqVO.getInventoryDown())
.eqIfPresent(ProductDO::getInventoryUpper, reqVO.getInventoryUpper())
.eqIfPresent(ProductDO::getFixedReplenishmentQuantity, reqVO.getFixedReplenishmentQuantity())
.eqIfPresent(ProductDO::getAvailableInventory, reqVO.getAvailableInventory())
.eqIfPresent(ProductDO::getTransitInventory, reqVO.getTransitInventory())
.eqIfPresent(ProductDO::getManageInventory, reqVO.getManageInventory())
.eqIfPresent(ProductDO::getFromInventory, reqVO.getFromInventory())
.eqIfPresent(ProductDO::getManageBatches, reqVO.getManageBatches())
.eqIfPresent(ProductDO::getTransportStoreyBoardNum, reqVO.getTransportStoreyBoardNum())
.eqIfPresent(ProductDO::getTransportBoxStoreyNum, reqVO.getTransportBoxStoreyNum())
.eqIfPresent(ProductDO::getTransportBoxBoardNum, reqVO.getTransportBoxBoardNum())
.eqIfPresent(ProductDO::getTransportTemperature, reqVO.getTransportTemperature())
.eqIfPresent(ProductDO::getTransportTemperatureDown, reqVO.getTransportTemperatureDown())
.eqIfPresent(ProductDO::getTransportTemperatureUpper, reqVO.getTransportTemperatureUpper())
.eqIfPresent(ProductDO::getStorageStoreyBoardNum, reqVO.getStorageStoreyBoardNum())
.eqIfPresent(ProductDO::getStorageBoxStoreyNum, reqVO.getStorageBoxStoreyNum())
.eqIfPresent(ProductDO::getStorageBoxBoardNum, reqVO.getStorageBoxBoardNum())
.eqIfPresent(ProductDO::getStorageTemperature, reqVO.getStorageTemperature())
.eqIfPresent(ProductDO::getStorageTemperatureDown, reqVO.getStorageTemperatureDown())
.eqIfPresent(ProductDO::getStorageTemperatureUpper, reqVO.getStorageTemperatureUpper())
.eqIfPresent(ProductDO::getQualityInspectionRatio, reqVO.getQualityInspectionRatio())
.eqIfPresent(ProductDO::getQualityInspectionFrequency, reqVO.getQualityInspectionFrequency())
.eqIfPresent(ProductDO::getQualityInspectionReport, reqVO.getQualityInspectionReport())
.eqIfPresent(ProductDO::getQualityInspectionReportStart, reqVO.getQualityInspectionReportStart())
.eqIfPresent(ProductDO::getQualityInspectionReportEnd, reqVO.getQualityInspectionReportEnd())
.eqIfPresent(ProductDO::getQualityControl, reqVO.getQualityControl())
.eqIfPresent(ProductDO::getQualityInspectionStandards, reqVO.getQualityInspectionStandards())
.eqIfPresent(ProductDO::getRemark, reqVO.getRemark())
.eqIfPresent(ProductDO::getReservedFields1, reqVO.getReservedFields1())
.eqIfPresent(ProductDO::getReservedFields2, reqVO.getReservedFields2())
.eqIfPresent(ProductDO::getReservedFields3, reqVO.getReservedFields3())
.eqIfPresent(ProductDO::getReservedFields4, reqVO.getReservedFields4())
.eqIfPresent(ProductDO::getReservedFields5, reqVO.getReservedFields5())
.eqIfPresent(ProductDO::getReservedFields6, reqVO.getReservedFields6())
.betweenIfPresent(ProductDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ProductDO::getId));
}
default List<ProductDO> selectList(ProductExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<ProductDO>()
.eqIfPresent(ProductDO::getPhoto, reqVO.getPhoto())
.eqIfPresent(ProductDO::getCode, reqVO.getCode())
.likeIfPresent(ProductDO::getName, reqVO.getName())
.eqIfPresent(ProductDO::getProductStatus, reqVO.getProductStatus())
.eqIfPresent(ProductDO::getProductType, reqVO.getProductType())
.likeIfPresent(ProductDO::getShortName, reqVO.getShortName())
.eqIfPresent(ProductDO::getBarCode, reqVO.getBarCode())
.eqIfPresent(ProductDO::getBoxSurfaceNum, reqVO.getBoxSurfaceNum())
.eqIfPresent(ProductDO::getSpec, reqVO.getSpec())
.eqIfPresent(ProductDO::getInventoryType, reqVO.getInventoryType())
.eqIfPresent(ProductDO::getBrandId, reqVO.getBrandId())
.eqIfPresent(ProductDO::getArea, reqVO.getArea())
.eqIfPresent(ProductDO::getProductTypeId, reqVO.getProductTypeId())
.eqIfPresent(ProductDO::getAreaCategory, reqVO.getAreaCategory())
.eqIfPresent(ProductDO::getDangerousFlag, reqVO.getDangerousFlag())
.eqIfPresent(ProductDO::getImportedFlag, reqVO.getImportedFlag())
.eqIfPresent(ProductDO::getFirstSupplierId, reqVO.getFirstSupplierId())
.eqIfPresent(ProductDO::getSettlementEntity, reqVO.getSettlementEntity())
.eqIfPresent(ProductDO::getOutputTaxRate, reqVO.getOutputTaxRate())
.eqIfPresent(ProductDO::getInputTaxRate, reqVO.getInputTaxRate())
.eqIfPresent(ProductDO::getDeliveryType, reqVO.getDeliveryType())
.eqIfPresent(ProductDO::getManyUnitFlag, reqVO.getManyUnitFlag())
.eqIfPresent(ProductDO::getInventoryUnitId, reqVO.getInventoryUnitId())
.eqIfPresent(ProductDO::getOrderMainUnitId, reqVO.getOrderMainUnitId())
.eqIfPresent(ProductDO::getOrderOtherUnitId, reqVO.getOrderOtherUnitId())
.eqIfPresent(ProductDO::getSalesMainUnitId, reqVO.getSalesMainUnitId())
.eqIfPresent(ProductDO::getSalesOtherUnitId, reqVO.getSalesOtherUnitId())
.eqIfPresent(ProductDO::getOperateUnitId, reqVO.getOperateUnitId())
.eqIfPresent(ProductDO::getPricingUnitId, reqVO.getPricingUnitId())
.eqIfPresent(ProductDO::getPurchaseOrderQuantityDown, reqVO.getPurchaseOrderQuantityDown())
.eqIfPresent(ProductDO::getPurchaseOrderQuantityUpper, reqVO.getPurchaseOrderQuantityUpper())
.eqIfPresent(ProductDO::getPurchaseOrderMultiple, reqVO.getPurchaseOrderMultiple())
.eqIfPresent(ProductDO::getPurchaseInitialAmount, reqVO.getPurchaseInitialAmount())
.eqIfPresent(ProductDO::getPurchaseAllowOverchargingRatio, reqVO.getPurchaseAllowOverchargingRatio())
.eqIfPresent(ProductDO::getPurchaseOrderStart, reqVO.getPurchaseOrderStart())
.eqIfPresent(ProductDO::getPurchaseOrderEnd, reqVO.getPurchaseOrderEnd())
.eqIfPresent(ProductDO::getPurchaseMode, reqVO.getPurchaseMode())
.eqIfPresent(ProductDO::getSalesOrderQuantityDown, reqVO.getSalesOrderQuantityDown())
.eqIfPresent(ProductDO::getSalesOrderQuantityUpper, reqVO.getSalesOrderQuantityUpper())
.eqIfPresent(ProductDO::getSalesOrderMultiple, reqVO.getSalesOrderMultiple())
.eqIfPresent(ProductDO::getSalesInitialAmount, reqVO.getSalesInitialAmount())
.eqIfPresent(ProductDO::getSalesAllowOverchargingRatio, reqVO.getSalesAllowOverchargingRatio())
.eqIfPresent(ProductDO::getSalesStart, reqVO.getSalesStart())
.eqIfPresent(ProductDO::getSalesEnd, reqVO.getSalesEnd())
.eqIfPresent(ProductDO::getSalesModeStart, reqVO.getSalesModeStart())
.eqIfPresent(ProductDO::getSalesMode, reqVO.getSalesMode())
.betweenIfPresent(ProductDO::getDeliverGoodsDate, reqVO.getDeliverGoodsDate())
.eqIfPresent(ProductDO::getDelayNum, reqVO.getDelayNum())
.eqIfPresent(ProductDO::getSafetyStock, reqVO.getSafetyStock())
.eqIfPresent(ProductDO::getInventoryDayDown, reqVO.getInventoryDayDown())
.eqIfPresent(ProductDO::getInventoryDayUpper, reqVO.getInventoryDayUpper())
.eqIfPresent(ProductDO::getInventoryDown, reqVO.getInventoryDown())
.eqIfPresent(ProductDO::getInventoryUpper, reqVO.getInventoryUpper())
.eqIfPresent(ProductDO::getFixedReplenishmentQuantity, reqVO.getFixedReplenishmentQuantity())
.eqIfPresent(ProductDO::getAvailableInventory, reqVO.getAvailableInventory())
.eqIfPresent(ProductDO::getTransitInventory, reqVO.getTransitInventory())
.eqIfPresent(ProductDO::getManageInventory, reqVO.getManageInventory())
.eqIfPresent(ProductDO::getFromInventory, reqVO.getFromInventory())
.eqIfPresent(ProductDO::getManageBatches, reqVO.getManageBatches())
.eqIfPresent(ProductDO::getTransportStoreyBoardNum, reqVO.getTransportStoreyBoardNum())
.eqIfPresent(ProductDO::getTransportBoxStoreyNum, reqVO.getTransportBoxStoreyNum())
.eqIfPresent(ProductDO::getTransportBoxBoardNum, reqVO.getTransportBoxBoardNum())
.eqIfPresent(ProductDO::getTransportTemperature, reqVO.getTransportTemperature())
.eqIfPresent(ProductDO::getTransportTemperatureDown, reqVO.getTransportTemperatureDown())
.eqIfPresent(ProductDO::getTransportTemperatureUpper, reqVO.getTransportTemperatureUpper())
.eqIfPresent(ProductDO::getStorageStoreyBoardNum, reqVO.getStorageStoreyBoardNum())
.eqIfPresent(ProductDO::getStorageBoxStoreyNum, reqVO.getStorageBoxStoreyNum())
.eqIfPresent(ProductDO::getStorageBoxBoardNum, reqVO.getStorageBoxBoardNum())
.eqIfPresent(ProductDO::getStorageTemperature, reqVO.getStorageTemperature())
.eqIfPresent(ProductDO::getStorageTemperatureDown, reqVO.getStorageTemperatureDown())
.eqIfPresent(ProductDO::getStorageTemperatureUpper, reqVO.getStorageTemperatureUpper())
.eqIfPresent(ProductDO::getQualityInspectionRatio, reqVO.getQualityInspectionRatio())
.eqIfPresent(ProductDO::getQualityInspectionFrequency, reqVO.getQualityInspectionFrequency())
.eqIfPresent(ProductDO::getQualityInspectionReport, reqVO.getQualityInspectionReport())
.eqIfPresent(ProductDO::getQualityInspectionReportStart, reqVO.getQualityInspectionReportStart())
.eqIfPresent(ProductDO::getQualityInspectionReportEnd, reqVO.getQualityInspectionReportEnd())
.eqIfPresent(ProductDO::getQualityControl, reqVO.getQualityControl())
.eqIfPresent(ProductDO::getQualityInspectionStandards, reqVO.getQualityInspectionStandards())
.eqIfPresent(ProductDO::getRemark, reqVO.getRemark())
.eqIfPresent(ProductDO::getReservedFields1, reqVO.getReservedFields1())
.eqIfPresent(ProductDO::getReservedFields2, reqVO.getReservedFields2())
.eqIfPresent(ProductDO::getReservedFields3, reqVO.getReservedFields3())
.eqIfPresent(ProductDO::getReservedFields4, reqVO.getReservedFields4())
.eqIfPresent(ProductDO::getReservedFields5, reqVO.getReservedFields5())
.eqIfPresent(ProductDO::getReservedFields6, reqVO.getReservedFields6())
.betweenIfPresent(ProductDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ProductDO::getId));
}
}

@ -0,0 +1,70 @@
package com.yunxi.scm.module.xxjj.service.product;
import java.util.*;
import javax.validation.*;
import com.yunxi.scm.module.xxjj.controller.admin.product.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.product.ProductDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
/**
* Service
*
* @author
*/
public interface ProductService {
/**
*
*
* @param createReqVO
* @return
*/
Long createProduct(@Valid ProductCreateReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateProduct(@Valid ProductUpdateReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteProduct(Long id);
/**
*
*
* @param id
* @return
*/
ProductDO getProduct(Long id);
/**
*
*
* @param ids
* @return
*/
List<ProductDO> getProductList(Collection<Long> ids);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<ProductDO> getProductPage(ProductPageReqVO pageReqVO);
/**
* , Excel
*
* @param exportReqVO
* @return
*/
List<ProductDO> getProductList(ProductExportReqVO exportReqVO);
}

@ -0,0 +1,82 @@
package com.yunxi.scm.module.xxjj.service.product;
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.product.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.product.ProductDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.module.xxjj.convert.product.ProductConvert;
import com.yunxi.scm.module.xxjj.dal.mysql.product.ProductMapper;
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 ProductServiceImpl implements ProductService {
@Resource
private ProductMapper productMapper;
@Override
public Long createProduct(ProductCreateReqVO createReqVO) {
// 插入
ProductDO product = ProductConvert.INSTANCE.convert(createReqVO);
productMapper.insert(product);
// 返回
return product.getId();
}
@Override
public void updateProduct(ProductUpdateReqVO updateReqVO) {
// 校验存在
validateProductExists(updateReqVO.getId());
// 更新
ProductDO updateObj = ProductConvert.INSTANCE.convert(updateReqVO);
productMapper.updateById(updateObj);
}
@Override
public void deleteProduct(Long id) {
// 校验存在
validateProductExists(id);
// 删除
productMapper.deleteById(id);
}
private void validateProductExists(Long id) {
if (productMapper.selectById(id) == null) {
throw exception(PRODUCT_NOT_EXISTS);
}
}
@Override
public ProductDO getProduct(Long id) {
return productMapper.selectById(id);
}
@Override
public List<ProductDO> getProductList(Collection<Long> ids) {
return productMapper.selectBatchIds(ids);
}
@Override
public PageResult<ProductDO> getProductPage(ProductPageReqVO pageReqVO) {
return productMapper.selectPage(pageReqVO);
}
@Override
public List<ProductDO> getProductList(ProductExportReqVO exportReqVO) {
return productMapper.selectList(exportReqVO);
}
}

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yunxi.scm.module.xxjj.dal.mysql.product.ProductMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,831 @@
package com.yunxi.scm.module.xxjj.service.product;
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.product.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.product.ProductDO;
import com.yunxi.scm.module.xxjj.dal.mysql.product.ProductMapper;
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 ProductServiceImpl}
*
* @author
*/
@Import(ProductServiceImpl.class)
public class ProductServiceImplTest extends BaseDbUnitTest {
@Resource
private ProductServiceImpl productService;
@Resource
private ProductMapper productMapper;
@Test
public void testCreateProduct_success() {
// 准备参数
ProductCreateReqVO reqVO = randomPojo(ProductCreateReqVO.class);
// 调用
Long productId = productService.createProduct(reqVO);
// 断言
assertNotNull(productId);
// 校验记录的属性是否正确
ProductDO product = productMapper.selectById(productId);
assertPojoEquals(reqVO, product);
}
@Test
public void testUpdateProduct_success() {
// mock 数据
ProductDO dbProduct = randomPojo(ProductDO.class);
productMapper.insert(dbProduct);// @Sql: 先插入出一条存在的数据
// 准备参数
ProductUpdateReqVO reqVO = randomPojo(ProductUpdateReqVO.class, o -> {
o.setId(dbProduct.getId()); // 设置更新的 ID
});
// 调用
productService.updateProduct(reqVO);
// 校验是否更新正确
ProductDO product = productMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, product);
}
@Test
public void testUpdateProduct_notExists() {
// 准备参数
ProductUpdateReqVO reqVO = randomPojo(ProductUpdateReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> productService.updateProduct(reqVO), PRODUCT_NOT_EXISTS);
}
@Test
public void testDeleteProduct_success() {
// mock 数据
ProductDO dbProduct = randomPojo(ProductDO.class);
productMapper.insert(dbProduct);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbProduct.getId();
// 调用
productService.deleteProduct(id);
// 校验数据不存在了
assertNull(productMapper.selectById(id));
}
@Test
public void testDeleteProduct_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> productService.deleteProduct(id), PRODUCT_NOT_EXISTS);
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetProductPage() {
// mock 数据
ProductDO dbProduct = randomPojo(ProductDO.class, o -> { // 等会查询到
o.setPhoto(null);
o.setCode(null);
o.setName(null);
o.setProductStatus(null);
o.setProductType(null);
o.setShortName(null);
o.setBarCode(null);
o.setBoxSurfaceNum(null);
o.setSpec(null);
o.setInventoryType(null);
o.setBrandId(null);
o.setArea(null);
o.setProductTypeId(null);
o.setAreaCategory(null);
o.setDangerousFlag(null);
o.setImportedFlag(null);
o.setFirstSupplierId(null);
o.setSettlementEntity(null);
o.setOutputTaxRate(null);
o.setInputTaxRate(null);
o.setDeliveryType(null);
o.setManyUnitFlag(null);
o.setInventoryUnitId(null);
o.setOrderMainUnitId(null);
o.setOrderOtherUnitId(null);
o.setSalesMainUnitId(null);
o.setSalesOtherUnitId(null);
o.setOperateUnitId(null);
o.setPricingUnitId(null);
o.setPurchaseOrderQuantityDown(null);
o.setPurchaseOrderQuantityUpper(null);
o.setPurchaseOrderMultiple(null);
o.setPurchaseInitialAmount(null);
o.setPurchaseAllowOverchargingRatio(null);
o.setPurchaseOrderStart(null);
o.setPurchaseOrderEnd(null);
o.setPurchaseMode(null);
o.setSalesOrderQuantityDown(null);
o.setSalesOrderQuantityUpper(null);
o.setSalesOrderMultiple(null);
o.setSalesInitialAmount(null);
o.setSalesAllowOverchargingRatio(null);
o.setSalesStart(null);
o.setSalesEnd(null);
o.setSalesModeStart(null);
o.setSalesMode(null);
o.setDeliverGoodsDate(null);
o.setDelayNum(null);
o.setSafetyStock(null);
o.setInventoryDayDown(null);
o.setInventoryDayUpper(null);
o.setInventoryDown(null);
o.setInventoryUpper(null);
o.setFixedReplenishmentQuantity(null);
o.setAvailableInventory(null);
o.setTransitInventory(null);
o.setManageInventory(null);
o.setFromInventory(null);
o.setManageBatches(null);
o.setTransportStoreyBoardNum(null);
o.setTransportBoxStoreyNum(null);
o.setTransportBoxBoardNum(null);
o.setTransportTemperature(null);
o.setTransportTemperatureDown(null);
o.setTransportTemperatureUpper(null);
o.setStorageStoreyBoardNum(null);
o.setStorageBoxStoreyNum(null);
o.setStorageBoxBoardNum(null);
o.setStorageTemperature(null);
o.setStorageTemperatureDown(null);
o.setStorageTemperatureUpper(null);
o.setQualityInspectionRatio(null);
o.setQualityInspectionFrequency(null);
o.setQualityInspectionReport(null);
o.setQualityInspectionReportStart(null);
o.setQualityInspectionReportEnd(null);
o.setQualityControl(null);
o.setQualityInspectionStandards(null);
o.setRemark(null);
o.setReservedFields1(null);
o.setReservedFields2(null);
o.setReservedFields3(null);
o.setReservedFields4(null);
o.setReservedFields5(null);
o.setReservedFields6(null);
o.setCreateTime(null);
});
productMapper.insert(dbProduct);
// 测试 photo 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPhoto(null)));
// 测试 code 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setCode(null)));
// 测试 name 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setName(null)));
// 测试 productStatus 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setProductStatus(null)));
// 测试 productType 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setProductType(null)));
// 测试 shortName 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setShortName(null)));
// 测试 barCode 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setBarCode(null)));
// 测试 boxSurfaceNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setBoxSurfaceNum(null)));
// 测试 spec 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSpec(null)));
// 测试 inventoryType 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryType(null)));
// 测试 brandId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setBrandId(null)));
// 测试 area 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setArea(null)));
// 测试 productTypeId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setProductTypeId(null)));
// 测试 areaCategory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setAreaCategory(null)));
// 测试 dangerousFlag 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDangerousFlag(null)));
// 测试 importedFlag 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setImportedFlag(null)));
// 测试 firstSupplierId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setFirstSupplierId(null)));
// 测试 settlementEntity 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSettlementEntity(null)));
// 测试 outputTaxRate 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOutputTaxRate(null)));
// 测试 inputTaxRate 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInputTaxRate(null)));
// 测试 deliveryType 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDeliveryType(null)));
// 测试 manyUnitFlag 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setManyUnitFlag(null)));
// 测试 inventoryUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryUnitId(null)));
// 测试 orderMainUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOrderMainUnitId(null)));
// 测试 orderOtherUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOrderOtherUnitId(null)));
// 测试 salesMainUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesMainUnitId(null)));
// 测试 salesOtherUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOtherUnitId(null)));
// 测试 operateUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOperateUnitId(null)));
// 测试 pricingUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPricingUnitId(null)));
// 测试 purchaseOrderQuantityDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderQuantityDown(null)));
// 测试 purchaseOrderQuantityUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderQuantityUpper(null)));
// 测试 purchaseOrderMultiple 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderMultiple(null)));
// 测试 purchaseInitialAmount 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseInitialAmount(null)));
// 测试 purchaseAllowOverchargingRatio 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseAllowOverchargingRatio(null)));
// 测试 purchaseOrderStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderStart(null)));
// 测试 purchaseOrderEnd 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderEnd(null)));
// 测试 purchaseMode 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseMode(null)));
// 测试 salesOrderQuantityDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOrderQuantityDown(null)));
// 测试 salesOrderQuantityUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOrderQuantityUpper(null)));
// 测试 salesOrderMultiple 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOrderMultiple(null)));
// 测试 salesInitialAmount 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesInitialAmount(null)));
// 测试 salesAllowOverchargingRatio 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesAllowOverchargingRatio(null)));
// 测试 salesStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesStart(null)));
// 测试 salesEnd 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesEnd(null)));
// 测试 salesModeStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesModeStart(null)));
// 测试 salesMode 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesMode(null)));
// 测试 deliverGoodsDate 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDeliverGoodsDate(null)));
// 测试 delayNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDelayNum(null)));
// 测试 safetyStock 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSafetyStock(null)));
// 测试 inventoryDayDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryDayDown(null)));
// 测试 inventoryDayUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryDayUpper(null)));
// 测试 inventoryDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryDown(null)));
// 测试 inventoryUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryUpper(null)));
// 测试 fixedReplenishmentQuantity 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setFixedReplenishmentQuantity(null)));
// 测试 availableInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setAvailableInventory(null)));
// 测试 transitInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransitInventory(null)));
// 测试 manageInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setManageInventory(null)));
// 测试 fromInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setFromInventory(null)));
// 测试 manageBatches 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setManageBatches(null)));
// 测试 transportStoreyBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportStoreyBoardNum(null)));
// 测试 transportBoxStoreyNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportBoxStoreyNum(null)));
// 测试 transportBoxBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportBoxBoardNum(null)));
// 测试 transportTemperature 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportTemperature(null)));
// 测试 transportTemperatureDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportTemperatureDown(null)));
// 测试 transportTemperatureUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportTemperatureUpper(null)));
// 测试 storageStoreyBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageStoreyBoardNum(null)));
// 测试 storageBoxStoreyNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageBoxStoreyNum(null)));
// 测试 storageBoxBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageBoxBoardNum(null)));
// 测试 storageTemperature 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageTemperature(null)));
// 测试 storageTemperatureDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageTemperatureDown(null)));
// 测试 storageTemperatureUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageTemperatureUpper(null)));
// 测试 qualityInspectionRatio 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionRatio(null)));
// 测试 qualityInspectionFrequency 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionFrequency(null)));
// 测试 qualityInspectionReport 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionReport(null)));
// 测试 qualityInspectionReportStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionReportStart(null)));
// 测试 qualityInspectionReportEnd 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionReportEnd(null)));
// 测试 qualityControl 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityControl(null)));
// 测试 qualityInspectionStandards 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionStandards(null)));
// 测试 remark 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setRemark(null)));
// 测试 reservedFields1 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields1(null)));
// 测试 reservedFields2 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields2(null)));
// 测试 reservedFields3 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields3(null)));
// 测试 reservedFields4 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields4(null)));
// 测试 reservedFields5 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields5(null)));
// 测试 reservedFields6 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields6(null)));
// 测试 createTime 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setCreateTime(null)));
// 准备参数
ProductPageReqVO reqVO = new ProductPageReqVO();
reqVO.setPhoto(null);
reqVO.setCode(null);
reqVO.setName(null);
reqVO.setProductStatus(null);
reqVO.setProductType(null);
reqVO.setShortName(null);
reqVO.setBarCode(null);
reqVO.setBoxSurfaceNum(null);
reqVO.setSpec(null);
reqVO.setInventoryType(null);
reqVO.setBrandId(null);
reqVO.setArea(null);
reqVO.setProductTypeId(null);
reqVO.setAreaCategory(null);
reqVO.setDangerousFlag(null);
reqVO.setImportedFlag(null);
reqVO.setFirstSupplierId(null);
reqVO.setSettlementEntity(null);
reqVO.setOutputTaxRate(null);
reqVO.setInputTaxRate(null);
reqVO.setDeliveryType(null);
reqVO.setManyUnitFlag(null);
reqVO.setInventoryUnitId(null);
reqVO.setOrderMainUnitId(null);
reqVO.setOrderOtherUnitId(null);
reqVO.setSalesMainUnitId(null);
reqVO.setSalesOtherUnitId(null);
reqVO.setOperateUnitId(null);
reqVO.setPricingUnitId(null);
reqVO.setPurchaseOrderQuantityDown(null);
reqVO.setPurchaseOrderQuantityUpper(null);
reqVO.setPurchaseOrderMultiple(null);
reqVO.setPurchaseInitialAmount(null);
reqVO.setPurchaseAllowOverchargingRatio(null);
reqVO.setPurchaseOrderStart(null);
reqVO.setPurchaseOrderEnd(null);
reqVO.setPurchaseMode(null);
reqVO.setSalesOrderQuantityDown(null);
reqVO.setSalesOrderQuantityUpper(null);
reqVO.setSalesOrderMultiple(null);
reqVO.setSalesInitialAmount(null);
reqVO.setSalesAllowOverchargingRatio(null);
reqVO.setSalesStart(null);
reqVO.setSalesEnd(null);
reqVO.setSalesModeStart(null);
reqVO.setSalesMode(null);
reqVO.setDeliverGoodsDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setDelayNum(null);
reqVO.setSafetyStock(null);
reqVO.setInventoryDayDown(null);
reqVO.setInventoryDayUpper(null);
reqVO.setInventoryDown(null);
reqVO.setInventoryUpper(null);
reqVO.setFixedReplenishmentQuantity(null);
reqVO.setAvailableInventory(null);
reqVO.setTransitInventory(null);
reqVO.setManageInventory(null);
reqVO.setFromInventory(null);
reqVO.setManageBatches(null);
reqVO.setTransportStoreyBoardNum(null);
reqVO.setTransportBoxStoreyNum(null);
reqVO.setTransportBoxBoardNum(null);
reqVO.setTransportTemperature(null);
reqVO.setTransportTemperatureDown(null);
reqVO.setTransportTemperatureUpper(null);
reqVO.setStorageStoreyBoardNum(null);
reqVO.setStorageBoxStoreyNum(null);
reqVO.setStorageBoxBoardNum(null);
reqVO.setStorageTemperature(null);
reqVO.setStorageTemperatureDown(null);
reqVO.setStorageTemperatureUpper(null);
reqVO.setQualityInspectionRatio(null);
reqVO.setQualityInspectionFrequency(null);
reqVO.setQualityInspectionReport(null);
reqVO.setQualityInspectionReportStart(null);
reqVO.setQualityInspectionReportEnd(null);
reqVO.setQualityControl(null);
reqVO.setQualityInspectionStandards(null);
reqVO.setRemark(null);
reqVO.setReservedFields1(null);
reqVO.setReservedFields2(null);
reqVO.setReservedFields3(null);
reqVO.setReservedFields4(null);
reqVO.setReservedFields5(null);
reqVO.setReservedFields6(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
PageResult<ProductDO> pageResult = productService.getProductPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbProduct, pageResult.getList().get(0));
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetProductList() {
// mock 数据
ProductDO dbProduct = randomPojo(ProductDO.class, o -> { // 等会查询到
o.setPhoto(null);
o.setCode(null);
o.setName(null);
o.setProductStatus(null);
o.setProductType(null);
o.setShortName(null);
o.setBarCode(null);
o.setBoxSurfaceNum(null);
o.setSpec(null);
o.setInventoryType(null);
o.setBrandId(null);
o.setArea(null);
o.setProductTypeId(null);
o.setAreaCategory(null);
o.setDangerousFlag(null);
o.setImportedFlag(null);
o.setFirstSupplierId(null);
o.setSettlementEntity(null);
o.setOutputTaxRate(null);
o.setInputTaxRate(null);
o.setDeliveryType(null);
o.setManyUnitFlag(null);
o.setInventoryUnitId(null);
o.setOrderMainUnitId(null);
o.setOrderOtherUnitId(null);
o.setSalesMainUnitId(null);
o.setSalesOtherUnitId(null);
o.setOperateUnitId(null);
o.setPricingUnitId(null);
o.setPurchaseOrderQuantityDown(null);
o.setPurchaseOrderQuantityUpper(null);
o.setPurchaseOrderMultiple(null);
o.setPurchaseInitialAmount(null);
o.setPurchaseAllowOverchargingRatio(null);
o.setPurchaseOrderStart(null);
o.setPurchaseOrderEnd(null);
o.setPurchaseMode(null);
o.setSalesOrderQuantityDown(null);
o.setSalesOrderQuantityUpper(null);
o.setSalesOrderMultiple(null);
o.setSalesInitialAmount(null);
o.setSalesAllowOverchargingRatio(null);
o.setSalesStart(null);
o.setSalesEnd(null);
o.setSalesModeStart(null);
o.setSalesMode(null);
o.setDeliverGoodsDate(null);
o.setDelayNum(null);
o.setSafetyStock(null);
o.setInventoryDayDown(null);
o.setInventoryDayUpper(null);
o.setInventoryDown(null);
o.setInventoryUpper(null);
o.setFixedReplenishmentQuantity(null);
o.setAvailableInventory(null);
o.setTransitInventory(null);
o.setManageInventory(null);
o.setFromInventory(null);
o.setManageBatches(null);
o.setTransportStoreyBoardNum(null);
o.setTransportBoxStoreyNum(null);
o.setTransportBoxBoardNum(null);
o.setTransportTemperature(null);
o.setTransportTemperatureDown(null);
o.setTransportTemperatureUpper(null);
o.setStorageStoreyBoardNum(null);
o.setStorageBoxStoreyNum(null);
o.setStorageBoxBoardNum(null);
o.setStorageTemperature(null);
o.setStorageTemperatureDown(null);
o.setStorageTemperatureUpper(null);
o.setQualityInspectionRatio(null);
o.setQualityInspectionFrequency(null);
o.setQualityInspectionReport(null);
o.setQualityInspectionReportStart(null);
o.setQualityInspectionReportEnd(null);
o.setQualityControl(null);
o.setQualityInspectionStandards(null);
o.setRemark(null);
o.setReservedFields1(null);
o.setReservedFields2(null);
o.setReservedFields3(null);
o.setReservedFields4(null);
o.setReservedFields5(null);
o.setReservedFields6(null);
o.setCreateTime(null);
});
productMapper.insert(dbProduct);
// 测试 photo 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPhoto(null)));
// 测试 code 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setCode(null)));
// 测试 name 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setName(null)));
// 测试 productStatus 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setProductStatus(null)));
// 测试 productType 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setProductType(null)));
// 测试 shortName 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setShortName(null)));
// 测试 barCode 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setBarCode(null)));
// 测试 boxSurfaceNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setBoxSurfaceNum(null)));
// 测试 spec 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSpec(null)));
// 测试 inventoryType 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryType(null)));
// 测试 brandId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setBrandId(null)));
// 测试 area 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setArea(null)));
// 测试 productTypeId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setProductTypeId(null)));
// 测试 areaCategory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setAreaCategory(null)));
// 测试 dangerousFlag 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDangerousFlag(null)));
// 测试 importedFlag 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setImportedFlag(null)));
// 测试 firstSupplierId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setFirstSupplierId(null)));
// 测试 settlementEntity 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSettlementEntity(null)));
// 测试 outputTaxRate 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOutputTaxRate(null)));
// 测试 inputTaxRate 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInputTaxRate(null)));
// 测试 deliveryType 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDeliveryType(null)));
// 测试 manyUnitFlag 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setManyUnitFlag(null)));
// 测试 inventoryUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryUnitId(null)));
// 测试 orderMainUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOrderMainUnitId(null)));
// 测试 orderOtherUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOrderOtherUnitId(null)));
// 测试 salesMainUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesMainUnitId(null)));
// 测试 salesOtherUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOtherUnitId(null)));
// 测试 operateUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setOperateUnitId(null)));
// 测试 pricingUnitId 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPricingUnitId(null)));
// 测试 purchaseOrderQuantityDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderQuantityDown(null)));
// 测试 purchaseOrderQuantityUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderQuantityUpper(null)));
// 测试 purchaseOrderMultiple 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderMultiple(null)));
// 测试 purchaseInitialAmount 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseInitialAmount(null)));
// 测试 purchaseAllowOverchargingRatio 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseAllowOverchargingRatio(null)));
// 测试 purchaseOrderStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderStart(null)));
// 测试 purchaseOrderEnd 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseOrderEnd(null)));
// 测试 purchaseMode 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setPurchaseMode(null)));
// 测试 salesOrderQuantityDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOrderQuantityDown(null)));
// 测试 salesOrderQuantityUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOrderQuantityUpper(null)));
// 测试 salesOrderMultiple 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesOrderMultiple(null)));
// 测试 salesInitialAmount 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesInitialAmount(null)));
// 测试 salesAllowOverchargingRatio 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesAllowOverchargingRatio(null)));
// 测试 salesStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesStart(null)));
// 测试 salesEnd 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesEnd(null)));
// 测试 salesModeStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesModeStart(null)));
// 测试 salesMode 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSalesMode(null)));
// 测试 deliverGoodsDate 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDeliverGoodsDate(null)));
// 测试 delayNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setDelayNum(null)));
// 测试 safetyStock 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setSafetyStock(null)));
// 测试 inventoryDayDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryDayDown(null)));
// 测试 inventoryDayUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryDayUpper(null)));
// 测试 inventoryDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryDown(null)));
// 测试 inventoryUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setInventoryUpper(null)));
// 测试 fixedReplenishmentQuantity 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setFixedReplenishmentQuantity(null)));
// 测试 availableInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setAvailableInventory(null)));
// 测试 transitInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransitInventory(null)));
// 测试 manageInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setManageInventory(null)));
// 测试 fromInventory 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setFromInventory(null)));
// 测试 manageBatches 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setManageBatches(null)));
// 测试 transportStoreyBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportStoreyBoardNum(null)));
// 测试 transportBoxStoreyNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportBoxStoreyNum(null)));
// 测试 transportBoxBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportBoxBoardNum(null)));
// 测试 transportTemperature 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportTemperature(null)));
// 测试 transportTemperatureDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportTemperatureDown(null)));
// 测试 transportTemperatureUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setTransportTemperatureUpper(null)));
// 测试 storageStoreyBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageStoreyBoardNum(null)));
// 测试 storageBoxStoreyNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageBoxStoreyNum(null)));
// 测试 storageBoxBoardNum 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageBoxBoardNum(null)));
// 测试 storageTemperature 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageTemperature(null)));
// 测试 storageTemperatureDown 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageTemperatureDown(null)));
// 测试 storageTemperatureUpper 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setStorageTemperatureUpper(null)));
// 测试 qualityInspectionRatio 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionRatio(null)));
// 测试 qualityInspectionFrequency 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionFrequency(null)));
// 测试 qualityInspectionReport 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionReport(null)));
// 测试 qualityInspectionReportStart 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionReportStart(null)));
// 测试 qualityInspectionReportEnd 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionReportEnd(null)));
// 测试 qualityControl 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityControl(null)));
// 测试 qualityInspectionStandards 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setQualityInspectionStandards(null)));
// 测试 remark 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setRemark(null)));
// 测试 reservedFields1 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields1(null)));
// 测试 reservedFields2 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields2(null)));
// 测试 reservedFields3 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields3(null)));
// 测试 reservedFields4 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields4(null)));
// 测试 reservedFields5 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields5(null)));
// 测试 reservedFields6 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setReservedFields6(null)));
// 测试 createTime 不匹配
productMapper.insert(cloneIgnoreId(dbProduct, o -> o.setCreateTime(null)));
// 准备参数
ProductExportReqVO reqVO = new ProductExportReqVO();
reqVO.setPhoto(null);
reqVO.setCode(null);
reqVO.setName(null);
reqVO.setProductStatus(null);
reqVO.setProductType(null);
reqVO.setShortName(null);
reqVO.setBarCode(null);
reqVO.setBoxSurfaceNum(null);
reqVO.setSpec(null);
reqVO.setInventoryType(null);
reqVO.setBrandId(null);
reqVO.setArea(null);
reqVO.setProductTypeId(null);
reqVO.setAreaCategory(null);
reqVO.setDangerousFlag(null);
reqVO.setImportedFlag(null);
reqVO.setFirstSupplierId(null);
reqVO.setSettlementEntity(null);
reqVO.setOutputTaxRate(null);
reqVO.setInputTaxRate(null);
reqVO.setDeliveryType(null);
reqVO.setManyUnitFlag(null);
reqVO.setInventoryUnitId(null);
reqVO.setOrderMainUnitId(null);
reqVO.setOrderOtherUnitId(null);
reqVO.setSalesMainUnitId(null);
reqVO.setSalesOtherUnitId(null);
reqVO.setOperateUnitId(null);
reqVO.setPricingUnitId(null);
reqVO.setPurchaseOrderQuantityDown(null);
reqVO.setPurchaseOrderQuantityUpper(null);
reqVO.setPurchaseOrderMultiple(null);
reqVO.setPurchaseInitialAmount(null);
reqVO.setPurchaseAllowOverchargingRatio(null);
reqVO.setPurchaseOrderStart(null);
reqVO.setPurchaseOrderEnd(null);
reqVO.setPurchaseMode(null);
reqVO.setSalesOrderQuantityDown(null);
reqVO.setSalesOrderQuantityUpper(null);
reqVO.setSalesOrderMultiple(null);
reqVO.setSalesInitialAmount(null);
reqVO.setSalesAllowOverchargingRatio(null);
reqVO.setSalesStart(null);
reqVO.setSalesEnd(null);
reqVO.setSalesModeStart(null);
reqVO.setSalesMode(null);
reqVO.setDeliverGoodsDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setDelayNum(null);
reqVO.setSafetyStock(null);
reqVO.setInventoryDayDown(null);
reqVO.setInventoryDayUpper(null);
reqVO.setInventoryDown(null);
reqVO.setInventoryUpper(null);
reqVO.setFixedReplenishmentQuantity(null);
reqVO.setAvailableInventory(null);
reqVO.setTransitInventory(null);
reqVO.setManageInventory(null);
reqVO.setFromInventory(null);
reqVO.setManageBatches(null);
reqVO.setTransportStoreyBoardNum(null);
reqVO.setTransportBoxStoreyNum(null);
reqVO.setTransportBoxBoardNum(null);
reqVO.setTransportTemperature(null);
reqVO.setTransportTemperatureDown(null);
reqVO.setTransportTemperatureUpper(null);
reqVO.setStorageStoreyBoardNum(null);
reqVO.setStorageBoxStoreyNum(null);
reqVO.setStorageBoxBoardNum(null);
reqVO.setStorageTemperature(null);
reqVO.setStorageTemperatureDown(null);
reqVO.setStorageTemperatureUpper(null);
reqVO.setQualityInspectionRatio(null);
reqVO.setQualityInspectionFrequency(null);
reqVO.setQualityInspectionReport(null);
reqVO.setQualityInspectionReportStart(null);
reqVO.setQualityInspectionReportEnd(null);
reqVO.setQualityControl(null);
reqVO.setQualityInspectionStandards(null);
reqVO.setRemark(null);
reqVO.setReservedFields1(null);
reqVO.setReservedFields2(null);
reqVO.setReservedFields3(null);
reqVO.setReservedFields4(null);
reqVO.setReservedFields5(null);
reqVO.setReservedFields6(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
List<ProductDO> list = productService.getProductList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbProduct, list.get(0));
}
}

@ -0,0 +1,120 @@
import request from '@/config/axios'
export interface ProductVO {
id: number
photo: string
code: string
name: string
productStatus: string
productType: string
shortName: string
barCode: string
boxSurfaceNum: string
spec: string
inventoryType: string
brandId: number
area: string
productTypeId: string
areaCategory: string
dangerousFlag: string
importedFlag: string
firstSupplierId: number
settlementEntity: string
outputTaxRate: string
inputTaxRate: string
deliveryType: string
manyUnitFlag: string
inventoryUnitId: number
orderMainUnitId: number
orderOtherUnitId: string
salesMainUnitId: number
salesOtherUnitId: string
operateUnitId: number
pricingUnitId: number
purchaseOrderQuantityDown: string
purchaseOrderQuantityUpper: string
purchaseOrderMultiple: string
purchaseInitialAmount: string
purchaseAllowOverchargingRatio: string
purchaseOrderStart: Date
purchaseOrderEnd: Date
purchaseMode: string
salesOrderQuantityDown: string
salesOrderQuantityUpper: string
salesOrderMultiple: string
salesInitialAmount: string
salesAllowOverchargingRatio: string
salesStart: Date
salesEnd: Date
salesModeStart: string
salesMode: string
deliverGoodsDate: Date
delayNum: string
safetyStock: string
inventoryDayDown: string
inventoryDayUpper: string
inventoryDown: string
inventoryUpper: string
fixedReplenishmentQuantity: string
availableInventory: string
transitInventory: string
manageInventory: string
fromInventory: string
manageBatches: string
transportStoreyBoardNum: string
transportBoxStoreyNum: string
transportBoxBoardNum: string
transportTemperature: string
transportTemperatureDown: string
transportTemperatureUpper: string
storageStoreyBoardNum: string
storageBoxStoreyNum: string
storageBoxBoardNum: string
storageTemperature: string
storageTemperatureDown: string
storageTemperatureUpper: string
qualityInspectionRatio: string
qualityInspectionFrequency: string
qualityInspectionReport: string
qualityInspectionReportStart: Date
qualityInspectionReportEnd: Date
qualityControl: string
qualityInspectionStandards: string
remark: string
reservedFields1: string
reservedFields2: string
reservedFields3: string
reservedFields4: string
reservedFields5: string
reservedFields6: string
}
// 查询商品列表
export const getProductPage = async (params) => {
return await request.get({ url: `/xxjj/product/page`, params })
}
// 查询商品详情
export const getProduct = async (id: number) => {
return await request.get({ url: `/xxjj/product/get?id=` + id })
}
// 新增商品
export const createProduct = async (data: ProductVO) => {
return await request.post({ url: `/xxjj/product/create`, data })
}
// 修改商品
export const updateProduct = async (data: ProductVO) => {
return await request.put({ url: `/xxjj/product/update`, data })
}
// 删除商品
export const deleteProduct = async (id: number) => {
return await request.delete({ url: `/xxjj/product/delete?id=` + id })
}
// 导出商品 Excel
export const exportProduct = async (params) => {
return await request.download({ url: `/xxjj/product/export-excel`, params })
}

@ -1,3 +1,45 @@
:root {
// abCdefghijklmnopqrstuvwxyz
--xy-border: 1px solid #e4e7ed;
--xy-border-radius: 4px 4px 4px 4px;
--xy-border-radius-2: 4px 4px 0px 0px;
--xy-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);
--xy-margin: 16px;
--xy-padding: 16px;
--xy-padding-b: 16px 16px 0px 16px;
}
.xy-card {
margin: 0px;
margin-top: var(--xy-margin);
.el-card__header {
background-color: #F7F8FA;
padding: var(--xy-padding);
}
}
.xy-tabs {
margin-top: var(--xy-margin);
box-shadow: var(--xy-box-shadow);
border: var(--xy-border);
border-radius: var(--xy-border-radius);
.el-tabs__header {
margin: 0px;
border-bottom: 1px solid #e4e7ed;
border-radius: var(--xy-border-radius-2);
padding: var(--xy-padding-b);
background-color: #F7F8FA;
overflow: hidden;
}
.el-tabs__content {
padding: var(--xy-padding);
background-color: #FFFFFF;
}
}
.xy-card-info.is-always-shadow {
box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);
}
@ -30,3 +72,11 @@
}
}
}
.xy-margin-zero {
margin: 0px;
}
.xy-padding-zero {
margin: 0px;
}

@ -209,4 +209,21 @@ export enum DICT_TYPE {
urgent_level = 'urgent_level', //紧要程度
task_remind = 'task_remind', //紧要程度
remind_way = 'remind_way', //紧要程度
// ============= PRODUCT 模块=================
PRODUCT_STATUS = 'product_status', //商品状态
PRODUCT_TYPE = 'product_type', //商品类型
SAVE_TYPE = 'save_type', //存货类型
DANGEROUS_FLAG = 'dangerous_flag', //危险品
IMPORTED_FLAG = 'imported_flag', //进口商品
MANY_UNIT_FLAG = 'many_unit_flag', //开启多单位
PURCHASE_WAY = 'purchase_mode', //采购模式
SALES_MODE_START = 'sales_mode_start', //开售模式
SALES_MODE = 'sales_mode', //售卖方式
TRANSIT_INVENTORY = 'transit_inventory', //使用在途库存
MANAGE_INVENTORY = 'manage_inventory', //管理库存
TRANSPORT_TEMPERATURE = 'transport_temperature', //温层
OUTPUT_TAX_RATE = 'output_tax_rate', //商品进销税率
}

@ -201,6 +201,8 @@
<!-- 表单弹窗添加/修改 -->
<EnterpriseBranchForm ref="formRef" @success="getList" />
<!-- 表单弹窗设置状态 -->
<EnterpriseBranchForm ref="formRefstatus" @success="getList" />
</template>
<script setup lang="ts" name="EnterpriseBranch">
@ -263,6 +265,12 @@ const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 设置状态 */
const formRefstatus = ref()
const openForm1 = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {

@ -0,0 +1,631 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="商品图片">
<UploadImg v-model="formData.photo" />
</el-form-item>
<el-form-item label="商品编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入商品编码" />
</el-form-item>
<el-form-item label="商品名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入商品名称" />
</el-form-item>
<el-form-item label="商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)" prop="productStatus">
<el-radio-group v-model="formData.productStatus">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.PRODUCT_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)" prop="productType">
<el-select v-model="formData.productType" placeholder="请选择商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.PRODUCT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="商品简称" prop="shortName">
<el-input v-model="formData.shortName" placeholder="请输入商品简称" />
</el-form-item>
<el-form-item label="商品条码" prop="barCode">
<el-input v-model="formData.barCode" placeholder="请输入商品条码" />
</el-form-item>
<el-form-item label="箱面号" prop="boxSurfaceNum">
<el-input v-model="formData.boxSurfaceNum" placeholder="请输入箱面号" />
</el-form-item>
<el-form-item label="商品规格" prop="spec">
<el-input v-model="formData.spec" placeholder="请输入商品规格" />
</el-form-item>
<el-form-item label="存货类型(1:原材料 2:半成品 3:产成品)" prop="inventoryType">
<el-select v-model="formData.inventoryType" placeholder="请选择存货类型(1:原材料 2:半成品 3:产成品)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.SAVE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="品牌id" prop="brandId">
<el-input v-model="formData.brandId" placeholder="请输入品牌id" />
</el-form-item>
<el-form-item label="地区" prop="area">
<el-input v-model="formData.area" placeholder="请输入地区" />
</el-form-item>
<el-form-item label="关联商品分类id" prop="productTypeId">
<el-input v-model="formData.productTypeId" placeholder="请输入关联商品分类id" />
</el-form-item>
<el-form-item label="商品类目" prop="areaCategory">
<el-input v-model="formData.areaCategory" placeholder="请输入商品类目" />
</el-form-item>
<el-form-item label="危险品(0:否 1:是)" prop="dangerousFlag">
<el-radio-group v-model="formData.dangerousFlag">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.DANGEROUS_FLAG)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="进口商品(0:否 1:是)" prop="importedFlag">
<el-checkbox-group v-model="formData.importedFlag">
<el-checkbox
v-for="dict in getStrDictOptions(DICT_TYPE.IMPORTED_FLAG)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="关联一级供应商id" prop="firstSupplierId">
<el-input v-model="formData.firstSupplierId" placeholder="请输入关联一级供应商id" />
</el-form-item>
<el-form-item label="结算主体" prop="settlementEntity">
<el-input v-model="formData.settlementEntity" placeholder="请输入结算主体" />
</el-form-item>
<el-form-item label="销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" prop="outputTaxRate">
<el-input v-model="formData.outputTaxRate" placeholder="请输入销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" />
</el-form-item>
<el-form-item label="进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" prop="inputTaxRate">
<el-input v-model="formData.inputTaxRate" placeholder="请输入进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" />
</el-form-item>
<el-form-item label="配送方式(1:仓配 2:直送 3:直达)" prop="deliveryType">
<el-select v-model="formData.deliveryType" placeholder="请选择配送方式(1:仓配 2:直送 3:直达)">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="开启多单位(0:否 1:是)" prop="manyUnitFlag">
<el-radio-group v-model="formData.manyUnitFlag">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MANY_UNIT_FLAG)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="库存单位" prop="inventoryUnitId">
<el-input v-model="formData.inventoryUnitId" placeholder="请输入库存单位" />
</el-form-item>
<el-form-item label="订货主单位" prop="orderMainUnitId">
<el-input v-model="formData.orderMainUnitId" placeholder="请输入订货主单位" />
</el-form-item>
<el-form-item label="其他订货单位" prop="orderOtherUnitId">
<el-input v-model="formData.orderOtherUnitId" placeholder="请输入其他订货单位" />
</el-form-item>
<el-form-item label="销售主单位" prop="salesMainUnitId">
<el-input v-model="formData.salesMainUnitId" placeholder="请输入销售主单位" />
</el-form-item>
<el-form-item label="其他销售单位" prop="salesOtherUnitId">
<el-input v-model="formData.salesOtherUnitId" placeholder="请输入其他销售单位" />
</el-form-item>
<el-form-item label="操作单位" prop="operateUnitId">
<el-input v-model="formData.operateUnitId" placeholder="请输入操作单位" />
</el-form-item>
<el-form-item label="计价单位" prop="pricingUnitId">
<el-input v-model="formData.pricingUnitId" placeholder="请输入计价单位" />
</el-form-item>
<el-form-item label="采购订货量下限" prop="purchaseOrderQuantityDown">
<el-input v-model="formData.purchaseOrderQuantityDown" placeholder="请输入采购订货量下限" />
</el-form-item>
<el-form-item label="采购订货量上限" prop="purchaseOrderQuantityUpper">
<el-input v-model="formData.purchaseOrderQuantityUpper" placeholder="请输入采购订货量上限" />
</el-form-item>
<el-form-item label="采购订货倍数" prop="purchaseOrderMultiple">
<el-input v-model="formData.purchaseOrderMultiple" placeholder="请输入采购订货倍数" />
</el-form-item>
<el-form-item label="采购起订金额" prop="purchaseInitialAmount">
<el-input v-model="formData.purchaseInitialAmount" placeholder="请输入采购起订金额" />
</el-form-item>
<el-form-item label="允许超收比例" prop="purchaseAllowOverchargingRatio">
<el-input v-model="formData.purchaseAllowOverchargingRatio" placeholder="请输入允许超收比例" />
</el-form-item>
<el-form-item label="采购订货时间开始" prop="purchaseOrderStart">
<el-input v-model="formData.purchaseOrderStart" placeholder="请输入采购订货时间开始" />
</el-form-item>
<el-form-item label="采购订货时间结束" prop="purchaseOrderEnd">
<el-input v-model="formData.purchaseOrderEnd" placeholder="请输入采购订货时间结束" />
</el-form-item>
<el-form-item label="采购模式(1:以采定销 2:以销定采)" prop="purchaseMode">
<el-select v-model="formData.purchaseMode" placeholder="请选择采购模式(1:以采定销 2:以销定采)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.PURCHASE_WAY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="销售订货量下限" prop="salesOrderQuantityDown">
<el-input v-model="formData.salesOrderQuantityDown" placeholder="请输入销售订货量下限" />
</el-form-item>
<el-form-item label="销售订货量上限" prop="salesOrderQuantityUpper">
<el-input v-model="formData.salesOrderQuantityUpper" placeholder="请输入销售订货量上限" />
</el-form-item>
<el-form-item label="销售订货倍数" prop="salesOrderMultiple">
<el-input v-model="formData.salesOrderMultiple" placeholder="请输入销售订货倍数" />
</el-form-item>
<el-form-item label="销售起订金额" prop="salesInitialAmount">
<el-input v-model="formData.salesInitialAmount" placeholder="请输入销售起订金额" />
</el-form-item>
<el-form-item label="允许超收比例" prop="salesAllowOverchargingRatio">
<el-input v-model="formData.salesAllowOverchargingRatio" placeholder="请输入允许超收比例" />
</el-form-item>
<el-form-item label="销售时间开始" prop="salesStart">
<el-input v-model="formData.salesStart" placeholder="请输入销售时间开始" />
</el-form-item>
<el-form-item label="销售时间结束" prop="salesEnd">
<el-input v-model="formData.salesEnd" placeholder="请输入销售时间结束" />
</el-form-item>
<el-form-item label="开售模式(1:立即开售 2:定时开售)" prop="salesModeStart">
<el-select v-model="formData.salesModeStart" placeholder="请选择开售模式(1:立即开售 2:定时开售)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.SALES_MODE_START)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="售卖方式(1:现货 2:预售)" prop="salesMode">
<el-radio-group v-model="formData.salesMode">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.SALES_MODE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="送货时间" prop="deliverGoodsDate">
<el-date-picker
v-model="formData.deliverGoodsDate"
type="date"
value-format="x"
placeholder="选择送货时间"
/>
</el-form-item>
<el-form-item label="下单成功后几天后送货" prop="delayNum">
<el-input v-model="formData.delayNum" placeholder="请输入下单成功后几天后送货" />
</el-form-item>
<el-form-item label="安全库存" prop="safetyStock">
<el-input v-model="formData.safetyStock" placeholder="请输入安全库存" />
</el-form-item>
<el-form-item label="库存天数下限" prop="inventoryDayDown">
<el-input v-model="formData.inventoryDayDown" placeholder="请输入库存天数下限" />
</el-form-item>
<el-form-item label="库存天数上限" prop="inventoryDayUpper">
<el-input v-model="formData.inventoryDayUpper" placeholder="请输入库存天数上限" />
</el-form-item>
<el-form-item label="库存下限" prop="inventoryDown">
<el-input v-model="formData.inventoryDown" placeholder="请输入库存下限" />
</el-form-item>
<el-form-item label="库存上限" prop="inventoryUpper">
<el-input v-model="formData.inventoryUpper" placeholder="请输入库存上限" />
</el-form-item>
<el-form-item label="固定补货数量" prop="fixedReplenishmentQuantity">
<el-input v-model="formData.fixedReplenishmentQuantity" placeholder="请输入固定补货数量" />
</el-form-item>
<el-form-item label="可售库存" prop="availableInventory">
<el-input v-model="formData.availableInventory" placeholder="请输入可售库存" />
</el-form-item>
<el-form-item label="使用在途库存(0:不使用 1:使用)" prop="transitInventory">
<el-select v-model="formData.transitInventory" placeholder="请选择使用在途库存(0:不使用 1:使用)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.TRANSIT_INVENTORY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="管理库存(0:关闭 1:开启)" prop="manageInventory">
<el-select v-model="formData.manageInventory" placeholder="请选择管理库存(0:关闭 1:开启)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MANAGE_INVENTORY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="追溯(0:关闭 1:开启)" prop="fromInventory">
<el-radio-group v-model="formData.fromInventory">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MANAGE_INVENTORY)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="批次管理(0:关闭 1:开启)" prop="manageBatches">
<el-select v-model="formData.manageBatches" placeholder="请选择批次管理(0:关闭 1:开启)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MANAGE_INVENTORY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="层数/板(运输)" prop="transportStoreyBoardNum">
<el-input v-model="formData.transportStoreyBoardNum" placeholder="请输入层数/板(运输)" />
</el-form-item>
<el-form-item label="箱数/层(运输)" prop="transportBoxStoreyNum">
<el-input v-model="formData.transportBoxStoreyNum" placeholder="请输入箱数/层(运输)" />
</el-form-item>
<el-form-item label="箱数/板(运输)" prop="transportBoxBoardNum">
<el-input v-model="formData.transportBoxBoardNum" placeholder="请输入箱数/板(运输)" />
</el-form-item>
<el-form-item label="温层(运输)(1:常温 2:恒温 3:冷藏 4:冷冻)" prop="transportTemperature">
<el-radio-group v-model="formData.transportTemperature">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.TRANSPORT_TEMPERATURE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="运输温度下限" prop="transportTemperatureDown">
<el-input v-model="formData.transportTemperatureDown" placeholder="请输入运输温度下限" />
</el-form-item>
<el-form-item label="运输温度上限" prop="transportTemperatureUpper">
<el-input v-model="formData.transportTemperatureUpper" placeholder="请输入运输温度上限" />
</el-form-item>
<el-form-item label="层数/板(存储)" prop="storageStoreyBoardNum">
<el-input v-model="formData.storageStoreyBoardNum" placeholder="请输入层数/板(存储)" />
</el-form-item>
<el-form-item label="层数/板(存储)" prop="storageBoxStoreyNum">
<el-input v-model="formData.storageBoxStoreyNum" placeholder="请输入层数/板(存储)" />
</el-form-item>
<el-form-item label="层数/板(存储)" prop="storageBoxBoardNum">
<el-input v-model="formData.storageBoxBoardNum" placeholder="请输入层数/板(存储)" />
</el-form-item>
<el-form-item label="温层(存储)(1:常温 2:恒温 3:冷藏 4:冷冻)" prop="storageTemperature">
<el-select v-model="formData.storageTemperature" placeholder="请选择温层(存储)(1:常温 2:恒温 3:冷藏 4:冷冻)">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.TRANSPORT_TEMPERATURE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="存储温度下限" prop="storageTemperatureDown">
<el-input v-model="formData.storageTemperatureDown" placeholder="请输入存储温度下限" />
</el-form-item>
<el-form-item label="存储温度上限" prop="storageTemperatureUpper">
<el-input v-model="formData.storageTemperatureUpper" placeholder="请输入存储温度上限" />
</el-form-item>
<el-form-item label="质检比例" prop="qualityInspectionRatio">
<el-input v-model="formData.qualityInspectionRatio" placeholder="请输入质检比例" />
</el-form-item>
<el-form-item label="质检频次" prop="qualityInspectionFrequency">
<el-input v-model="formData.qualityInspectionFrequency" placeholder="请输入质检频次" />
</el-form-item>
<el-form-item label="质检报告" prop="qualityInspectionReport">
<el-input v-model="formData.qualityInspectionReport" placeholder="请输入质检报告" />
</el-form-item>
<el-form-item label="质检报告有效期开始" prop="qualityInspectionReportStart">
<el-input v-model="formData.qualityInspectionReportStart" placeholder="请输入质检报告有效期开始" />
</el-form-item>
<el-form-item label="质检报告有效期结束" prop="qualityInspectionReportEnd">
<el-input v-model="formData.qualityInspectionReportEnd" placeholder="请输入质检报告有效期结束" />
</el-form-item>
<el-form-item label="质量控制(0:关闭 1:开启)" prop="qualityControl">
<el-input v-model="formData.qualityControl" placeholder="请输入质量控制(0:关闭 1:开启)" />
</el-form-item>
<el-form-item label="质检标准" prop="qualityInspectionStandards">
<el-input v-model="formData.qualityInspectionStandards" placeholder="请输入质检标准" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="预留字段1" prop="reservedFields1">
<el-input v-model="formData.reservedFields1" placeholder="请输入预留字段1" />
</el-form-item>
<el-form-item label="预留字段2" prop="reservedFields2">
<el-input v-model="formData.reservedFields2" placeholder="请输入预留字段2" />
</el-form-item>
<el-form-item label="预留字段3" prop="reservedFields3">
<el-input v-model="formData.reservedFields3" placeholder="请输入预留字段3" />
</el-form-item>
<el-form-item label="预留字段4" prop="reservedFields4">
<el-input v-model="formData.reservedFields4" placeholder="请输入预留字段4" />
</el-form-item>
<el-form-item label="预留字段5" prop="reservedFields5">
<el-input v-model="formData.reservedFields5" placeholder="请输入预留字段5" />
</el-form-item>
<el-form-item label="预留字段6" prop="reservedFields6">
<el-input v-model="formData.reservedFields6" placeholder="请输入预留字段6" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import * as ProductApi from '@/api/xxjj/product'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
photo: undefined,
code: undefined,
name: undefined,
productStatus: undefined,
productType: undefined,
shortName: undefined,
barCode: undefined,
boxSurfaceNum: undefined,
spec: undefined,
inventoryType: undefined,
brandId: undefined,
area: undefined,
productTypeId: undefined,
areaCategory: undefined,
dangerousFlag: undefined,
importedFlag: [],
firstSupplierId: undefined,
settlementEntity: undefined,
outputTaxRate: undefined,
inputTaxRate: undefined,
deliveryType: undefined,
manyUnitFlag: undefined,
inventoryUnitId: undefined,
orderMainUnitId: undefined,
orderOtherUnitId: undefined,
salesMainUnitId: undefined,
salesOtherUnitId: undefined,
operateUnitId: undefined,
pricingUnitId: undefined,
purchaseOrderQuantityDown: undefined,
purchaseOrderQuantityUpper: undefined,
purchaseOrderMultiple: undefined,
purchaseInitialAmount: undefined,
purchaseAllowOverchargingRatio: undefined,
purchaseOrderStart: undefined,
purchaseOrderEnd: undefined,
purchaseMode: undefined,
salesOrderQuantityDown: undefined,
salesOrderQuantityUpper: undefined,
salesOrderMultiple: undefined,
salesInitialAmount: undefined,
salesAllowOverchargingRatio: undefined,
salesStart: undefined,
salesEnd: undefined,
salesModeStart: undefined,
salesMode: undefined,
deliverGoodsDate: undefined,
delayNum: undefined,
safetyStock: undefined,
inventoryDayDown: undefined,
inventoryDayUpper: undefined,
inventoryDown: undefined,
inventoryUpper: undefined,
fixedReplenishmentQuantity: undefined,
availableInventory: undefined,
transitInventory: undefined,
manageInventory: undefined,
fromInventory: undefined,
manageBatches: undefined,
transportStoreyBoardNum: undefined,
transportBoxStoreyNum: undefined,
transportBoxBoardNum: undefined,
transportTemperature: undefined,
transportTemperatureDown: undefined,
transportTemperatureUpper: undefined,
storageStoreyBoardNum: undefined,
storageBoxStoreyNum: undefined,
storageBoxBoardNum: undefined,
storageTemperature: undefined,
storageTemperatureDown: undefined,
storageTemperatureUpper: undefined,
qualityInspectionRatio: undefined,
qualityInspectionFrequency: undefined,
qualityInspectionReport: undefined,
qualityInspectionReportStart: undefined,
qualityInspectionReportEnd: undefined,
qualityControl: undefined,
qualityInspectionStandards: undefined,
remark: undefined,
reservedFields1: undefined,
reservedFields2: undefined,
reservedFields3: undefined,
reservedFields4: undefined,
reservedFields5: undefined,
reservedFields6: undefined
})
const formRules = reactive({
productStatus: [{ required: true, message: '商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ProductApi.getProduct(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as ProductApi.ProductVO
if (formType.value === 'create') {
await ProductApi.createProduct(data)
message.success(t('common.createSuccess'))
} else {
await ProductApi.updateProduct(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
photo: undefined,
code: undefined,
name: undefined,
productStatus: undefined,
productType: undefined,
shortName: undefined,
barCode: undefined,
boxSurfaceNum: undefined,
spec: undefined,
inventoryType: undefined,
brandId: undefined,
area: undefined,
productTypeId: undefined,
areaCategory: undefined,
dangerousFlag: undefined,
importedFlag: [],
firstSupplierId: undefined,
settlementEntity: undefined,
outputTaxRate: undefined,
inputTaxRate: undefined,
deliveryType: undefined,
manyUnitFlag: undefined,
inventoryUnitId: undefined,
orderMainUnitId: undefined,
orderOtherUnitId: undefined,
salesMainUnitId: undefined,
salesOtherUnitId: undefined,
operateUnitId: undefined,
pricingUnitId: undefined,
purchaseOrderQuantityDown: undefined,
purchaseOrderQuantityUpper: undefined,
purchaseOrderMultiple: undefined,
purchaseInitialAmount: undefined,
purchaseAllowOverchargingRatio: undefined,
purchaseOrderStart: undefined,
purchaseOrderEnd: undefined,
purchaseMode: undefined,
salesOrderQuantityDown: undefined,
salesOrderQuantityUpper: undefined,
salesOrderMultiple: undefined,
salesInitialAmount: undefined,
salesAllowOverchargingRatio: undefined,
salesStart: undefined,
salesEnd: undefined,
salesModeStart: undefined,
salesMode: undefined,
deliverGoodsDate: undefined,
delayNum: undefined,
safetyStock: undefined,
inventoryDayDown: undefined,
inventoryDayUpper: undefined,
inventoryDown: undefined,
inventoryUpper: undefined,
fixedReplenishmentQuantity: undefined,
availableInventory: undefined,
transitInventory: undefined,
manageInventory: undefined,
fromInventory: undefined,
manageBatches: undefined,
transportStoreyBoardNum: undefined,
transportBoxStoreyNum: undefined,
transportBoxBoardNum: undefined,
transportTemperature: undefined,
transportTemperatureDown: undefined,
transportTemperatureUpper: undefined,
storageStoreyBoardNum: undefined,
storageBoxStoreyNum: undefined,
storageBoxBoardNum: undefined,
storageTemperature: undefined,
storageTemperatureDown: undefined,
storageTemperatureUpper: undefined,
qualityInspectionRatio: undefined,
qualityInspectionFrequency: undefined,
qualityInspectionReport: undefined,
qualityInspectionReportStart: undefined,
qualityInspectionReportEnd: undefined,
qualityControl: undefined,
qualityInspectionStandards: undefined,
remark: undefined,
reservedFields1: undefined,
reservedFields2: undefined,
reservedFields3: undefined,
reservedFields4: undefined,
reservedFields5: undefined,
reservedFields6: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,361 @@
<template>
<ContentWrap title="商品列表">
<el-row>
<el-col :span="24">
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-row>
<el-col :span="24">
<el-form-item label="商品编码" prop="code">
<el-input v-model="queryParams.code" placeholder="请输入商品编码" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="商品名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入商品名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="商品状态" prop="productStatus">
<el-select v-model="queryParams.productStatus" placeholder="请选择商品状态" clearable class="!w-240px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.PRODUCT_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="商品类型" prop="productType">
<el-select v-model="queryParams.productType" placeholder="请选择商品类型" clearable class="!w-240px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.PRODUCT_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="存货类型" prop="inventoryType">
<el-select v-model="queryParams.inventoryType" placeholder="请选择存货类型" clearable class="!w-240px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.SAVE_TYPE)" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" link :icon="Filter" @click="doShowDrawerFilterA(true)"></el-button>
</el-form-item>
<el-row>
<el-col :span="24">
<el-form-item>
<el-button type="primary" @click="openForm('create')" v-hasPermi="['xxjj:product:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['xxjj:product:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-form>
</el-col>
</el-row>
<!-- 列表 -->
<el-row>
<el-col :span="24" style="margin: 10px 0px;">
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="70px" />
<el-table-column label="编号" align="center" prop="id" width="150px" />
<el-table-column label="商品图片" align="center" prop="photo" width="150px" />
<el-table-column label="商品编码" align="center" prop="code" width="150px" />
<el-table-column label="商品名称" align="center" prop="name" width="150px" />
<el-table-column label="商品状态" align="center" prop="productStatus" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PRODUCT_STATUS" :value="scope.row.productStatus" />
</template>
</el-table-column>
<el-table-column label="商品类型" align="center" prop="productType" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PRODUCT_TYPE" :value="scope.row.productType" />
</template>
</el-table-column>
<el-table-column label="商品简称" align="center" prop="shortName" width="150px" />
<el-table-column label="商品条码" align="center" prop="barCode" width="150px" />
<el-table-column label="箱面号" align="center" prop="boxSurfaceNum" width="150px" />
<el-table-column label="商品规格" align="center" prop="spec" width="150px" />
<el-table-column label="存货类型" align="center" prop="inventoryType" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SAVE_TYPE" :value="scope.row.inventoryType" />
</template>
</el-table-column>
<el-table-column label="品牌id" align="center" prop="brandId" width="150px" />
<el-table-column label="地区" align="center" prop="area" width="150px" />
<el-table-column label="关联商品分类id" align="center" prop="productTypeId" width="150px" />
<el-table-column label="商品类目" align="center" prop="areaCategory" width="150px" />
<el-table-column label="危险品" align="center" prop="dangerousFlag" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.DANGEROUS_FLAG" :value="scope.row.dangerousFlag" />
</template>
</el-table-column>
<el-table-column label="进口商品" align="center" prop="importedFlag" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IMPORTED_FLAG" :value="scope.row.importedFlag" />
</template>
</el-table-column>
<el-table-column label="关联一级供应商id" align="center" prop="firstSupplierId" width="150px" />
<el-table-column label="结算主体" align="center" prop="settlementEntity" width="150px" />
<el-table-column label="销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" align="center" prop="outputTaxRate" width="150px" />
<el-table-column label="进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" align="center" prop="inputTaxRate" width="150px" />
<el-table-column label="配送方式(1:仓配 2:直送 3:直达)" align="center" prop="deliveryType" width="150px" />
<el-table-column label="开启多单位(0:否 1:是)" align="center" prop="manyUnitFlag" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MANY_UNIT_FLAG" :value="scope.row.manyUnitFlag" />
</template>
</el-table-column>
<el-table-column label="采购订货时间开始" align="center" prop="purchaseOrderStart" :formatter="dateFormatter"
width="150px" />
<el-table-column label="采购订货时间结束" align="center" prop="purchaseOrderEnd" :formatter="dateFormatter"
width="150px" />
<el-table-column label="采购模式(1:以采定销 2:以销定采)" align="center" prop="purchaseMode" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PURCHASE_WAY" :value="scope.row.purchaseMode" />
</template>
</el-table-column>
<el-table-column label="销售订货量下限" align="center" prop="salesOrderQuantityDown" width="150px" />
<el-table-column label="销售订货量上限" align="center" prop="salesOrderQuantityUpper" width="150px" />
<el-table-column label="销售订货倍数" align="center" prop="salesOrderMultiple" width="150px" />
<el-table-column label="销售起订金额" align="center" prop="salesInitialAmount" width="150px" />
<el-table-column label="允许超收比例" align="center" prop="salesAllowOverchargingRatio" width="150px" />
<el-table-column label="销售时间开始" align="center" prop="salesStart" :formatter="dateFormatter" width="150px" />
<el-table-column label="销售时间结束" align="center" prop="salesEnd" :formatter="dateFormatter" width="150px" />
<el-table-column label="开售模式(1:立即开售 2:定时开售)" align="center" prop="salesModeStart" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SALES_MODE_START" :value="scope.row.salesModeStart" />
</template>
</el-table-column>
<el-table-column label="售卖方式(1:现货 2:预售)" align="center" prop="salesMode" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SALES_MODE" :value="scope.row.salesMode" />
</template>
</el-table-column>
<el-table-column label="送货时间" align="center" prop="deliverGoodsDate" :formatter="dateFormatter" width="150px" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="150px" />
<el-table-column label="操作" align="center" width="150px">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:product:update']">
编辑
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['xxjj:product:delete']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</el-col>
</el-row>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ProductForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="Product">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as ProductApi from '@/api/xxjj/product'
import ProductForm from './ProductForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
photo: null,
code: null,
name: null,
productStatus: null,
productType: null,
shortName: null,
barCode: null,
boxSurfaceNum: null,
spec: null,
inventoryType: null,
brandId: null,
area: null,
productTypeId: null,
areaCategory: null,
dangerousFlag: null,
importedFlag: null,
firstSupplierId: null,
settlementEntity: null,
outputTaxRate: null,
inputTaxRate: null,
deliveryType: null,
manyUnitFlag: null,
inventoryUnitId: null,
orderMainUnitId: null,
orderOtherUnitId: null,
salesMainUnitId: null,
salesOtherUnitId: null,
operateUnitId: null,
pricingUnitId: null,
purchaseOrderQuantityDown: null,
purchaseOrderQuantityUpper: null,
purchaseOrderMultiple: null,
purchaseInitialAmount: null,
purchaseAllowOverchargingRatio: null,
purchaseOrderStart: null,
purchaseOrderEnd: null,
purchaseMode: null,
salesOrderQuantityDown: null,
salesOrderQuantityUpper: null,
salesOrderMultiple: null,
salesInitialAmount: null,
salesAllowOverchargingRatio: null,
salesStart: null,
salesEnd: null,
salesModeStart: null,
salesMode: null,
deliverGoodsDate: [],
delayNum: null,
safetyStock: null,
inventoryDayDown: null,
inventoryDayUpper: null,
inventoryDown: null,
inventoryUpper: null,
fixedReplenishmentQuantity: null,
availableInventory: null,
transitInventory: null,
manageInventory: null,
fromInventory: null,
manageBatches: null,
transportStoreyBoardNum: null,
transportBoxStoreyNum: null,
transportBoxBoardNum: null,
transportTemperature: null,
transportTemperatureDown: null,
transportTemperatureUpper: null,
storageStoreyBoardNum: null,
storageBoxStoreyNum: null,
storageBoxBoardNum: null,
storageTemperature: null,
storageTemperatureDown: null,
storageTemperatureUpper: null,
qualityInspectionRatio: null,
qualityInspectionFrequency: null,
qualityInspectionReport: null,
qualityInspectionReportStart: null,
qualityInspectionReportEnd: null,
qualityControl: null,
qualityInspectionStandards: null,
remark: null,
reservedFields1: null,
reservedFields2: null,
reservedFields3: null,
reservedFields4: null,
reservedFields5: null,
reservedFields6: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ProductApi.getProductPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ProductApi.deleteProduct(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProductApi.exportProduct(queryParams)
download.excel(data, '商品.xls')
} catch {
} finally {
exportLoading.value = false
}
}
//
let isShowDrawerFilterA = ref(false);
const doShowDrawerFilterA = (isshow: boolean) => {
isShowDrawerFilterA.value = isshow;
}
// const doCloseDrawerFilterA = (isshow: boolean) => {
// isShowDrawerFilterA.value = isshow;
// }
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
<style lang="scss">
.xy-table thead {
color: #1D2129;
}
</style>

@ -0,0 +1,421 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="商品编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入商品编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="商品名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入商品名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)" prop="productStatus">
<el-select
v-model="queryParams.productStatus"
placeholder="请选择商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.PRODUCT_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)" prop="productType">
<el-select
v-model="queryParams.productType"
placeholder="请选择商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.PRODUCT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="存货类型(1:原材料 2:半成品 3:产成品)" prop="inventoryType">
<el-select
v-model="queryParams.inventoryType"
placeholder="请选择存货类型(1:原材料 2:半成品 3:产成品)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.SAVE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button type="primary" @click="openForm('create')" v-hasPermi="['xxjj:product:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['xxjj:product:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="70px" />
<el-table-column label="编号" align="center" prop="id" width="150px"/>
<el-table-column label="商品图片" align="center" prop="photo" width="150px"/>
<el-table-column label="商品编码" align="center" prop="code" width="150px"/>
<el-table-column label="商品名称" align="center" prop="name" width="150px"/>
<el-table-column label="商品状态(0待提交 1待审核 2待上架 3已上架 4已下架)" align="center" prop="productStatus" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PRODUCT_STATUS" :value="scope.row.productStatus" />
</template>
</el-table-column>
<el-table-column label="商品类型(1:实物商品 2:虚拟商品 3:电子卡券 4:设备/器材 5:耗材/辅材)" align="center" prop="productType" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PRODUCT_TYPE" :value="scope.row.productType" />
</template>
</el-table-column>
<el-table-column label="商品简称" align="center" prop="shortName" width="150px"/>
<el-table-column label="商品条码" align="center" prop="barCode" width="150px"/>
<el-table-column label="箱面号" align="center" prop="boxSurfaceNum" width="150px"/>
<el-table-column label="商品规格" align="center" prop="spec" width="150px"/>
<el-table-column label="存货类型(1:原材料 2:半成品 3:产成品)" align="center" prop="inventoryType" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SAVE_TYPE" :value="scope.row.inventoryType" />
</template>
</el-table-column>
<el-table-column label="品牌id" align="center" prop="brandId" width="150px"/>
<el-table-column label="地区" align="center" prop="area" width="150px"/>
<el-table-column label="关联商品分类id" align="center" prop="productTypeId" width="150px"/>
<el-table-column label="商品类目" align="center" prop="areaCategory" width="150px"/>
<el-table-column label="危险品(0:否 1:是)" align="center" prop="dangerousFlag" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.DANGEROUS_FLAG" :value="scope.row.dangerousFlag" />
</template>
</el-table-column>
<el-table-column label="进口商品(0:否 1:是)" align="center" prop="importedFlag" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IMPORTED_FLAG" :value="scope.row.importedFlag" />
</template>
</el-table-column>
<el-table-column label="关联一级供应商id" align="center" prop="firstSupplierId" width="150px"/>
<el-table-column label="结算主体" align="center" prop="settlementEntity" width="150px"/>
<el-table-column label="销项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" align="center" prop="outputTaxRate" width="150px"/>
<el-table-column label="进项税率(1:0% 2:1% 3:2% 4:3% 5:4%)" align="center" prop="inputTaxRate" width="150px"/>
<el-table-column label="配送方式(1:仓配 2:直送 3:直达)" align="center" prop="deliveryType" width="150px"/>
<el-table-column label="开启多单位(0:否 1:是)" align="center" prop="manyUnitFlag" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MANY_UNIT_FLAG" :value="scope.row.manyUnitFlag" />
</template>
</el-table-column>
<el-table-column
label="采购订货时间开始"
align="center"
prop="purchaseOrderStart"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column
label="采购订货时间结束"
align="center"
prop="purchaseOrderEnd"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="采购模式(1:以采定销 2:以销定采)" align="center" prop="purchaseMode" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PURCHASE_WAY" :value="scope.row.purchaseMode" />
</template>
</el-table-column>
<el-table-column label="销售订货量下限" align="center" prop="salesOrderQuantityDown" width="150px"/>
<el-table-column label="销售订货量上限" align="center" prop="salesOrderQuantityUpper" width="150px"/>
<el-table-column label="销售订货倍数" align="center" prop="salesOrderMultiple" width="150px"/>
<el-table-column label="销售起订金额" align="center" prop="salesInitialAmount" width="150px"/>
<el-table-column label="允许超收比例" align="center" prop="salesAllowOverchargingRatio" width="150px"/>
<el-table-column
label="销售时间开始"
align="center"
prop="salesStart"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column
label="销售时间结束"
align="center"
prop="salesEnd"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="开售模式(1:立即开售 2:定时开售)" align="center" prop="salesModeStart" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SALES_MODE_START" :value="scope.row.salesModeStart" />
</template>
</el-table-column>
<el-table-column label="售卖方式(1:现货 2:预售)" align="center" prop="salesMode" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SALES_MODE" :value="scope.row.salesMode" />
</template>
</el-table-column>
<el-table-column
label="送货时间"
align="center"
prop="deliverGoodsDate"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="操作" align="center" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:product:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['xxjj:product:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ProductForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="Product">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as ProductApi from '@/api/xxjj/product'
import ProductForm from './ProductForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
photo: null,
code: null,
name: null,
productStatus: null,
productType: null,
shortName: null,
barCode: null,
boxSurfaceNum: null,
spec: null,
inventoryType: null,
brandId: null,
area: null,
productTypeId: null,
areaCategory: null,
dangerousFlag: null,
importedFlag: null,
firstSupplierId: null,
settlementEntity: null,
outputTaxRate: null,
inputTaxRate: null,
deliveryType: null,
manyUnitFlag: null,
inventoryUnitId: null,
orderMainUnitId: null,
orderOtherUnitId: null,
salesMainUnitId: null,
salesOtherUnitId: null,
operateUnitId: null,
pricingUnitId: null,
purchaseOrderQuantityDown: null,
purchaseOrderQuantityUpper: null,
purchaseOrderMultiple: null,
purchaseInitialAmount: null,
purchaseAllowOverchargingRatio: null,
purchaseOrderStart: null,
purchaseOrderEnd: null,
purchaseMode: null,
salesOrderQuantityDown: null,
salesOrderQuantityUpper: null,
salesOrderMultiple: null,
salesInitialAmount: null,
salesAllowOverchargingRatio: null,
salesStart: null,
salesEnd: null,
salesModeStart: null,
salesMode: null,
deliverGoodsDate: [],
delayNum: null,
safetyStock: null,
inventoryDayDown: null,
inventoryDayUpper: null,
inventoryDown: null,
inventoryUpper: null,
fixedReplenishmentQuantity: null,
availableInventory: null,
transitInventory: null,
manageInventory: null,
fromInventory: null,
manageBatches: null,
transportStoreyBoardNum: null,
transportBoxStoreyNum: null,
transportBoxBoardNum: null,
transportTemperature: null,
transportTemperatureDown: null,
transportTemperatureUpper: null,
storageStoreyBoardNum: null,
storageBoxStoreyNum: null,
storageBoxBoardNum: null,
storageTemperature: null,
storageTemperatureDown: null,
storageTemperatureUpper: null,
qualityInspectionRatio: null,
qualityInspectionFrequency: null,
qualityInspectionReport: null,
qualityInspectionReportStart: null,
qualityInspectionReportEnd: null,
qualityControl: null,
qualityInspectionStandards: null,
remark: null,
reservedFields1: null,
reservedFields2: null,
reservedFields3: null,
reservedFields4: null,
reservedFields5: null,
reservedFields6: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ProductApi.getProductPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ProductApi.deleteProduct(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProductApi.exportProduct(queryParams)
download.excel(data, '商品.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -1,6 +1,6 @@
<template>
<div>
<el-card class="box-card xy-y1">
<el-card class="xy-card xy-margin-zero">
<template #header>
<el-button type="" link>返回</el-button>
</template>
@ -89,7 +89,7 @@
</el-row>
</template>
</el-card>
<el-tabs v-model="activeTabN">
<el-tabs v-model="activeTabN" class="xy-tabs">
<el-tab-pane label="基础信息" name="tabN1">
<template v-if="activeTabN == 'tabN1'">
<InfoBasic />
@ -148,63 +148,5 @@ const activeTabN = ref('tabN1')
</script>
<style lang="scss">
.xy-tabs {
.el-tabs--top .el-tabs__item.is-top:nth-child(2) {
padding-left: 10px;
}
}
.xy-card {
.el-card__header {
background-color: #F7F8FA;
}
}
.xy-card-info.is-always-shadow {
box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);
}
.xy-card-info {
border: 0px;
.el-card__header {
padding: 16px 0px;
background-color: inherit;
.xy-card-info-icona {
top: 10px;
width: 5px;
height: 24px;
float: left;
background-color: #005EFE;
}
.xy-card-info-text {
margin-left: 10px;
}
}
.el-card__body {
padding: 15px 0px;
.el-row {
margin: 10px;
}
}
}
</style>
<style lang="scss" scoped>
.xy-y1 {
.xy-label {
text-align: right;
color: #86909C;
}
.xy-text {
color: #1D2129;
}
}
@import '@/styles/cus.scss';
</style>

@ -93,7 +93,8 @@
<el-col :span="18">
<el-row>
<el-col :span="24">{{ scope.row.name }}</el-col>
<el-col :span="24"><dict-tag :type="DICT_TYPE.customer_type" :value="scope.row.reservedFields1" /></el-col>
<el-col :span="24"><dict-tag :type="DICT_TYPE.customer_type"
:value="scope.row.reservedFields1" /></el-col>
</el-row>
</el-col>
</el-row>
@ -121,7 +122,7 @@
</el-table-column>
<el-table-column label="客户星级" prop="customerStarrating" width="150px">
<template #default="scope">
<el-rate v-model="scope.row.customerStarrating" :disabled="true"/>
<el-rate v-model="scope.row.customerStarrating" :disabled="true" />
</template>
</el-table-column>
<el-table-column label="业务进度" prop="industrySchedule" width="120px">
@ -197,7 +198,7 @@ const { t } = useI18n() // 国际化
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
let queryParams : any = reactive({
let queryParams: any = reactive({
pageNo: 1,
pageSize: 10,
businessType: null,
@ -311,8 +312,10 @@ const resetQuery = () => {
/** 添加/修改操作 */
const formRef = ref()
const router = useRouter()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
router.push({ path: '/customer/customer-add' })
//formRef.value.open(type, id)
}
/** 新建任务操作 */
@ -322,12 +325,12 @@ const openForm2 = (type: string, id?: number) => {
}
const subjectTransferFormRef = ref()
const openForm3 = (type: string, id?: number) => {
if(multipleSelection.value == undefined || multipleSelection.value.length <= 0){
if (multipleSelection.value == undefined || multipleSelection.value.length <= 0) {
message.error(t('请选择需要转移的客户'))
return
}
let customerIds : any = ref([])
let belongingPeoples : any = ref([])
let customerIds: any = ref([])
let belongingPeoples: any = ref([])
multipleSelection.value.forEach(element => {
customerIds.value.push(element.id);
belongingPeoples.value.push(element.belongingPeople);

@ -1,5 +1,5 @@
<template>
<el-card class="xy-card-b">
<el-card class="xy-card xy-margin-zero">
<template #header>
流程进度
</template>
@ -14,7 +14,7 @@
</template>
</el-card>
<el-card class="xy-card-b">
<el-card class="xy-card">
<template #header>
操作记录
</template>
@ -311,55 +311,6 @@ const tbDataA = [
]
</script>
<style lang="scss">
// .xy-card-b {
// margin: 16px 24px;
// .el-card__header {
// background-color: #F7F8FA;
// height: 48px;
// padding: 12px 16px;
// color: #666666;
// }
// }
// .xy-card {
// .el-card__header {
// background-color: #F7F8FA;
// }
// }
// .xy-card-info.is-always-shadow {
// box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);
// }
// .xy-card-info {
// border: 0px;
// .el-card__header {
// padding: 16px 0px;
// background-color: inherit;
// .xy-card-info-icona {
// top: 10px;
// width: 5px;
// height: 24px;
// float: left;
// background-color: #005EFE;
// }
// .xy-card-info-text {
// margin-left: 10px;
// }
// }
// .el-card__body {
// padding: 15px 0px;
// .el-row {
// margin: 10px;
// }
// }
// }
<style lang="scss" scoped>
</style>

@ -1,5 +1,5 @@
<template>
<el-card class="xy-card-b">
<el-card class="xy-card xy-margin-zero">
<template #header>
财务信息
</template>

@ -1,5 +1,5 @@
<template>
<el-card class="box-card">
<el-card class="xy-card xy-margin-zero">
<template #header>
<div class="card-header">
<span>日志记录</span>

@ -1,5 +1,5 @@
<template>
<el-card class="box-card">
<el-card class="xy-card xy-margin-zero">
<template #header>
<div class="card-header">
<span>操作记录</span>

@ -1,5 +1,5 @@
<template>
<el-card class="xy-card-b">
<el-card class="xy-card xy-margin-zero">
<template #header>
资质信息
</template>

Loading…
Cancel
Save