307 lines
10 KiB
Go
307 lines
10 KiB
Go
|
package models
|
|||
|
|
|||
|
import (
|
|||
|
"errors"
|
|||
|
"fmt"
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
orm "go-admin/common/global"
|
|||
|
"go-admin/logger"
|
|||
|
"math/rand"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
ErpMonthEndClosingUnAudit = 1 // 待审核
|
|||
|
ErpMonthEndClosingAudited = 2 // 已审核
|
|||
|
)
|
|||
|
|
|||
|
// ErpMonthEndClosing 财务月结订单表
|
|||
|
type ErpMonthEndClosing struct {
|
|||
|
Model
|
|||
|
|
|||
|
SerialNumber string `json:"serial_number" gorm:"index"` // 单据编号
|
|||
|
ClosingStartDate time.Time `json:"closing_start_date" gorm:"type:date"` // 月结开始时间,精确到天
|
|||
|
ClosingEndDate time.Time `json:"closing_end_date" gorm:"type:date"` // 月结结束时间,精确到天
|
|||
|
MakerId uint32 `json:"maker_id" gorm:"index"` // 制单人 ID
|
|||
|
MakerName string `json:"maker_name"` // 制单人名称
|
|||
|
MakerTime *time.Time `json:"maker_time"` // 制单时间
|
|||
|
AuditorId uint32 `json:"auditor_id" gorm:"index"` // 审核人 ID
|
|||
|
AuditorName string `json:"auditor_name"` // 审核人姓名
|
|||
|
AuditTime *time.Time `json:"audit_time"` // 审核时间
|
|||
|
State uint32 `json:"state"` // 订单状态:1-待审核;2-已审核
|
|||
|
}
|
|||
|
|
|||
|
// ErpMonthEndClosingListReq 月结列表-入参
|
|||
|
type ErpMonthEndClosingListReq struct {
|
|||
|
SerialNumber string `json:"serial_number"` // 单据编号
|
|||
|
ClosingStartDate string `json:"closing_start_date"` // 月结开始时间
|
|||
|
ClosingEndDate string `json:"closing_end_date"` // 月结结束时间
|
|||
|
State uint32 `json:"state"` // 订单状态:1-待审核;2-已审核
|
|||
|
PageIndex int `json:"pageIndex"` // 页码
|
|||
|
PageSize int `json:"pageSize"` // 页面条数
|
|||
|
}
|
|||
|
|
|||
|
type ErpMonthEndOrder struct {
|
|||
|
Model
|
|||
|
|
|||
|
SerialNumber string `json:"serial_number"` // 单据编号
|
|||
|
ClosingStartDate string `json:"closing_start_date"` // 月结开始时间,精确到天
|
|||
|
ClosingEndDate string `json:"closing_end_date"` // 月结结束时间,精确到天
|
|||
|
MakerId uint32 `json:"maker_id"` // 制单人 ID
|
|||
|
MakerName string `json:"maker_name"` // 制单人名称
|
|||
|
MakerTime *time.Time `json:"maker_time"` // 制单时间
|
|||
|
AuditorId uint32 `json:"auditor_id"` // 审核人 ID
|
|||
|
AuditorName string `json:"auditor_name"` // 审核人姓名
|
|||
|
AuditTime *time.Time `json:"audit_time"` // 审核时间
|
|||
|
State uint32 `json:"state"` // 订单状态:1-待审核;2-已审核
|
|||
|
}
|
|||
|
|
|||
|
// ErpMonthEndClosingListResp 月结列表-出参
|
|||
|
type ErpMonthEndClosingListResp struct {
|
|||
|
List []ErpMonthEndOrder `json:"list"`
|
|||
|
Total int `json:"total"` // 总条数
|
|||
|
PageIndex int `json:"pageIndex"` // 页码
|
|||
|
PageSize int `json:"pageSize"` // 每页展示条数
|
|||
|
}
|
|||
|
|
|||
|
// List 查询采购订单列表
|
|||
|
func (m *ErpMonthEndClosingListReq) List() (*ErpMonthEndClosingListResp, error) {
|
|||
|
resp := &ErpMonthEndClosingListResp{
|
|||
|
PageIndex: m.PageIndex,
|
|||
|
PageSize: m.PageSize,
|
|||
|
}
|
|||
|
page := m.PageIndex - 1
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if m.PageSize == 0 {
|
|||
|
m.PageSize = 10
|
|||
|
}
|
|||
|
qs := orm.Eloquent.Table("erp_month_end_closing")
|
|||
|
|
|||
|
if m.SerialNumber != "" {
|
|||
|
qs = qs.Where("serial_number=?", m.SerialNumber)
|
|||
|
}
|
|||
|
if m.State != 0 {
|
|||
|
qs = qs.Where("state=?", m.State)
|
|||
|
}
|
|||
|
|
|||
|
if m.ClosingStartDate != "" {
|
|||
|
parse, err := time.Parse(QueryTimeFormat, m.ClosingStartDate)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("ErpMonthEndClosingList err:", err)
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
qs = qs.Where("closing_end_date > ?", parse)
|
|||
|
}
|
|||
|
if m.ClosingEndDate != "" {
|
|||
|
parse, err := time.Parse(QueryTimeFormat, m.ClosingEndDate)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("ErpMonthEndClosingList err:", err)
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
qs = qs.Where("closing_start_date < ?", parse)
|
|||
|
}
|
|||
|
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("count err:", logger.Field("err", err))
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
resp.Total = int(count)
|
|||
|
var orders []ErpMonthEndClosing
|
|||
|
err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&orders).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Error("erp commodity list err:", logger.Field("err", err))
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
|
|||
|
var orderList []ErpMonthEndOrder
|
|||
|
// 校验时间
|
|||
|
for i, v := range orders {
|
|||
|
if v.MakerTime != nil && v.MakerTime.IsZero() {
|
|||
|
orders[i].MakerTime = nil
|
|||
|
}
|
|||
|
|
|||
|
if v.AuditTime != nil && v.AuditTime.IsZero() {
|
|||
|
orders[i].AuditTime = nil
|
|||
|
}
|
|||
|
|
|||
|
var orderInfo ErpMonthEndOrder
|
|||
|
orderInfo.Model = v.Model
|
|||
|
orderInfo.SerialNumber = v.SerialNumber
|
|||
|
orderInfo.ClosingStartDate = v.ClosingStartDate.Format(DateTimeFormat)
|
|||
|
orderInfo.ClosingEndDate = v.ClosingEndDate.Format(DateTimeFormat)
|
|||
|
orderInfo.MakerId = v.MakerId
|
|||
|
orderInfo.MakerName = v.MakerName
|
|||
|
orderInfo.MakerTime = orders[i].MakerTime
|
|||
|
orderInfo.AuditorId = v.AuditorId
|
|||
|
orderInfo.AuditorName = v.AuditorName
|
|||
|
orderInfo.AuditTime = orders[i].AuditTime
|
|||
|
orderInfo.State = v.State
|
|||
|
|
|||
|
orderList = append(orderList, orderInfo)
|
|||
|
}
|
|||
|
|
|||
|
resp.List = orderList
|
|||
|
return resp, nil
|
|||
|
}
|
|||
|
|
|||
|
// ErpMonthEndClosingCreateReq 新增月结订单-入参
|
|||
|
type ErpMonthEndClosingCreateReq struct {
|
|||
|
ClosingStartDate string `json:"closing_start_date" validate:"required"` // 月结开始时间,精确到天
|
|||
|
ClosingEndDate string `json:"closing_end_date" validate:"required"` // 月结结束时间,精确到天
|
|||
|
}
|
|||
|
|
|||
|
// CreateErpMonthEndClosing 新增月结
|
|||
|
func CreateErpMonthEndClosing(req *ErpMonthEndClosingCreateReq, c *gin.Context) error {
|
|||
|
sysUser, err := GetSysUserByCtx(c)
|
|||
|
if err != nil {
|
|||
|
return errors.New("操作失败:" + err.Error())
|
|||
|
}
|
|||
|
|
|||
|
startDate, err := time.Parse(DateTimeFormat, req.ClosingStartDate)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
endDate, err := time.Parse(DateTimeFormat, req.ClosingEndDate)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
nowTime := time.Now()
|
|||
|
erpMonthEndClosing := &ErpMonthEndClosing{
|
|||
|
SerialNumber: NewErpMonthEndClosingSerialNumber(),
|
|||
|
ClosingStartDate: startDate,
|
|||
|
ClosingEndDate: endDate,
|
|||
|
MakerId: uint32(sysUser.UserId),
|
|||
|
MakerName: sysUser.NickName,
|
|||
|
MakerTime: &nowTime,
|
|||
|
State: ErpMonthEndClosingUnAudit,
|
|||
|
}
|
|||
|
|
|||
|
err = orm.Eloquent.Create(erpMonthEndClosing).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("create purchase order err:", logger.Field("err", err))
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// NewErpMonthEndClosingSerialNumber 生成月结订单号
|
|||
|
func NewErpMonthEndClosingSerialNumber() string {
|
|||
|
prefix := "YJ"
|
|||
|
|
|||
|
nowTime := time.Now()
|
|||
|
rand.Seed(nowTime.UnixNano())
|
|||
|
max := 1
|
|||
|
for {
|
|||
|
if max > 5 {
|
|||
|
logger.Error("create sn err")
|
|||
|
return ""
|
|||
|
}
|
|||
|
random := rand.Intn(9000) + 1000
|
|||
|
sn := fmt.Sprintf("%s%d", nowTime.Format("060102"), random)
|
|||
|
exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_month_end_closing WHERE "+
|
|||
|
"serial_number='%s'", prefix+sn))
|
|||
|
if err != nil {
|
|||
|
logger.Error("exist sn err")
|
|||
|
}
|
|||
|
if !exist {
|
|||
|
return prefix + sn
|
|||
|
}
|
|||
|
|
|||
|
max++
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// ErpMonthEndClosingDeleteReq 删除月结订单-入参
|
|||
|
type ErpMonthEndClosingDeleteReq struct {
|
|||
|
SerialNumber string `json:"serial_number" validate:"required"` // 单据编号
|
|||
|
}
|
|||
|
|
|||
|
// DeleteErpMonthEndClosing 删除月结订单
|
|||
|
func DeleteErpMonthEndClosing(req *ErpMonthEndClosingDeleteReq) error {
|
|||
|
var orderInfo ErpMonthEndClosing
|
|||
|
err := orm.Eloquent.Table("erp_month_end_closing").Where("serial_number = ?", req.SerialNumber).Find(&orderInfo).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("erp_month_end_closing delete err:", logger.Field("err", err))
|
|||
|
return errors.New("未查询到订单")
|
|||
|
}
|
|||
|
|
|||
|
if orderInfo.State == ErpMonthEndClosingAudited {
|
|||
|
logger.Errorf("erp_month_end_closing delete err, state is:", orderInfo.State)
|
|||
|
return errors.New("已审核订单不能删除")
|
|||
|
}
|
|||
|
|
|||
|
err = orm.Eloquent.Delete(orderInfo).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("erp_month_end_closing delete2 err:", logger.Field("err", err))
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// ErpMonthEndClosingEditReq 编辑月结订单-入参
|
|||
|
type ErpMonthEndClosingEditReq struct {
|
|||
|
SerialNumber string `json:"serial_number" validate:"required"` // 单据编号
|
|||
|
ClosingStartDate string `json:"closing_start_date" validate:"required"` // 月结开始时间,精确到天
|
|||
|
ClosingEndDate string `json:"closing_end_date" validate:"required"` // 月结结束时间,精确到天
|
|||
|
}
|
|||
|
|
|||
|
// EditErpMonthEndClosing 编辑月结订单
|
|||
|
func EditErpMonthEndClosing(req *ErpMonthEndClosingEditReq, sysUser *SysUser) (*ErpMonthEndClosing, error) {
|
|||
|
// 查询订单信息
|
|||
|
var endOrder ErpMonthEndClosing
|
|||
|
err := orm.Eloquent.Table("erp_month_end_closing").Where("serial_number=?", req.SerialNumber).
|
|||
|
Find(&endOrder).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("erp_month_end_closing order err:", logger.Field("err", err))
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
if endOrder.State != ErpMonthEndClosingUnAudit { // 只有待审核的订单才能编辑
|
|||
|
return nil, errors.New("订单不是待审核状态")
|
|||
|
}
|
|||
|
|
|||
|
startDate, err := time.Parse(DateTimeFormat, req.ClosingStartDate)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
endDate, err := time.Parse(DateTimeFormat, req.ClosingEndDate)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
// 1-更新采购订单信息
|
|||
|
endOrder.ClosingStartDate = startDate
|
|||
|
endOrder.ClosingEndDate = endDate
|
|||
|
endOrder.MakerId = uint32(sysUser.UserId)
|
|||
|
endOrder.MakerName = sysUser.NickName
|
|||
|
|
|||
|
err = orm.Eloquent.Model(&ErpMonthEndClosing{}).Where("serial_number = ?", req.SerialNumber).
|
|||
|
Omit("created_at").Save(endOrder).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("update erp_month_end_closing err:", logger.Field("err", err))
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
return &endOrder, nil
|
|||
|
}
|
|||
|
|
|||
|
// ErpMonthEndClosingAuditReq 审核月结订单-入参
|
|||
|
type ErpMonthEndClosingAuditReq struct {
|
|||
|
SerialNumber string `json:"serial_number" validate:"required"` // 单据编号
|
|||
|
State int `json:"state" validate:"required"` // 审核操作: 1-审核 2-取消审核
|
|||
|
}
|
|||
|
|
|||
|
// ErpMonthEndClosingDateResp 获取月结日期-出参
|
|||
|
type ErpMonthEndClosingDateResp struct {
|
|||
|
StartDate string `json:"start_date"` // 月结开始时间
|
|||
|
}
|