diff --git a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java index eae0d83..70eaea2 100644 --- a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java +++ b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java @@ -11,11 +11,13 @@ public interface ErrorCodeConstants extends cn.hangtag.module.system.enums.Erro ErrorCode DRAFT_DESIGN_DATA_NOT_EXISTS = new ErrorCode(3500, "稿件模板数据 不存在"); ErrorCode SALE_ORDER_NOT_EXISTS = new ErrorCode(3600, "OMS销售订单主表不存在"); ErrorCode SALE_ORDER_ENTRY_NOT_EXISTS = new ErrorCode(3700, "OMS销售订单明细不存在"); + ErrorCode SALE_ORDER_ENTRY_PRICE_NOT_NULL= new ErrorCode(3701, "单价不允许为空"); ErrorCode CUSTOMER_BRAND_NOT_EXISTS = new ErrorCode(3800, "客户和品牌关联不存在"); ErrorCode PRODUCT_CARE_ITEM_NOT_EXISTS = new ErrorCode(3900, "产品保养项 不存在"); ErrorCode PRODUCE_ORDER_NOT_EXISTS = new ErrorCode(4000, "生产制单不存在"); ErrorCode PRODUCE_ORDER_EXISTS = new ErrorCode(4002, "生产制单已经存在"); ErrorCode PRODUCE_ORDER_IMPORT_LIST_IS_EMPTY = new ErrorCode(4003, "导入生产制单数据不能为空"); ErrorCode SALE_CONTRACT_NOT_EXISTS = new ErrorCode(5000, "OMS销售合约不存在"); + ErrorCode PRODUCT_PRICE_NOT_EXISTS = new ErrorCode(600, "产品单价记录不存在"); } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderImportExcelVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderImportExcelVO.java index 4a36024..057fa29 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderImportExcelVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderImportExcelVO.java @@ -80,6 +80,6 @@ public class ProduceOrderImportExcelVO { @Schema(description = "交货数量") @ExcelProperty("交货数量") - private Integer deliveryQty; + private Long deliveryQty; } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderRespVO.java index 1fe4cfe..bb52129 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderRespVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderRespVO.java @@ -28,6 +28,10 @@ public class ProduceOrderRespVO { @ExcelProperty("客户编号") private String customerCode; + @Schema(description = "产品编号", example = "11111") + @ExcelProperty("产品编号") + private String productCode; + @Schema(description = "产品名称", example = "王五") @ExcelProperty("产品名称") private String productName; @@ -86,6 +90,6 @@ public class ProduceOrderRespVO { @Schema(description = "交货数量") @ExcelProperty("交货数量") - private Integer deliveryQty; + private Long deliveryQty; } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderSaveReqVO.java index a7f5bc6..ddc0848 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderSaveReqVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/produceorder/vo/ProduceOrderSaveReqVO.java @@ -72,6 +72,6 @@ public class ProduceOrderSaveReqVO { private LocalDateTime deliverydate; @Schema(description = "交货数量") - private Integer deliveryQty; + private Long deliveryQty; } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/ProductPriceController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/ProductPriceController.java new file mode 100644 index 0000000..20b1fc8 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/ProductPriceController.java @@ -0,0 +1,95 @@ +package cn.hangtag.module.oms.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 cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.framework.common.util.object.BeanUtils; +import static cn.hangtag.framework.common.pojo.CommonResult.success; + +import cn.hangtag.framework.excel.core.util.ExcelUtils; + +import cn.hangtag.framework.apilog.core.annotation.ApiAccessLog; +import static cn.hangtag.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.hangtag.module.oms.controller.admin.product.vo.*; +import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO; +import cn.hangtag.module.oms.service.product.ProductPriceService; + +@Tag(name = "管理后台 - 产品单价记录") +@RestController +@RequestMapping("/oms/product-price") +@Validated +public class ProductPriceController { + + @Resource + private ProductPriceService productPriceService; + + @PostMapping("/create") + @Operation(summary = "创建产品单价记录") + @PreAuthorize("@ss.hasPermission('oms:product-price:create')") + public CommonResult createProductPrice(@Valid @RequestBody ProductPriceSaveReqVO createReqVO) { + return success(productPriceService.createProductPrice(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新产品单价记录") + @PreAuthorize("@ss.hasPermission('oms:product-price:update')") + public CommonResult updateProductPrice(@Valid @RequestBody ProductPriceSaveReqVO updateReqVO) { + productPriceService.updateProductPrice(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除产品单价记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('oms:product-price:delete')") + public CommonResult deleteProductPrice(@RequestParam("id") Long id) { + productPriceService.deleteProductPrice(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得产品单价记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('oms:product-price:query')") + public CommonResult getProductPrice(@RequestParam("id") Long id) { + ProductPriceDO productPrice = productPriceService.getProductPrice(id); + return success(BeanUtils.toBean(productPrice, ProductPriceRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得产品单价记录分页") + @PreAuthorize("@ss.hasPermission('oms:product-price:query')") + public CommonResult> getProductPricePage(@Valid ProductPricePageReqVO pageReqVO) { + PageResult pageResult = productPriceService.getProductPricePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ProductPriceRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出产品单价记录 Excel") + @PreAuthorize("@ss.hasPermission('oms:product-price:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportProductPriceExcel(@Valid ProductPricePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = productPriceService.getProductPricePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "产品单价记录.xls", "数据", ProductPriceRespVO.class, + BeanUtils.toBean(list, ProductPriceRespVO.class)); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPricePageReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPricePageReqVO.java new file mode 100644 index 0000000..08d83ad --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPricePageReqVO.java @@ -0,0 +1,29 @@ +package cn.hangtag.module.oms.controller.admin.product.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.hangtag.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.hangtag.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 ProductPricePageReqVO extends PageParam { + + @Schema(description = "产品id", example = "25258") + private Long productId; + + @Schema(description = "单价", example = "6732") + private BigDecimal price; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPriceRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPriceRespVO.java new file mode 100644 index 0000000..4e6a3fa --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPriceRespVO.java @@ -0,0 +1,32 @@ +package cn.hangtag.module.oms.controller.admin.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 产品单价记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ProductPriceRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9841") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "产品id", example = "25258") + @ExcelProperty("产品id") + private Long productId; + + @Schema(description = "单价", example = "6732") + @ExcelProperty("单价") + private BigDecimal price; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPriceSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPriceSaveReqVO.java new file mode 100644 index 0000000..841307e --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/product/vo/ProductPriceSaveReqVO.java @@ -0,0 +1,21 @@ +package cn.hangtag.module.oms.controller.admin.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 产品单价记录新增/修改 Request VO") +@Data +public class ProductPriceSaveReqVO { + @Schema(description = "ID", example = "25258") + private Long id; + + @Schema(description = "产品id", example = "25258") + private Long productId; + + @Schema(description = "单价", example = "6732") + private BigDecimal price; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/produceorder/ProduceOrderDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/produceorder/ProduceOrderDO.java index 6cb39dd..cfd840e 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/produceorder/ProduceOrderDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/produceorder/ProduceOrderDO.java @@ -115,6 +115,6 @@ public class ProduceOrderDO extends BaseDO { /** * 交货数量 */ - private Integer deliveryQty; + private Long deliveryQty; } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/product/ProductPriceDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/product/ProductPriceDO.java new file mode 100644 index 0000000..3a78efa --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/product/ProductPriceDO.java @@ -0,0 +1,40 @@ +package cn.hangtag.module.oms.dal.dataobject.product; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; + +/** + * 产品单价记录 DO + * + * @author wwb + */ +@TableName("oms_product_price") +@KeySequence("oms_product_price_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProductPriceDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 产品id + */ + private Long productId; + /** + * 单价 + */ + private BigDecimal price; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/product/ProductPriceMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/product/ProductPriceMapper.java new file mode 100644 index 0000000..e728112 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/product/ProductPriceMapper.java @@ -0,0 +1,33 @@ +package cn.hangtag.module.oms.dal.mysql.product; + +import java.util.*; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO; +import org.apache.ibatis.annotations.Mapper; +import cn.hangtag.module.oms.controller.admin.product.vo.*; + +/** + * 产品单价记录 Mapper + * + * @author wwb + */ +@Mapper +public interface ProductPriceMapper extends BaseMapperX { + + default PageResult selectPage(ProductPricePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ProductPriceDO::getProductId, reqVO.getProductId()) + .eqIfPresent(ProductPriceDO::getPrice, reqVO.getPrice()) + .betweenIfPresent(ProductPriceDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ProductPriceDO::getId)); + } + + default ProductPriceDO getProductPriceByProductId(Long productId){ + return selectOne(new LambdaQueryWrapperX() + .eqIfPresent(ProductPriceDO::getProductId, productId) + .orderByDesc(ProductPriceDO::getCreateTime)); + } +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/product/ProductPriceService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/product/ProductPriceService.java new file mode 100644 index 0000000..75d84ba --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/product/ProductPriceService.java @@ -0,0 +1,57 @@ +package cn.hangtag.module.oms.service.product; + +import java.util.*; +import javax.validation.*; +import cn.hangtag.module.oms.controller.admin.product.vo.*; +import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; + +/** + * 产品单价记录 Service 接口 + * + * @author wwb + */ +public interface ProductPriceService { + + /** + * 创建产品单价记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProductPrice(@Valid ProductPriceSaveReqVO createReqVO); + + /** + * 更新产品单价记录 + * + * @param updateReqVO 更新信息 + */ + void updateProductPrice(@Valid ProductPriceSaveReqVO updateReqVO); + + /** + * 删除产品单价记录 + * + * @param id 编号 + */ + void deleteProductPrice(Long id); + + /** + * 获得产品单价记录 + * + * @param id 编号 + * @return 产品单价记录 + */ + ProductPriceDO getProductPrice(Long id); + + ProductPriceDO getProductPriceByProductId(Long productId); + + /** + * 获得产品单价记录分页 + * + * @param pageReqVO 分页查询 + * @return 产品单价记录分页 + */ + PageResult getProductPricePage(ProductPricePageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/product/ProductPriceServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/product/ProductPriceServiceImpl.java new file mode 100644 index 0000000..5071507 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/product/ProductPriceServiceImpl.java @@ -0,0 +1,79 @@ +package cn.hangtag.module.oms.service.product; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.hangtag.module.oms.controller.admin.product.vo.*; +import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.util.object.BeanUtils; + +import cn.hangtag.module.oms.dal.mysql.product.ProductPriceMapper; + +import static cn.hangtag.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.hangtag.module.oms.enums.ErrorCodeConstants.*; + +/** + * 产品单价记录 Service 实现类 + * + * @author wwb + */ +@Service +@Validated +public class ProductPriceServiceImpl implements ProductPriceService { + + @Resource + private ProductPriceMapper productPriceMapper; + + @Override + public Long createProductPrice(ProductPriceSaveReqVO createReqVO) { + // 插入 + ProductPriceDO productPrice = BeanUtils.toBean(createReqVO, ProductPriceDO.class); + productPriceMapper.insert(productPrice); + // 返回 + return productPrice.getId(); + } + + @Override + public void updateProductPrice(ProductPriceSaveReqVO updateReqVO) { + // 校验存在 + validateProductPriceExists(updateReqVO.getId()); + // 更新 + ProductPriceDO updateObj = BeanUtils.toBean(updateReqVO, ProductPriceDO.class); + productPriceMapper.updateById(updateObj); + } + + @Override + public void deleteProductPrice(Long id) { + // 校验存在 + validateProductPriceExists(id); + // 删除 + productPriceMapper.deleteById(id); + } + + private void validateProductPriceExists(Long id) { + if (productPriceMapper.selectById(id) == null) { + throw exception(PRODUCT_PRICE_NOT_EXISTS); + } + } + + @Override + public ProductPriceDO getProductPrice(Long id) { + return productPriceMapper.selectById(id); + } + + @Override + public ProductPriceDO getProductPriceByProductId(Long productId) { + return productPriceMapper.getProductPriceByProductId(productId); + } + + @Override + public PageResult getProductPricePage(ProductPricePageReqVO pageReqVO) { + return productPriceMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java index b800c00..704b8f6 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java @@ -1,16 +1,20 @@ package cn.hangtag.module.oms.service.saleorder; +import cn.hangtag.framework.common.exception.ServiceException; +import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.hangtag.framework.common.pojo.PageResult; import cn.hangtag.framework.common.util.object.BeanUtils; import cn.hangtag.module.oms.common.utils.NumberChineseFormatterUtils; import cn.hangtag.module.oms.common.utils.WKHtmlToPdfUtil; import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; import cn.hangtag.module.oms.controller.admin.produceorder.vo.ProduceOrderSaveReqVO; +import cn.hangtag.module.oms.controller.admin.product.vo.ProductPriceSaveReqVO; import cn.hangtag.module.oms.controller.admin.salecontract.vo.SaleContractSaveReqVO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderPageReqVO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderSaveReqVO; import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderSummaryRespVO; import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO; import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; import cn.hangtag.module.oms.dal.dataobject.salecontract.SaleContractDO; import cn.hangtag.module.oms.dal.dataobject.salecontractentry.SaleContractEntryDO; @@ -18,10 +22,12 @@ import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; import cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO; import cn.hangtag.module.oms.dal.mysql.saleorder.SaleOrderMapper; import cn.hangtag.module.oms.dal.mysql.saleorderentry.SaleOrderEntryMapper; +import cn.hangtag.module.oms.enums.ErrorCodeConstants; import cn.hangtag.module.oms.enums.common.BillStatusEnum; import cn.hangtag.module.oms.enums.saleorder.SaleOrderStatusEnum; import cn.hangtag.module.oms.service.customer.CustomerService; import cn.hangtag.module.oms.service.produceorder.ProduceOrderService; +import cn.hangtag.module.oms.service.product.ProductPriceService; import cn.hangtag.module.oms.service.productinfo.ProductInfoService; import cn.hangtag.module.oms.service.salecontract.SaleContractService; import cn.hutool.core.date.DateUtil; @@ -75,7 +81,8 @@ public class SaleOrderServiceImpl implements SaleOrderService { private SaleContractService saleContractService; @Resource private CustomerService customerService; - + @Resource + private ProductPriceService productPriceService; @Resource private TemplateEngine templateEngine; @@ -84,8 +91,8 @@ public class SaleOrderServiceImpl implements SaleOrderService { public Long createSaleOrder(SaleOrderSaveReqVO createReqVO) { // 插入 SaleOrderDO saleOrder = BeanUtils.toBean(createReqVO, SaleOrderDO.class); + saleOrder.setOrderStatus(SaleOrderStatusEnum.YXD.getValue()); saleOrderMapper.insert(saleOrder); - // 插入子表 createSaleOrderEntryList(saleOrder.getId(), createReqVO.getSaleOrderEntrys()); // 返回 @@ -137,6 +144,17 @@ public class SaleOrderServiceImpl implements SaleOrderService { @Override public List getSaleOrderEntryListByParentId(Long parentId) { + //加载历史产品价格记录 + List entrys = saleOrderEntryMapper.selectListByParentId(parentId); + for (cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO entry : entrys) { + BigDecimal price = entry.getPrice(); + if(price==null){ + ProductPriceDO productPrice = productPriceService.getProductPriceByProductId(entry.getParentId()); + if(productPrice!=null){ + entry.setPrice(productPrice.getPrice()); + } + } + } return saleOrderEntryMapper.selectListByParentId(parentId); } @@ -163,6 +181,7 @@ public class SaleOrderServiceImpl implements SaleOrderService { for (SaleOrderDO saleOrder : saleOrders) { if(!BillStatusEnum.AUDIT.getValue().equals(saleOrder.getBillStatus())){ saleOrder.setBillStatus(BillStatusEnum.INVALID.getValue()); + saleOrder.setOrderStatus(SaleOrderStatusEnum.YXD.getValue()); saleOrderMapper.updateById(saleOrder); } } @@ -171,6 +190,7 @@ public class SaleOrderServiceImpl implements SaleOrderService { for (SaleOrderDO saleOrder : saleOrders) { if(!BillStatusEnum.AUDIT.getValue().equals(saleOrder.getBillStatus()) && (params!=null && params.size()>0)){ saleOrder.setBillStatus(BillStatusEnum.REJECT.getValue()); + saleOrder.setOrderStatus(SaleOrderStatusEnum.YXD.getValue()); saleOrder.setRejectReason((String)params.get("rejectReason")); saleOrderMapper.updateById(saleOrder); } @@ -180,6 +200,7 @@ public class SaleOrderServiceImpl implements SaleOrderService { for (SaleOrderDO saleOrder : saleOrders) { if(BillStatusEnum.SAVE.getValue().equals(saleOrder.getBillStatus())){ saleOrder.setBillStatus(BillStatusEnum.SUBMIT.getValue()); + saleOrder.setOrderStatus(SaleOrderStatusEnum.SCZ.getValue()); saleOrderMapper.updateById(saleOrder); } } @@ -188,13 +209,39 @@ public class SaleOrderServiceImpl implements SaleOrderService { for (SaleOrderDO saleOrder : saleOrders) { if(BillStatusEnum.SUBMIT.getValue().equals(saleOrder.getBillStatus())){ saleOrder.setBillStatus(BillStatusEnum.AUDIT.getValue()); + saleOrder.setOrderStatus(SaleOrderStatusEnum.YWC.getValue()); saleOrderMapper.updateById(saleOrder); + List entrys = getSaleOrderEntryListByParentId(saleOrder.getId()); + for (cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO entry : entrys) { + BigDecimal price = entry.getPrice(); + if(price==null){ + throw new ServiceException(ErrorCodeConstants.SALE_ORDER_ENTRY_PRICE_NOT_NULL); + } + } + + //生成产品单价记录 + for (cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO entry : entrys) { + Long parentId = entry.getParentId(); + BigDecimal price = entry.getPrice(); + generateProductPrice(parentId,price); + } } } break; } } + + /** + * 生成产品单价记录 + */ + private void generateProductPrice(Long productId,BigDecimal price){ + ProductPriceSaveReqVO saveReqVO = new ProductPriceSaveReqVO(); + saveReqVO.setProductId(productId); + saveReqVO.setPrice(price); + productPriceService.createProductPrice(saveReqVO); + + } @Override public void generateProduceOrder(List ids) { List saleOrders = saleOrderMapper.selectList(SaleOrderDO::getId, ids); @@ -205,7 +252,7 @@ public class SaleOrderServiceImpl implements SaleOrderService { saveReqVO.setProductId(0L); saveReqVO.setProduceLine("测试线"); saveReqVO.setDeliveryMethod("交货方式"); - saveReqVO.setDeliveryQty(1111111); + saveReqVO.setDeliveryQty(1111111L); saveReqVO.setDays(5L); saveReqVO.setClerk("职员"); saveReqVO.setContractDate(LocalDateTime.now() ); diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/product/ProductPriceMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/product/ProductPriceMapper.xml new file mode 100644 index 0000000..2438896 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/product/ProductPriceMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/test/java/cn/hangtag/module/oms/service/product/ProductPriceServiceImplTest.java b/hangtag-module-oms/hangtag-module-oms-biz/src/test/java/cn/hangtag/module/oms/service/product/ProductPriceServiceImplTest.java new file mode 100644 index 0000000..540c69c --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/test/java/cn/hangtag/module/oms/service/product/ProductPriceServiceImplTest.java @@ -0,0 +1,138 @@ +package cn.hangtag.module.oms.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 cn.hangtag.framework.test.core.ut.BaseDbUnitTest; + +import cn.hangtag.module.oms.controller.admin.product.vo.*; +import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO; +import cn.hangtag.module.oms.dal.mysql.product.ProductPriceMapper; +import cn.hangtag.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 cn.hangtag.module.oms.enums.ErrorCodeConstants.*; +import static cn.hangtag.framework.test.core.util.AssertUtils.*; +import static cn.hangtag.framework.test.core.util.RandomUtils.*; +import static cn.hangtag.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.hangtag.framework.common.util.object.ObjectUtils.*; +import static cn.hangtag.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link ProductPriceServiceImpl} 的单元测试类 + * + * @author wwb + */ +@Import(ProductPriceServiceImpl.class) +public class ProductPriceServiceImplTest extends BaseDbUnitTest { + + @Resource + private ProductPriceServiceImpl productPriceService; + + @Resource + private ProductPriceMapper productPriceMapper; + + @Test + public void testCreateProductPrice_success() { + // 准备参数 + ProductPriceSaveReqVO createReqVO = randomPojo(ProductPriceSaveReqVO.class).setId(null); + + // 调用 + Integer productPriceId = productPriceService.createProductPrice(createReqVO); + // 断言 + assertNotNull(productPriceId); + // 校验记录的属性是否正确 + ProductPriceDO productPrice = productPriceMapper.selectById(productPriceId); + assertPojoEquals(createReqVO, productPrice, "id"); + } + + @Test + public void testUpdateProductPrice_success() { + // mock 数据 + ProductPriceDO dbProductPrice = randomPojo(ProductPriceDO.class); + productPriceMapper.insert(dbProductPrice);// @Sql: 先插入出一条存在的数据 + // 准备参数 + ProductPriceSaveReqVO updateReqVO = randomPojo(ProductPriceSaveReqVO.class, o -> { + o.setId(dbProductPrice.getId()); // 设置更新的 ID + }); + + // 调用 + productPriceService.updateProductPrice(updateReqVO); + // 校验是否更新正确 + ProductPriceDO productPrice = productPriceMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, productPrice); + } + + @Test + public void testUpdateProductPrice_notExists() { + // 准备参数 + ProductPriceSaveReqVO updateReqVO = randomPojo(ProductPriceSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> productPriceService.updateProductPrice(updateReqVO), PRODUCT_PRICE_NOT_EXISTS); + } + + @Test + public void testDeleteProductPrice_success() { + // mock 数据 + ProductPriceDO dbProductPrice = randomPojo(ProductPriceDO.class); + productPriceMapper.insert(dbProductPrice);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Integer id = dbProductPrice.getId(); + + // 调用 + productPriceService.deleteProductPrice(id); + // 校验数据不存在了 + assertNull(productPriceMapper.selectById(id)); + } + + @Test + public void testDeleteProductPrice_notExists() { + // 准备参数 + Integer id = randomIntegerId(); + + // 调用, 并断言异常 + assertServiceException(() -> productPriceService.deleteProductPrice(id), PRODUCT_PRICE_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetProductPricePage() { + // mock 数据 + ProductPriceDO dbProductPrice = randomPojo(ProductPriceDO.class, o -> { // 等会查询到 + o.setProductId(null); + o.setPrice(null); + o.setCreateTime(null); + }); + productPriceMapper.insert(dbProductPrice); + // 测试 productId 不匹配 + productPriceMapper.insert(cloneIgnoreId(dbProductPrice, o -> o.setProductId(null))); + // 测试 price 不匹配 + productPriceMapper.insert(cloneIgnoreId(dbProductPrice, o -> o.setPrice(null))); + // 测试 createTime 不匹配 + productPriceMapper.insert(cloneIgnoreId(dbProductPrice, o -> o.setCreateTime(null))); + // 准备参数 + ProductPricePageReqVO reqVO = new ProductPricePageReqVO(); + reqVO.setProductId(null); + reqVO.setPrice(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = productPriceService.getProductPricePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbProductPrice, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/DataForm.vue b/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/DataForm.vue new file mode 100644 index 0000000..30434c8 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/DataForm.vue @@ -0,0 +1,69 @@ + + diff --git a/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/config.data.ts b/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/config.data.ts new file mode 100644 index 0000000..03fe29a --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/config.data.ts @@ -0,0 +1,43 @@ +import type { CrudSchema } from '@/hooks/web/useCrudSchemas' +import { dateFormatter } from '@/utils/formatTime' + +// 表单校验 +export const rules = reactive({ + code: [required], + name: [required], +}) + +// CrudSchema https://doc.iocoder.cn/vue3/crud-schema/ +const crudSchemas = reactive([ + { + label: 'id', + field: 'id', + isForm: false, + }, + { + label: '编码', + field: 'code', + isSearch: true, + }, + { + label: '名称', + field: 'name', + isSearch: true, + }, + { + label: '创建时间', + field: 'createTime', + formatter: dateFormatter, + isSearch: true, + search: { + component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD HH:mm:ss', + type: 'daterange', + defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')] + } + }, + isForm: false, + } +]) +export const { allSchemas } = useCrudSchemas(crudSchemas) diff --git a/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/index.vue b/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/index.vue new file mode 100644 index 0000000..be83138 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/components/Dialog/src/ProductInfoListDialog/index.vue @@ -0,0 +1,308 @@ + + + + + diff --git a/hangtag-ui/hangtag-ui-admin/src/router/modules/remaining.ts b/hangtag-ui/hangtag-ui-admin/src/router/modules/remaining.ts index 5f497b9..6e5ed43 100644 --- a/hangtag-ui/hangtag-ui-admin/src/router/modules/remaining.ts +++ b/hangtag-ui/hangtag-ui-admin/src/router/modules/remaining.ts @@ -234,6 +234,55 @@ const remainingRouter: AppRouteRecordRaw[] = [ noTagsView: true } }, + { + path: '/oms/produceorder', // 订单管理 + component: Layout, + name: 'ProduceOrderCenter', + meta: { + hidden: true + }, + children: [ + { + path: 'produceorder/add', + component: () => import('@/views/oms/produceorder/form/index.vue'), + name: 'ProduceOrderAdd', + meta: { + noCache: false, // 需要缓存 + hidden: true, + canTo: true, + icon: 'ep:edit', + title: '生产制单添加', + activeMenu: '/oms/produceorder' + } + }, + { + path: 'produceorder/edit/:id(\\d+)', + component: () => import('@/views/oms/produceorder/form/index.vue'), + name: 'ProduceOrderEdit', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:edit', + title: '生产制单编辑', + activeMenu: '/oms/produceorder' + } + }, + { + path: 'produceorder/detail/:id(\\d+)', + component: () => import('@/views/oms/produceorder/form/index.vue'), + name: 'ProduceOrderDetail', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:view', + title: '生产制单详情', + activeMenu: '/oms/produceorder' + } + } + ] + } ] export default remainingRouter diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/ProduceOrderForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/ProduceOrderForm.vue index 8df9c22..84b436c 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/ProduceOrderForm.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/ProduceOrderForm.vue @@ -16,15 +16,15 @@ - - + + - + @@ -37,10 +37,10 @@ /> - + - + @@ -65,7 +65,7 @@ /> - + @@ -90,17 +90,27 @@ /> - + + + \ No newline at end of file + + +const preview = async () => { + const id = formData.value.id; + if (id) { + formData.value = await ProduceOrderApi.getProduceOrder(id) + } + //日期转换 + formData.value.contractDateStr = formatDate(formData.value.contractDate,'YYYY-MM-DD') + formData.value.reportDateStr = formatDate(formData.value.reportDate,'YYYY-MM-DD') + formData.value.reportTimeStr = formatDate(formData.value.reportDate,'HH:mm:ss') + formData.value.produceDateStr = formatDate(formData.value.produceDate,'YYYY-MM-DD') + formData.value.inspectionDateStr = formatDate(formData.value.inspectionDate,'YYYY-MM-DD') + formData.value.deliverydateStr = formatDate(formData.value.deliverydate,'YYYY-MM-DD') + //formData.value.saleContractNo = formData.value.orderNo + + let printData = JSON.stringify(formData.value) + printData = JSON.parse(printData) + let hiprintTemplate = new hiprint.PrintTemplate({template: template1}); + + // 弹出浏览器打印窗口,并填充 字段名:name 的元素 + // hiprintTemplate.print(hiprintTemplate); + //let html = hiprintTemplate.getHtml(printData); + //previewRef.value.showModal(html); + + hiprintTemplate.toPdf(printData, '打印预览', {isDownload: false, type: 'pdfobjectnewwindow'}).then((res) => { + console.log('type:', 'pdfobjectnewwindow'); + console.log(res); + }); +} + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/form/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/form/index.vue new file mode 100644 index 0000000..b5ed475 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/form/index.vue @@ -0,0 +1,208 @@ + + + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/index.vue index b615143..88a7a01 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/index.vue @@ -114,13 +114,13 @@ - 打印 - + --> { formRef.value.open(type, id) } +/* +const openForm = (id?: number) => { + // 修改 + if (typeof id === 'number') { + push({ name: 'ProductSpuEdit', params: { id } }) + return + } + // 新增 + push({ name: 'ProductSpuAdd' }) +}*/ /** 删除按钮操作 */ const handleDelete = async (id: number) => { diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/template1.js b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/template1.js index 22c8fd1..8e8bf15 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/template1.js +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/produceorder/template1.js @@ -1,6 +1,5 @@ export default { - "panels": - [ + "panels": [ { "index": 0, "name": 1, @@ -67,7 +66,7 @@ export default { "bottom": 48.741851806640625, "vCenter": 527.2480087280273, "hCenter": 43.866851806640625, - "field": "asdasd", + "field": "batchno", "coordinateSync": false, "widthHeightSync": false, "fontSize": 7.5, @@ -163,7 +162,7 @@ export default { "bottom": 115.49387741088867, "vCenter": 258.74796295166016, "hCenter": 110.61887741088867, - "field": "produceDate", + "field": "produceDateStr", "coordinateSync": false, "widthHeightSync": false, "fontSize": 7.5, @@ -282,7 +281,7 @@ export default { "bottom": 130.74609375, "vCenter": 278.49609375, "hCenter": 125.87109375, - "field": "inspectionDate", + "field": "inspectionDateStr", "coordinateSync": false, "widthHeightSync": false, "fontSize": 7.5, @@ -300,14 +299,14 @@ export default { "top": 145.33333333333331, "height": 16, "width": 120, - "field": "contractDate", + "field": "contractDateStr", "testData": "2024-02-21", "fontSize": 7.75, "fontWeight": "700", "textAlign": "left", "textContentVerticalAlign": "middle", "title": "合约日期", - "qid": "contractDate", + "qid": "contractDateStr", "right": 153, "bottom": 191.49797439575195, "vCenter": 93, @@ -406,7 +405,7 @@ export default { "bottom": 208.49390029907227, "vCenter": 418.49796295166016, "hCenter": 203.61890029907227, - "field": "deliverydate", + "field": "deliverydateStr", "coordinateSync": false, "widthHeightSync": false, "fixed": true, @@ -506,14 +505,14 @@ export default { "top": 259.5, "height": 16, "width": 120, - "field": "reportTime", + "field": "reportTimeStr", "testData": "12312", "fontSize": 7.75, "fontWeight": "700", "textAlign": "left", "textContentVerticalAlign": "middle", "title": "报告时间", - "qid": "reportTime", + "qid": "reportTimeStr", "right": 378.7459487915039, "bottom": 264.9918575286865, "vCenter": 318.7459487915039, @@ -533,14 +532,14 @@ export default { "top": 259.5, "height": 16, "width": 120, - "field": "reportDate", + "field": "reportDateStr", "testData": "XS888888888", "fontSize": 7.75, "fontWeight": "700", "textAlign": "left", "textContentVerticalAlign": "middle", "title": "报告日期", - "qid": "reportDate", + "qid": "reportDateStr", "right": 137.24185180664062, "bottom": 277.74796295166016, "vCenter": 77.24185180664062, @@ -573,7 +572,7 @@ export default { "coordinateSync": false, "widthHeightSync": false, "qrCodeLevel": 0, - "field": "scxq" + "field": "productionDetails" }, "printElementType": { "title": "订单编号", @@ -1267,6 +1266,226 @@ export default { "title": "制单人", "type": "text" } + }, + { + "options": { + "left": 69, + "top": 585, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 210, + "top": 585, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 357, + "top": 585, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 510, + "top": 585, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 69, + "top": 628.5, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 210, + "top": 628.5, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 355.5, + "top": 627, + "height": 9, + "width": 90, + "borderWidth": 0.75, + "right": 446.2459487915039, + "bottom": 637.4959487915039, + "vCenter": 401.2459487915039, + "hCenter": 632.9959487915039 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 504, + "top": 627, + "height": 9, + "width": 90, + "borderWidth": 0.75, + "right": 599.2480087280273, + "bottom": 636.7500228881836, + "vCenter": 554.2480087280273, + "hCenter": 632.2500228881836 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 69, + "top": 669, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 210, + "top": 669, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 355.5, + "top": 670.5, + "height": 9, + "width": 90, + "borderWidth": 0.75, + "right": 444.0000228881836, + "bottom": 677.9979858398438, + "vCenter": 399.0000228881836, + "hCenter": 673.4979858398438 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 510, + "top": 669, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 510, + "top": 712.5, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 354, + "top": 712.5, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 213, + "top": 712.5, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 69, + "top": 712.5, + "height": 9, + "width": 90, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } } ], "paperNumberLeft": 565,