package controllers
|
|
import (
|
"github.com/gin-gonic/gin"
|
"github.com/shopspring/decimal"
|
"net/url"
|
"os"
|
"time"
|
"wms/constvar"
|
"wms/extend/code"
|
"wms/extend/util"
|
"wms/models"
|
"wms/pkg/logx"
|
"wms/request"
|
"wms/service"
|
"wms/task"
|
)
|
|
type ReportFormsController struct {
|
}
|
|
type Detail struct {
|
ProductId string `json:"productId"`
|
Amount decimal.Decimal `json:"amount"`
|
Status constvar.OperationStatus `json:"status"`
|
//ProductName string `json:"productName"`
|
}
|
|
// GetInventoryForms
|
// @Tags 报表
|
// @Summary 获取库存报表
|
// @Produce application/json
|
// @Param Authorization header string true "token"
|
// @Param object body request.GetInventoryForms true "查询参数"
|
// @Success 200 {object} util.ResponseList{data=[]response.InventoryForms} "成功"
|
// @Router /api-wms/v1/forms/getInventoryForms [post]
|
func (slf ReportFormsController) GetInventoryForms(c *gin.Context) {
|
var params request.GetInventoryForms
|
err := c.BindJSON(¶ms)
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
inventoryReportFormsService := service.NewInventoryReportFormsService()
|
total, err := inventoryReportFormsService.Count(params)
|
if err != nil {
|
logx.Errorf("GetInventoryForms count err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询总数失败")
|
return
|
}
|
result, err := inventoryReportFormsService.Query(params)
|
if err != nil {
|
logx.Errorf("GetInventoryForms query err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
util.ResponseFormatList(c, code.Success, result, int(total))
|
}
|
|
// DownloadInventoryForms
|
// @Tags 报表
|
// @Summary 下载库存报表
|
// @Produce application/json
|
// @Param Authorization header string true "token"
|
// @Param object body request.GetInventoryForms true "查询参数"
|
// @Success 200 {object} util.ResponseList{data=[]response.InventoryForms} "成功"
|
// @Router /api-wms/v1/forms/downloadInventoryForms [post]
|
func (slf ReportFormsController) DownloadInventoryForms(c *gin.Context) {
|
var params request.GetInventoryForms
|
err := c.BindJSON(¶ms)
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
inventoryReportFormsService := service.NewInventoryReportFormsService()
|
list, err := inventoryReportFormsService.FetchAll(params)
|
if err != nil {
|
logx.Errorf("DownloadInventoryForms FetchAll err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
filename, err := inventoryReportFormsService.Export(list)
|
if err != nil {
|
logx.Errorf("DownloadInventoryForms Export err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "导出数据到文件失败")
|
return
|
}
|
|
fileContentDisposition := "attachment;filename=\"" + url.QueryEscape(filename) + "\""
|
c.Header("Content-Type", "application/xlsx")
|
c.Header("Content-Disposition", fileContentDisposition)
|
c.File(filename)
|
defer os.Remove(filename)
|
}
|
|
// GetHistory
|
// @Tags 报表
|
// @Summary 获取出入库明细
|
// @Produce application/json
|
// @Param Authorization header string true "token"
|
// @Param object body request.GetInventoryHistory true "查询参数"
|
// @Success 200 {object} util.ResponseList{data=[]models.MoveHistory} "成功"
|
// @Router /api-wms/v1/forms/getHistory [post]
|
func (slf ReportFormsController) GetHistory(c *gin.Context) {
|
slf.GetHistoryNew(c)
|
return
|
//var params request.GetInventoryHistory
|
//if err := c.BindJSON(¶ms); err != nil {
|
// util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
// return
|
//}
|
////获取操作详情
|
//detailsSearch := models.NewOperationDetailsSearch()
|
//var (
|
// result []*response.InventoryHistory
|
// total int64
|
// ids []int
|
// err error
|
//)
|
//if params.KeyWord != "" {
|
// ids, err = service.SearchHistoryReport(params.KeyWord, params.BaseOperationType)
|
//
|
// if err != nil {
|
// util.ResponseFormat(c, code.InternalError, err.Error())
|
// return
|
// }
|
// if len(ids) == 0 {
|
// util.ResponseFormatList(c, code.Success, result, 0)
|
// }
|
//}
|
//
|
//detailsSearch.Orm = detailsSearch.Orm.Model(&models.OperationDetails{}).
|
// Select("wms_operation.number, wms_operation.updated_at as date, material.name as product_name, wms_operation.from_location_id,"+
|
// "wms_operation.to_location_id, wms_operation_details.amount, material.unit, wms_operation.contacter_name as contacted_name,"+
|
// "wms_operation.base_operation_type, material.weight, wms_operation_details.product_id").
|
// Joins("left join wms_operation on wms_operation_details.operation_id = wms_operation.id").
|
// Joins("left join material on wms_operation_details.product_id = material.id").
|
// Where("wms_operation.status = ?", constvar.OperationStatus_Finish).Order("wms_operation.created_at desc")
|
//if len(ids) > 0 {
|
// detailsSearch.Orm = detailsSearch.Orm.Where("wms_operation_details.id in ?", ids)
|
//}
|
//if params.ProduceId != "" {
|
// detailsSearch.Orm = detailsSearch.Orm.Where("wms_operation_details.product_id = ?", params.ProduceId)
|
//}
|
//if params.BaseOperationType != 0 {
|
// detailsSearch.Orm = detailsSearch.Orm.Where("wms_operation.base_operation_type = ?", params.BaseOperationType)
|
//}
|
//
|
//err = detailsSearch.Orm.Count(&total).Error
|
//if err != nil {
|
// util.ResponseFormat(c, code.RequestParamError, "查询total失败")
|
// return
|
//}
|
//if params.Page*params.PageSize > 0 {
|
// detailsSearch.Orm = detailsSearch.Orm.Offset((params.Page - 1) * params.PageSize).Limit(params.PageSize)
|
//}
|
//
|
//err = detailsSearch.Orm.Find(&result).Error
|
//if err != nil {
|
// util.ResponseFormat(c, code.RequestParamError, fmt.Errorf("查询操作明细失败: %v", err))
|
// return
|
//}
|
//var locationIds []int
|
//for _, history := range result {
|
// locationIds = append(locationIds, history.FromLocationId, history.ToLocationId)
|
//}
|
//locations, err := models.NewLocationSearch().SetIds(locationIds).FindNotTotal()
|
//if err != nil {
|
// util.ResponseFormat(c, code.RequestParamError, fmt.Errorf("查询位置失败: %v", err))
|
// return
|
//}
|
//for _, history := range result {
|
// history.Status = "完成"
|
// for _, location := range locations {
|
// if history.ToLocationId == location.Id {
|
// history.ToLocation = location.Name
|
// }
|
// if history.FromLocationId == location.Id {
|
// history.FromLocation = location.Name
|
// }
|
// }
|
//}
|
//util.ResponseFormatList(c, code.Success, result, int(total))
|
}
|
|
func (slf ReportFormsController) GetHistoryNew(c *gin.Context) {
|
var params request.GetInventoryHistory
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
historyFormsService := service.NewHistoryFormsService()
|
result, err := historyFormsService.Query(params)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "内部错误")
|
return
|
}
|
|
total, err := historyFormsService.Count(params)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "内部错误")
|
return
|
}
|
|
util.ResponseFormatList(c, code.Success, result, int(total))
|
}
|
|
// DownloadHistory
|
// @Tags 报表
|
// @Summary 下载出入库明细报表
|
// @Produce application/json
|
// @Param Authorization header string true "token"
|
// @Param object body request.GetInventoryHistory true "查询参数"
|
// @Success 200 {object} util.ResponseList{data=[]models.MoveHistory} "成功"
|
// @Router /api-wms/v1/forms/downloadHistory [post]
|
func (slf ReportFormsController) DownloadHistory(c *gin.Context) {
|
var params request.GetInventoryHistory
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
if params.BaseOperationType == 0 {
|
util.ResponseFormat(c, code.RequestParamError, "基础操作类型不能为空")
|
return
|
}
|
|
historyFormsService := service.NewHistoryFormsService()
|
list, err := historyFormsService.FetchAll(params)
|
if err != nil {
|
logx.Errorf("DownloadHistory FetchAll err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
filename, err := historyFormsService.Export(list, params)
|
if err != nil {
|
logx.Errorf("DownloadHistory Export err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "导出数据到文件失败")
|
return
|
}
|
|
fileContentDisposition := "attachment;filename=\"" + url.QueryEscape(filename) + "\""
|
c.Header("Content-Type", "application/xlsx")
|
c.Header("Content-Disposition", fileContentDisposition)
|
c.File(filename)
|
defer os.Remove(filename)
|
}
|
|
// GetLocationForms
|
// @Tags 报表
|
// @Summary 获取位置报表
|
// @Produce application/json
|
// @Param Authorization header string true "token"
|
// @Param object body request.GetLocationForms true "查询参数"
|
// @Success 200 {object} util.ResponseList{data=[]response.LocationForms} "成功"
|
// @Router /api-wms/v1/forms/getLocationForms [post]
|
func (slf ReportFormsController) GetLocationForms(c *gin.Context) {
|
var params request.GetLocationForms
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
locationFormsService := service.NewLocationFormsService()
|
total, err := locationFormsService.Count(params)
|
if err != nil {
|
logx.Errorf("GetLocationForms count err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询总数失败")
|
return
|
}
|
result, err := locationFormsService.Query(params)
|
if err != nil {
|
logx.Errorf("GetLocationForms query err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
util.ResponseFormatList(c, code.Success, result, int(total))
|
}
|
|
// DownloadLocationForms
|
// @Tags 报表
|
// @Summary 下载位置报表
|
// @Produce application/json
|
// @Param Authorization header string true "token"
|
// @Param object body request.GetLocationForms true "查询参数"
|
// @Success 200 {object} util.ResponseList{data=[]response.LocationForms} "成功"
|
// @Router /api-wms/v1/forms/downloadLocationForms [post]
|
func (slf ReportFormsController) DownloadLocationForms(c *gin.Context) {
|
var params request.GetLocationForms
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
locationFormsService := service.NewLocationFormsService()
|
list, err := locationFormsService.FetchAll(params)
|
if err != nil {
|
logx.Errorf("DownloadLocationForms FetchAll err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
filename, err := locationFormsService.Export(list)
|
if err != nil {
|
logx.Errorf("DownloadLocationForms Export err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "导出数据到文件失败")
|
return
|
}
|
|
fileContentDisposition := "attachment;filename=\"" + url.QueryEscape(filename) + "\""
|
c.Header("Content-Type", "application/xlsx")
|
c.Header("Content-Disposition", fileContentDisposition)
|
c.File(filename)
|
defer os.Remove(filename)
|
}
|
|
// MonthStats
|
// @Tags 报表
|
// @Summary 月度统计库存报表
|
// @Produce application/json
|
// @Param object body request.GetMonthStats true "查询参数"
|
// @Param Authorization header string true "token"
|
// @Success 200 {object} util.ResponseList{data=[]models.MonthStats} "成功"
|
// @Router /api-wms/v1/forms/monthStats [post]
|
func (slf ReportFormsController) MonthStats(c *gin.Context) {
|
var params request.GetMonthStats
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
monthFormsService := service.NewMonthFormsService()
|
total, err := monthFormsService.Count(params)
|
if err != nil {
|
logx.Errorf("MonthStats count err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询总数失败")
|
return
|
}
|
|
result, err := monthFormsService.Query(params)
|
if err != nil {
|
logx.Errorf("MonthStats query err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
nowMonth := time.Now().Local().Format("2006-01")
|
if nowMonth == params.Date { //实时查询
|
result, err = MonthStatsReplaceRealtimeOperation(result, params.Date)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
}
|
|
util.ResponseFormatList(c, code.Success, result, int(total))
|
}
|
|
func MonthStatsReplaceRealtimeOperation(result []*models.MonthStats, date string) ([]*models.MonthStats, error) {
|
productIds := make([]string, 0, len(result))
|
for _, item := range result {
|
productIds = append(productIds, item.ProductId)
|
}
|
statsRecords, err := service.GetCurrentStats(date, productIds)
|
if err != nil {
|
return nil, err
|
}
|
statsMap := models.MonthStatsMap(statsRecords)
|
for k, v := range result {
|
if statsMap[v.ProductId] == nil {
|
continue
|
}
|
|
result[k].OutputAmount = statsMap[v.ProductId].OutputAmount
|
result[k].OutputMoreUnits = statsMap[v.ProductId].OutputMoreUnits
|
result[k].EndAmount = statsMap[v.ProductId].EndAmount
|
result[k].EndMoreUnits = statsMap[v.ProductId].EndMoreUnits
|
result[k].InputAmount = statsMap[v.ProductId].InputAmount
|
result[k].InputMoreUnits = statsMap[v.ProductId].InputMoreUnits
|
}
|
return result, nil
|
}
|
|
// DownloadMonthStats
|
// @Tags 报表
|
// @Summary 下载月度统计库存报表
|
// @Produce application/json
|
// @Param object body request.GetMonthStats true "查询参数"
|
// @Param Authorization header string true "token"
|
// @Success 200 {object} util.ResponseList{data=[]models.MonthStats} "成功"
|
// @Router /api-wms/v1/forms/downloadMonthStats [post]
|
func (slf ReportFormsController) DownloadMonthStats(c *gin.Context) {
|
var params request.GetMonthStats
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
monthFormsService := service.NewMonthFormsService()
|
list, err := monthFormsService.FetchAll(params)
|
if err != nil {
|
logx.Errorf("DownloadMonthStats FetchAll err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
nowMonth := time.Now().Local().Format("2006-01")
|
if nowMonth == params.Date { //实时查询
|
list, err = MonthStatsReplaceRealtimeOperation(list, params.Date)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
}
|
|
filename, err := monthFormsService.Export(list)
|
if err != nil {
|
logx.Errorf("DownloadMonthStats Export err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "导出数据到文件失败")
|
return
|
}
|
|
fileContentDisposition := "attachment;filename=\"" + url.QueryEscape(filename) + "\""
|
c.Header("Content-Type", "application/xlsx")
|
c.Header("Content-Disposition", fileContentDisposition)
|
c.File(filename)
|
defer os.Remove(filename)
|
}
|
|
// DoMonthStats
|
// @Tags 报表
|
// @Summary 手动跑月度统计库存报表
|
// @Produce application/json
|
// @Param object body request.DoMonthStats true "查询参数"
|
// @Param Authorization header string true "token"
|
// @Success 200 {object} util.ResponseList{data=[]models.MonthStats} "成功"
|
// @Router /api-wms/v1/forms/doMonthStats [post]
|
func (slf ReportFormsController) DoMonthStats(c *gin.Context) {
|
var params request.DoMonthStats
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
if params.Token != constvar.DoMonthStatsToken {
|
return
|
}
|
|
task.MonthStats()
|
util.ResponseFormat(c, code.Success, nil)
|
}
|
|
// WarehouseMonthStats
|
// @Tags 报表
|
// @Summary 仓库月度统计库存报表
|
// @Produce application/json
|
// @Param object body request.GetMonthStats true "查询参数"
|
// @Param Authorization header string true "token"
|
// @Success 200 {object} util.ResponseList{data=[]models.WarehouseMonthStats} "成功"
|
// @Router /api-wms/v1/forms/warehouseMonthStats [post]
|
func (slf ReportFormsController) WarehouseMonthStats(c *gin.Context) {
|
var params request.GetMonthStats
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
if params.WarehouseID == 0 {
|
util.ResponseFormat(c, code.RequestParamError, "仓库ID参数缺失")
|
return
|
}
|
|
monthFormsService := service.NewWarehouseMonthFormsService()
|
total, err := monthFormsService.Count(params)
|
if err != nil {
|
logx.Errorf("MonthStats count err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询总数失败")
|
return
|
}
|
|
params.Preload = true
|
|
result, err := monthFormsService.Query(params)
|
if err != nil {
|
logx.Errorf("MonthStats query err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
if len(result) == 0 {
|
util.ResponseFormatList(c, code.Success, result, int(total))
|
return
|
}
|
|
nowMonth := time.Now().Local().Format("2006-01")
|
if nowMonth == params.Date {
|
result, err = WarehouseMonthStatsReplaceRealtimeOperation(result, params.Date, params.WarehouseID)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
}
|
|
util.ResponseFormatList(c, code.Success, result, int(total))
|
|
}
|
|
// DoWareHouseMonthStats
|
// @Tags 报表
|
// @Summary 手动跑月度统计库存报表
|
// @Produce application/json
|
// @Param object body request.DoWarehouseMonthStats true "查询参数"
|
// @Param Authorization header string true "token"
|
// @Success 200 {object} util.ResponseList{data=[]models.MonthStats} "成功"
|
// @Router /api-wms/v1/forms/doWarehouseMonthStats [post]
|
func (slf ReportFormsController) DoWareHouseMonthStats(c *gin.Context) {
|
var params request.DoMonthStats
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
if params.Token != constvar.DoMonthStatsToken {
|
return
|
}
|
|
task.WarehouseMonthStats()
|
util.ResponseFormat(c, code.Success, nil)
|
}
|
|
// DownloadWarehouseMonthStats
|
// @Tags 报表
|
// @Summary 下载按仓库统计月度统计库存报表
|
// @Produce application/json
|
// @Param object body request.GetMonthStats true "查询参数"
|
// @Param Authorization header string true "token"
|
// @Success 200 {object} util.ResponseList{data=[]models.MonthStats} "成功"
|
// @Router /api-wms/v1/forms/downloadWarehouseMonthStats [post]
|
func (slf ReportFormsController) DownloadWarehouseMonthStats(c *gin.Context) {
|
var params request.GetMonthStats
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
|
if params.WarehouseID == 0 {
|
util.ResponseFormat(c, code.RequestParamError, "仓库ID参数缺失")
|
return
|
}
|
|
params.Preload = true
|
monthFormsService := service.NewWarehouseMonthFormsService()
|
list, err := monthFormsService.FetchAll(params)
|
if err != nil {
|
logx.Errorf("DownloadMonthStats FetchAll err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
nowMonth := time.Now().Local().Format("2006-01")
|
if nowMonth == params.Date {
|
list, err = WarehouseMonthStatsReplaceRealtimeOperation(list, params.Date, params.WarehouseID)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
}
|
|
filename, err := monthFormsService.Export(list)
|
if err != nil {
|
logx.Errorf("DownloadMonthStats Export err:%v", err)
|
util.ResponseFormat(c, code.InternalError, "导出数据到文件失败")
|
return
|
}
|
|
fileContentDisposition := "attachment;filename=\"" + url.QueryEscape(filename) + "\""
|
c.Header("Content-Type", "application/xlsx")
|
c.Header("Content-Disposition", fileContentDisposition)
|
c.File(filename)
|
defer os.Remove(filename)
|
}
|
|
func WarehouseMonthStatsReplaceRealtimeOperation(list []*models.WarehouseMonthStats, date string, warehouseId int) (newList []*models.WarehouseMonthStats, err error) {
|
productIds := make([]string, 0, len(list))
|
for _, item := range list {
|
productIds = append(productIds, item.ProductId)
|
}
|
statsRecords, err := service.GetCurrentWarehouseStats(date, warehouseId, productIds, true)
|
if err != nil {
|
return nil, err
|
}
|
statsMap := models.WarehouseMonthStatsMap(statsRecords)
|
for k, v := range list {
|
if statsMap[v.ProductId] == nil {
|
continue
|
}
|
|
list[k].OutputAmount = statsMap[v.ProductId].OutputAmount
|
list[k].EndAmount = statsMap[v.ProductId].EndAmount
|
list[k].InputAmount = statsMap[v.ProductId].InputAmount
|
list[k].InputItems = statsMap[v.ProductId].InputItems
|
list[k].OutputItems = statsMap[v.ProductId].OutputItems
|
}
|
return list, nil
|
}
|