zhangzengfei
2023-08-15 1a6fa89e9ffc8ade73afbeda3e6c791bad1d4cd9
添加bom子项的上报
2个文件已修改
126 ■■■■■ 已修改文件
kingdee/bom.go 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
report/send.go 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
kingdee/bom.go
@@ -1,5 +1,10 @@
package kingdee
import (
    "fmt"
    "strings"
)
type ICBom struct {
    FInterID         int     `gorm:"column:FInterID" json:"FInterID"`                 // 内码
    FBOMNumber       string  `gorm:"column:FBOMNumber" json:"FBOMNumber"`             // BOM单编号
@@ -42,7 +47,7 @@
        ICBom.FAudDate, 
        ICBom.FPDMImportDate, 
        ICBom.FStatus
     FROM ICBom
    FROM ICBom
        left join t_SubMessage on ICBom.FUseStatus = t_SubMessage.FInterID AND t_SubMessage.FInterID <> 0  
        join t_ICItem on ICBom.FItemID= t_ICItem.FItemID  AND t_ICItem.FItemID <> 0  
        left join t_MeasureUnit on ICBom.FUnitID = t_MeasureUnit.FItemID AND t_MeasureUnit.FItemID <> 0  
@@ -51,13 +56,75 @@
    // 如果不是请求全部数据, 仅查询当天更新的, 默认查当天
    if !fData {
        sql = sql + " Where DateDiff(dd,FAudDate,getdate())=1"
        sql = sql + " WHERE DateDiff(dd, ICBom.FAudDate, getdate())=1"
    }
    var result []ICBom
    db.Raw(sql).Scan(&result)
    //db.Raw(sql).Debug().Scan(&result)
    return result
}
type ICBomChild struct {
    FInterID          int     `gorm:"column:FInterID" json:"FInterID"`                   // 所属BOM内码
    FBOMNumber        string  `gorm:"column:FBOMNumber" json:"FBOMNumber"`               // 所属BOM单编号
    FEntryID          int     `gorm:"column:FEntryID" json:"FEntryID"`                   // 顺序号
    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"`                 // 物料属性
    FMaterielTypeName string  `gorm:"column:FMaterielTypeName" json:"FMaterielTypeName"` // 子项类型
    FMarshalTypeName  string  `gorm:"column:FMarshalTypeName" json:"FMarshalTypeName"`   // 配置属性
    FQty              float64 `gorm:"column:FQty" json:"FQty"`                           // 数量
    FUnitName         string  `gorm:"column:FUnitName" json:"FUnitName"`                 // 单位
    FPercent          float64 `gorm:"column:FPercent" json:"FPercent"`                   // 计划百分比
    FBackFlushNumber  string  `gorm:"column:FBackFlushNumber" json:"FBackFlushNumber"`   // 是否倒冲代码
    FBackFlushName    string  `gorm:"column:FBackFlushName" json:"FBackFlushName"`       // 是否倒
    FUseState         string  `gorm:"column:FUseState" json:"FUseState"`                 // 使用状态
    FStockIDNumber    string  `gorm:"column:FStockIDNumber" json:"FStockIDNumber"`       // 仓库代码
    FStockIDName      string  `gorm:"column:FStockIDName" json:"FStockIDName"`           // 仓库名称
    FPDMImportDate    string  `gorm:"column:FPDMImportDate" json:"FPDMImportDate"`       // 导入时间
}
func BomChild(bomNumber []string) []ICBomChild {
    sql := `
    SELECT ICBomChild.FInterID,
        ICBOM.FBOMNumber,
        ICBomChild.FEntryID,
        t_ICItem.FNumber as  FItemIDNumber,
        t_ICItem.FName as FItemName,
        t_ICItem.FModel as FModel,
        (SELECT FName FROM t_SubMessage WHERE t_ICItem.FErpClsID=FInterID) as FErpCls,
        t010.FName as FMaterielTypeName,
        t011.FName as FMarshalTypeName,
        ICBomChild.FQty,
        t_MeasureUnit.FName as FUnitName,
        ICBomChild.FPercent,
        t012.FID as FBackFlushNumber,
        t012.FName as FBackFlushName,
        (SELECT FName FROM t_SubMessage WHERE t_ICItem.FUseState=FInterID) as FUseState,
        t_Stock.FNumber as FStockIDNumber,
        t_Stock.FName as FStockIDName,
        ICBomChild.FPDMImportDate
    FROM ICBomChild
        join t_ICItem on t_ICItem.FItemID = ICBomChild.FItemID AND t_ICItem.FItemID <>0
        left join ICBOM on ICBOM.FInterID = ICBomChild.FInterID  AND ICBOM.FInterID<>0
        left join t_MeasureUnit on t_MeasureUnit.FItemID = t_ICItem.FUnitID  AND t_MeasureUnit.FItemID<>0
        left join t_SubMessage  t010 on t010.FInterID = ICBomChild.FMaterielType AND t010.FInterID <>0
        left join t_SubMessage  t011 on t011.FInterID = ICBomChild.FMarshalType AND t011.FInterID <>0
        left join t_SubMessage  t012 on t012.FInterID = ICBomChild.FBackFlush AND t012.FInterID <>0
        left join t_Stock on t_Stock.FItemID = ICBomChild.FStockID AND t_Stock.FItemID <>0
    `
    // 按bom查询
    if bomNumber != nil {
        sql = fmt.Sprintf("%s WHERE ICBOM.FBOMNumber in('%s')", sql, strings.Join(bomNumber, "','"))
    }
    var result []ICBomChild
    db.Raw(sql).Scan(&result)
    return result
}
report/send.go
@@ -130,7 +130,10 @@
            logger.Warn("库存数据上报失败")
            //上报失败, 缓存清空
            invReportedCache = make(map[string]float64, 0)
            for _, v := range list[i:end] {
                key := v.FNumber + v.FBatchNo + v.FStockNo
                delete(invReportedCache, key)
            }
        } else {
            successCnt = end
        }
