送样需求表创建
Docker Deploy / ctn-build-and-deploy (push) Failing after 39s Details
Docker Deploy / app-build-and-deploy (push) Has been cancelled Details

This commit is contained in:
SysProChan 2025-04-06 17:56:07 +08:00
parent aec26792b8
commit 5152756185
13 changed files with 1612 additions and 2 deletions

View File

@ -6,10 +6,12 @@ type ApiGroup struct {
ProductApi
ProjectApi
CustomerApi
OrderApi
}
var (
ProdService = service.ServiceGroupApp.GvappServiceGroup.ProductService
ProjService = service.ServiceGroupApp.GvappServiceGroup.ProjectService
CustService = service.ServiceGroupApp.GvappServiceGroup.CustomerService
OrdService = service.ServiceGroupApp.GvappServiceGroup.OrderService
)

View File

@ -0,0 +1,210 @@
package gvapp
import (
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
"github.com/flipped-aurora/gin-vue-admin/server/model/gvapp"
gvappReq "github.com/flipped-aurora/gin-vue-admin/server/model/gvapp/request"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
type OrderApi struct {}
// CreateOrder 创建订单信息
// @Tags Order
// @Summary 创建订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data body gvapp.Order true "创建订单信息"
// @Success 200 {object} response.Response{msg=string} "创建成功"
// @Router /Ord/createOrder [post]
func (OrdApi *OrderApi) CreateOrder(c *gin.Context) {
// 创建业务用Context
ctx := c.Request.Context()
var Ord gvapp.Order
err := c.ShouldBindJSON(&Ord)
if err != nil {
response.FailWithMessage(err.Error(), c)
return
}
err = OrdService.CreateOrder(ctx,&Ord)
if err != nil {
global.GVA_LOG.Error("创建失败!", zap.Error(err))
response.FailWithMessage("创建失败:" + err.Error(), c)
return
}
response.OkWithMessage("创建成功", c)
}
// DeleteOrder 删除订单信息
// @Tags Order
// @Summary 删除订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data body gvapp.Order true "删除订单信息"
// @Success 200 {object} response.Response{msg=string} "删除成功"
// @Router /Ord/deleteOrder [delete]
func (OrdApi *OrderApi) DeleteOrder(c *gin.Context) {
// 创建业务用Context
ctx := c.Request.Context()
ID := c.Query("ID")
err := OrdService.DeleteOrder(ctx,ID)
if err != nil {
global.GVA_LOG.Error("删除失败!", zap.Error(err))
response.FailWithMessage("删除失败:" + err.Error(), c)
return
}
response.OkWithMessage("删除成功", c)
}
// DeleteOrderByIds 批量删除订单信息
// @Tags Order
// @Summary 批量删除订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Success 200 {object} response.Response{msg=string} "批量删除成功"
// @Router /Ord/deleteOrderByIds [delete]
func (OrdApi *OrderApi) DeleteOrderByIds(c *gin.Context) {
// 创建业务用Context
ctx := c.Request.Context()
IDs := c.QueryArray("IDs[]")
err := OrdService.DeleteOrderByIds(ctx,IDs)
if err != nil {
global.GVA_LOG.Error("批量删除失败!", zap.Error(err))
response.FailWithMessage("批量删除失败:" + err.Error(), c)
return
}
response.OkWithMessage("批量删除成功", c)
}
// UpdateOrder 更新订单信息
// @Tags Order
// @Summary 更新订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data body gvapp.Order true "更新订单信息"
// @Success 200 {object} response.Response{msg=string} "更新成功"
// @Router /Ord/updateOrder [put]
func (OrdApi *OrderApi) UpdateOrder(c *gin.Context) {
// 从ctx获取标准context进行业务行为
ctx := c.Request.Context()
var Ord gvapp.Order
err := c.ShouldBindJSON(&Ord)
if err != nil {
response.FailWithMessage(err.Error(), c)
return
}
err = OrdService.UpdateOrder(ctx,Ord)
if err != nil {
global.GVA_LOG.Error("更新失败!", zap.Error(err))
response.FailWithMessage("更新失败:" + err.Error(), c)
return
}
response.OkWithMessage("更新成功", c)
}
// FindOrder 用id查询订单信息
// @Tags Order
// @Summary 用id查询订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param ID query uint true "用id查询订单信息"
// @Success 200 {object} response.Response{data=gvapp.Order,msg=string} "查询成功"
// @Router /Ord/findOrder [get]
func (OrdApi *OrderApi) FindOrder(c *gin.Context) {
// 创建业务用Context
ctx := c.Request.Context()
ID := c.Query("ID")
reOrd, err := OrdService.GetOrder(ctx,ID)
if err != nil {
global.GVA_LOG.Error("查询失败!", zap.Error(err))
response.FailWithMessage("查询失败:" + err.Error(), c)
return
}
response.OkWithData(reOrd, c)
}
// GetOrderList 分页获取订单信息列表
// @Tags Order
// @Summary 分页获取订单信息列表
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data query gvappReq.OrderSearch true "分页获取订单信息列表"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "获取成功"
// @Router /Ord/getOrderList [get]
func (OrdApi *OrderApi) GetOrderList(c *gin.Context) {
// 创建业务用Context
ctx := c.Request.Context()
var pageInfo gvappReq.OrderSearch
err := c.ShouldBindQuery(&pageInfo)
if err != nil {
response.FailWithMessage(err.Error(), c)
return
}
list, total, err := OrdService.GetOrderInfoList(ctx,pageInfo)
if err != nil {
global.GVA_LOG.Error("获取失败!", zap.Error(err))
response.FailWithMessage("获取失败:" + err.Error(), c)
return
}
response.OkWithDetailed(response.PageResult{
List: list,
Total: total,
Page: pageInfo.Page,
PageSize: pageInfo.PageSize,
}, "获取成功", c)
}
// GetOrderDataSource 获取Order的数据源
// @Tags Order
// @Summary 获取Order的数据源
// @Accept application/json
// @Produce application/json
// @Success 200 {object} response.Response{data=object,msg=string} "查询成功"
// @Router /Ord/getOrderDataSource [get]
func (OrdApi *OrderApi) GetOrderDataSource(c *gin.Context) {
// 创建业务用Context
ctx := c.Request.Context()
// 此接口为获取数据源定义的数据
dataSource, err := OrdService.GetOrderDataSource(ctx)
if err != nil {
global.GVA_LOG.Error("查询失败!", zap.Error(err))
response.FailWithMessage("查询失败:" + err.Error(), c)
return
}
response.OkWithData(dataSource, c)
}
// GetOrderPublic 不需要鉴权的订单信息接口
// @Tags Order
// @Summary 不需要鉴权的订单信息接口
// @Accept application/json
// @Produce application/json
// @Success 200 {object} response.Response{data=object,msg=string} "获取成功"
// @Router /Ord/getOrderPublic [get]
func (OrdApi *OrderApi) GetOrderPublic(c *gin.Context) {
// 创建业务用Context
ctx := c.Request.Context()
// 此接口不需要鉴权
// 示例为返回了一个固定的消息接口一般本接口用于C端服务需要自己实现业务逻辑
OrdService.GetOrderPublic(ctx)
response.OkWithDetailed(gin.H{
"info": "不需要鉴权的订单信息接口信息",
}, "获取成功", c)
}

View File

@ -11,5 +11,7 @@ func bizModel() error {
if err != nil {
return err
}
LocalDb := global.GetGlobalDBByDBName("Local")
LocalDb.AutoMigrate(gvapp.Order{})
return nil
}

View File

@ -16,7 +16,8 @@ func initBizRouter(routers ...*gin.RouterGroup) {
{
gvappRouter := router.RouterGroupApp.Gvapp
gvappRouter.InitProductRouter(privateGroup, publicGroup)
gvappRouter.InitProjectRouter(privateGroup, publicGroup) // 占位方法保证文件可以正确加载避免go空变量检测报错请勿删除。
gvappRouter.InitCustomerRouter(privateGroup, publicGroup)
gvappRouter.InitProjectRouter(privateGroup, publicGroup)
gvappRouter.InitCustomerRouter(privateGroup, publicGroup) // 占位方法保证文件可以正确加载避免go空变量检测报错请勿删除。
gvappRouter.InitOrderRouter(privateGroup, publicGroup)
}
}

View File

@ -0,0 +1,34 @@
// 自动生成模板Order
package gvapp
import (
"time"
"github.com/flipped-aurora/gin-vue-admin/server/global"
)
// 订单信息 结构体 Order
type Order struct {
global.GVA_MODEL
SalesMan *int `json:"salesMan" form:"salesMan" gorm:"column:sales_man;comment:销售经理;" binding:"required"` //销售经理
CustomerCode uint `json:"customerCode" form:"customerCode" gorm:"column:customer_code;comment:;" binding:"required"` //客户代码
CustomerType *string `json:"customerType" form:"customerType" gorm:"column:customer_type;comment:;"` //客户类型
CustomerName *string `json:"customerName" form:"customerName" gorm:"column:customer_name;comment:客户名称;"` //客户名称
CustomerLocation *string `json:"customerLocation" form:"customerLocation" gorm:"column:customer_location;comment:;"` //客户所在地
ProductCode *string `json:"productCode" form:"productCode" gorm:"column:product_code;comment:产品code;" binding:"required"` //产品code
ProductType *string `json:"productType" form:"productType" gorm:"column:product_type;comment:;"` //产品类型
ProjectManager *string `json:"projectManager" form:"projectManager" gorm:"column:project_manager;comment:;"` //项目经理
DemandDate *time.Time `json:"demandDate" form:"demandDate" gorm:"column:demand_date;comment:需求日期;" binding:"required"` //需求日期
DemandQuantity *int `json:"demandQuantity" form:"demandQuantity" gorm:"column:demand_quantity;comment:需求数量;" binding:"required"` //需求数量
PlanDeliveryDate *time.Time `json:"planDeliveryDate" form:"planDeliveryDate" gorm:"column:plan_delivery_date;comment:;"` //计划交付日期
ActualDeliveryDate *time.Time `json:"actualDeliveryDate" form:"actualDeliveryDate" gorm:"column:actual_delivery_date;comment:;"` //实际交付日期
ActualQuantity *int `json:"actualQuantity" form:"actualQuantity" gorm:"column:actual_quantity;comment:;"` //实际交付数量
Status *string `json:"status" form:"status" gorm:"column:status;comment:订单状态;"` //交付状态
Project *Project `json:"project" form:"project" gorm:"foreignKey:ProductCode;references:ProductCode;"`
Customer *Customer `json:"customer" form:"customer" gorm:"foreignKey:CustomerCode;references:ID;"`
}
// TableName 订单信息 Order自定义表名 order
func (Order) TableName() string {
return "sample_order"
}

View File

@ -0,0 +1,32 @@
package request
import (
"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
"time"
)
type OrderSearch struct{
StartCreatedAt *time.Time `json:"startCreatedAt" form:"startCreatedAt"`
EndCreatedAt *time.Time `json:"endCreatedAt" form:"endCreatedAt"`
SalesMan *int `json:"salesMan" form:"salesMan" `
CustomerCode *int `json:"customerCode" form:"customerCode" `
CustomerType *string `json:"customerType" form:"customerType" `
CustomerName *string `json:"customerName" form:"customerName" `
CustomerLocation *string `json:"customerLocation" form:"customerLocation" `
ProductCode *string `json:"productCode" form:"productCode" `
ProductType *string `json:"productType" form:"productType" `
ProjectManager *string `json:"projectManager" form:"projectManager" `
StartDemandDate *time.Time `json:"startDemandDate" form:"startDemandDate"`
EndDemandDate *time.Time `json:"endDemandDate" form:"endDemandDate"`
StartDemandQuantity *int `json:"startDemandQuantity" form:"startDemandQuantity"`
EndDemandQuantity *int `json:"endDemandQuantity" form:"endDemandQuantity"`
StartPlanDeliveryDate *time.Time `json:"startPlanDeliveryDate" form:"startPlanDeliveryDate"`
EndPlanDeliveryDate *time.Time `json:"endPlanDeliveryDate" form:"endPlanDeliveryDate"`
StartActualDeliveryDate *time.Time `json:"startActualDeliveryDate" form:"startActualDeliveryDate"`
EndActualDeliveryDate *time.Time `json:"endActualDeliveryDate" form:"endActualDeliveryDate"`
Status *string `json:"status" form:"status" `
request.PageInfo
Sort string `json:"sort" form:"sort"`
Order string `json:"order" form:"order"`
}

View File

@ -6,10 +6,12 @@ type RouterGroup struct {
ProductRouter
ProjectRouter
CustomerRouter
OrderRouter
}
var (
ProdApi = api.ApiGroupApp.GvappApiGroup.ProductApi
ProjApi = api.ApiGroupApp.GvappApiGroup.ProjectApi
CustApi = api.ApiGroupApp.GvappApiGroup.CustomerApi
OrdApi = api.ApiGroupApp.GvappApiGroup.OrderApi
)

View File

@ -0,0 +1,29 @@
package gvapp
import (
"github.com/flipped-aurora/gin-vue-admin/server/middleware"
"github.com/gin-gonic/gin"
)
type OrderRouter struct {}
// InitOrderRouter 初始化 订单信息 路由信息
func (s *OrderRouter) InitOrderRouter(Router *gin.RouterGroup,PublicRouter *gin.RouterGroup) {
OrdRouter := Router.Group("Ord").Use(middleware.OperationRecord())
OrdRouterWithoutRecord := Router.Group("Ord")
OrdRouterWithoutAuth := PublicRouter.Group("Ord")
{
OrdRouter.POST("createOrder", OrdApi.CreateOrder) // 新建订单信息
OrdRouter.DELETE("deleteOrder", OrdApi.DeleteOrder) // 删除订单信息
OrdRouter.DELETE("deleteOrderByIds", OrdApi.DeleteOrderByIds) // 批量删除订单信息
OrdRouter.PUT("updateOrder", OrdApi.UpdateOrder) // 更新订单信息
}
{
OrdRouterWithoutRecord.GET("findOrder", OrdApi.FindOrder) // 根据ID获取订单信息
OrdRouterWithoutRecord.GET("getOrderList", OrdApi.GetOrderList) // 获取订单信息列表
}
{
OrdRouterWithoutAuth.GET("getOrderDataSource", OrdApi.GetOrderDataSource) // 获取订单信息数据源
OrdRouterWithoutAuth.GET("getOrderPublic", OrdApi.GetOrderPublic) // 订单信息开放接口
}
}

View File

@ -4,4 +4,5 @@ type ServiceGroup struct {
ProductService
ProjectService
CustomerService
OrderService
}

View File

@ -0,0 +1,160 @@
package gvapp
import (
"context"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/gvapp"
gvappReq "github.com/flipped-aurora/gin-vue-admin/server/model/gvapp/request"
"gorm.io/gorm/clause"
)
type OrderService struct{}
// CreateOrder 创建订单信息记录
// Author [yourname](https://github.com/yourname)
func (OrdService *OrderService) CreateOrder(ctx context.Context, Ord *gvapp.Order) (err error) {
err = global.MustGetGlobalDBByDBName("Local").Create(Ord).Error
return err
}
// DeleteOrder 删除订单信息记录
// Author [yourname](https://github.com/yourname)
func (OrdService *OrderService) DeleteOrder(ctx context.Context, ID string) (err error) {
err = global.MustGetGlobalDBByDBName("Local").Delete(&gvapp.Order{}, "id = ?", ID).Error
return err
}
// DeleteOrderByIds 批量删除订单信息记录
// Author [yourname](https://github.com/yourname)
func (OrdService *OrderService) DeleteOrderByIds(ctx context.Context, IDs []string) (err error) {
err = global.MustGetGlobalDBByDBName("Local").Delete(&[]gvapp.Order{}, "id in ?", IDs).Error
return err
}
// UpdateOrder 更新订单信息记录
// Author [yourname](https://github.com/yourname)
func (OrdService *OrderService) UpdateOrder(ctx context.Context, Ord gvapp.Order) (err error) {
err = global.MustGetGlobalDBByDBName("Local").Model(&gvapp.Order{}).Where("id = ?", Ord.ID).Updates(&Ord).Error
return err
}
// GetOrder 根据ID获取订单信息记录
// Author [yourname](https://github.com/yourname)
func (OrdService *OrderService) GetOrder(ctx context.Context, ID string) (Ord gvapp.Order, err error) {
err = global.MustGetGlobalDBByDBName("Local").Preload("Project.Product").Preload(clause.Associations).Where("id = ?", ID).First(&Ord).Error
return
}
// GetOrderInfoList 分页获取订单信息记录
// Author [yourname](https://github.com/yourname)
func (OrdService *OrderService) GetOrderInfoList(ctx context.Context, info gvappReq.OrderSearch) (list []gvapp.Order, total int64, err error) {
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
// 创建db
db := global.MustGetGlobalDBByDBName("Local").Model(&gvapp.Order{})
var Ords []gvapp.Order
// 如果有条件搜索 下方会自动创建搜索语句
if info.StartCreatedAt != nil && info.EndCreatedAt != nil {
db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
}
if info.SalesMan != nil {
db = db.Where("sales_man = ?", *info.SalesMan)
}
if info.CustomerCode != nil || info.CustomerType != nil && *info.CustomerType != "" || info.CustomerName != nil && *info.CustomerName != "" || info.CustomerLocation != nil && *info.CustomerLocation != "" {
db = db.Joins("INNER JOIN customer ON customer.id = sample_order.customer_code")
}
if info.CustomerCode != nil {
db = db.Where("customer.id = ?", *info.CustomerCode)
}
if info.CustomerType != nil && *info.CustomerType != "" {
db = db.Where("customer.type = ?", *info.CustomerType)
}
if info.CustomerName != nil && *info.CustomerName != "" {
db = db.Where("customer.name LIKE ?", "%"+*info.CustomerName+"%")
}
if info.CustomerLocation != nil && *info.CustomerLocation != "" {
db = db.Where("customer.location = ?", *info.CustomerLocation)
}
if info.ProductCode != nil && *info.ProductCode != "" {
db = db.Where("sample_order.product_code = ?", *info.ProductCode)
}
// 如果产品类型和项目经理都不为空则通过product_code字段关联查询project表
if info.ProductType != nil && *info.ProductType != "" || info.ProjectManager != nil && *info.ProjectManager != ""{
db = db.Joins("INNER JOIN project ON project.product_code = sample_order.product_code")
}
if info.ProductType != nil && *info.ProductType != "" {
db = db.Preload("Project.Product", "product_type = ?", info.ProductType).
Joins("INNER JOIN product ON product.product_code = project.product_code").
Where("product.product_type = ?", *info.ProductType)
}
if info.ProjectManager != nil && *info.ProjectManager != "" {
db = db.Where("project.project_manager = ?", *info.ProjectManager)
}
if info.StartDemandDate != nil && info.EndDemandDate != nil {
db = db.Where("demand_date BETWEEN ? AND ? ", info.StartDemandDate, info.EndDemandDate)
}
if info.StartDemandQuantity != nil && info.EndDemandQuantity != nil {
db = db.Where("demand_quantity BETWEEN ? AND ? ", info.StartDemandQuantity, info.EndDemandQuantity)
}
if info.StartPlanDeliveryDate != nil && info.EndPlanDeliveryDate != nil {
db = db.Where("plan_delivery_date BETWEEN ? AND ? ", info.StartPlanDeliveryDate, info.EndPlanDeliveryDate)
}
if info.StartActualDeliveryDate != nil && info.EndActualDeliveryDate != nil {
db = db.Where("actual_delivery_date BETWEEN ? AND ? ", info.StartActualDeliveryDate, info.EndActualDeliveryDate)
}
if info.Status != nil && *info.Status != "" {
db = db.Where("status = ?", *info.Status)
}
err = db.Count(&total).Error
if err != nil {
return
}
var OrderStr string
orderMap := make(map[string]bool)
orderMap["sales_man"] = true
orderMap["demand_date"] = true
orderMap["demand_quantity"] = true
orderMap["plan_delivery_date"] = true
orderMap["actual_delivery_date"] = true
orderMap["actual_quantity"] = true
if orderMap[info.Sort] {
OrderStr = info.Sort
if info.Order == "descending" {
OrderStr = OrderStr + " desc"
}
db = db.Order(OrderStr)
}
if limit != 0 {
db = db.Limit(limit).Offset(offset)
}
err = db.Preload("Project.Product").Preload(clause.Associations).Find(&Ords).Error
return Ords, total, err
}
func (OrdService *OrderService) GetOrderDataSource(ctx context.Context) (res map[string][]map[string]any, err error) {
res = make(map[string][]map[string]any)
customerCode := make([]map[string]any, 0)
global.MustGetGlobalDBByDBName("Local").Table("customer").Where("deleted_at IS NULL").Select("code as label,id as value").Scan(&customerCode)
res["customerCode"] = customerCode
productCode := make([]map[string]any, 0)
global.MustGetGlobalDBByDBName("Local").Table("project").Where("deleted_at IS NULL").Select("product_code as label,product_code as value").Scan(&productCode)
res["productCode"] = productCode
salesMan := make([]map[string]any, 0)
global.MustGetGlobalDBByDBName("Local").Table("sys_users").Where("deleted_at IS NULL").Select("nick_name as label,id as value").Scan(&salesMan)
res["salesMan"] = salesMan
projectManager := make([]map[string]any, 0)
global.MustGetGlobalDBByDBName("Local").Table("sys_users").Where("deleted_at IS NULL").Select("nick_name as label,id as value").Scan(&projectManager)
res["projectManager"] = projectManager
return
}
func (OrdService *OrderService) GetOrderPublic(ctx context.Context) {
// 此方法为获取数据源定义的数据
// 请自行实现
}

123
web/src/api/gvapp/order.js Normal file
View File

@ -0,0 +1,123 @@
import service from '@/utils/request'
// @Tags Order
// @Summary 创建订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data body model.Order true "创建订单信息"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
// @Router /Ord/createOrder [post]
export const createOrder = (data) => {
return service({
url: '/Ord/createOrder',
method: 'post',
data
})
}
// @Tags Order
// @Summary 删除订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data body model.Order true "删除订单信息"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
// @Router /Ord/deleteOrder [delete]
export const deleteOrder = (params) => {
return service({
url: '/Ord/deleteOrder',
method: 'delete',
params
})
}
// @Tags Order
// @Summary 批量删除订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data body request.IdsReq true "批量删除订单信息"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
// @Router /Ord/deleteOrder [delete]
export const deleteOrderByIds = (params) => {
return service({
url: '/Ord/deleteOrderByIds',
method: 'delete',
params
})
}
// @Tags Order
// @Summary 更新订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data body model.Order true "更新订单信息"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}"
// @Router /Ord/updateOrder [put]
export const updateOrder = (data) => {
return service({
url: '/Ord/updateOrder',
method: 'put',
data
})
}
// @Tags Order
// @Summary 用id查询订单信息
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data query model.Order true "用id查询订单信息"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
// @Router /Ord/findOrder [get]
export const findOrder = (params) => {
return service({
url: '/Ord/findOrder',
method: 'get',
params
})
}
// @Tags Order
// @Summary 分页获取订单信息列表
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Param data query request.PageInfo true "分页获取订单信息列表"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /Ord/getOrderList [get]
export const getOrderList = (params) => {
return service({
url: '/Ord/getOrderList',
method: 'get',
params
})
}
// @Tags Order
// @Summary 获取数据源
// @Security ApiKeyAuth
// @Accept application/json
// @Produce application/json
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
// @Router /Ord/findOrderDataSource [get]
export const getOrderDataSource = () => {
return service({
url: '/Ord/getOrderDataSource',
method: 'get',
})
}
// @Tags Order
// @Summary 不需要鉴权的订单信息接口
// @Accept application/json
// @Produce application/json
// @Param data query gvappReq.OrderSearch true "分页获取订单信息列表"
// @Success 200 {object} response.Response{data=object,msg=string} "获取成功"
// @Router /Ord/getOrderPublic [get]
export const getOrderPublic = () => {
return service({
url: '/Ord/getOrderPublic',
method: 'get',
})
}

View File

@ -0,0 +1,836 @@
<template>
<div>
<div class="gva-search-box">
<el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule"
@keyup.enter="onSubmit">
<el-form-item label="创建日期" prop="createdAt">
<template #label>
<span>
创建日期
<el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</span>
</template>
<el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期"
:disabled-date="time => searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false">
</el-date-picker>
<el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期"
:disabled-date="time => searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false">
</el-date-picker>
</el-form-item>
<el-form-item label="产品code" prop="productCode">
<el-select v-model="searchInfo.productCode" placeholder="请选择产品code" clearable>
<el-option v-for="(item, key) in dataSource.productCode" :key="key" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<template v-if="showAllQuery">
<!-- 将需要控制显示状态的查询条件添加到此范围内 -->
<el-form-item label="销售经理" prop="salesMan">
<el-select v-model.number="searchInfo.salesMan" clearable placeholder="请选择"
@clear="() => { searchInfo.salesMan = undefined }">
<el-option v-for="(item, key) in dataSource.salesMan" :key="key" :label="item.label"
:value="item.value" />
</el-select>
<!-- <el-input v-model.number="searchInfo.salesMan" placeholder="搜索条件" /> -->
</el-form-item>
<el-form-item label="客户代码" prop="customerCode">
<el-select v-model.number="searchInfo.customerCode" clearable placeholder="请选择"
@clear="() => { searchInfo.customerCode = undefined }">
<el-option v-for="(item, key) in dataSource.customerCode" :key="key" :label="item.label"
:value="item.value" />
</el-select>
<!-- <el-input v-model.number="searchInfo.customerCode" placeholder="搜索条件" /> -->
</el-form-item>
<el-form-item label="客户类型" prop="customerType">
<el-select v-model="searchInfo.customerType" clearable placeholder="请选择"
@clear="() => { searchInfo.customerType = undefined }">
<el-option v-for="(item, key) in CustomerTypeOptions" :key="key" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="searchInfo.customerName" placeholder="搜索条件" />
</el-form-item>
<el-form-item label="客户所在地" prop="customerLocation">
<el-select v-model="searchInfo.customerLocation" clearable placeholder="请选择"
@clear="() => { searchInfo.customerLocation = undefined }">
<el-option v-for="(item, key) in CustomerLocationOptions" :key="key" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="产品类型" prop="productType">
<el-select v-model="searchInfo.productType" clearable placeholder="请选择"
@clear="() => { searchInfo.productType = undefined }">
<el-option v-for="(item, key) in ProductTypeOptions" :key="key" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="项目经理" prop="projectManager">
<el-select v-model.number="searchInfo.projectManager" clearable placeholder="请选择"
@clear="() => { searchInfo.projectManager = undefined }">
<el-option v-for="(item, key) in dataSource.projectManager" :key="key" :label="item.label"
:value="item.value" />
</el-select>
<!-- <el-input v-model="searchInfo.projectManager" placeholder="搜索条件" /> -->
</el-form-item>
<el-form-item label="需求日期" prop="demandDate">
<template #label>
<span>
需求日期
<el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</span>
</template>
<el-date-picker v-model="searchInfo.startDemandDate" type="datetime" placeholder="开始日期"
:disabled-date="time => searchInfo.endDemandDate ? time.getTime() > searchInfo.endDemandDate.getTime() : false">
</el-date-picker>
<el-date-picker v-model="searchInfo.endDemandDate" type="datetime" placeholder="结束日期"
:disabled-date="time => searchInfo.startDemandDate ? time.getTime() < searchInfo.startDemandDate.getTime() : false">
</el-date-picker>
</el-form-item>
<el-form-item label="需求数量" prop="demandQuantity">
<el-input v-model.number="searchInfo.startDemandQuantity" placeholder="最小值" />
<el-input v-model.number="searchInfo.endDemandQuantity" placeholder="最大值" />
</el-form-item>
<el-form-item label="计划交付日期" prop="planDeliveryDate">
<template #label>
<span>
计划交付日期
<el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</span>
</template>
<el-date-picker v-model="searchInfo.startPlanDeliveryDate" type="datetime" placeholder="开始日期"
:disabled-date="time => searchInfo.endPlanDeliveryDate ? time.getTime() > searchInfo.endPlanDeliveryDate.getTime() : false">
</el-date-picker>
<el-date-picker v-model="searchInfo.endPlanDeliveryDate" type="datetime" placeholder="结束日期"
:disabled-date="time => searchInfo.startPlanDeliveryDate ? time.getTime() < searchInfo.startPlanDeliveryDate.getTime() : false">
</el-date-picker>
</el-form-item>
<el-form-item label="实际交付日期" prop="actualDeliveryDate">
<template #label>
<span>
实际交付日期
<el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</span>
</template>
<el-date-picker v-model="searchInfo.startActualDeliveryDate" type="datetime" placeholder="开始日期"
:disabled-date="time => searchInfo.endActualDeliveryDate ? time.getTime() > searchInfo.endActualDeliveryDate.getTime() : false">
</el-date-picker>
<el-date-picker v-model="searchInfo.endActualDeliveryDate" type="datetime" placeholder="结束日期"
:disabled-date="time => searchInfo.startActualDeliveryDate ? time.getTime() < searchInfo.startActualDeliveryDate.getTime() : false">
</el-date-picker>
</el-form-item>
<el-form-item label="交付状态" prop="status">
<el-select v-model="searchInfo.status" clearable placeholder="请选择"
@clear="() => { searchInfo.status = undefined }">
<el-option v-for="(item, key) in DeliveryStatusOptions" :key="key" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</template>
<el-form-item>
<el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
<el-button icon="refresh" @click="onReset">重置</el-button>
<el-button link type="primary" icon="arrow-down" @click="showAllQuery = true" v-if="!showAllQuery">展开
</el-button>
<el-button link type="primary" icon="arrow-up" @click="showAllQuery = false" v-else>收起</el-button>
</el-form-item>
</el-form>
</div>
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button type="primary" icon="plus" @click="openDialog()">新增</el-button>
<el-button icon="delete" style="margin-left: 10px;" :disabled="!multipleSelection.length" @click="onDelete">删除
</el-button>
<ExportTemplate template-id="gvapp_Order" />
<ExportExcel template-id="gvapp_Order" />
<ImportExcel template-id="gvapp_Order" @on-success="getTableData" />
</div>
<el-table ref="multipleTable" style="width: 100%" tooltip-effect="dark" :data="tableData" row-key="ID"
@selection-change="handleSelectionChange" @sort-change="sortChange">
<el-table-column type="selection" width="55" />
<el-table-column align="left" label="日期" prop="createdAt" width="180">
<template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
</el-table-column>
<el-table-column sortable align="left" label="销售经理" prop="salesMan" width="120">
<template #default="scope">
<span>{{ filterDataSource(dataSource.salesMan, scope.row.salesMan) }}</span>
</template>
</el-table-column>
<el-table-column align="left" label="客户代码" prop="customerCode" width="120">
<template #default="scope">
<span>{{ filterDataSource(dataSource.customerCode, scope.row.customerCode) }}</span>
</template>
</el-table-column>
<el-table-column align="left" label="客户类型" prop="customerType" width="120">
<template #default="scope">
{{ filterDict(scope.row.customer ? scope.row.customer.type : "", CustomerTypeOptions) }}
</template>
</el-table-column>
<el-table-column align="left" label="客户所在地" prop="customerLocation" width="120">
<template #default="scope">
{{ filterDict(scope.row.customer ? scope.row.customer.location : "", CustomerLocationOptions) }}
</template>
</el-table-column>
<el-table-column align="left" label="产品code" prop="productCode" width="120">
<template #default="scope">
<span>{{ filterDataSource(dataSource.productCode, scope.row.productCode) }}</span>
</template>
</el-table-column>
<el-table-column align="left" label="产品类型" prop="productType" width="120">
<template #default="scope">
{{ filterDict(scope.row.project ? scope.row.project.product.productType : "", ProductTypeOptions) }}
</template>
</el-table-column>
<el-table-column align="left" label="项目经理" prop="projectManager" width="120">
<template #default="scope">
{{ filterDataSource(dataSource.projectManager, scope.row.project.projectManager) }}
</template>
</el-table-column>
<el-table-column sortable align="left" label="需求日期" prop="demandDate" width="180">
<template #default="scope">{{ scope.row.demandDate ? formatTimeToStr(scope.row.demandDate, "yyyy-MM-dd") : ""
}}</template>
</el-table-column>
<el-table-column sortable align="left" label="需求数量" prop="demandQuantity" width="120" />
<el-table-column sortable align="left" label="计划交付日期" prop="planDeliveryDate" width="180">
<template #default="scope">{{ scope.row.planDeliveryDate ? formatTimeToStr(scope.row.planDeliveryDate,
"yyyy-MM-dd") : ""
}}</template>
</el-table-column>
<el-table-column sortable align="left" label="实际交付日期" prop="actualDeliveryDate" width="180">
<template #default="scope">{{ scope.row.actualDeliveryDate ? formatTimeToStr(scope.row.actualDeliveryDate,
"yyyy-MM-dd") : ""
}}</template>
</el-table-column>
<el-table-column sortable align="left" label="发货数量" prop="actualQuantity" width="120" />
<el-table-column align="left" label="交付状态" prop="status" width="120">
<template #default="scope">
{{ filterDict(getStatus(scope.row.planDeliveryDate, scope.row.actualDeliveryDate), DeliveryStatusOptions) }}
</template>
</el-table-column>
<el-table-column align="left" label="操作" fixed="right" :min-width="appStore.operateMinWith">
<template #default="scope">
<el-button type="primary" link class="table-button" @click="getDetails(scope.row)">
<el-icon style="margin-right: 5px">
<InfoFilled />
</el-icon>
</el-button>
<el-button type="primary" link icon="edit" class="table-button" @click="updateOrderFunc(scope.row)">编辑
</el-button>
<el-button type="primary" link icon="delete" @click="deleteRow(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="gva-pagination">
<el-pagination layout="total, sizes, prev, pager, next, jumper" :current-page="page" :page-size="pageSize"
:page-sizes="[10, 30, 50, 100]" :total="total" @current-change="handleCurrentChange"
@size-change="handleSizeChange" />
</div>
</div>
<el-drawer destroy-on-close :size="appStore.drawerSize" v-model="dialogFormVisible" :show-close="false"
:before-close="closeDialog">
<template #header>
<div class="flex justify-between items-center">
<span class="text-lg">{{ type === 'create' ? '新增' : '编辑' }}</span>
<div>
<el-button :loading="btnLoading" type="primary" @click="enterDialog"> </el-button>
<el-button @click="closeDialog"> </el-button>
</div>
</div>
</template>
<el-form :model="formData" label-position="top" ref="elFormRef" :rules="rule" label-width="80px">
<el-form-item label="销售经理:" prop="salesMan">
<el-select v-model="formData.salesMan" placeholder="请选择销售经理" style="width:100%" :clearable="false">
<el-option v-for="(item, key) in dataSource.salesMan" :key="key" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="客户代码:" prop="customerCode">
<el-select v-model="formData.customerCode" placeholder="请选择客户代码" style="width:100%" :clearable="false">
<el-option v-for="(item, key) in dataSource.customerCode" :key="key" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="产品code:" prop="productCode">
<el-select v-model="formData.productCode" placeholder="请选择产品code" style="width:100%" :clearable="false">
<el-option v-for="(item, key) in dataSource.productCode" :key="key" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="需求日期:" prop="demandDate">
<el-date-picker v-model="formData.demandDate" type="date" style="width:100%" placeholder="选择日期"
:clearable="false" />
</el-form-item>
<el-form-item label="需求数量:" prop="demandQuantity">
<el-input v-model.number="formData.demandQuantity" :clearable="false" placeholder="请输入需求数量" />
</el-form-item>
<el-form-item label="计划交付日期:" prop="planDeliveryDate">
<el-date-picker v-model="formData.planDeliveryDate" type="date" style="width:100%" placeholder="选择日期"
:clearable="false" />
</el-form-item>
<el-form-item label="实际交付日期:" prop="actualDeliveryDate">
<el-date-picker v-model="formData.actualDeliveryDate" type="date" style="width:100%" placeholder="选择日期"
:clearable="false" />
</el-form-item>
<el-form-item label="实际交付数量:" prop="actualQuantity">
<el-input v-model.number="formData.actualQuantity" :clearable="false" placeholder="请输入实际交付数量" />
</el-form-item>
</el-form>
</el-drawer>
<el-drawer destroy-on-close :size="appStore.drawerSize" v-model="detailShow" :show-close="true"
:before-close="closeDetailShow" title="查看">
<el-descriptions :column="1" border>
<el-descriptions-item label="销售经理">
<span>{{ filterDataSource(dataSource.salesMan, detailFrom.salesMan) }}</span>
</el-descriptions-item>
<el-descriptions-item label="客户代码">
<span>{{ filterDataSource(dataSource.customerCode, detailFrom.customerCode) }}</span>
</el-descriptions-item>
<el-descriptions-item label="客户类型">
{{ filterDict(detailFrom.customer ? detailFrom.customer.type : "", CustomerTypeOptions) }}
</el-descriptions-item>
<el-descriptions-item label="客户名称">
{{ detailFrom.customer ? detailFrom.customer.name : "" }}
</el-descriptions-item>
<el-descriptions-item label="客户所在地">
{{ filterDict(detailFrom.customer ? detailFrom.customer.location : "", CustomerLocationOptions) }}
</el-descriptions-item>
<el-descriptions-item label="产品code">
<span>{{ filterDataSource(dataSource.productCode, detailFrom.productCode) }}</span>
</el-descriptions-item>
<el-descriptions-item label="产品类型">
{{ filterDict(detailFrom.project ? detailFrom.project.product.productType : "", ProductTypeOptions) }}
</el-descriptions-item>
<el-descriptions-item label="项目经理">
<span>{{ filterDataSource(dataSource.projectManager, detailFrom.project.projectManager) }}</span>
</el-descriptions-item>
<el-descriptions-item label="需求日期">
{{ detailFrom.demandDate ? formatTimeToStr(detailFrom.demandDate, "yyyy-MM-dd") : "" }}
</el-descriptions-item>
<el-descriptions-item label="需求数量">
{{ detailFrom.demandQuantity }}
</el-descriptions-item>
<el-descriptions-item label="计划交付日期">
{{ detailFrom.planDeliveryDate ? formatTimeToStr(detailFrom.planDeliveryDate, "yyyy-MM-dd") : "" }}
</el-descriptions-item>
<el-descriptions-item label="实际交付日期">
{{ detailFrom.planDeliveryDate ? formatTimeToStr(detailFrom.actualDeliveryDate, "yyyy-MM-dd") : "" }}
</el-descriptions-item>
<el-descriptions-item label="实际交付数量">
{{ detailFrom.actualQuantity }}
</el-descriptions-item>
<el-descriptions-item label="交付状态">
<template #label>
<span>
交付状态
<el-tooltip :content="`按时交付:实际交付日期有效且不晚于计划日期;延期交付:实际交付日期有效且晚于计划日期;延期未交付:计划日期有效但实际日期无效,且当前时间已超过计划日期`">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</span>
</template>
{{ filterDict(getStatus(detailFrom.planDeliveryDate, detailFrom.actualDeliveryDate), DeliveryStatusOptions) }}
</el-descriptions-item>
</el-descriptions>
</el-drawer>
</div>
</template>
<script setup>
import {
getOrderDataSource,
createOrder,
deleteOrder,
deleteOrderByIds,
updateOrder,
findOrder,
getOrderList
} from '@/api/gvapp/order'
//
import { getDictFunc, formatDate, formatBoolean, filterDict, filterDataSource, returnArrImg, onDownloadFile } from '@/utils/format'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ref, reactive } from 'vue'
import { useAppStore } from "@/pinia"
//
import ExportExcel from '@/components/exportExcel/exportExcel.vue'
//
import ImportExcel from '@/components/exportExcel/importExcel.vue'
//
import ExportTemplate from '@/components/exportExcel/exportTemplate.vue'
import { formatTimeToStr } from '@/utils/date'
defineOptions({
name: 'Order'
})
// loading
const btnLoading = ref(false)
const appStore = useAppStore()
// /
const showAllQuery = ref(false)
//
const ProductTypeOptions = ref([])
const DeliveryStatusOptions = ref([])
const CustomerTypeOptions = ref([])
const CustomerLocationOptions = ref([])
const formData = ref({
salesMan: undefined,
customerCode: undefined,
productCode: '',
demandDate: new Date(),
demandQuantity: undefined,
planDeliveryDate: undefined,
actualDeliveryDate: undefined,
actualQuantity: undefined,
})
const dataSource = ref([])
const getDataSourceFunc = async () => {
const res = await getOrderDataSource()
if (res.code === 0) {
dataSource.value = res.data
}
}
getDataSourceFunc()
const getStatus = (planDeliveryDate, actualDeliveryDate) => {
// Date
const planDate = new Date(planDeliveryDate);
const actualDate = new Date(actualDeliveryDate);
const now = new Date();
// 1-
if (isValidDate(actualDate) && isValidDate(planDate) && actualDate < planDate) {
return '1';
}
// 2-
if (isValidDate(actualDate) && isValidDate(planDate) && actualDate > planDate) {
return '2';
}
// 3-
if (isValidDate(planDate) && !isValidDate(actualDate) && now > planDate) {
return '3';
}
// 4-
return '4';
};
//
const isValidDate = (date) => {
return date instanceof Date && !isNaN(date.getTime());
};
//
const rule = reactive({
salesMan: [{
required: true,
message: '',
trigger: ['input', 'blur'],
},
],
customerCode: [{
required: true,
message: '',
trigger: ['input', 'blur'],
},
],
productCode: [{
required: true,
message: '',
trigger: ['input', 'blur'],
},
{
whitespace: true,
message: '不能只输入空格',
trigger: ['input', 'blur'],
}
],
demandDate: [{
required: true,
message: '',
trigger: ['input', 'blur'],
},
],
demandQuantity: [{
required: true,
message: '',
trigger: ['input', 'blur'],
},
],
})
const searchRule = reactive({
createdAt: [
{
validator: (rule, value, callback) => {
if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
callback(new Error('请填写结束日期'))
} else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
callback(new Error('请填写开始日期'))
} else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
callback(new Error('开始日期应当早于结束日期'))
} else {
callback()
}
}, trigger: 'change'
}
],
demandDate: [{
validator: (rule, value, callback) => {
if (searchInfo.value.startDemandDate && !searchInfo.value.endDemandDate) {
callback(new Error('请填写结束日期'))
} else if (!searchInfo.value.startDemandDate && searchInfo.value.endDemandDate) {
callback(new Error('请填写开始日期'))
} else if (searchInfo.value.startDemandDate && searchInfo.value.endDemandDate && (searchInfo.value.startDemandDate.getTime() === searchInfo.value.endDemandDate.getTime() || searchInfo.value.startDemandDate.getTime() > searchInfo.value.endDemandDate.getTime())) {
callback(new Error('开始日期应当早于结束日期'))
} else {
callback()
}
}, trigger: 'change'
}],
planDeliveryDate: [{
validator: (rule, value, callback) => {
if (searchInfo.value.startPlanDeliveryDate && !searchInfo.value.endPlanDeliveryDate) {
callback(new Error('请填写结束日期'))
} else if (!searchInfo.value.startPlanDeliveryDate && searchInfo.value.endPlanDeliveryDate) {
callback(new Error('请填写开始日期'))
} else if (searchInfo.value.startPlanDeliveryDate && searchInfo.value.endPlanDeliveryDate && (searchInfo.value.startPlanDeliveryDate.getTime() === searchInfo.value.endPlanDeliveryDate.getTime() || searchInfo.value.startPlanDeliveryDate.getTime() > searchInfo.value.endPlanDeliveryDate.getTime())) {
callback(new Error('开始日期应当早于结束日期'))
} else {
callback()
}
}, trigger: 'change'
}],
actualDeliveryDate: [{
validator: (rule, value, callback) => {
if (searchInfo.value.startActualDeliveryDate && !searchInfo.value.endActualDeliveryDate) {
callback(new Error('请填写结束日期'))
} else if (!searchInfo.value.startActualDeliveryDate && searchInfo.value.endActualDeliveryDate) {
callback(new Error('请填写开始日期'))
} else if (searchInfo.value.startActualDeliveryDate && searchInfo.value.endActualDeliveryDate && (searchInfo.value.startActualDeliveryDate.getTime() === searchInfo.value.endActualDeliveryDate.getTime() || searchInfo.value.startActualDeliveryDate.getTime() > searchInfo.value.endActualDeliveryDate.getTime())) {
callback(new Error('开始日期应当早于结束日期'))
} else {
callback()
}
}, trigger: 'change'
}],
})
const elFormRef = ref()
const elSearchFormRef = ref()
// =========== ===========
const page = ref(1)
const total = ref(0)
const pageSize = ref(10)
const tableData = ref([])
const searchInfo = ref({})
//
const sortChange = ({ prop, order }) => {
const sortMap = {
salesMan: 'sales_man',
demandDate: 'demand_date',
demandQuantity: 'demand_quantity',
planDeliveryDate: 'plan_delivery_date',
actualDeliveryDate: 'actual_delivery_date',
actualQuantity: 'actual_quantity',
}
let sort = sortMap[prop]
if (!sort) {
sort = prop.replace(/[A-Z]/g, match => `_${match.toLowerCase()}`)
}
searchInfo.value.sort = sort
searchInfo.value.order = order
getTableData()
}
//
const onReset = () => {
searchInfo.value = {}
getTableData()
}
//
const onSubmit = () => {
elSearchFormRef.value?.validate(async (valid) => {
if (!valid) return
page.value = 1
getTableData()
})
}
//
const handleSizeChange = (val) => {
pageSize.value = val
getTableData()
}
//
const handleCurrentChange = (val) => {
page.value = val
getTableData()
}
//
const getTableData = async () => {
const table = await getOrderList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
if (table.code === 0) {
tableData.value = table.data.list
total.value = table.data.total
page.value = table.data.page
pageSize.value = table.data.pageSize
}
}
getTableData()
// ============== ===============
//
const setOptions = async () => {
ProductTypeOptions.value = await getDictFunc('ProductType')
DeliveryStatusOptions.value = await getDictFunc('DeliveryStatus')
CustomerTypeOptions.value = await getDictFunc('CustomerType')
CustomerLocationOptions.value = await getDictFunc('CustomerLocation')
}
//
setOptions()
//
const multipleSelection = ref([])
//
const handleSelectionChange = (val) => {
multipleSelection.value = val
}
//
const deleteRow = (row) => {
ElMessageBox.confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteOrderFunc(row)
})
}
//
const onDelete = async () => {
ElMessageBox.confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const IDs = []
if (multipleSelection.value.length === 0) {
ElMessage({
type: 'warning',
message: '请选择要删除的数据'
})
return
}
multipleSelection.value &&
multipleSelection.value.map(item => {
IDs.push(item.ID)
})
const res = await deleteOrderByIds({ IDs })
if (res.code === 0) {
ElMessage({
type: 'success',
message: '删除成功'
})
if (tableData.value.length === IDs.length && page.value > 1) {
page.value--
}
getTableData()
}
})
}
//
const type = ref('')
//
const updateOrderFunc = async (row) => {
const res = await findOrder({ ID: row.ID })
type.value = 'update'
if (res.code === 0) {
formData.value = res.data
dialogFormVisible.value = true
}
}
//
const deleteOrderFunc = async (row) => {
const res = await deleteOrder({ ID: row.ID })
if (res.code === 0) {
ElMessage({
type: 'success',
message: '删除成功'
})
if (tableData.value.length === 1 && page.value > 1) {
page.value--
}
getTableData()
}
}
//
const dialogFormVisible = ref(false)
//
const openDialog = () => {
type.value = 'create'
dialogFormVisible.value = true
}
//
const closeDialog = () => {
dialogFormVisible.value = false
formData.value = {
salesMan: undefined,
customerCode: undefined,
productCode: '',
demandDate: new Date(),
demandQuantity: undefined,
planDeliveryDate: undefined,
actualDeliveryDate: undefined,
actualQuantity: undefined,
}
}
//
const enterDialog = async () => {
btnLoading.value = true
elFormRef.value?.validate(async (valid) => {
if (!valid) return btnLoading.value = false
let res
switch (type.value) {
case 'create':
res = await createOrder(formData.value)
break
case 'update':
res = await updateOrder(formData.value)
break
default:
res = await createOrder(formData.value)
break
}
btnLoading.value = false
if (res.code === 0) {
ElMessage({
type: 'success',
message: '创建/更改成功'
})
closeDialog()
getTableData()
}
})
}
const detailFrom = ref({})
//
const detailShow = ref(false)
//
const openDetailShow = () => {
detailShow.value = true
}
//
const getDetails = async (row) => {
//
const res = await findOrder({ ID: row.ID })
if (res.code === 0) {
detailFrom.value = res.data
openDetailShow()
}
}
//
const closeDetailShow = () => {
detailShow.value = false
detailFrom.value = {}
}
</script>
<style>
</style>

