采购订单 UI/UX 接口代码生成

采购订单 UI/UX 接口代码生成
pull/4/head
siontion 8 months ago
parent bb6036aa2d
commit b510dce751

@ -45,6 +45,7 @@ public enum CodeEnum {
PROJECT_DELIVERY_ORDER("发货单", "HL", 3, "yyyyMM"), PROJECT_DELIVERY_ORDER("发货单", "HL", 3, "yyyyMM"),
PROJECT_PLAN("生产计划", "PP",3, "yyyyMM"), PROJECT_PLAN("生产计划", "PP",3, "yyyyMM"),
MATERIAL_PLAN("物料需求计划", "PR",4, "yyyyMMdd"), MATERIAL_PLAN("物料需求计划", "PR",4, "yyyyMMdd"),
PURCHASE_ORDER("采购订单", "PO",4, "yyyyMMdd"),
; ;

@ -64,4 +64,6 @@ public interface ErrorCodeConstants {
/************采购管理***********/ /************采购管理***********/
ErrorCode MATERIAL_PLAN_NOT_EXISTS = new ErrorCode(1_008_001, "物料需求计划不存在"); ErrorCode MATERIAL_PLAN_NOT_EXISTS = new ErrorCode(1_008_001, "物料需求计划不存在");
ErrorCode MATERIAL_PLAN_DETAIL_NOT_EXISTS = new ErrorCode(1_008_002, "物料需求计划物料详情不存在"); ErrorCode MATERIAL_PLAN_DETAIL_NOT_EXISTS = new ErrorCode(1_008_002, "物料需求计划物料详情不存在");
ErrorCode PURCHASE_ORDER_NOT_EXISTS = new ErrorCode(1_008_003, "采购订单不存在");
ErrorCode PURCHASE_ORDER_MATERIAL_NOT_EXISTS = new ErrorCode(1_008_004, "采购单物料不存在");
} }

