dsmzx
2024-06-26 5f7f65f00d4d1c280f8b09b73ef7dcfa2af0fd54
出库/入库 打印
3个文件已修改
259 ■■■■ 已修改文件
controllers/operation.go 208 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/file_template_attachment.go 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/warehouse.go 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/operation.go
@@ -9,6 +9,7 @@
    "github.com/shopspring/decimal"
    "github.com/xuri/excelize/v2"
    "gorm.io/gorm"
    "io/ioutil"
    "sort"
    "strconv"
    "strings"
@@ -742,33 +743,32 @@
                util.ResponseFormat(c, code.RequestParamError, err.Error())
                return
            }
            fileTemplateAttachments, err := models.NewFileTemplateAttachmentSearch().SetWarehouseId(oT.WarehouseId).Find()
            warehouse, err := models.NewWarehouseSearch().SetID(oT.WarehouseId).First()
            if err != nil {
                util.ResponseFormat(c, code.RequestParamError, err.Error())
                return
            }
            for _, fileTemplateAttachment := range fileTemplateAttachments {
                if fileTemplateAttachment.Category == constvar.FileTemplateCategory_JialianInput1 {
                    //fileUrl, err = JialianOperation(constvar.FileTemplateCategory_JialianInput1, operation)
                    fileUrl, err = JialianOperation(fileTemplateAttachment.Category, operation)
                    // 出库
                    //fileUrl, err = JialianOperation(constvar.FileTemplateCategory_JialianOutput1, operation)
                    if err != nil {
                        util.ResponseFormat(c, code.RequestParamError, err.Error())
                        return
                    }
                    break
                } else if fileTemplateAttachment.Category == constvar.FileWarehouseCategory_JialianInput2 {
                    fileUrl, err = JialianOperation(fileTemplateAttachment.Category, operation)
                    // 出库
                    //fileUrl, err = JialianOperation(constvar.FileTemplateCategory_JialianOutput1, operation)
                    if err != nil {
                        util.ResponseFormat(c, code.RequestParamError, err.Error())
                        return
                    }
                    break
                }
            if err != nil {
                util.ResponseFormat(c, code.RequestParamError, err.Error())
                return
            }
            if warehouse.FileTemplateCategoryIn == constvar.FileTemplateCategory_JialianInput1 {
                fileUrl, err = JialianOperation2(warehouse.FileTemplateCategoryIn, operation)
                if err != nil {
                    util.ResponseFormat(c, code.RequestParamError, err.Error())
                    return
                }
            } else if warehouse.FileTemplateCategoryIn == constvar.FileWarehouseCategory_JialianInput2 {
                fileUrl, err = JialianOperation1(warehouse.FileTemplateCategoryIn, operation)
                if err != nil {
                    util.ResponseFormat(c, code.RequestParamError, err.Error())
                    return
                }
            }
        } else if companyName == "geruimi" {
            fileUrl, err = ExportInputSelfmade(constvar.FileTemplateCategory_Selfmade, operation)
            if err != nil {
@@ -783,34 +783,31 @@
                util.ResponseFormat(c, code.RequestParamError, err.Error())
                return
            }
            fileTemplateAttachments, err := models.NewFileTemplateAttachmentSearch().SetWarehouseId(oT.WarehouseId).Find()
            warehouse, err := models.NewWarehouseSearch().SetID(oT.WarehouseId).First()
            if err != nil {
                util.ResponseFormat(c, code.RequestParamError, err.Error())
                return
            }
            for _, fileTemplateAttachment := range fileTemplateAttachments {
                if fileTemplateAttachment.Category == constvar.FileTemplateCategory_JialianOutput1 {
                    //fileUrl, err = JialianOperation(constvar.FileTemplateCategory_JialianInput1, operation)
                    fileUrl, err = JialianOperation(fileTemplateAttachment.Category, operation)
                    // 出库
                    //fileUrl, err = JialianOperation(constvar.FileTemplateCategory_JialianOutput1, operation)
                    if err != nil {
                        util.ResponseFormat(c, code.RequestParamError, err.Error())
                        return
                    }
                    break
                } else if fileTemplateAttachment.Category == constvar.FileWarehouseCategory_JialianOutput2 {
                    fileUrl, err = JialianOperation(fileTemplateAttachment.Category, operation)
                    // 出库
                    //fileUrl, err = JialianOperation(constvar.FileTemplateCategory_JialianOutput1, operation)
                    if err != nil {
                        util.ResponseFormat(c, code.RequestParamError, err.Error())
                        return
                    }
                    break
                }
            if err != nil {
                util.ResponseFormat(c, code.RequestParamError, err.Error())
                return
            }
            if warehouse.FileTemplateCategoryOut == constvar.FileTemplateCategory_JialianOutput1 {
                fileUrl, err = JialianOperation2(warehouse.FileTemplateCategoryOut, operation)
                if err != nil {
                    util.ResponseFormat(c, code.RequestParamError, err.Error())
                    return
                }
            } else if warehouse.FileTemplateCategoryOut == constvar.FileWarehouseCategory_JialianOutput2 {
                fileUrl, err = JialianOperation1(warehouse.FileTemplateCategoryOut, operation)
                if err != nil {
                    util.ResponseFormat(c, code.RequestParamError, err.Error())
                    return
                }
            }
        } else if companyName == "geruimi" {
            fileUrl, err = ExportInputSelfmade(constvar.FileTemplateCategory_Output, operation)
            if err != nil {
@@ -829,7 +826,7 @@
    util.ResponseFormat(c, code.Success, m)
}
func JialianOperation(category constvar.FileTemplateCategory, operation *models.Operation) (string, error) {
func JialianOperation1(category constvar.FileTemplateCategory, operation *models.Operation) (string, error) {
    // 获取模板记录
    template, err := models.NewFileTemplateAttachmentSearch().SetCategory(category).First()
    if err != nil {
@@ -854,9 +851,9 @@
    defer f.Close()
    sheet := "Sheet1"
    if category == constvar.FileTemplateCategory_JialianInput1 {
    if category == constvar.FileWarehouseCategory_JialianInput2 {
        sheet = "入库单"
    } else if category == constvar.FileTemplateCategory_JialianOutput1 {
    } else if category == constvar.FileWarehouseCategory_JialianOutput2 {
        sheet = "出库单"
    }
@@ -903,7 +900,7 @@
            break
        }
        f.SetCellValue(sheet, "B"+strconv.Itoa(rowIndex), v.Product.Name)                                                          // 产品名称
        f.SetCellValue(sheet, "C"+strconv.Itoa(rowIndex), v.Product.Unit)                                                          //规格
        f.SetCellValue(sheet, "C"+strconv.Itoa(rowIndex), v.Product.Specs)                                                         //规格
        f.SetCellValue(sheet, "D"+strconv.Itoa(rowIndex), attributeValueMap[fmt.Sprintf("%d%s", attributeMap["颜色"], v.ProductId)]) //颜色
        f.SetCellValue(sheet, "E"+strconv.Itoa(rowIndex), attributeValueMap[fmt.Sprintf("%d%s", attributeMap["面料"], v.ProductId)]) //面料
        f.SetCellValue(sheet, "F"+strconv.Itoa(rowIndex), v.TotalGrossWeight.String())                                             //重量
@@ -972,6 +969,7 @@
    }
    fileUrl, err := upload.UploadFileToSeaWeed(string(constvar.FileType_File), uuid.NewV4().String()+".xlsx", buf.Bytes())
    ioutil.WriteFile("E:\\"+uuid.NewV4().String()+".xlsx", buf.Bytes(), 0644)
    if err != nil {
        //ioutil.WriteFile("E:\\"+uuid.NewV4().String()+".xlsx", buf.Bytes(), 0644)
        logx.Errorf("file upload err: %v", err)
@@ -980,6 +978,120 @@
    return fileUrl, nil
}
func JialianOperation2(category constvar.FileTemplateCategory, operation *models.Operation) (string, error) {
    // 获取模板记录
    template, err := models.NewFileTemplateAttachmentSearch().SetCategory(category).First()
    if err != nil {
        return "", errors.New("获取模版记录失败:" + err.Error())
    }
    fmt.Println(template)
    // 根据模板路径获取模板消息
    readerCloser, err := http.HttpGetWithReadCloser(template.FileUrl)
    if err != nil {
        return "", errors.New("获取模版失败:" + err.Error())
    }
    // 读取模板内容
    f, err := excelize.OpenReader(readerCloser)
    if err != nil {
        return "", errors.New("读取excel模版失败:" + err.Error())
    }
    readerCloser.Close()
    defer f.Close()
    sheet := "Sheet1"
    f.SetCellValue(sheet, "A2", "单位(部门):"+operation.CompanyName) // 单位部门
    f.SetCellValue(sheet, "H2", operation.OperationDate)         // 时间
    f.SetCellValue(sheet, "O2", operation.Number)                // 编号
    totalAmount := decimal.NewFromInt(0) // 总金额
    totalPrice := decimal.NewFromInt(0)  // 总价
    rowIndex := 5
    for i, v := range operation.Details {
        //设置表单最多9条数据
        if i > 9 {
            break
        }
        f.SetCellValue(sheet, "A"+strconv.Itoa(rowIndex), v.Product.Name)               // 产品名称
        f.SetCellValue(sheet, "B"+strconv.Itoa(rowIndex), v.Product.Specs)              //规格
        f.SetCellValue(sheet, "C"+strconv.Itoa(rowIndex), v.TotalGrossWeight.String())  //重量
        f.SetCellValue(sheet, "D"+strconv.Itoa(rowIndex), v.Amount.String())            //数量
        f.SetCellValue(sheet, "E"+strconv.Itoa(rowIndex), v.AuxiliaryAmount.String())   //辅助数量
        f.SetCellValue(sheet, "F"+strconv.Itoa(rowIndex), v.AuxiliaryUnit)              //辅助单位
        f.SetCellValue(sheet, "G"+strconv.Itoa(rowIndex), v.Product.SalePrice.String()) // 单价
        // 金额
        if !v.Product.SalePrice.IsZero() {
            ap := v.Amount.Mul(v.Product.SalePrice)
            totalPrice = totalPrice.Add(ap)
            price := ap.String()
            split := strings.Split(price, ".")
            if len(split) == 2 {
                for n, a := range split[1] {
                    f.SetCellValue(sheet, string('O'+n)+strconv.Itoa(rowIndex), string(a))
                }
            }
            s := split[0]
            n := 0
            for j := len(s) - 1; j >= 0; j-- {
                if n == 6 {
                    f.SetCellValue(sheet, string('N'-n)+strconv.Itoa(rowIndex), s[:j])
                    break
                }
                f.SetCellValue(sheet, string('N'-n)+strconv.Itoa(rowIndex), string(s[j]))
                n++
            }
        }
        rowIndex++
        totalAmount = totalAmount.Add(v.Amount)
    }
    //合计
    if !totalPrice.IsZero() {
        price := totalPrice.String()
        split := strings.Split(price, ".")
        if len(split) == 2 {
            for n, a := range split[1] {
                f.SetCellValue(sheet, string('N'+n)+"14", string(a))
            }
        } else {
            f.SetCellValue(sheet, "O14", "0")
            f.SetCellValue(sheet, "P14", "0")
        }
        s := split[0]
        n := 0
        for j := len(s) - 1; j >= 0; j-- {
            if n == 6 {
                f.SetCellValue(sheet, string('N'-n)+"14", s[:j])
                break
            }
            f.SetCellValue(sheet, string('N'-n)+"14", string(s[j]))
            n++
        }
    }
    f.SetCellValue(sheet, "Q5", operation.Remark) // 备注
    // 第14行
    f.SetCellValue(sheet, "B15", operation.Manager)    // 主管
    f.SetCellValue(sheet, "D15", operation.Accountant) // 会计
    f.SetCellValue(sheet, "H15", operation.Custodian)  //保管员
    f.SetCellValue(sheet, "Q15", operation.Custodian)  //经手
    buf, err := f.WriteToBuffer()
    if err != nil {
        return "", err
    }
    fileUrl, err := upload.UploadFileToSeaWeed(string(constvar.FileType_File), uuid.NewV4().String()+".xlsx", buf.Bytes())
    ioutil.WriteFile("E:\\"+uuid.NewV4().String()+".xlsx", buf.Bytes(), 0644)
    if err != nil {
        logx.Errorf("file upload err: %v", err)
        return "", err
    }
    return fileUrl, nil
}
func ExportInputSelfmade(category constvar.FileTemplateCategory, operation *models.Operation) (string, error) {
    template, err := models.NewFileTemplateAttachmentSearch().SetCategory(category).First()
    if err != nil {
models/file_template_attachment.go
@@ -10,10 +10,9 @@
type (
    FileTemplateAttachment struct {
        WmsModel
        Id          int                           `json:"id"  gorm:"column:id;primary_key;AUTO_INCREMENT"`
        Category    constvar.FileTemplateCategory `json:"category" gorm:"type:int(11);comment:模版种类"`
        WarehouseId int                           `json:"warehouseId" gorm:"type:int(11);comment:仓库id"`
        Name        string                        `json:"name" gorm:"type:varchar(63);comment:模版名称"`
        Id       int                           `json:"id"  gorm:"column:id;primary_key;AUTO_INCREMENT"`
        Category constvar.FileTemplateCategory `json:"category" gorm:"type:int(11);comment:模版种类"`
        Name     string                        `json:"name" gorm:"type:varchar(63);comment:模版名称"`
        //AttachmentId uint                          `json:"attachmentId" gorm:"comment:附件表外键"`
        //Attachment   Attachment                    `json:"attachment" gorm:"foreignKey:AttachmentId;references:Id"`
        TableInfo string `json:"tableInfo" gorm:"type:varchar(31);comment:表名"`
@@ -52,10 +51,6 @@
    slf.Order = order
    return slf
}
func (slf *FileTemplateAttachmentSearch) SetWarehouseId(warehouseId int) *FileTemplateAttachmentSearch {
    slf.WarehouseId = warehouseId
    return slf
}
func (slf *FileTemplateAttachmentSearch) SetID(id int) *FileTemplateAttachmentSearch {
    slf.Id = id
@@ -82,9 +77,6 @@
    if slf.Id != 0 {
        db = db.Where("id = ?", slf.Id)
    }
    if slf.WarehouseId != 0 {
        db = db.Where("warehouse_id = ?", slf.Id)
    }
    if slf.Order != "" {
        db = db.Order(slf.Order)
models/warehouse.go
@@ -4,6 +4,7 @@
    "fmt"
    "gorm.io/gorm"
    "strings"
    "wms/constvar"
    "wms/pkg/mysqlx"
)
@@ -11,23 +12,25 @@
    // Warehouse 仓库
    Warehouse struct {
        WmsModel
        Id                     int          `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
        Name                   string       `json:"name" gorm:"index;type:varchar(255);not null;comment:仓库名称"`                   //仓库名称
        Active                 bool         `json:"active" gorm:"type:tinyint(1);not null;comment:是否激活"`                         //是否启用,传true就行
        Code                   string       `json:"code" gorm:"index;type:varchar(255);not null;comment:仓库编码"`                   //仓库编码
        PartnerID              int          `json:"partnerId"  gorm:"type:int;not null;comment:合作伙伴id"`                          //合作伙伴id
        BuyToResupply          bool         `json:"buyToResupply" gorm:"type:tinyint(1);not null;comment:是否购买补给"`                //是否购买补给,已购买产品能够发送到此仓库
        ResupplyWhIdsStr       string       `json:"-" gorm:"column:resupply_wh_ids;type:varchar(255);not null;comment:补给来源仓库ID"` //补给来源仓库ID
        ResupplyWhIds          []string     `json:"resupplyWhIds" gorm:"-"`                                                      //补给来源仓库ID
        ResupplyWh             []*Warehouse `json:"resupplyWh" gorm:"-"`                                                         //补给来源仓库
        CompanyId              int          `json:"companyId" gorm:"type:int;not null;comment:公司id"`
        Company                Company      `json:"company" gorm:"foreignKey:CompanyId"`
        Address                string       `json:"address" gorm:"type:varchar(512);comment:地址"`         //地址
        InboundTransportation  int          `json:"inboundTransportation" gorm:"type:int;comment:入向运输"`  //入向运输
        OutboundTransportation int          `json:"outboundTransportation" gorm:"type:int;comment:出库运输"` //出库运输
        LocationId             int          `json:"locationId" gorm:"type:int;comment:位置id"`             //默认位置id
        WarehouseLocation      string       `json:"warehouseLocation" gorm:"-"`                          //库存位置
        Contacts               string       `json:"contacts" gorm:"type:varchar(255);comment:联系人"`       //联系人
        Id                      int                           `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
        Name                    string                        `json:"name" gorm:"index;type:varchar(255);not null;comment:仓库名称"`                   //仓库名称
        Active                  bool                          `json:"active" gorm:"type:tinyint(1);not null;comment:是否激活"`                         //是否启用,传true就行
        Code                    string                        `json:"code" gorm:"index;type:varchar(255);not null;comment:仓库编码"`                   //仓库编码
        PartnerID               int                           `json:"partnerId"  gorm:"type:int;not null;comment:合作伙伴id"`                          //合作伙伴id
        BuyToResupply           bool                          `json:"buyToResupply" gorm:"type:tinyint(1);not null;comment:是否购买补给"`                //是否购买补给,已购买产品能够发送到此仓库
        ResupplyWhIdsStr        string                        `json:"-" gorm:"column:resupply_wh_ids;type:varchar(255);not null;comment:补给来源仓库ID"` //补给来源仓库ID
        ResupplyWhIds           []string                      `json:"resupplyWhIds" gorm:"-"`                                                      //补给来源仓库ID
        ResupplyWh              []*Warehouse                  `json:"resupplyWh" gorm:"-"`                                                         //补给来源仓库
        CompanyId               int                           `json:"companyId" gorm:"type:int;not null;comment:公司id"`
        Company                 Company                       `json:"company" gorm:"foreignKey:CompanyId"`
        Address                 string                        `json:"address" gorm:"type:varchar(512);comment:地址"`         //地址
        InboundTransportation   int                           `json:"inboundTransportation" gorm:"type:int;comment:入向运输"`  //入向运输
        OutboundTransportation  int                           `json:"outboundTransportation" gorm:"type:int;comment:出库运输"` //出库运输
        LocationId              int                           `json:"locationId" gorm:"type:int;comment:位置id"`             //默认位置id
        WarehouseLocation       string                        `json:"warehouseLocation" gorm:"-"`                          //库存位置
        Contacts                string                        `json:"contacts" gorm:"type:varchar(255);comment:联系人"`       //联系人
        FileTemplateCategoryIn  constvar.FileTemplateCategory `json:"fileTemplateCategoryIn" gorm:"type:int(11);comment:入库模版种类"`
        FileTemplateCategoryOut constvar.FileTemplateCategory `json:"fileTemplateCategoryOut" gorm:"type:int(11);comment:出库模版种类"`
    }
    WarehouseSearch struct {