View File

@ -0,0 +1,178 @@
<template>
<div>
<div class="gva-form-box">
<el-form :model="formData" ref="elFormRef" label-position="right" :rules="rule" label-width="80px">
<el-form-item label="销售经理:" prop="salesMan">
<el-select v-model="formData.salesMan" placeholder="请选择销售经理" style="width:100%" :clearable="false" >
<el-option v-for="(item,key) in dataSource.salesMan" :key="key" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="客户代码:" prop="customerCode">
<el-select v-model="formData.customerCode" placeholder="请选择客户代码" style="width:100%" :clearable="false" >
<el-option v-for="(item,key) in dataSource.customerCode" :key="key" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="产品code:" prop="productCode">
<el-select v-model="formData.productCode" placeholder="请选择产品code" style="width:100%" :clearable="false" >
<el-option v-for="(item,key) in dataSource.productCode" :key="key" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="需求日期:" prop="demandDate">
<el-date-picker v-model="formData.demandDate" type="date" placeholder="选择日期" :clearable="false"></el-date-picker>
</el-form-item>
<el-form-item label="需求数量:" prop="demandQuantity">
<el-input v-model.number="formData.demandQuantity" :clearable="false" placeholder="请输入" />
</el-form-item>
<el-form-item label="计划交付日期:" prop="planDeliveryDate">
<el-date-picker v-model="formData.planDeliveryDate" type="date" placeholder="选择日期" :clearable="false"></el-date-picker>
</el-form-item>
<el-form-item label="实际交付日期:" prop="actualDeliveryDate">
<el-date-picker v-model="formData.actualDeliveryDate" type="date" placeholder="选择日期" :clearable="false"></el-date-picker>
</el-form-item>
<el-form-item label="实际交付数量:" prop="actualQuantity">
<el-input v-model.number="formData.actualQuantity" :clearable="false" placeholder="请输入" />
</el-form-item>
<el-form-item>
<el-button :loading="btnLoading" type="primary" @click="save">保存</el-button>
<el-button type="primary" @click="back">返回</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script setup>
import {
getOrderDataSource,
createOrder,
updateOrder,
findOrder
} from '@/api/gvapp/order'
defineOptions({
name: 'OrderForm'
})
//
import { getDictFunc } from '@/utils/format'
import { useRoute, useRouter } from "vue-router"
import { ElMessage } from 'element-plus'
import { ref, reactive } from 'vue'
const route = useRoute()
const router = useRouter()
// loading
const btnLoading = ref(false)
const type = ref('')
const ProductTypeOptions = ref([])
const DeliveryStatusOptions = ref([])
const CustomerTypeOptions = ref([])
const CustomerLocationOptions = ref([])
const formData = ref({
salesMan: undefined,
customerCode: undefined,
productCode: '',
demandDate: new Date(),
demandQuantity: undefined,
planDeliveryDate: new Date(),
actualDeliveryDate: new Date(),
actualQuantity: undefined,
})
//
const rule = reactive({
salesMan : [{
required: true,
message: '',
trigger: ['input','blur'],
}],
customerCode : [{
required: true,
message: '',
trigger: ['input','blur'],
}],
productCode : [{
required: true,
message: '',
trigger: ['input','blur'],
}],
demandDate : [{
required: true,
message: '',
trigger: ['input','blur'],
}],
demandQuantity : [{
required: true,
message: '',
trigger: ['input','blur'],
}],
})
const elFormRef = ref()
const dataSource = ref([])
const getDataSourceFunc = async()=>{
const res = await getOrderDataSource()
if (res.code === 0) {
dataSource.value = res.data
}
}
getDataSourceFunc()
//
const init = async () => {
// urlID find createupdate idurl
if (route.query.id) {
const res = await findOrder({ ID: route.query.id })
if (res.code === 0) {
formData.value = res.data
type.value = 'update'
}
} else {
type.value = 'create'
}
ProductTypeOptions.value = await getDictFunc('ProductType')
DeliveryStatusOptions.value = await getDictFunc('DeliveryStatus')
CustomerTypeOptions.value = await getDictFunc('CustomerType')
CustomerLocationOptions.value = await getDictFunc('CustomerLocation')
}
init()
//
const save = async() => {
btnLoading.value = true
elFormRef.value?.validate( async (valid) => {
if (!valid) return btnLoading.value = false
let res
switch (type.value) {
case 'create':
res = await createOrder(formData.value)
break
case 'update':
res = await updateOrder(formData.value)
break
default:
res = await createOrder(formData.value)
break
}
btnLoading.value = false
if (res.code === 0) {
ElMessage({
type: 'success',
message: '创建/更改成功'
})
}
})
}
//
const back = () => {
router.go(-1)
}
</script>
<style>
</style>