@@ -139,17 +142,17 @@
    logger.Debug("已上报%d条库存数据", successCnt)
}
// bom数据分bom和bomChild两个表
func SendBom(fData bool) {
    // 上报bom
    bomList := kingdee.BomList(fData)
    logger.Debug("查询到%d条Bom数据", len(bomList))
    b, _ := json.Marshal(bomList)
    ioutil.WriteFile("bomList.tmp", b, 0644)
    // 过滤数据, 判断是否已经上报过, 请求全量数据不过滤, 直接上报
    if fData {
    if !fData {
        for i := 0; i < len(bomList); {
            cacheKey := bomList[i].FBOMNumber + bomList[i].FAudDate
            if _, ok := bomReportedCache[cacheKey]; ok {
@@ -161,8 +164,9 @@
        }
    }
    // 分组上传bom数据
    if len(bomList) == 0 {
        logger.Debug("没有要更新的Bom数据.")
        logger.Debug("没有要更新的BOM数据.")
    } else {
        // 每次发 1000 条
        successCnt := 0
@@ -174,13 +178,15 @@
            b, _ := json.Marshal(bomList[i:end])
            // TCP协议上报
            ok := nsqclient.Produce(config.Options.BomTopic, b)
            if !ok {
                logger.Warn("BOM数据上报失败")
                //上报失败, 缓存清空
                bomReportedCache = make(map[string]struct{}, 0)
                for _, v := range bomList[i:end] {
                    key := v.FBOMNumber + v.FAudDate
                    delete(bomReportedCache, key)
                }
            } else {
                successCnt = end
            }
@@ -189,4 +195,39 @@
    }
    // 上报bom子项
    var bomChildList []kingdee.ICBomChild
    // 如果请求全量数据, 直接查询所有的数据并发送. 增量上报, 先判断bom是否有更新,然后按bom编码查询子项
    if fData {
        bomChildList = kingdee.BomChild(nil)
        b, _ := json.Marshal(bomChildList)
        ioutil.WriteFile("bomChdList.tmp", b, 0644)
    } else {
        if len(bomList) <= 0 {
            return
        }
    }
    if len(bomChildList) == 0 {
        logger.Debug("没有要更新的BOM子项数据.")
    } else {
        // 每次发 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)
    }
}