@ -0,0 +1,95 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder;
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.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog;
import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder.PurchaseOrderDO;
import com.chanko.yunxi.mes.module.heli.service.purchaseorder.PurchaseOrderService;
@Tag(name = "管理后台 - 采购订单")
@RestController
@RequestMapping("/heli/purchase-order")
@Validated
public class PurchaseOrderController {
@Resource
private PurchaseOrderService purchaseOrderService;
@PostMapping("/create")
@Operation(summary = "创建采购订单")
@PreAuthorize("@ss.hasPermission('heli:purchase-order:create')")
public CommonResult<Long> createPurchaseOrder(@Valid @RequestBody PurchaseOrderSaveReqVO createReqVO) {
return success(purchaseOrderService.createPurchaseOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新采购订单")
@PreAuthorize("@ss.hasPermission('heli:purchase-order:update')")
public CommonResult<Boolean> updatePurchaseOrder(@Valid @RequestBody PurchaseOrderSaveReqVO updateReqVO) {
purchaseOrderService.updatePurchaseOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除采购订单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('heli:purchase-order:delete')")
public CommonResult<Boolean> deletePurchaseOrder(@RequestParam("id") Long id) {
purchaseOrderService.deletePurchaseOrder(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得采购订单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:purchase-order:query')")
public CommonResult<PurchaseOrderRespVO> getPurchaseOrder(@RequestParam("id") Long id) {
PurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(id);
return success(BeanUtils.toBean(purchaseOrder, PurchaseOrderRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得采购订单分页")
@PreAuthorize("@ss.hasPermission('heli:purchase-order:query')")
public CommonResult<PageResult<PurchaseOrderRespVO>> getPurchaseOrderPage(@Valid PurchaseOrderPageReqVO pageReqVO) {
PageResult<PurchaseOrderDO> pageResult = purchaseOrderService.getPurchaseOrderPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PurchaseOrderRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出采购订单 Excel")
@PreAuthorize("@ss.hasPermission('heli:purchase-order:export')")
@OperateLog(type = EXPORT)
public void exportPurchaseOrderExcel(@Valid PurchaseOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PurchaseOrderDO> list = purchaseOrderService.getPurchaseOrderPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "采购订单.xls", "数据", PurchaseOrderRespVO.class,
BeanUtils.toBean(list, PurchaseOrderRespVO.class));
}
}

@ -0,0 +1,85 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.chanko.yunxi.mes.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 PurchaseOrderPageReqVO extends PageParam {
@Schema(description = "自增字段,唯一")
private Long id;
@Schema(description = "采购单号")
private String purchaseNo;
@Schema(description = "供应商id")
private Long supplierId;
@Schema(description = "供应商名称")
private Long supplierName;
@Schema(description = "采购合同号")
private String contractNo;
@Schema(description = "采购单类型1按物料需求计划采购2备库采购")
private Integer purchaseType;
@Schema(description = "供应商id")
private Long projectMaterialPlanId;
@Schema(description = "供应商id")
private Long materialPlanNo;
@Schema(description = "采购物类型1物料2加工件")
private Integer goodsType;
@Schema(description = "结算币种")
private Integer currencyType;
@Schema(description = "税率")
private Integer taxRatio;
@Schema(description = "暂估价金额")
private BigDecimal estimatedPrice;
@Schema(description = "实际价金额")
private BigDecimal actualPrice;
@Schema(description = "状态,1已保存2已送审3已审核4已打回 默认是1")
private Integer status;
@Schema(description = "送审人")
private Long submitUserId;
@Schema(description = "送审时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] submitTime;
@Schema(description = "审核人")
private Long auditor;
@Schema(description = "审核时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] auditTime;
@Schema(description = "备注")
private String description;
@Schema(description = "创建者")
private String creator;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,106 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat;
import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert;
@Schema(description = "管理后台 - 采购订单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PurchaseOrderRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "采购单号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("采购单号")
private String purchaseNo;
@Schema(description = "供应商id")
@ExcelProperty("供应商id")
private Long supplierId;
@Schema(description = "供应商名称")
@ExcelProperty("供应商")
private String supplierName;
@Schema(description = "采购合同号")
@ExcelProperty("采购合同号")
private String contractNo;
@Schema(description = "采购单类型1按物料需求计划采购2备库采购")
@ExcelProperty(value = "采购单类型1按物料需求计划采购2备库采购", converter = DictConvert.class)
@DictFormat("heli_project_purchase_order_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer purchaseType;
@Schema(description = "供应商id")
@ExcelProperty("供应商id")
private Long projectMaterialPlanId;
@Schema(description = "物料需求计划单号")
@ExcelProperty("物料需求计划单号")
private String materialPlanNp;
@Schema(description = "采购物类型1物料2加工件", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty(value = "采购物类型1物料2加工件", converter = DictConvert.class)
@DictFormat("heli_project_purchase_goods_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer goodsType;
@Schema(description = "结算币种")
@ExcelProperty("结算币种")
private Integer currencyType;
@Schema(description = "税率")
@ExcelProperty("税率")
private Integer taxRatio;
@Schema(description = "暂估价金额")
@ExcelProperty("暂估价金额")
private BigDecimal estimatedPrice;
@Schema(description = "实际价金额")
@ExcelProperty("实际价金额")
private BigDecimal actualPrice;
@Schema(description = "状态,1已保存2已送审3已审核4已打回 默认是1")
@ExcelProperty(value = "状态,1已保存2已送审3已审核4已打回 默认是1", converter = DictConvert.class)
@DictFormat("heli_purchase_order_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer status;
@Schema(description = "送审人")
@ExcelProperty("送审人")
private Long submitUserId;
@Schema(description = "送审时间")
@ExcelProperty("送审时间")
private LocalDateTime submitTime;
@Schema(description = "审核人")
@ExcelProperty("审核人")
private Long auditor;
@Schema(description = "审核时间")
@ExcelProperty("审核时间")
private LocalDateTime auditTime;
@Schema(description = "备注")
@ExcelProperty("备注")
private String description;
@Schema(description = "创建者")
@ExcelProperty("创建者")
private String creator;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,68 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 采购订单新增/修改 Request VO")
@Data
public class PurchaseOrderSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "采购单号", requiredMode = Schema.RequiredMode.REQUIRED)
private String purchaseNo;
@Schema(description = "供应商id")
private Long supplierId;
@Schema(description = "采购合同号")
private String contractNo;
@Schema(description = "采购单类型1按物料需求计划采购2备库采购")
private Integer purchaseType;
@Schema(description = "供应商id")
private Long projectMaterialPlanId;
@Schema(description = "采购物类型1物料2加工件", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "采购物类型1物料2加工件不能为空")
private Integer goodsType;
@Schema(description = "结算币种")
private Integer currencyType;
@Schema(description = "税率")
private Integer taxRatio;
@Schema(description = "暂估价金额")
private BigDecimal estimatedPrice;
@Schema(description = "实际价金额")
private BigDecimal actualPrice;
@Schema(description = "状态,1已保存2已送审3已审核4已打回 默认是1")
private Boolean status;
@Schema(description = "送审人")
private Long submitUserId;
@Schema(description = "送审时间")
private LocalDateTime submitTime;
@Schema(description = "审核人")
private Long auditor;
@Schema(description = "审核时间")
private LocalDateTime auditTime;
@Schema(description = "备注")
private String description;
}

@ -0,0 +1,95 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial;
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.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog;
import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermaterial.PurchaseOrderMaterialDO;
import com.chanko.yunxi.mes.module.heli.service.purchaseordermaterial.PurchaseOrderMaterialService;
@Tag(name = "管理后台 - 采购单物料")
@RestController
@RequestMapping("/heli/purchase-order-material")
@Validated
public class PurchaseOrderMaterialController {
@Resource
private PurchaseOrderMaterialService purchaseOrderMaterialService;
@PostMapping("/create")
@Operation(summary = "创建采购单物料")
@PreAuthorize("@ss.hasPermission('heli:purchase-order-material:create')")
public CommonResult<Long> createPurchaseOrderMaterial(@Valid @RequestBody PurchaseOrderMaterialSaveReqVO createReqVO) {
return success(purchaseOrderMaterialService.createPurchaseOrderMaterial(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新采购单物料")
@PreAuthorize("@ss.hasPermission('heli:purchase-order-material:update')")
public CommonResult<Boolean> updatePurchaseOrderMaterial(@Valid @RequestBody PurchaseOrderMaterialSaveReqVO updateReqVO) {
purchaseOrderMaterialService.updatePurchaseOrderMaterial(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除采购单物料")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('heli:purchase-order-material:delete')")
public CommonResult<Boolean> deletePurchaseOrderMaterial(@RequestParam("id") Long id) {
purchaseOrderMaterialService.deletePurchaseOrderMaterial(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得采购单物料")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:purchase-order-material:query')")
public CommonResult<PurchaseOrderMaterialRespVO> getPurchaseOrderMaterial(@RequestParam("id") Long id) {
PurchaseOrderMaterialDO purchaseOrderMaterial = purchaseOrderMaterialService.getPurchaseOrderMaterial(id);
return success(BeanUtils.toBean(purchaseOrderMaterial, PurchaseOrderMaterialRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得采购单物料分页")
@PreAuthorize("@ss.hasPermission('heli:purchase-order-material:query')")
public CommonResult<PageResult<PurchaseOrderMaterialRespVO>> getPurchaseOrderMaterialPage(@Valid PurchaseOrderMaterialPageReqVO pageReqVO) {
PageResult<PurchaseOrderMaterialDO> pageResult = purchaseOrderMaterialService.getPurchaseOrderMaterialPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PurchaseOrderMaterialRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出采购单物料 Excel")
@PreAuthorize("@ss.hasPermission('heli:purchase-order-material:export')")
@OperateLog(type = EXPORT)
public void exportPurchaseOrderMaterialExcel(@Valid PurchaseOrderMaterialPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PurchaseOrderMaterialDO> list = purchaseOrderMaterialService.getPurchaseOrderMaterialPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "采购单物料.xls", "数据", PurchaseOrderMaterialRespVO.class,
BeanUtils.toBean(list, PurchaseOrderMaterialRespVO.class));
}
}

@ -0,0 +1,45 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.chanko.yunxi.mes.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 PurchaseOrderMaterialPageReqVO extends PageParam {
@Schema(description = "采购单编号")
private Long purchaseOrderId;
@Schema(description = "物料id")
private Long materialId;
@Schema(description = "采购数量")
private Long purchaseAmount;
@Schema(description = "暂估价金额")
private BigDecimal estimatedPrice;
@Schema(description = "实际价金额")
private BigDecimal actualPrice;
@Schema(description = "预计到期日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] arriveTime;
@Schema(description = "备注")
private String description;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,53 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
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 PurchaseOrderMaterialRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "采购单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("采购单编号")
private Long purchaseOrderId;
@Schema(description = "物料id")
@ExcelProperty("物料id")
private Long materialId;
@Schema(description = "采购数量")
@ExcelProperty("采购数量")
private Long purchaseAmount;
@Schema(description = "暂估价金额")
@ExcelProperty("暂估价金额")
private BigDecimal estimatedPrice;
@Schema(description = "实际价金额")
@ExcelProperty("实际价金额")
private BigDecimal actualPrice;
@Schema(description = "预计到期日期")
@ExcelProperty("预计到期日期")
private LocalDateTime arriveTime;
@Schema(description = "备注")
@ExcelProperty("备注")
private String description;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,41 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 采购单物料新增/修改 Request VO")
@Data
public class PurchaseOrderMaterialSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "采购单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "采购单编号不能为空")
private Long purchaseOrderId;
@Schema(description = "物料id")
private Long materialId;
@Schema(description = "采购数量")
private Long purchaseAmount;
@Schema(description = "暂估价金额")
private BigDecimal estimatedPrice;
@Schema(description = "实际价金额")
private BigDecimal actualPrice;
@Schema(description = "预计到期日期")
private LocalDateTime arriveTime;
@Schema(description = "备注")
private String description;
}

@ -1,95 +1,109 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.supplier; package com.chanko.yunxi.mes.module.heli.controller.admin.supplier;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import javax.validation.*; import javax.validation.*;
import javax.servlet.http.*; import javax.servlet.http.*;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog;
import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.supplier.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.supplier.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.heli.service.supplier.SupplierService; import com.chanko.yunxi.mes.module.heli.service.supplier.SupplierService;
@Tag(name = "管理后台 - 供应商") @Tag(name = "管理后台 - 供应商")
@RestController @RestController
@RequestMapping("/heli/supplier") @RequestMapping("/heli/supplier")
@Validated @Validated
public class SupplierController { public class SupplierController {
@Resource @Resource
private SupplierService supplierService; private SupplierService supplierService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建供应商") @Operation(summary = "创建供应商")
@PreAuthorize("@ss.hasPermission('heli:supplier:create')") @PreAuthorize("@ss.hasPermission('heli:supplier:create')")
public CommonResult<Long> createSupplier(@Valid @RequestBody SupplierSaveReqVO createReqVO) { public CommonResult<Long> createSupplier(@Valid @RequestBody SupplierSaveReqVO createReqVO) {
return success(supplierService.createSupplier(createReqVO)); return success(supplierService.createSupplier(createReqVO));
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新供应商") @Operation(summary = "更新供应商")
@PreAuthorize("@ss.hasPermission('heli:supplier:update')") @PreAuthorize("@ss.hasPermission('heli:supplier:update')")
public CommonResult<Boolean> updateSupplier(@Valid @RequestBody SupplierSaveReqVO updateReqVO) { public CommonResult<Boolean> updateSupplier(@Valid @RequestBody SupplierSaveReqVO updateReqVO) {
supplierService.updateSupplier(updateReqVO); supplierService.updateSupplier(updateReqVO);
return success(true); return success(true);
} }
@DeleteMapping("/delete") @DeleteMapping("/delete")
@Operation(summary = "删除供应商") @Operation(summary = "删除供应商")
@Parameter(name = "id", description = "编号", required = true) @Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('heli:supplier:delete')") @PreAuthorize("@ss.hasPermission('heli:supplier:delete')")
public CommonResult<Boolean> deleteSupplier(@RequestParam("id") Long id) { public CommonResult<Boolean> deleteSupplier(@RequestParam("id") Long id) {
supplierService.deleteSupplier(id); supplierService.deleteSupplier(id);
return success(true); return success(true);
} }
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得供应商") @Operation(summary = "获得供应商")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:supplier:query')") @PreAuthorize("@ss.hasPermission('heli:supplier:query')")
public CommonResult<SupplierRespVO> getSupplier(@RequestParam("id") Long id) { public CommonResult<SupplierRespVO> getSupplier(@RequestParam("id") Long id) {
SupplierDO supplier = supplierService.getSupplier(id); SupplierDO supplier = supplierService.getSupplier(id);
return success(BeanUtils.toBean(supplier, SupplierRespVO.class)); return success(BeanUtils.toBean(supplier, SupplierRespVO.class));
} }
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得供应商分页") @Operation(summary = "获得供应商分页")
@PreAuthorize("@ss.hasPermission('heli:supplier:query')") @PreAuthorize("@ss.hasPermission('heli:supplier:query')")
public CommonResult<PageResult<SupplierRespVO>> getSupplierPage(@Valid SupplierPageReqVO pageReqVO) { public CommonResult<PageResult<SupplierRespVO>> getSupplierPage(@Valid SupplierPageReqVO pageReqVO) {
PageResult<SupplierDO> pageResult = supplierService.getSupplierPage(pageReqVO); PageResult<SupplierDO> pageResult = supplierService.getSupplierPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, SupplierRespVO.class)); return success(BeanUtils.toBean(pageResult, SupplierRespVO.class));
} }
@GetMapping("/export-excel") @GetMapping("/export-excel")
@Operation(summary = "导出供应商 Excel") @Operation(summary = "导出供应商 Excel")
@PreAuthorize("@ss.hasPermission('heli:supplier:export')") @PreAuthorize("@ss.hasPermission('heli:supplier:export')")
@OperateLog(type = EXPORT) @OperateLog(type = EXPORT)
public void exportSupplierExcel(@Valid SupplierPageReqVO pageReqVO, public void exportSupplierExcel(@Valid SupplierPageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<SupplierDO> list = supplierService.getSupplierPage(pageReqVO).getList(); List<SupplierDO> list = supplierService.getSupplierPage(pageReqVO).getList();
// 导出 Excel // 导出 Excel
ExcelUtils.write(response, "供应商.xls", "数据", SupplierRespVO.class, ExcelUtils.write(response, "供应商.xls", "数据", SupplierRespVO.class,
BeanUtils.toBean(list, SupplierRespVO.class)); BeanUtils.toBean(list, SupplierRespVO.class));
} }
} @GetMapping({"/all-simples"})
@Operation(summary = "TODO:获取供应商精简信息列表", description = "只包含被开启的供应商,主要用于前端的下拉选项")
public CommonResult<List<Map<String, Object>> > getSimpleList() {
List<Map<String, Object>> list = supplierService.getSimpleList();
// 拼接数据
return success(list);
}
@GetMapping({"/all-no-status-simples"})
@Operation(summary = "TODO:获取供应商精简信息列表", description = "全部供应商,主要用于前端的下拉选项")
public CommonResult<List<Map<String, Object>> > getSimpleNoStatusList() {
List<Map<String, Object>> list = supplierService.getSimpleNoStatusList();
// 拼接数据
return success(list);
}
}

@ -0,0 +1,110 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("project_purchase_order")
@KeySequence("project_purchase_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PurchaseOrderDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private String purchaseNo;
/**
* id
*/
private Long supplierId;
/**
*
*/
private String contractNo;
/**
* 12
*
* {@link TODO heli_project_purchase_order_type }
*/
private Integer purchaseType;
/**
* id
*/
private Long projectMaterialPlanId;
/**
* 12
*
* {@link TODO heli_project_purchase_goods_type }
*/
private Integer goodsType;
/**
*
*/
private Integer currencyType;
/**
*
*/
private Integer taxRatio;
/**
*
*/
private BigDecimal estimatedPrice;
/**
*
*/
private BigDecimal actualPrice;
/**
* ,1234 1
*
* {@link TODO heli_purchase_order_status }
*/
private Integer status;
/**
*
*/
private Long submitUserId;
/**
*
*/
private LocalDateTime submitTime;
/**
*
*/
private Long auditor;
/**
*
*/
private LocalDateTime auditTime;
/**
*
*/
private String description;
@TableField(exist = false)
private String supplierName;
@TableField(exist = false)
private String materialPlanNo;
}

@ -0,0 +1,62 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermaterial;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("project_purchase_order_material")
@KeySequence("project_purchase_order_material_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PurchaseOrderMaterialDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private Long purchaseOrderId;
/**
* id
*/
private Long materialId;
/**
*
*/
private Long purchaseAmount;
/**
*
*/
private BigDecimal estimatedPrice;
/**
*
*/
private BigDecimal actualPrice;
/**
*
*/
private LocalDateTime arriveTime;
/**
*
*/
private String description;
}

@ -0,0 +1,91 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorder;
import java.util.*;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo.MaterialPlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder.PurchaseOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo.*;
import org.springframework.util.StringUtils;
/**
* Mapper
*
* @author
*/
@Mapper
public interface PurchaseOrderMapper extends BaseMapperX<PurchaseOrderDO> {
default PageResult<PurchaseOrderDO> selectPage(PurchaseOrderPageReqVO reqVO) {
MPJLambdaWrapper<PurchaseOrderDO> query = new MPJLambdaWrapper<>();
query.selectAll(PurchaseOrderDO.class)
.select("s.name as supplierName","m.project_material_plan_no as materialPlanNo")
.leftJoin(SupplierDO.class, "s", SupplierDO::getId, PurchaseOrderDO::getSupplierId)
.leftJoin(MaterialPlanDO.class, "m", MaterialPlanDO::getId, PurchaseOrderDO::getProjectMaterialPlanId)
.disableSubLogicDel()
.orderByDesc(PurchaseOrderDO::getCreateTime);
query.like(!StringUtils.isEmpty(reqVO.getPurchaseNo()), PurchaseOrderDO::getPurchaseNo, reqVO.getPurchaseNo())
.like(!StringUtils.isEmpty(reqVO.getSupplierName()), "s.name", reqVO.getSupplierName())
.like(!StringUtils.isEmpty(reqVO.getMaterialPlanNo()), "m.project_material_plan_no", reqVO.getMaterialPlanNo())
.apply(reqVO.getCreateTime() != null, "DATE_FORMAT(t.create_time,'%Y-%m-%d') = {0}", reqVO.getCreateTime())
.eq(reqVO.getStatus() != null, PurchaseOrderDO::getStatus, reqVO.getStatus())
.eq(reqVO.getPurchaseType() != null, PurchaseOrderDO::getPurchaseType, reqVO.getPurchaseType())
.eq(reqVO.getGoodsType() != null, PurchaseOrderDO::getGoodsType, reqVO.getGoodsType());
return selectPage(reqVO, query);
}
default PageResult<PurchaseOrderDO> selectListWithRatio(PurchaseOrderPageReqVO reqVO) {
MPJLambdaWrapper<PurchaseOrderDO> query = new MPJLambdaWrapper<>();
query.selectAll(PurchaseOrderDO.class)
.select("s.name as supplierName","m.project_material_plan_no as materialPlanNo","(case when t.tax_ratio!=Null and t.estimated_price!=null then t.estimated_price*t.tax_ratio else '' end) as estimated_price","(case when t.tax_ratio!=Null and t.actual_price!=null then t.actual_price*t.tax_ratio else '' end) as actual_price")
.leftJoin(SupplierDO.class, "s", SupplierDO::getId, PurchaseOrderDO::getSupplierId)
.leftJoin(MaterialPlanDO.class, "m", MaterialPlanDO::getId, PurchaseOrderDO::getProjectMaterialPlanId)
.disableSubLogicDel()
.orderByDesc(PurchaseOrderDO::getCreateTime);
query.like(!StringUtils.isEmpty(reqVO.getPurchaseNo()), PurchaseOrderDO::getPurchaseNo, reqVO.getPurchaseNo())
.like(!StringUtils.isEmpty(reqVO.getSupplierName()), "s.name", reqVO.getSupplierName())
.like(!StringUtils.isEmpty(reqVO.getMaterialPlanNo()), "m.project_material_plan_no", reqVO.getMaterialPlanNo())
.apply(reqVO.getCreateTime() != null, "DATE_FORMAT(t.create_time,'%Y-%m-%d') = {0}", reqVO.getCreateTime())
.eq(reqVO.getStatus() != null, PurchaseOrderDO::getStatus, reqVO.getStatus())
.eq(reqVO.getPurchaseType() != null, PurchaseOrderDO::getPurchaseType, reqVO.getPurchaseType())
.eq(reqVO.getGoodsType() != null, PurchaseOrderDO::getGoodsType, reqVO.getGoodsType());
return selectPage(reqVO, query);
}
// default PageResult<PurchaseOrderDO> selectPage(PurchaseOrderPageReqVO reqVO) {
// return selectPage(reqVO, new LambdaQueryWrapperX<PurchaseOrderDO>()
// .eqIfPresent(PurchaseOrderDO::getId, reqVO.getId())
// .eqIfPresent(PurchaseOrderDO::getPurchaseNo, reqVO.getPurchaseNo())
// .eqIfPresent(PurchaseOrderDO::getSupplierId, reqVO.getSupplierId())
// .eqIfPresent(PurchaseOrderDO::getContractNo, reqVO.getContractNo())
// .eqIfPresent(PurchaseOrderDO::getPurchaseType, reqVO.getPurchaseType())
// .eqIfPresent(PurchaseOrderDO::getProjectMaterialPlanId, reqVO.getProjectMaterialPlanId())
// .eqIfPresent(PurchaseOrderDO::getGoodsType, reqVO.getGoodsType())
// .eqIfPresent(PurchaseOrderDO::getCurrencyType, reqVO.getCurrencyType())
// .eqIfPresent(PurchaseOrderDO::getTaxRatio, reqVO.getTaxRatio())
// .eqIfPresent(PurchaseOrderDO::getEstimatedPrice, reqVO.getEstimatedPrice())
// .eqIfPresent(PurchaseOrderDO::getActualPrice, reqVO.getActualPrice())
// .eqIfPresent(PurchaseOrderDO::getStatus, reqVO.getStatus())
// .eqIfPresent(PurchaseOrderDO::getSubmitUserId, reqVO.getSubmitUserId())
// .betweenIfPresent(PurchaseOrderDO::getSubmitTime, reqVO.getSubmitTime())
// .eqIfPresent(PurchaseOrderDO::getAuditor, reqVO.getAuditor())
// .betweenIfPresent(PurchaseOrderDO::getAuditTime, reqVO.getAuditTime())
// .eqIfPresent(PurchaseOrderDO::getDescription, reqVO.getDescription())
// .eqIfPresent(PurchaseOrderDO::getCreator, reqVO.getCreator())
// .betweenIfPresent(PurchaseOrderDO::getCreateTime, reqVO.getCreateTime())
// .orderByDesc(PurchaseOrderDO::getId));
// }
}

@ -0,0 +1,33 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermaterial;
import java.util.*;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermaterial.PurchaseOrderMaterialDO;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface PurchaseOrderMaterialMapper extends BaseMapperX<PurchaseOrderMaterialDO> {
default PageResult<PurchaseOrderMaterialDO> selectPage(PurchaseOrderMaterialPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<PurchaseOrderMaterialDO>()
.eqIfPresent(PurchaseOrderMaterialDO::getPurchaseOrderId, reqVO.getPurchaseOrderId())
.eqIfPresent(PurchaseOrderMaterialDO::getMaterialId, reqVO.getMaterialId())
.eqIfPresent(PurchaseOrderMaterialDO::getPurchaseAmount, reqVO.getPurchaseAmount())
.eqIfPresent(PurchaseOrderMaterialDO::getEstimatedPrice, reqVO.getEstimatedPrice())
.eqIfPresent(PurchaseOrderMaterialDO::getActualPrice, reqVO.getActualPrice())
.betweenIfPresent(PurchaseOrderMaterialDO::getArriveTime, reqVO.getArriveTime())
.eqIfPresent(PurchaseOrderMaterialDO::getDescription, reqVO.getDescription())
.betweenIfPresent(PurchaseOrderMaterialDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PurchaseOrderMaterialDO::getId));
}
}

@ -2,10 +2,12 @@ package com.chanko.yunxi.mes.module.heli.dal.mysql.supplier;
import java.util.*; import java.util.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.warehouse.WarehouseDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.supplier.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.supplier.vo.*;
@ -55,5 +57,14 @@ public interface SupplierMapper extends BaseMapperX<SupplierDO> {
.eqIfPresent(SupplierDO::getTaxNo, reqVO.getTaxNo()) .eqIfPresent(SupplierDO::getTaxNo, reqVO.getTaxNo())
.orderByDesc(SupplierDO::getId)); .orderByDesc(SupplierDO::getId));
} }
default List<Map<String, Object>> selectSimpleList() {
return selectMaps(new QueryWrapper<SupplierDO>().select("id", "name").eq("status","1").lambda());
}
default List<Map<String, Object>> selectSimpleNoStatusList() {
return selectMaps(new QueryWrapper<SupplierDO>().select("id", "name").lambda());
}
} }

@ -0,0 +1,55 @@
package com.chanko.yunxi.mes.module.heli.service.purchaseorder;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder.PurchaseOrderDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* Service
*
* @author
*/
public interface PurchaseOrderService {
/**
*
*
* @param createReqVO
* @return
*/
Long createPurchaseOrder(@Valid PurchaseOrderSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updatePurchaseOrder(@Valid PurchaseOrderSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deletePurchaseOrder(Long id);
/**
*
*
* @param id
* @return
*/
PurchaseOrderDO getPurchaseOrder(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<PurchaseOrderDO> getPurchaseOrderPage(PurchaseOrderPageReqVO pageReqVO);
}

@ -0,0 +1,92 @@
package com.chanko.yunxi.mes.module.heli.service.purchaseorder;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder.PurchaseOrderDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorder.PurchaseOrderMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.MATERIAL_PLAN;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PURCHASE_ORDER;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class PurchaseOrderServiceImpl implements PurchaseOrderService {
@Resource
private PurchaseOrderMapper purchaseOrderMapper;
@Resource
private SerialNumberService serialNumberService;
@Override
public Long createPurchaseOrder(PurchaseOrderSaveReqVO createReqVO) {
// 插入
PurchaseOrderDO purchaseOrder = BeanUtils.toBean(createReqVO, PurchaseOrderDO.class);
// 月度流水号
SerialNumberDO serialNumberDO = new SerialNumberDO();
serialNumberDO = serialNumberService.getSerialNumber(PURCHASE_ORDER.name(), new SimpleDateFormat("yyyyMMdd").format(new Date()));
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1);
purchaseOrder.setPurchaseNo(PURCHASE_ORDER.getCode(serialNumberDO.getSerialNumber().toString()));
purchaseOrderMapper.insert(purchaseOrder);
// 回写序列记录
serialNumberService.updateSerialNumber(serialNumberDO);
// 返回
return purchaseOrder.getId();
}
@Override
public void updatePurchaseOrder(PurchaseOrderSaveReqVO updateReqVO) {
// 校验存在
validatePurchaseOrderExists(updateReqVO.getId());
// 更新
PurchaseOrderDO updateObj = BeanUtils.toBean(updateReqVO, PurchaseOrderDO.class);
purchaseOrderMapper.updateById(updateObj);
}
@Override
public void deletePurchaseOrder(Long id) {
// 校验存在
validatePurchaseOrderExists(id);
// 删除
purchaseOrderMapper.deleteById(id);
}
private void validatePurchaseOrderExists(Long id) {
if (purchaseOrderMapper.selectById(id) == null) {
throw exception(PURCHASE_ORDER_NOT_EXISTS);
}
}
@Override
public PurchaseOrderDO getPurchaseOrder(Long id) {
return purchaseOrderMapper.selectById(id);
}
@Override
public PageResult<PurchaseOrderDO> getPurchaseOrderPage(PurchaseOrderPageReqVO pageReqVO) {
return purchaseOrderMapper.selectPage(pageReqVO);
}
}

@ -0,0 +1,55 @@
package com.chanko.yunxi.mes.module.heli.service.purchaseordermaterial;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermaterial.PurchaseOrderMaterialDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* Service
*
* @author
*/
public interface PurchaseOrderMaterialService {
/**
*
*
* @param createReqVO
* @return
*/
Long createPurchaseOrderMaterial(@Valid PurchaseOrderMaterialSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updatePurchaseOrderMaterial(@Valid PurchaseOrderMaterialSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deletePurchaseOrderMaterial(Long id);
/**
*
*
* @param id
* @return
*/
PurchaseOrderMaterialDO getPurchaseOrderMaterial(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<PurchaseOrderMaterialDO> getPurchaseOrderMaterialPage(PurchaseOrderMaterialPageReqVO pageReqVO);
}

@ -0,0 +1,74 @@
package com.chanko.yunxi.mes.module.heli.service.purchaseordermaterial;
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 com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermaterial.PurchaseOrderMaterialDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermaterial.PurchaseOrderMaterialMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class PurchaseOrderMaterialServiceImpl implements PurchaseOrderMaterialService {
@Resource
private PurchaseOrderMaterialMapper purchaseOrderMaterialMapper;
@Override
public Long createPurchaseOrderMaterial(PurchaseOrderMaterialSaveReqVO createReqVO) {
// 插入
PurchaseOrderMaterialDO purchaseOrderMaterial = BeanUtils.toBean(createReqVO, PurchaseOrderMaterialDO.class);
purchaseOrderMaterialMapper.insert(purchaseOrderMaterial);
// 返回
return purchaseOrderMaterial.getId();
}
@Override
public void updatePurchaseOrderMaterial(PurchaseOrderMaterialSaveReqVO updateReqVO) {
// 校验存在
validatePurchaseOrderMaterialExists(updateReqVO.getId());
// 更新
PurchaseOrderMaterialDO updateObj = BeanUtils.toBean(updateReqVO, PurchaseOrderMaterialDO.class);
purchaseOrderMaterialMapper.updateById(updateObj);
}
@Override
public void deletePurchaseOrderMaterial(Long id) {
// 校验存在
validatePurchaseOrderMaterialExists(id);
// 删除
purchaseOrderMaterialMapper.deleteById(id);
}
private void validatePurchaseOrderMaterialExists(Long id) {
if (purchaseOrderMaterialMapper.selectById(id) == null) {
throw exception(PURCHASE_ORDER_MATERIAL_NOT_EXISTS);
}
}
@Override
public PurchaseOrderMaterialDO getPurchaseOrderMaterial(Long id) {
return purchaseOrderMaterialMapper.selectById(id);
}
@Override
public PageResult<PurchaseOrderMaterialDO> getPurchaseOrderMaterialPage(PurchaseOrderMaterialPageReqVO pageReqVO) {
return purchaseOrderMaterialMapper.selectPage(pageReqVO);
}
}

@ -1,55 +1,59 @@
package com.chanko.yunxi.mes.module.heli.service.supplier; package com.chanko.yunxi.mes.module.heli.service.supplier;
import java.util.*; import java.util.*;
import javax.validation.*; import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.supplier.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.supplier.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/** /**
* Service * Service
* *
* @author * @author
*/ */
public interface SupplierService { public interface SupplierService {
/** /**
* *
* *
* @param createReqVO * @param createReqVO
* @return * @return
*/ */
Long createSupplier(@Valid SupplierSaveReqVO createReqVO); Long createSupplier(@Valid SupplierSaveReqVO createReqVO);
/** /**
* *
* *
* @param updateReqVO * @param updateReqVO
*/ */
void updateSupplier(@Valid SupplierSaveReqVO updateReqVO); void updateSupplier(@Valid SupplierSaveReqVO updateReqVO);
/** /**
* *
* *
* @param id * @param id
*/ */
void deleteSupplier(Long id); void deleteSupplier(Long id);
/** /**
* *
* *
* @param id * @param id
* @return * @return
*/ */
SupplierDO getSupplier(Long id); SupplierDO getSupplier(Long id);
/** /**
* *
* *
* @param pageReqVO * @param pageReqVO
* @return * @return
*/ */
PageResult<SupplierDO> getSupplierPage(SupplierPageReqVO pageReqVO); PageResult<SupplierDO> getSupplierPage(SupplierPageReqVO pageReqVO);
} List<Map<String, Object>> getSimpleList();
List<Map<String, Object>> getSimpleNoStatusList();
}

@ -90,4 +90,14 @@ public class SupplierServiceImpl implements SupplierService {
throw exception(CODE_REPEAT); throw exception(CODE_REPEAT);
} }
} }
@Override
public List<Map<String, Object>> getSimpleList() {
return supplierMapper.selectSimpleList();
}
@Override
public List<Map<String, Object>> getSimpleNoStatusList() {
return supplierMapper.selectSimpleNoStatusList();
}
} }

@ -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.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorder.PurchaseOrderMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -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.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermaterial.PurchaseOrderMaterialMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,51 @@
import request from '@/config/axios'
export interface PurchaseOrderVO {
id: number
purchaseNo: string
supplierId: number
contractNo: string
purchaseType: number
projectMaterialPlanId: number
goodsType: number
currencyType: number
taxRatio: number
estimatedPrice: number
actualPrice: number
status: boolean
submitUserId: number
submitTime: Date
auditor: number
auditTime: Date
description: string
}
// 查询采购订单分页
export const getPurchaseOrderPage = async (params) => {
return await request.get({ url: `/heli/purchase-order/page`, params })
}
// 查询采购订单详情
export const getPurchaseOrder = async (id: number) => {
return await request.get({ url: `/heli/purchase-order/get?id=` + id })
}
// 新增采购订单
export const createPurchaseOrder = async (data: PurchaseOrderVO) => {
return await request.post({ url: `/heli/purchase-order/create`, data })
}
// 修改采购订单
export const updatePurchaseOrder = async (data: PurchaseOrderVO) => {
return await request.put({ url: `/heli/purchase-order/update`, data })
}
// 删除采购订单
export const deletePurchaseOrder = async (id: number) => {
return await request.delete({ url: `/heli/purchase-order/delete?id=` + id })
}
// 导出采购订单 Excel
export const exportPurchaseOrder = async (params) => {
return await request.download({ url: `/heli/purchase-order/export-excel`, params })
}

@ -0,0 +1,42 @@
import request from '@/config/axios'
export interface PurchaseOrderMaterialVO {
id: number
purchaseOrderId: number
materialId: number
purchaseAmount: number
estimatedPrice: number
actualPrice: number
arriveTime: Date
description: string
}
// 查询采购单物料分页
export const getPurchaseOrderMaterialPage = async (params) => {
return await request.get({ url: `/heli/purchase-order-material/page`, params })
}
// 查询采购单物料详情
export const getPurchaseOrderMaterial = async (id: number) => {
return await request.get({ url: `/heli/purchase-order-material/get?id=` + id })
}
// 新增采购单物料
export const createPurchaseOrderMaterial = async (data: PurchaseOrderMaterialVO) => {
return await request.post({ url: `/heli/purchase-order-material/create`, data })
}
// 修改采购单物料
export const updatePurchaseOrderMaterial = async (data: PurchaseOrderMaterialVO) => {
return await request.put({ url: `/heli/purchase-order-material/update`, data })
}
// 删除采购单物料
export const deletePurchaseOrderMaterial = async (id: number) => {
return await request.delete({ url: `/heli/purchase-order-material/delete?id=` + id })
}
// 导出采购单物料 Excel
export const exportPurchaseOrderMaterial = async (params) => {
return await request.download({ url: `/heli/purchase-order-material/export-excel`, params })
}

@ -1,65 +1,72 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface SupplierVO { export interface SupplierVO {
id: number id: number
code: string code: string
brief: string brief: string
name: string name: string
industry: string industry: string
level: number level: number
category: number category: number
userId: number userId: number
description: string description: string
contact1Name: string contact1Name: string
contact1Post: string contact1Post: string
contact1Method: string contact1Method: string
contact1Email: string contact1Email: string
contact1Addr: string contact1Addr: string
contact2Name: string contact2Name: string
contact2Post: string contact2Post: string
contact2Method: string contact2Method: string
contact2Email: string contact2Email: string
contact2Addr: string contact2Addr: string
contact3Name: string contact3Name: string
contact3Post: string contact3Post: string
contact3Method: string contact3Method: string
contact3Email: string contact3Email: string
contact3Addr: string contact3Addr: string
status: number status: number
logo: string logo: string
payType: string payType: string
accountName: string accountName: string
bankNo: string bankNo: string
bankAddress: string bankAddress: string
taxNo: string taxNo: string
} }
// 查询仓库分页
// 查询供应商分页 export const getSimpNoStatusList = async () => {
export const getSupplierPage = async (params) => { return await request.get({ url: `/heli/supplier/all-no-status-simples` })
return await request.get({ url: `/heli/supplier/page`, params }) }
} // 查询仓库分页
export const getSimpList = async () => {
// 查询供应商详情 return await request.get({ url: `/heli/supplier/all-simples` })
export const getSupplier = async (id: number) => { }
return await request.get({ url: `/heli/supplier/get?id=` + id }) // 查询供应商分页
} export const getSupplierPage = async (params) => {
return await request.get({ url: `/heli/supplier/page`, params })
// 新增供应商 }
export const createSupplier = async (data: SupplierVO) => {
return await request.post({ url: `/heli/supplier/create`, data }) // 查询供应商详情
} export const getSupplier = async (id: number) => {
return await request.get({ url: `/heli/supplier/get?id=` + id })
// 修改供应商 }
export const updateSupplier = async (data: SupplierVO) => {
return await request.put({ url: `/heli/supplier/update`, data }) // 新增供应商
} export const createSupplier = async (data: SupplierVO) => {
return await request.post({ url: `/heli/supplier/create`, data })
// 删除供应商 }
export const deleteSupplier = async (id: number) => {
return await request.delete({ url: `/heli/supplier/delete?id=` + id }) // 修改供应商
} export const updateSupplier = async (data: SupplierVO) => {
return await request.put({ url: `/heli/supplier/update`, data })
// 导出供应商 Excel }
export const exportSupplier = async (params) => {
return await request.download({ url: `/heli/supplier/export-excel`, params }) // 删除供应商
} export const deleteSupplier = async (id: number) => {
return await request.delete({ url: `/heli/supplier/delete?id=` + id })
}
// 导出供应商 Excel
export const exportSupplier = async (params) => {
return await request.download({ url: `/heli/supplier/export-excel`, params })
}

@ -245,4 +245,7 @@ export enum DICT_TYPE {
HELI_PROJECT_MATERIAL_PLAN_STATUS = 'heli_project_material_plan_status',//物料需求计划状态 HELI_PROJECT_MATERIAL_PLAN_STATUS = 'heli_project_material_plan_status',//物料需求计划状态
HELI_BOM_STATUS = 'heli_bom_status', //bom状态 HELI_BOM_STATUS = 'heli_bom_status', //bom状态
HELI_BOM_MATERIAL_TYPE = 'heli_bom_material_type', //bom物料类型 HELI_BOM_MATERIAL_TYPE = 'heli_bom_material_type', //bom物料类型
HELI_PROJECT_PURCHASE_ORDER_TYPE = 'heli_project_purchase_order_type',//采购单类型
HELI_PROJECT_PURCHASE_GOODS_TYPE = 'heli_project_purchase_goods_type',//采购物类型
HELI_PURCHASE_ORDER_STATUS = 'heli_purchase_order_status',//采购单状态
} }

@ -0,0 +1,202 @@
<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="采购单号" prop="purchaseNo">
<el-input v-model="formData.purchaseNo" placeholder="请输入采购单号" />
</el-form-item>
<el-form-item label="供应商id" prop="supplierId">
<el-input v-model="formData.supplierId" placeholder="请输入供应商id" />
</el-form-item>
<el-form-item label="采购合同号" prop="contractNo">
<el-input v-model="formData.contractNo" placeholder="请输入采购合同号" />
</el-form-item>
<el-form-item label="采购单类型1按物料需求计划采购2备库采购" prop="purchaseType">
<el-radio-group v-model="formData.purchaseType">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="供应商id" prop="projectMaterialPlanId">
<el-input v-model="formData.projectMaterialPlanId" placeholder="请输入供应商id" />
</el-form-item>
<el-form-item label="采购物类型1物料2加工件" prop="goodsType">
<el-radio-group v-model="formData.goodsType">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_GOODS_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="结算币种" prop="currencyType">
<el-select v-model="formData.currencyType" placeholder="请选择结算币种">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="税率" prop="taxRatio">
<el-input v-model="formData.taxRatio" placeholder="请输入税率" />
</el-form-item>
<el-form-item label="暂估价金额" prop="estimatedPrice">
<el-input v-model="formData.estimatedPrice" placeholder="请输入暂估价金额" />
</el-form-item>
<el-form-item label="实际价金额" prop="actualPrice">
<el-input v-model="formData.actualPrice" placeholder="请输入实际价金额" />
</el-form-item>
<el-form-item label="状态,1已保存2已送审3已审核4已打回 默认是1" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.HELI_PURCHASE_ORDER_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="送审人" prop="submitUserId">
<el-input v-model="formData.submitUserId" placeholder="请输入送审人" />
</el-form-item>
<el-form-item label="送审时间" prop="submitTime">
<el-date-picker
v-model="formData.submitTime"
type="date"
value-format="x"
placeholder="选择送审时间"
/>
</el-form-item>
<el-form-item label="审核人" prop="auditor">
<el-input v-model="formData.auditor" placeholder="请输入审核人" />
</el-form-item>
<el-form-item label="审核时间" prop="auditTime">
<el-date-picker
v-model="formData.auditTime"
type="date"
value-format="x"
placeholder="选择审核时间"
/>
</el-form-item>
<el-form-item label="备注" prop="description">
<el-input v-model="formData.description" type="textarea" placeholder="请输入备注" />
</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 { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import * as PurchaseOrderApi from '@/api/heli/purchaseorder'
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,
purchaseNo: undefined,
supplierId: undefined,
contractNo: undefined,
purchaseType: undefined,
projectMaterialPlanId: undefined,
goodsType: undefined,
currencyType: undefined,
taxRatio: undefined,
estimatedPrice: undefined,
actualPrice: undefined,
status: undefined,
submitUserId: undefined,
submitTime: undefined,
auditor: undefined,
auditTime: undefined,
description: undefined,
})
const formRules = reactive({
purchaseNo: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
goodsType: [{ required: true, message: '采购物类型1物料2加工件不能为空', 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 PurchaseOrderApi.getPurchaseOrder(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as PurchaseOrderApi.PurchaseOrderVO
if (formType.value === 'create') {
await PurchaseOrderApi.createPurchaseOrder(data)
message.success(t('common.createSuccess'))
} else {
await PurchaseOrderApi.updatePurchaseOrder(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
purchaseNo: undefined,
supplierId: undefined,
contractNo: undefined,
purchaseType: undefined,
projectMaterialPlanId: undefined,
goodsType: undefined,
currencyType: undefined,
taxRatio: undefined,
estimatedPrice: undefined,
actualPrice: undefined,
status: undefined,
submitUserId: undefined,
submitTime: undefined,
auditor: undefined,
auditTime: undefined,
description: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,199 @@
<template>
<el-card class="hl-card" style="position: relative">
<template #header>
<span>新增页</span>
</template>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="160px" v-loading="formLoading">
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<el-row>
<el-col :span="24">
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="采购编号" prop="purchaseNo">
<el-input class="!w-265px" placeholder="系统自动生成" v-model="formData.purchaseNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="采购单类型" prop="purchaseType" :rules="formRules.purchaseType">
<el-select v-model="formData.purchaseType" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="结算币种" prop="currencyType">
<el-select v-model="formData.currencyType" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_CURRENCY)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="80">
<el-form-item label="备注" prop="description" >
<el-input class="!w-713px" type="textarea" v-model="formData.description" show-word-limit
maxlength="200" />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="单据日期" prop="createTime">
<el-date-picker class="!w-265px" v-model="formData.createTime" value-format="x" placeholder="单据日期"
disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="物料需求计划编号" prop="materialPlanNo">
<el-input class="!w-265px" v-model="formData.materialPlanNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="税率(%)" prop="taxRatio" >
<el-input class="!w-265px" v-model="formData.taxRatio" placeholder="税率" />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="供应商" prop="supplierId" :rules="formRules.supplierId">
<el-select v-model="formData.supplierId" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in supplierInit"
:key="dict.id" :label="dict.name" :value="dict.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="采购物类型" prop="goodsType" :rules="formRules.goodsType">
<el-select v-model="formData.goodsType" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_GOODS_TYPE)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="采购合同号" prop="contractNo">
<el-input class="!w-265px" v-model="formData.contractNo" placeholder="采购合同号" />
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<el-button @click="() => router.back()" size="large"> </el-button>
<el-button @click="submitForm" type="success" size="large"> </el-button>
</div>
</el-card>
<projectMaterialPlanDialog ref="projectMaterialPlanDialog" @success="handleSelectedProjectMaterialPlan" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as MaterialPlanApi from '@/api/heli/materialplan'
import * as SupplierApi from '@/api/heli/supplier'
import * as PurchaseOrderApi from '@/api/heli/purchaseorder'
import { Search, Plus } from '@element-plus/icons-vue'
import ProjectPlanDialog from '@/views/heli/materialplan/ProjectPlanDialog.vue'
const { t } = useI18n() //
const message = useMessage() //
const router = useRouter()
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
purchaseNo:undefined,
supplierId:undefined,
contractNo:undefined,
purchaseNo:undefined,
projectMaterialPlanNo: undefined,
projectMaterialPlanId: undefined,
goodsType: undefined,
currencyType: undefined,
taxRatio: undefined,
status:1,
createTime: new Date(),
description: undefined,
})
const formRules = reactive({
supplierId: [{ required: true, message: '供应商不能为空', trigger: 'blur' }],
purchaseType: [{ required: true, message: '采购单类型不能为空', trigger: 'blur' }],
goodsType: [{ required: true, message: '采购物料不能为空', trigger: 'blur' }],
currencyType: [{ required: true, message: '结算币种不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
defineExpose({ open }) // open
const projectMaterialPlanDialog = ref()
const openprojectMaterialPlanDialog = () => {
projectMaterialPlanDialog.value?.open()
}
const handleSelectedProjectMaterialPlan = (arr) => {
if (arr) {
// formData.value.projectPlanId = arr.id
// formData.value.projectId = arr.projectId
// formData.value.projectCode = arr.projectCode
// formData.value.projectName = arr.projectName
// formData.value.planNo = arr.planNo
}
}
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as PurchaseOrderApi.PurchaseOrderVO
var purchaseOrderId = await PurchaseOrderApi.createPurchaseOrder(data)
router.push({ path: '/purchase/edit', query: { id: purchaseOrderId } })
dialogVisible.value = false
} finally {
formLoading.value = false
}
}
const supplierInit = ref()
onMounted(async () => {
supplierInit.value = await SupplierApi.getSimpList()
})
</script>

@ -0,0 +1,594 @@
<template>
<el-card class="hl-card" style="position: relative">
<template #header>
<span>详情页</span>
</template>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="160px" v-loading="formLoading">
<!-- 基础信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<el-row>
<el-col :span="24">
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="物料需求计划编号" prop="projectMaterialPlanNo">
<el-input class="!w-265px" placeholder="系统自动生成" v-model="formData.projectMaterialPlanNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="80">
<el-form-item label="备注" prop="description">
<el-input class="!w-713px" type="textarea" v-model="formData.description" show-word-limit
maxlength="200" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="单据日期" prop="createTime">
<el-date-picker class="!w-265px" v-model="formData.createTime" value-format="x" placeholder="单据日期"
disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="生产计划单号" prop="planNo">
<el-input class="!w-265px" placeholder="生产计划单号" v-model="formData.planNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="项目名称" prop="projectName">
<el-input class="!w-265px" placeholder="项目名称" v-model="formData.projectName" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="项目编号" prop="projectCode">
<el-input class="!w-265px" v-model="formData.projectCode" placeholder="项目编号" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="单据状态" prop="status">
<el-select v-model="formData.status" placeholder="单据状态" clearable class="!w-265px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_MATERIAL_PLAN_STATUS)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<!-- 物料信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">物料信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-col>
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem" v-if="false"></el-button>
</el-col>
<el-form ref="subFormRef" :model="formData.matItemDOList" :rules="subFormRules"
v-loading="subFormLoading" label-width="0">
<el-table :data="formData.matItemDOList" class="hl-table">
<el-table-column type="index" label="序号" :width="80" />
<el-table-column prop="matCode" label="物料编码" min-width="120" align="center" />
<el-table-column prop="matId" min-width="140" align="center">
<template #header> <span class="hl-table_header">*</span>物料名称 </template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.matId`" :rules="subFormRules.matId" class="mb-0px!">
<el-select v-model="scope.row.matId" placeholder="物料名称" :remote-method="remoteMatNameSearch" disabled
remote-show-suffix remote clearable reserve-keyword filterable :loading="matSelectLoading"
@change="(val) => handleMatName(scope, val)" class="!w-180px">
<el-option v-for="item in matList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="matType" label="物料类型" min-width="120" align="center">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_TYPE" :value="scope.row.matType"
v-if="scope.row.matType ? true : false" />
</template>
</el-table-column>
<el-table-column prop="matSpec" label="规格/型号" min-width="120" align="center" />
<el-table-column prop="matUnit" label="系统单位" min-width="120" align="center">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.matUnit"
v-if="scope.row.matUnit ? true : false" />
</template>
</el-table-column>
<el-table-column prop="requireAmount" min-width="120" align="center">
<template #header><span class="hl-table_header">*</span>需求数量</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.requireAmount`" :rules="subFormRules.requireAmount" class="mb-0px!">
<el-input v-model="scope.row.requireAmount" disabled/>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="150" align="center">
<template #header> <span class="hl-table_header">*</span>需求到货日期 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.requireArriveTime`" :rules="subFormRules.requireArriveTime" class="mb-0px!">
<el-date-picker class="!w-265px" v-model="row.requireArriveTime" type="date" value-format="x"
placeholder="需求到货日期" disabled/>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="150" align="center">
<template #header><span class="hl-table_header">*</span>子项目编号</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.projectSubId`" :rules="subFormRules.projectSubId" class="mb-0px!">
<el-select class="!w-265px" v-model="row.projectSubId" filterable clearable disabled>
<el-option v-for="dict in formData.projectOrderSubs" :key="dict.projectSubId"
:label="dict.projectSubCode" :value="dict.projectSubId" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="description" min-width="180" label="备注" align="center">
<template #default="scope">
<el-input v-model="scope.row.description" disabled/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<template #default="scope">
<el-button link type="danger" size="small" @click.prevent="handleDelete2(scope.$index)" v-if="false">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 附件信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">附件信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-col>
<el-upload ref="matUploadRef" :file-list="matUploadFiles" multiple :limit="10" :action="uploadUrl"
:headers="{
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
}" name="files" :show-file-list="false" :auto-upload="false" :data="matUploadData"
:on-change="matUploadChange" :on-error="UpError" class="upload-file-uploader">
<el-button type="primary" v-if="false">
<Icon icon="ep:upload-filled" />上传
</el-button>
</el-upload>
</el-col>
<el-table :data="formData.attachments" class="hl-table">
<el-table-column prop="name" label="文件名称" align="center">
<!-- <template #default="scope">
<a :href="scope.row.url" target="_blank" style="color: #409eff">{{ scope.row.name }} </a>
</template> -->
</el-table-column>
<el-table-column prop="createTime" align="center" label="上传日期" :formatter="dateFormatter" />
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button link type="danger" size="small" v-if="false"
@click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
删除
</el-button>
<el-button link type="primary" size="small"
@click="downloadAttachment(scope.row.name, scope.row.url)">
下载
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 系统信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">系统信息</span>
</template>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="creator" label="创建人">
{{ userList.find((user) => user.id == formData.creator)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="createTime" label="创建时间">
{{ formatDate(formData.createTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="submitUserId" label="送审人">
{{ userList.find((user) => user.id == formData.submitUserId)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="submitTime" label="送审时间">
{{ formatDate(formData.submitTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="auditor" label="审核人">
{{ userList.find((user) => user.id == formData.auditor)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="auditTime" label="审核时间">
{{ formatDate(formData.auditTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<el-button @click="() => router.go(-1)" size="large"> </el-button>
</div>
</el-card>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as MaterialPlanApi from '@/api/heli/materialplan'
import * as MaterialPlanDetailApi from '@/api/heli/materialplandetail'
import * as PlanApi from '@/api/heli/plan'
import * as PlanSubApi from '@/api/heli/plansub'
import * as ProjectOrderApi from '@/api/heli/projectorder'
import * as UserApi from '@/api/system/user'
import * as MaterialApi from '@/api/heli/material'
import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file'
import download from '@/utils/download'
import { getAccessToken, getTenantId } from '@/utils/auth'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import { useUserStore } from '@/store/modules/user'
const reload = inject('reload')
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()
const router = useRouter()
const dialogVisible = ref(false) //
const formLoading = ref(false) // 12
const formData = ref({
id: undefined,
projectMaterialPlanNo: undefined,
projectId: undefined,
projectPlanId: undefined,
projectPlanNo: undefined,
projectCode: undefined,
auditor: undefined,
createTime: new Date(),
status: undefined,
description: undefined,
matItemDOList: [],
matItemRemoveList: [],
attachments: []
})
const formRules = reactive({
projectPlanId: [{ required: true, message: '生产计划单号不能为空', trigger: 'blur' }],
})
const subFormRules = reactive({
matId: [{ required: true, message: '物料编码不能为空', trigger: 'blur' }],
requireAmount: [{ required: true, message: '需求数量不能为空', trigger: 'blur' }],
requireArriveTime: [{ required: true, message: '需求到货日期不能为空', trigger: 'blur' }],
projectSubId: [{ required: true, message: '子项目编号不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
const subFormRef = ref() // Ref
// ==================== =======================================
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const matUploadRef = ref()
const matUploadFiles = ref<UploadUserFile[]>([])
const matUploadData = ref({
businessType: 'MATERIALPLAN',
businessId: formData.value.id,
businessFileType: ''
})
const matUploadChange = (file, files) => {
matUploadFiles.value = files
refreshAttachments(files, 'MATERIALPLAN')
}
const failedAttachments = ref<UploadUserFile[]>([])
const failedAttachmentsName = ref()
const UpError = (err, file, fileList) => {
//
if (err) {
// failedAttachments.value
failedAttachments.value.push(file)
failedAttachmentsName.value = failedAttachments.value.map((value) => value.name)
}
}
const openerror = () => {
setTimeout(() => {
if (failedAttachmentsName.value.length > 0) {
//
ElMessageBox.alert(
// 使
`文件名为:${failedAttachmentsName.value.join(' / ')}上传失败`,
`文件格式不正确或网络问题 请您稍后再试`,
{
dangerouslyUseHTMLString: false,
confirmButtonText: '知道了',
center: true
}
)
}
}, 1000)
}
const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value) => value.id)
//
const newFiles = files.filter(
(file) => !formData.value.attachments.some((att) => att.name === file.name)
)
for (let i = 0; i < newFiles.length; i++) {
let file = newFiles[i]
file.businessFileType = type
file.createTime = new Date()
formData.value.attachments.push(file)
}
//
formData.value.attachments.sort((v1, v2) => v1.createTime - v2.createTime)
}
//
const handleDeleteAttachment = async (index, type) => {
const deletedAttachments = formData.value.attachments.splice(index, 1)
for (let i = 0; i < deletedAttachments.length; i++) {
const attachment = deletedAttachments[i]
if (attachment.id) {
//
await deleteFile(attachment.id)
}
//
matUploadFiles.value = matUploadFiles.value.filter((file1) => {
return file1.name != attachment.name || file1.businessFileType != type
})
}
}
//
const downloadAttachment = async (name, url) => {
if (url) {
const data = await downloadFile(url)
download.any(data, name)
}
}
// ==================== =======================================
//
const getMatList = async (name) => {
//
let matParams = {
pageNo: 1,
pageSize: 10,
status: '1'
}
if (name.length > 0) {
matParams.name = name
}
const dataMat = await MaterialApi.getMaterialPage(matParams)
matList.value = dataMat.list
}
const matList = ref<MaterialApi.MaterialVO[]>([]) //
const matSelectLoading = ref(false)
const remoteMatNameSearch = async (name) => {
matSelectLoading.value = true
//
await getMatList(name)
matSelectLoading.value = false
}
const handleMatName = async (scope, matid) => {
scope.row.matId = matList.value.find((item) => item.id === matid)?.id
scope.row.matName = matList.value.find((item) => item.id === matid)?.name
scope.row.matCode = matList.value.find((item) => item.id === matid)?.code
scope.row.matSpec = matList.value.find((item) => item.id === matid)?.spec
scope.row.matType = matList.value.find((item) => item.id === matid)?.materialType
scope.row.matUnit = matList.value.find((item) => item.id === matid)?.unit
}
//
const onAddItem = () => {
const newData = {
//
stockId: 0,
matId: '',
matName: '',
matCode: '',
matType: '',
matSpec: '',
matUnit: '',
requireAmount: '',
requireArriveTime: '',
projectSubId: '',
description: ''
}
formData.value.matItemDOList.push(newData)
}
//
const handleDelete2 = (index: number) => {
formData.value.matItemRemoveList.push(formData.value.matItemDOList[index])
formData.value.matItemDOList.splice(index, 1)
}
const handleInitPlanSub = async () => {
//
formData.value.projectOrderSubs =
await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(formData.value.projectId)
//
const queryParams = reactive({
pageNo: 1,
pageSize: 99,
projectPlanId: query.id
})
formData.value.projectPlanSubs =
(await PlanSubApi.getPlanSubPage(queryParams)).list
formData.value.projectOrderSubs.forEach(item => {
if (formData.value.projectPlanSubs.filter(sub => sub.projectSubId == item.id).length > 0) {
var subTemp = formData.value.projectPlanSubs.find(sub => sub.projectSubId == item.id)
item.projectSubId = subTemp.projectSubId
item.projectSubCode = subTemp.projectSubCode
}
})
}
//
const saveMaterials = async () =>{
formData.value.matItemDOList.forEach(item => {
var subData = item as unknown as MaterialPlanDetailApi.MaterialPlanDetailVO
subData.materialId = item.matId
subData.projectMaterialPlanId = formData.value.id
if (subData.id == undefined) {
MaterialPlanDetailApi.createMaterialPlanDetail(subData)
} else {
MaterialPlanDetailApi.updateMaterialPlanDetail(subData)
}
})
formData.value.matItemRemoveList.forEach(item =>{
if (item.id != undefined) {
MaterialPlanDetailApi.deleteMaterialPlanDetail(item.id)
}
})
}
//
const saveForm = async () => {
//
formLoading.value = true
try {
const data = formData.value as unknown as MaterialPlanApi.MaterialPlanVO
await MaterialPlanApi.updateMaterialPlan(data)
//
await saveMaterials()
//formData.value.matItemDOList
if (formData.value.attachments != undefined && formData.value.attachments.length > 0) {
//
matUploadData.value.businessId = formData.value.id
await matUploadRef.value!.submit()
}
message.success(t('common.updateSuccess'))
dialogVisible.value = false
//
emit('success')
} finally {
reload()
formLoading.value = false
}
}
//
const submitForm = async () => {
if(formData.value.matItemDOList.length ==0){
message.alertWarning('请添加物料信息!')
return
}
//
try {
await subFormRef.value.validate()
} catch (e) {
return
}
//
formData.value.status = 2
formData.value.submitUserId = useUserStore().getUser.id
await saveForm()
}
const userList = ref<UserApi.UserVO[]>([]) //
const planInit = ref()
const projectInit = ref()
const queryParams = reactive({
pageNo: 1,
pageSize: 99,
projectMaterialPlanId: query.id,
})
//
onMounted(async () => {
//
formData.value = await MaterialPlanApi.getMaterialPlan(query.id)
//
planInit.value = await PlanApi.getPlan(formData.value.projectPlanId)
//
projectInit.value = await ProjectOrderApi.getProjectOrder(formData.value.projectId)
formData.value.planNo = planInit.value.planNo
formData.value.projectName = projectInit.value.projectName
formData.value.projectCode = projectInit.value.code
//
formData.value.matItemDOList = (await MaterialPlanDetailApi.getMaterialPlanDetailPage(queryParams)).list
formData.value.matItemDOList.forEach(item=>{
matList.value.push({id:item.matId,name:item.matName})
})
formData.value.matItemRemoveList = []
//
await handleInitPlanSub()
//
let attParams = {
pageNo: 1,
pageSize: 99,
businessId: query.id,
businessType: 'MATERIALPLAN'
}
formData.value.attachments = (await getFilePage(attParams)).list
//
userList.value = await UserApi.getSimpleUserList()
})
</script>

@ -0,0 +1,626 @@
<template>
<el-card class="hl-card" style="position: relative">
<template #header>
<span>编辑页</span>
</template>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="160px" v-loading="formLoading">
<!-- 基础信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<el-row>
<el-col :span="24">
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="采购编号" prop="purchaseNo">
<el-input class="!w-265px" placeholder="系统自动生成" v-model="formData.purchaseNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="采购单类型" prop="purchaseType" :rules="formRules.purchaseType">
<el-select v-model="formData.purchaseType" clearable class="!w-240px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="结算币种" prop="currencyType">
<el-select v-model="formData.currencyType" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_CURRENCY)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="80">
<el-form-item label="备注" prop="description" >
<el-input class="!w-713px" type="textarea" v-model="formData.description" show-word-limit
maxlength="200" />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="单据日期" prop="createTime">
<el-date-picker class="!w-265px" v-model="formData.createTime" value-format="x" placeholder="单据日期"
disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="物料需求计划编号" prop="materialPlanNo">
<el-input class="!w-265px" v-model="formData.materialPlanNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="暂估价金额(元)" prop="estimatedPrice" >
<el-input class="!w-265px" v-model="formData.estimatedPrice" placeholder="暂估价金额(元)" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="单据状态" prop="status">
<el-select v-model="formData.status" placeholder="单据状态" clearable class="!w-265px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PURCHASE_ORDER_STATUS)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="采购物类型" prop="goodsType" :rules="formRules.goodsType">
<el-select v-model="formData.goodsType" placeholder="下拉选择" clearable class="!w-240px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_GOODS_TYPE)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="实际价金额(元)" prop="actualPrice" >
<el-input class="!w-265px" v-model="formData.actualPrice" placeholder="实际价金额(元)" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="供应商" prop="supplierId" :rules="formRules.supplierId">
<el-select v-model="formData.supplierId" placeholder="下拉选择" clearable class="!w-240px" disabled>
<el-option v-for="dict in supplierInit"
:key="dict.id" :label="dict.name" :value="dict.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="采购合同号" prop="contractNo">
<el-input class="!w-265px" v-model="formData.contractNo" placeholder="采购合同号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="税率(%)" prop="taxRatio" >
<el-input class="!w-265px" v-model="formData.taxRatio" placeholder="税率" />
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<!-- 物料信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">物料信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-col>
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem"></el-button>
</el-col>
<el-form ref="subFormRef" :model="formData.matItemDOList" :rules="subFormRules"
v-loading="subFormLoading" label-width="0">
<el-table :data="formData.matItemDOList" class="hl-table">
<el-table-column type="index" label="序号" :width="80" />
<el-table-column prop="matCode" label="物料编码" min-width="120" align="center" />
<el-table-column prop="matId" min-width="140" align="center">
<template #header> <span class="hl-table_header">*</span>物料名称 </template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.matId`" :rules="subFormRules.matId" class="mb-0px!">
<el-select v-model="scope.row.matId" placeholder="物料名称" :remote-method="remoteMatNameSearch"
remote-show-suffix remote clearable reserve-keyword filterable :loading="matSelectLoading"
@change="(val) => handleMatName(scope, val)" class="!w-180px">
<el-option v-for="item in matList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="matType" label="物料类型" min-width="120" align="center">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_TYPE" :value="scope.row.matType"
v-if="scope.row.matType ? true : false" />
</template>
</el-table-column>
<el-table-column prop="matSpec" label="规格/型号" min-width="120" align="center" />
<el-table-column prop="matUnit" label="系统单位" min-width="120" align="center">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.matUnit"
v-if="scope.row.matUnit ? true : false" />
</template>
</el-table-column>
<el-table-column prop="requireAmount" min-width="120" align="center">
<template #header><span class="hl-table_header">*</span>需求数量</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.requireAmount`" :rules="subFormRules.requireAmount" class="mb-0px!">
<el-input v-model="scope.row.requireAmount" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="150" align="center">
<template #header> <span class="hl-table_header">*</span>需求到货日期 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.requireArriveTime`" :rules="subFormRules.requireArriveTime" class="mb-0px!">
<el-date-picker class="!w-265px" v-model="row.requireArriveTime" type="date" value-format="x"
placeholder="需求到货日期" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="150" align="center">
<template #header><span class="hl-table_header">*</span>子项目编号</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.projectSubId`" :rules="subFormRules.projectSubId" class="mb-0px!">
<el-select class="!w-265px" v-model="row.projectSubId" filterable clearable>
<el-option v-for="dict in formData.projectOrderSubs" :key="dict.projectSubId"
:label="dict.projectSubCode" :value="dict.projectSubId" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="description" min-width="180" label="备注" align="center">
<template #default="scope">
<el-input v-model="scope.row.description" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<template #default="scope">
<el-button link type="danger" size="small" @click.prevent="handleDelete2(scope.$index)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 附件信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">附件信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-col>
<el-upload ref="matUploadRef" :file-list="matUploadFiles" multiple :limit="10" :action="uploadUrl"
:headers="{
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
}" name="files" :show-file-list="false" :auto-upload="false" :data="matUploadData"
:on-change="matUploadChange" :on-error="UpError" class="upload-file-uploader">
<el-button type="primary">
<Icon icon="ep:upload-filled" />上传
</el-button>
</el-upload>
</el-col>
<el-table :data="formData.attachments" class="hl-table">
<el-table-column prop="name" label="文件名称" align="center">
<!-- <template #default="scope">
<a :href="scope.row.url" target="_blank" style="color: #409eff">{{ scope.row.name }} </a>
</template> -->
</el-table-column>
<el-table-column prop="createTime" align="center" label="上传日期" :formatter="dateFormatter" />
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button link type="danger" size="small"
@click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
删除
</el-button>
<el-button link type="primary" size="small"
@click="downloadAttachment(scope.row.name, scope.row.url)">
下载
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 系统信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">系统信息</span>
</template>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="creator" label="创建人">
{{ userList.find((user) => user.id == formData.creator)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="createTime" label="创建时间">
{{ formatDate(formData.createTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="submitUserId" label="送审人">
{{ userList.find((user) => user.id == formData.submitUserId)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="submitTime" label="送审时间">
{{ formatDate(formData.submitTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="auditor" label="审核人">
{{ userList.find((user) => user.id == formData.auditor)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="auditTime" label="审核时间">
{{ formatDate(formData.auditTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<el-button @click="() => router.go(-1)" size="large"> </el-button>
<el-button @click="deleteForm" type="danger" size="large" v-if="formData.status !== 2 && formData.status !==3"> </el-button>
<el-button @click="saveForm" type="primary" size="large" v-if="formData.status !== 2 && formData.status !==3"> </el-button>
<el-button @click="submitForm" type="success" size="large" v-if="formData.status !== 2 && formData.status !==3"> </el-button>
</div>
</el-card>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as PurchaseOrderApi from '@/api/heli/purchaseorder'
// import * as MaterialPlanDetailApi from '@/api/heli/materialplandetail'
import * as UserApi from '@/api/system/user'
import * as MaterialApi from '@/api/heli/material'
import * as SupplierApi from '@/api/heli/supplier'
import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file'
import download from '@/utils/download'
import { getAccessToken, getTenantId } from '@/utils/auth'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import { useUserStore } from '@/store/modules/user'
const reload = inject('reload')
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()
const router = useRouter()
const dialogVisible = ref(false) //
const formLoading = ref(false) // 12
const formData = ref({
id: undefined,
purchaseNo:undefined,
supplierId:undefined,
contractNo:undefined,
purchaseNo:undefined,
projectMaterialPlanNo: undefined,
projectMaterialPlanId: undefined,
goodsType: undefined,
currencyType: undefined,
taxRatio: undefined,
status:undefined,
createTime: undefined,
description: undefined,
matItemDOList: [],
matItemRemoveList: [],
attachments: []
})
const formRules = reactive({
projectPlanId: [{ required: true, message: '生产计划单号不能为空', trigger: 'blur' }],
})
const subFormRules = reactive({
matId: [{ required: true, message: '物料编码不能为空', trigger: 'blur' }],
requireAmount: [{ required: true, message: '需求数量不能为空', trigger: 'blur' }],
requireArriveTime: [{ required: true, message: '需求到货日期不能为空', trigger: 'blur' }],
projectSubId: [{ required: true, message: '子项目编号不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
const subFormRef = ref() // Ref
// ==================== =======================================
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const matUploadRef = ref()
const matUploadFiles = ref<UploadUserFile[]>([])
const matUploadData = ref({
businessType: 'PURCHASEORDER',
businessId: formData.value.id,
businessFileType: ''
})
const matUploadChange = (file, files) => {
matUploadFiles.value = files
refreshAttachments(files, 'PURCHASEORDER')
}
const failedAttachments = ref<UploadUserFile[]>([])
const failedAttachmentsName = ref()
const UpError = (err, file, fileList) => {
//
if (err) {
// failedAttachments.value
failedAttachments.value.push(file)
failedAttachmentsName.value = failedAttachments.value.map((value) => value.name)
}
}
const openerror = () => {
setTimeout(() => {
if (failedAttachmentsName.value.length > 0) {
//
ElMessageBox.alert(
// 使
`文件名为:${failedAttachmentsName.value.join(' / ')}上传失败`,
`文件格式不正确或网络问题 请您稍后再试`,
{
dangerouslyUseHTMLString: false,
confirmButtonText: '知道了',
center: true
}
)
}
}, 1000)
}
const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value) => value.id)
//
const newFiles = files.filter(
(file) => !formData.value.attachments.some((att) => att.name === file.name)
)
for (let i = 0; i < newFiles.length; i++) {
let file = newFiles[i]
file.businessFileType = type
file.createTime = new Date()
formData.value.attachments.push(file)
}
//
formData.value.attachments.sort((v1, v2) => v1.createTime - v2.createTime)
}
//
const handleDeleteAttachment = async (index, type) => {
const deletedAttachments = formData.value.attachments.splice(index, 1)
for (let i = 0; i < deletedAttachments.length; i++) {
const attachment = deletedAttachments[i]
if (attachment.id) {
//
await deleteFile(attachment.id)
}
//
matUploadFiles.value = matUploadFiles.value.filter((file1) => {
return file1.name != attachment.name || file1.businessFileType != type
})
}
}
//
const downloadAttachment = async (name, url) => {
if (url) {
const data = await downloadFile(url)
download.any(data, name)
}
}
// ==================== =======================================
//
const getMatList = async (name) => {
//
let matParams = {
pageNo: 1,
pageSize: 10,
status: '1'
}
if (name.length > 0) {
matParams.name = name
}
const dataMat = await MaterialApi.getMaterialPage(matParams)
matList.value = dataMat.list
}
const matList = ref<MaterialApi.MaterialVO[]>([]) //
const matSelectLoading = ref(false)
const remoteMatNameSearch = async (name) => {
matSelectLoading.value = true
//
await getMatList(name)
matSelectLoading.value = false
}
const handleMatName = async (scope, matid) => {
scope.row.matId = matList.value.find((item) => item.id === matid)?.id
scope.row.matName = matList.value.find((item) => item.id === matid)?.name
scope.row.matCode = matList.value.find((item) => item.id === matid)?.code
scope.row.matSpec = matList.value.find((item) => item.id === matid)?.spec
scope.row.matType = matList.value.find((item) => item.id === matid)?.materialType
scope.row.matUnit = matList.value.find((item) => item.id === matid)?.unit
}
//
const onAddItem = () => {
const newData = {
//
stockId: 0,
matId: '',
matName: '',
matCode: '',
matType: '',
matSpec: '',
matUnit: '',
requireAmount: '',
requireArriveTime: '',
projectSubId: '',
description: ''
}
formData.value.matItemDOList.push(newData)
}
//
const handleDelete2 = (index: number) => {
formData.value.matItemRemoveList.push(formData.value.matItemDOList[index])
formData.value.matItemDOList.splice(index, 1)
}
const handleInitPlanSub = async () => {
}
//
const saveMaterials = async () =>{
// formData.value.matItemDOList.forEach(item => {
// var subData = item as unknown as MaterialPlanDetailApi.MaterialPlanDetailVO
// subData.materialId = item.matId
// subData.projectMaterialPlanId = formData.value.id
// if (subData.id == undefined) {
// MaterialPlanDetailApi.createMaterialPlanDetail(subData)
// } else {
// MaterialPlanDetailApi.updateMaterialPlanDetail(subData)
// }
// })
// formData.value.matItemRemoveList.forEach(item =>{
// if (item.id != undefined) {
// MaterialPlanDetailApi.deleteMaterialPlanDetail(item.id)
// }
// })
}
//
const saveForm = async () => {
//
formLoading.value = true
try {
const data = formData.value as unknown as PurchaseOrderApi.PurchaseOrderVO
var purchaseOrderId = await PurchaseOrderApi.updatePurchaseOrder(data)
//
await saveMaterials()
//formData.value.matItemDOList
if (formData.value.attachments != undefined && formData.value.attachments.length > 0) {
//
matUploadData.value.businessId = formData.value.id
await matUploadRef.value!.submit()
}
message.success(t('common.updateSuccess'))
dialogVisible.value = false
//
emit('success')
} finally {
reload()
formLoading.value = false
}
}
//
const submitForm = async () => {
if(formData.value.matItemDOList.length ==0){
message.alertWarning('请添加物料信息!')
return
}
//
try {
await subFormRef.value.validate()
} catch (e) {
return
}
//
formData.value.status = 2
formData.value.submitUserId = useUserStore().getUser.id
await saveForm()
}
const userList = ref<UserApi.UserVO[]>([]) //
const supplierInit = ref()
const queryParams = reactive({
pageNo: 1,
pageSize: 99,
purchaseId: query.id,
})
//
onMounted(async () => {
//
formData.value = await PurchaseOrderApi.getPurchaseOrder(query.id)
//
formData.value.matItemDOList = []
//(await MaterialPlanDetailApi.getMaterialPlanDetailPage(queryParams)).list
formData.value.matItemDOList.forEach(item=>{
matList.value.push({id:item.matId,name:item.matName})
})
formData.value.matItemRemoveList = []
//
let attParams = {
pageNo: 1,
pageSize: 99,
businessId: query.id,
businessType: 'PURCHASEORDER'
}
formData.value.attachments = (await getFilePage(attParams)).list
//
userList.value = await UserApi.getSimpleUserList()
supplierInit.value = await SupplierApi.getSimpList()
})
</script>

@ -0,0 +1,226 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="98px">
<el-form-item label="采购单号" prop="purchaseNo">
<el-input v-model="queryParams.purchaseNo" placeholder="采购单号" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="单据日期" prop="createTime">
<el-date-picker class="!w-265px" v-model="queryParams.createTime" type="date" value-format="x"
placeholder="单据日期" />
</el-form-item>
<el-form-item label="供应商" prop="supplierName">
<el-input v-model="queryParams.supplierName" placeholder="供应商" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="采购单类型" prop="purchaseType">
<el-select v-model="queryParams.purchaseType" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="物料需求计划单号" prop="materialPlanNo">
<el-input v-model="queryParams.materialPlanNo" placeholder="物料需求计划单号" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="采购物类型" prop="goodsType">
<el-select v-model="queryParams.goodsType" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_GOODS_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="单据状态" prop="status">
<el-select v-model="queryParams.status" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PURCHASE_ORDER_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</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" plain @click="openForm('create')" v-hasPermi="['heli:purchase-order:create']">
<Icon icon="ep:plus" 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="采购单号" align="center" prop="purchaseNo" fixed min-width="180"/>
<el-table-column label="单据日期" align="center" prop="createTime" :formatter="dateFormatter" min-width="180px" fixed>
<template #default="scope">
{{
formatDate(scope.row.createTime, 'YYYY-MM-DD')
}}
</template>
</el-table-column>
<el-table-column label="供应商" align="center" prop="supplierName" fixed />
<el-table-column label="采购单类型" align="center" prop="purchaseType" min-width="220">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE" :value="scope.row.purchaseType" />
</template>
</el-table-column>
<el-table-column label="物料需求计划单号" align="center" prop="materialPlanNo" min-width="220"/>
<el-table-column label="采购物类型" align="center" prop="goodsType" min-width="180">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PURCHASE_GOODS_TYPE" :value="scope.row.goodsType" />
</template>
</el-table-column>
<el-table-column label="采购合同号" align="center" prop="contractNo" min-width="180"/>
<el-table-column label="结算币种" align="center" prop="currencyType" min-width="180">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_CURRENCY" :value="scope.row.currencyType" />
</template>
</el-table-column>
<el-table-column label="暂估价金额(元)" align="center" prop="estimatedPrice" min-width="180"/>
<el-table-column label="实际价金额(元)" align="center" prop="actualPrice" min-width="180"/>
<el-table-column label="税率" align="center" prop="taxRatio" />
<el-table-column label="备注" align="center" prop="description" />
<el-table-column label="单据状态" align="center" prop="status" fixed="right" min-width="180">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PURCHASE_ORDER_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" min-width="180">
<template #default="scope">
<el-button link type="primary" @click="openForm('edit', scope.row.id)">
编辑
</el-button>
<el-button link type="primary" @click="openForm('detail', scope.row.id)">
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import download from '@/utils/download'
import * as PurchaseOrderApi from '@/api/heli/purchaseorder'
import PurchaseOrderForm from './PurchaseOrderForm.vue'
defineOptions({ name: 'PurchaseOrder' })
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
id: undefined,
purchaseNo: undefined,
supplierId: undefined,
contractNo: undefined,
purchaseType: undefined,
projectMaterialPlanId: undefined,
goodsType: undefined,
currencyType: undefined,
taxRatio: undefined,
estimatedPrice: undefined,
actualPrice: undefined,
status: undefined,
submitUserId: undefined,
submitTime: [],
auditor: undefined,
auditTime: [],
description: undefined,
creator: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PurchaseOrderApi.getPurchaseOrderPage(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 openForm = (type: string, id?: number) => {
switch (type) {
case 'create':
router.push({ path: '/purchase/add', query: { id: id } })
break;
case 'edit':
router.push({ path: '/purchase/edit', query: { id: id } })
break;
case 'detail':
router.push({ path: '/purchase/detail', query: { id: id } })
break;
default:
break;
}
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await PurchaseOrderApi.deletePurchaseOrder(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PurchaseOrderApi.exportPurchaseOrder(queryParams)
download.excel(data, '采购订单.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(async () => {
await getList()
})
</script>

@ -265,3 +265,22 @@ CREATE TABLE `project_purchase_order` (
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='采购订单'; ) ENGINE=InnoDB COMMENT='采购订单';
DROP TABLE IF EXISTS `project_purchase_order_material`;
CREATE TABLE `project_purchase_order_material` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`purchase_order_id` bigint(20) NOT NULL COMMENT '采购单编号',
`material_id` bigint(20) DEFAULT NULL COMMENT '物料id',
`purchase_amount` bigint(10) DEFAULT NULL COMMENT '采购数量',
`estimated_price` decimal(10,2) DEFAULT NULL COMMENT '暂估价金额',
`actual_price` decimal(10,2) DEFAULT NULL COMMENT '实际价金额',
`arrive_time` datetime DEFAULT NULL COMMENT '预计到期日期',
`description` varchar(255) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='采购单物料表';
Loading…
Cancel
Save