278 lines
8.8 KiB
Go
278 lines
8.8 KiB
Go
package decision
|
||
|
||
import (
|
||
"errors"
|
||
"github.com/gin-gonic/gin"
|
||
model "go-admin/app/admin/models"
|
||
orm "go-admin/common/global"
|
||
"go-admin/logger"
|
||
"go-admin/tools"
|
||
"go-admin/tools/app"
|
||
"gorm.io/gorm"
|
||
"net/http"
|
||
"time"
|
||
)
|
||
|
||
// ErpMonthEndClosingList 财务月结-列表
|
||
// @Summary 财务月结-列表
|
||
// @Tags 决策中心,V1.4.0
|
||
// @Produce json
|
||
// @Accept json
|
||
// @Param request body models.ErpMonthEndClosingListReq true "财务月结-列表模型"
|
||
// @Success 200 {object} models.ErpMonthEndClosingListResp
|
||
// @Router /api/v1/decision/month_end_closing/list [post]
|
||
func ErpMonthEndClosingList(c *gin.Context) {
|
||
req := new(model.ErpMonthEndClosingListReq)
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
logger.Error("ShouldBindJSON err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误"+err.Error())
|
||
return
|
||
}
|
||
|
||
resp, err := req.List()
|
||
if err != nil {
|
||
logger.Error("ErpPurchaseList err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "获取失败"+err.Error())
|
||
return
|
||
}
|
||
|
||
app.OK(c, resp, "success")
|
||
return
|
||
}
|
||
|
||
// ErpMonthEndClosingCreate 财务月结-新增
|
||
// @Summary 财务月结-新增
|
||
// @Tags 决策中心,V1.4.0
|
||
// @Produce json
|
||
// @Accept json
|
||
// @Param request body models.ErpMonthEndClosingCreateReq true "财务月结-新增模型"
|
||
// @Success 200 {object} app.Response
|
||
// @Router /api/v1/decision/month_end_closing/create [post]
|
||
func ErpMonthEndClosingCreate(c *gin.Context) {
|
||
req := new(model.ErpMonthEndClosingCreateReq)
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
logger.Error("ShouldBindJSON err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误"+err.Error())
|
||
return
|
||
}
|
||
|
||
err := tools.Validate(req) //必填参数校验
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, err.Error())
|
||
return
|
||
}
|
||
|
||
err = model.CreateErpMonthEndClosing(req, c)
|
||
if err != nil {
|
||
logger.Error("CreateErpMarketingCoupon err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, err.Error())
|
||
return
|
||
}
|
||
|
||
app.OK(c, nil, "新增成功")
|
||
return
|
||
}
|
||
|
||
// ErpMonthEndClosingAudit 财务月结-审核
|
||
// @Summary 财务月结-审核
|
||
// @Tags 决策中心,V1.4.0
|
||
// @Produce json
|
||
// @Accept json
|
||
// @Param request body models.ErpMonthEndClosingAuditReq true "财务月结-审核模型"
|
||
// @Success 200 {object} app.Response
|
||
// @Router /api/v1/decision/month_end_closing/audit [post]
|
||
func ErpMonthEndClosingAudit(c *gin.Context) {
|
||
req := new(model.ErpMonthEndClosingAuditReq)
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
logger.Error("ShouldBindJSON err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误"+err.Error())
|
||
return
|
||
}
|
||
|
||
err := tools.Validate(req) //必填参数校验
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, err.Error())
|
||
return
|
||
}
|
||
|
||
sysUser, err := model.GetSysUserByCtx(c)
|
||
if err != nil {
|
||
logger.Error("sys user err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "操作失败")
|
||
return
|
||
}
|
||
|
||
var erpMonthEndOrder model.ErpMonthEndClosing
|
||
err = orm.Eloquent.Table("erp_month_end_closing").Where("serial_number = ?", req.SerialNumber).
|
||
Find(&erpMonthEndOrder).Error
|
||
if err != nil {
|
||
logger.Error("order err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "审核失败:"+err.Error())
|
||
return
|
||
}
|
||
|
||
// 判断入参state:1-审核,2-取消审核
|
||
orderState := 0
|
||
switch req.State {
|
||
case 1: // 1-审核:待审核状态可以审核
|
||
if erpMonthEndOrder.State == model.ErpMonthEndClosingUnAudit {
|
||
orderState = model.ErpMonthEndClosingAudited
|
||
} else {
|
||
app.OK(c, nil, "订单已审核")
|
||
return
|
||
}
|
||
case 2: // 2-取消审核:不能跨月取消,如:2024/08,2024/09都已经审核,则2024/08不能取消审核,除非2024/09先取消审核
|
||
if erpMonthEndOrder.State == model.ErpMonthEndClosingUnAudit {
|
||
app.OK(c, nil, "订单已取消审核")
|
||
return
|
||
}
|
||
|
||
// 检查是否存在跨月已审核记录
|
||
var laterAuditCount int64
|
||
err = orm.Eloquent.Table("erp_month_end_closing").
|
||
Where("state = ? AND closing_start_date > ?", model.ErpMonthEndClosingAudited, erpMonthEndOrder.ClosingEndDate).
|
||
Count(&laterAuditCount).Error
|
||
if err != nil {
|
||
logger.Error("check later audits err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "取消审核失败:"+err.Error())
|
||
return
|
||
}
|
||
if laterAuditCount > 0 {
|
||
app.Error(c, http.StatusForbidden, nil, "存在更晚月份已审核记录,无法取消审核")
|
||
return
|
||
}
|
||
|
||
orderState = model.ErpMonthEndClosingUnAudit
|
||
default:
|
||
logger.Error("order err, req.State is:", logger.Field("req.State", req.State))
|
||
app.Error(c, http.StatusInternalServerError, err, "审核失败:参数有误")
|
||
return
|
||
}
|
||
|
||
err = orm.Eloquent.Table("erp_month_end_closing").Where("id = ?", erpMonthEndOrder.ID).Updates(map[string]interface{}{
|
||
"state": orderState,
|
||
"auditor_id": sysUser.UserId,
|
||
"audit_time": time.Now(),
|
||
"auditor_name": sysUser.NickName,
|
||
}).Error
|
||
if err != nil {
|
||
logger.Error("update erp_month_end_closing err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "审核失败:"+err.Error())
|
||
return
|
||
}
|
||
|
||
app.OK(c, nil, "操作成功")
|
||
return
|
||
}
|
||
|
||
// ErpMonthEndClosingEdit 财务月结-编辑
|
||
// @Summary 财务月结-编辑
|
||
// @Tags 决策中心,V1.4.0
|
||
// @Produce json
|
||
// @Accept json
|
||
// @Param request body models.ErpMonthEndClosingEditReq true "财务月结-编辑模型"
|
||
// @Success 200 {object} models.ErpMonthEndClosing
|
||
// @Router /api/v1/decision/month_end_closing/edit [post]
|
||
func ErpMonthEndClosingEdit(c *gin.Context) {
|
||
req := new(model.ErpMonthEndClosingEditReq)
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
logger.Error("ShouldBindJSON err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误"+err.Error())
|
||
return
|
||
}
|
||
|
||
err := tools.Validate(req) //必填参数校验
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, err.Error())
|
||
return
|
||
}
|
||
|
||
sysUser, err := model.GetSysUserByCtx(c)
|
||
if err != nil {
|
||
logger.Error("sys user err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "操作失败")
|
||
return
|
||
}
|
||
|
||
// 更新订单信息
|
||
monthEndClosingOrder, err := model.EditErpMonthEndClosing(req, sysUser)
|
||
if err != nil {
|
||
logger.Error("EditErpPurchaseOrder err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "编辑失败:"+err.Error())
|
||
return
|
||
}
|
||
|
||
app.OK(c, monthEndClosingOrder, "success")
|
||
}
|
||
|
||
// ErpMonthEndClosingDelete 财务月结-删除
|
||
// @Summary 财务月结-删除
|
||
// @Tags 决策中心,V1.4.0
|
||
// @Produce json
|
||
// @Accept json
|
||
// @Param request body models.ErpMonthEndClosingDeleteReq true "财务月结-删除模型"
|
||
// @Success 200 {object} app.Response
|
||
// @Router /api/v1/decision/month_end_closing/delete [post]
|
||
func ErpMonthEndClosingDelete(c *gin.Context) {
|
||
var req = new(model.ErpMonthEndClosingDeleteReq)
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
logger.Error("ShouldBindJSON err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusBadRequest, err, "参数错误:"+err.Error())
|
||
return
|
||
}
|
||
|
||
err := tools.Validate(req) //必填参数校验
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, err.Error())
|
||
return
|
||
}
|
||
|
||
err = model.DeleteErpMonthEndClosing(req)
|
||
if err != nil {
|
||
logger.Error("DeleteErpMonthEndClosing err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, err.Error())
|
||
return
|
||
}
|
||
|
||
app.OK(c, nil, "删除成功")
|
||
return
|
||
}
|
||
|
||
// ErpMonthEndClosingDate 财务月结-获取开始日期
|
||
// @Summary 财务月结-获取开始日期
|
||
// @Tags 决策中心,V1.4.0
|
||
// @Produce json
|
||
// @Accept json
|
||
// @Success 200 {object} models.ErpMonthEndClosingDateResp
|
||
// @Router /api/v1/decision/month_end_closing/start_date [get]
|
||
func ErpMonthEndClosingDate(c *gin.Context) {
|
||
var latestClosing model.ErpMonthEndClosing
|
||
err := orm.Eloquent.Table("erp_month_end_closing").
|
||
Where("state = ?", model.ErpMonthEndClosingAudited).
|
||
Order("closing_end_date DESC").
|
||
First(&latestClosing).Error
|
||
|
||
var startDate *time.Time
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
// 如果没有已审核记录,startDate 返回 nil
|
||
startDate = nil
|
||
} else if err != nil {
|
||
// 数据库查询出错,返回错误响应
|
||
logger.Error("query latest closing err:", logger.Field("err", err))
|
||
app.Error(c, http.StatusInternalServerError, err, "获取开始日期失败")
|
||
return
|
||
} else {
|
||
// 如果存在已审核记录,则取最晚的 ClosingEndDate 加 1 天
|
||
nextDate := latestClosing.ClosingEndDate.AddDate(0, 0, 1)
|
||
startDate = &nextDate
|
||
}
|
||
|
||
resp := model.ErpMonthEndClosingDateResp{}
|
||
if startDate != nil {
|
||
resp.StartDate = startDate.Format(model.DateTimeFormat)
|
||
}
|
||
|
||
app.OK(c, resp, "获取成功")
|
||
return
|
||
}
|