zhangzengfei
2023-08-17 dc40143800edd914d0f721b06f90c8b4d307b979
调整bom
2个文件已修改
152 ■■■■■ 已修改文件
kingdee/bom.go 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
report/send.go 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
kingdee/bom.go
@@ -6,24 +6,25 @@
)
type ICBom struct {
    FInterID         int     `gorm:"column:FInterID" json:"FInterID"`                 // 内码
    FBOMNumber       string  `gorm:"column:FBOMNumber" json:"FBOMNumber"`             // BOM单编号
    FUseStatus       int     `gorm:"column:FUseStatus" json:"FUseStatus"`             // 使用状态码
    FUseStatusName   string  `gorm:"column:FUseStatusName" json:"FUseStatusName"`     // 使用状态
    FItemIDNumber    string  `gorm:"column:FItemIDNumber" json:"FItemIDNumber"`       // 物料代码
    FItemIDName      string  `gorm:"column:FItemIDName" json:"FItemIDName"`           // 物料名称
    FModel           string  `gorm:"column:FModel" json:"FModel"`                     // 规格型号
    FErpClsID        string  `gorm:"column:FErpClsID" json:"FErpClsID"`               // 物料属性
    FQty             float64 `gorm:"column:FQty" json:"FQty"`                         // 数量
    FUnitName        string  `gorm:"column:FUnitName" json:"FUnitName"`               // 单位
    FYield           float64 `gorm:"column:FYield" json:"FYield"`                     // 成品率
    FRoutingIDNumber string  `gorm:"column:FRoutingIDNumber" json:"FRoutingIDNumber"` // 工艺路线代码
    FRoutingIDName   string  `gorm:"column:FRoutingIDName" json:"FRoutingIDName"`     // 工艺路线名称
    FNote            string  `gorm:"column:FNote" json:"FNote"`                       // 备注
    FBomType         int     `gorm:"column:FBomType" json:"FBomType"`                 // BOM类型
    FAudDate         string  `gorm:"column:FAudDate" json:"FAudDate"`                 // 更新时间
    FPDMImportDate   string  `gorm:"column:FPDMImportDate" json:"FPDMImportDate"`     // 导入时间
    FStatus          int     `gorm:"column:FStatus" json:"FStatus"`                   // 状态
    FInterID         int          `gorm:"column:FInterID" json:"FInterID"`                 // 内码
    FBOMNumber       string       `gorm:"column:FBOMNumber" json:"FBOMNumber"`             // BOM单编号
    FUseStatus       int          `gorm:"column:FUseStatus" json:"FUseStatus"`             // 使用状态码
    FUseStatusName   string       `gorm:"column:FUseStatusName" json:"FUseStatusName"`     // 使用状态
    FItemIDNumber    string       `gorm:"column:FItemIDNumber" json:"FItemIDNumber"`       // 物料代码
    FItemIDName      string       `gorm:"column:FItemIDName" json:"FItemIDName"`           // 物料名称
    FModel           string       `gorm:"column:FModel" json:"FModel"`                     // 规格型号
    FErpClsID        string       `gorm:"column:FErpClsID" json:"FErpClsID"`               // 物料属性
    FQty             float64      `gorm:"column:FQty" json:"FQty"`                         // 数量
    FUnitName        string       `gorm:"column:FUnitName" json:"FUnitName"`               // 单位
    FYield           float64      `gorm:"column:FYield" json:"FYield"`                     // 成品率
    FRoutingIDNumber string       `gorm:"column:FRoutingIDNumber" json:"FRoutingIDNumber"` // 工艺路线代码
    FRoutingIDName   string       `gorm:"column:FRoutingIDName" json:"FRoutingIDName"`     // 工艺路线名称
    FNote            string       `gorm:"column:FNote" json:"FNote"`                       // 备注
    FBomType         int          `gorm:"column:FBomType" json:"FBomType"`                 // BOM类型
    FAudDate         string       `gorm:"column:FAudDate" json:"FAudDate"`                 // 更新时间
    FPDMImportDate   string       `gorm:"column:FPDMImportDate" json:"FPDMImportDate"`     // 导入时间
    FStatus          int          `gorm:"column:FStatus" json:"FStatus"`                   // 状态
    Component        []ICBomChild `json:"Component"`                                       // BOM组件
}
func BomList(fData bool) []ICBom {
report/send.go
@@ -2,6 +2,7 @@
import (
    "encoding/json"
    "io/ioutil"
    "time"
    "kingdee-dbapi/cache"
@@ -143,27 +144,48 @@
// bom数据分bom和bomChild两个表
func SendBom(fData bool) {
    var bomList []kingdee.ICBom
    var bomChildList []kingdee.ICBomChild
    // 上报bom
    bomList := kingdee.BomList(fData)
    bomList = kingdee.BomList(fData)
    logger.Debug("查询到%d条BOM数据", len(bomList))
    // 过滤数据, 判断是否已经上报过, 请求全量数据不过滤, 直接上报
    if !fData {
        var bomNumbers []string
        for i := 0; i < len(bomList); {
            cacheKey := bomList[i].FBOMNumber + bomList[i].FAudDate
            if _, ok := bomReportedCache[cacheKey]; ok {
                bomList = append(bomList[:i], bomList[i+1:]...)
            } else {
                bomReportedCache[cacheKey] = struct{}{}
                bomNumbers = append(bomNumbers, bomList[i].FBOMNumber)
                i++
            }
        }
        if len(bomNumbers) > 0 {
            bomChildList = kingdee.BomChild(bomNumbers)
        }
    } else {
        bomChildList = kingdee.BomChild(nil)
    }
    // 分组上传bom数据
    if len(bomList) == 0 {
        logger.Debug("没有要更新的BOM数据.")
    } else {
        // 将bom组件按bomId整理
        var bomChildMap = make(map[int][]kingdee.ICBomChild, 0)
        for idx, bomChild := range bomChildList {
            bomChildMap[bomChild.FInterID] = append(bomChildMap[bomChild.FInterID], bomChildList[idx])
        }
        // 给bom添加组件
        for _, bom := range bomList {
            bom.Component = bomChildMap[bom.FInterID]
        }
        // 每次发 1000 条
        successCnt := 0
        for i := 0; i < len(bomList); i += 1000 {
@@ -173,6 +195,8 @@
            }
            b, _ := json.Marshal(bomList[i:end])
            ioutil.WriteFile("bomList.tmp", b, 0644)
            ok := nsqclient.Produce(config.Options.BomTopic, b)
            if !ok {
@@ -190,49 +214,48 @@
        logger.Debug("已上报%d条BOM数据", successCnt)
    }
    // 上报bom子项
    var bomChildList []kingdee.ICBomChild
    // 如果请求全量数据, 直接查询所有的数据并发送. 增量上报, 先判断bom是否有更新,然后按bom编码查询子项
    if fData {
        bomChildList = kingdee.BomChild(nil)
    } else {
        if len(bomList) <= 0 {
            return
        }
        var bomIds []string
        for _, v := range bomList {
            bomIds = append(bomIds, v.FBOMNumber)
        }
        bomChildList = kingdee.BomChild(bomIds)
    }
    logger.Debug("查询到%d条BOM子项数据", len(bomList))
    if len(bomChildList) == 0 {
        logger.Debug("没有要更新的BOM子项数据.")
        return
    }
    // 每次发 1000 条
    successCnt := 0
    for i := 0; i < len(bomChildList); i += 1000 {
        end := i + 1000
        if end > len(bomChildList) {
            end = len(bomChildList)
        }
        b, _ := json.Marshal(bomChildList[i:end])
        ok := nsqclient.Produce(config.Options.BomChildTopic, b)
        if !ok {
            logger.Warn("BOM数据上报失败")
        } else {
            successCnt = end
        }
    }
    logger.Debug("已上报%d条BOM子项数据", successCnt)
    //
    //// 上报bom子项
    //
    //// 如果请求全量数据, 直接查询所有的数据并发送. 增量上报, 先判断bom是否有更新,然后按bom编码查询子项
    //if fData {
    //    bomChildList = kingdee.BomChild(nil)
    //} else {
    //    if len(bomList) <= 0 {
    //        return
    //    }
    //
    //    var bomIds []string
    //    for _, v := range bomList {
    //        bomIds = append(bomIds, v.FBOMNumber)
    //    }
    //
    //    bomChildList = kingdee.BomChild(bomIds)
    //}
    //
    //logger.Debug("查询到%d条BOM子项数据", len(bomList))
    //
    //if len(bomChildList) == 0 {
    //    logger.Debug("没有要更新的BOM子项数据.")
    //    return
    //}
    //
    //// 每次发 1000 条
    //successCnt := 0
    //for i := 0; i < len(bomChildList); i += 1000 {
    //    end := i + 1000
    //    if end > len(bomChildList) {
    //        end = len(bomChildList)
    //    }
    //
    //    b, _ := json.Marshal(bomChildList[i:end])
    //
    //    ok := nsqclient.Produce(config.Options.BomChildTopic, b)
    //    if !ok {
    //        logger.Warn("BOM数据上报失败")
    //    } else {
    //        successCnt = end
    //    }
    //}
    //logger.Debug("已上报%d条BOM子项数据", successCnt)
}