@ -4,6 +4,7 @@ package implments
import (
baseDal "LAPP_ACURA_MOM_BACKEND/dao/base"
dalMe "LAPP_ACURA_MOM_BACKEND/dao/me"
dal "LAPP_ACURA_MOM_BACKEND/dao/pln"
"LAPP_ACURA_MOM_BACKEND/db"
"LAPP_ACURA_MOM_BACKEND/global"
@ -11,6 +12,7 @@ import (
"LAPP_ACURA_MOM_BACKEND/infra/logger"
meta "LAPP_ACURA_MOM_BACKEND/meta/pln"
baseModel "LAPP_ACURA_MOM_BACKEND/models/base"
modelMe "LAPP_ACURA_MOM_BACKEND/models/me"
model "LAPP_ACURA_MOM_BACKEND/models/pln"
"LAPP_ACURA_MOM_BACKEND/utils"
"bufio"
@ -110,6 +112,54 @@ func NewHondaDemandServiceImplement() *HondaDemandServiceImplement {
return hondaDemandServiceImplement
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* @ Reference LAPP_ACURA_MOM_BACKEND / services / pln / HondaDemandService . Analysis
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
func ( impl * HondaDemandServiceImplement ) Analysis ( user * global . User , demandId string ) error {
grmi . Log ( user , "/services/pln/implments/HondaDemand.service.impl.go" , "Analysis" , "重新解析一个HondaDemand" )
condition := DefaultConditionOfHondaDemandErrorLstAndPaging
engine := db . Eloquent . Master ( )
session := engine . NewSession ( )
defer session . Close ( )
dao := dal . NewHondaDemandDAO ( session , user . PlantNr , user . UserId )
record , err := dao . SelectOne ( demandId )
if err != nil {
return err
}
if record == nil {
return grmi . NewBusinessError ( "不存在指定记录!" )
}
//判断是否存在未处理错误
errDao := dal . NewHondaDemandErrorLstDAO ( session , user . PlantNr , user . UserId )
urlParameters := make ( map [ string ] string )
urlParameters [ meta . HondaDemandErrorLst_ErrorStatus . Name ] = "开"
urlParameters [ meta . HondaDemandErrorLst_DemandId . Name ] = record . DemandId
predicates , err := condition . BuildPredicates ( urlParameters )
errList , err := errDao . Select ( predicates , condition . OrderByFields )
if err != nil {
return err
}
if len ( errList ) > 0 {
return grmi . NewBusinessError ( "请修复错误后解析!" )
}
if record . Parsed != 3 {
return grmi . NewBusinessError ( "记录正在解析或已经解析成功!" )
}
record . Parsed = 1
err = dao . UpdateOne ( record )
if err != nil {
return err
}
utils . EmailSendStruct [ "demandAnalysis" ] . SeyChannels ( utils . ChannelsInfo {
Key : record . DemandId ,
Info : * record ,
} )
return nil
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* @ Reference LAPP_ACURA_MOM_BACKEND / services / pln / HondaDemandService . InsertOne
@ -136,21 +186,55 @@ func (impl *HondaDemandServiceImplement) InsertOne(user *global.User, entity *mo
}
entity . Parsed = 1
dao := dal . NewHondaDemandDAO ( session , user . PlantNr , user . UserId )
record , err := dao . SelectOne ( entity . DemandId )
infoDao := dal . NewHondaDemandItemLstDAO ( session , user . PlantNr , user . UserId )
errList , infoList := impl . fileUpload ( entity )
record , err := dao . SelectOneWhere ( * entity )
if err != nil {
return err
}
if record != nil {
return grmi . NewBusinessError ( "已经存在相同主键的记录!" )
return grmi . NewBusinessError ( "需求代码周期不能重复导入!" )
}
if errList == nil {
session . Begin ( )
if len ( infoList ) > 100 {
var _infoList [ ] model . HondaDemandItemLst
for k , v := range infoList {
_infoList = append ( _infoList , v )
if ( k > 0 && k % 50 == 0 ) || k + 1 == len ( infoList ) {
err = infoDao . Insert ( & _infoList )
if err != nil {
session . Rollback ( )
return err
}
_infoList = [ ] model . HondaDemandItemLst { }
}
}
} else {
err = infoDao . Insert ( & infoList )
if err != nil {
session . Rollback ( )
return err
}
}
err = dao . InsertOne ( entity )
if err != nil {
session . Rollback ( )
return err
}
} else {
errStr := ""
for _ , v := range errList {
errStr += v . ErrorInfo + ";"
}
return fmt . Errorf ( errStr )
}
err = dao . InsertOne ( entity )
utils . EmailSendStruct [ "demandAnalysis" ] . SeyChannels ( utils . ChannelsInfo {
Key : entity . DemandId ,
Info : * entity ,
} )
if err != nil {
return err
}
session . Commit ( )
return nil
}
@ -161,53 +245,200 @@ func (impl *HondaDemandServiceImplement) AnalysisFile(info utils.ChannelsInfo) (
entity , ok := info . Info . ( model . HondaDemand )
engine := db . Eloquent . Master ( )
session := engine . NewSession ( )
defer func ( ) { //在panic前声明defer,能捕获异常
if err := recover ( ) ; err != nil {
session . Rollback ( )
innerLog , _ := logger . NewLogger ( "system" , "create_cust_order" )
innerLog . Debug ( "系统异常:" , err )
}
} ( )
defer session . Close ( )
errDao := dal . NewHondaDemandErrorLstDAO ( session , baseModel . PlantNr , "system" )
dao := dal . NewHondaDemandDAO ( session , baseModel . PlantNr , "system" )
infoDao := dal . NewHondaDemandItemLstDAO ( session , baseModel . PlantNr , "system" )
//配置
familyDao := dalMe . NewProductFamilyDAO ( session , baseModel . PlantNr , "system" )
//流水号
snrDao := baseDal . NewSnrDAO ( session , baseModel . PlantNr , "system" )
//客户订单
custDao := dal . NewCustOrderDAO ( session , baseModel . PlantNr , "system" )
//订单状态
custStatusDao := dal . NewCustOrderStatusDAO ( session , baseModel . PlantNr , "system" )
if ! ok || entity . DemandId == "" {
//写入日志
fmt . Println ( "消息体类型错误跳过消息" )
panic ( "消息体类型错误跳过消息" )
}
condition := DefaultConditionOfHondaDemandItemLstAndPaging
//删除错误信息
urlParameters := make ( map [ string ] string )
urlParameters [ meta . HondaDemandErrorLst_DemandId . Name ] = entity . DemandId
predicates , err := condition . BuildPredicates ( urlParameters )
if err != nil {
errData := model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 1 ,
ErrorType : "" ,
ErrorInfo : "系统解析异常:" + err . Error ( ) + ";" ,
ErrorStatus : "开" ,
}
_ = errDao . InsertOne ( & errData )
return false , info
}
_ , err := os . Stat ( "web/public/" + entity . DemandType + "/" + entity . EdiFile )
_ = errDao . DeleteWhere ( predicates )
//查出明细
urlParameters = make ( map [ string ] string )
urlParameters [ meta . HondaDemandErrorLst_DemandId . Name ] = entity . DemandId
predicates , err = condition . BuildPredicates ( urlParameters )
if err != nil {
//插入错误
errorInfo := model . HondaDemandErrorLst {
errData := model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 1 ,
ErrorType : "" ,
ErrorInfo : "文件不存在" ,
ErrorInfo : "系统解析异常:" + err . Error ( ) + "; " ,
ErrorStatus : "开" ,
}
if entity . Parsed == 1 {
_ = errDao . InsertOne ( & errorInfo )
} else {
_ = errDao . UpdateOne ( & errorInfo )
_ = errDao . InsertOne ( & errData )
return false , info
}
itemInfo , err := infoDao . Select ( predicates , condition . OrderByFields )
if err != nil {
errData := model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 1 ,
ErrorType : "" ,
ErrorInfo : "系统解析异常:" + err . Error ( ) + ";" ,
ErrorStatus : "开" ,
}
//修改主表为带解析
entity . Parsed = 3
_ = dao . UpdateOne ( & entity )
_ = errDao . InsertOne ( & errData )
return false , info
}
file , err := os . Open ( "web/public/" + entity . DemandType + "/" + entity . EdiFile )
//根据配置号查询零件配置 以及配置信息
var familyCode [ ] string
for _ , v := range itemInfo {
familyCode = append ( familyCode , v . ProductFamilyId )
}
familyData , err := familyDao . SelectAndRelate ( familyCode )
if err != nil {
errorInfo := model . HondaDemandErrorLst {
errData := model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 2 ,
Pos : - 1 ,
ErrorType : "" ,
ErrorInfo : "文件无法打开 " ,
ErrorInfo : "系统解析异常:" + err . Error ( ) + "; " ,
ErrorStatus : "开" ,
}
if entity . Parsed == 1 {
_ = errDao . InsertOne ( & errorInfo )
_ = errDao . InsertOne ( & errData )
return false , info
}
familyMap := make ( map [ string ] modelMe . ProductFamily )
for _ , v := range familyData {
familyMap [ v . ProductFamilyId ] = v
}
//客户订单列表
var custOrder [ ] model . CustOrder
var errList [ ] model . HondaDemandErrorLst
var custOrderStatus [ ] model . CustOrderStatus
//循环详情
for _ , v := range itemInfo {
familyInfo , ok := familyMap [ v . ProductFamilyId ]
if ok {
for _ , val := range familyInfo . Relate {
custOrderId , err := snrDao . GetNextSnr ( "custOrderID" )
if err != nil {
errData := model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 1 ,
ErrorType : "" ,
ErrorInfo : "系统解析异常,流水号生成失败:" + err . Error ( ) + ";" ,
ErrorStatus : "开" ,
}
_ = errDao . InsertOne ( & errData )
return false , info
}
custOrder = append ( custOrder , model . CustOrder {
CustOrderId : custOrderId ,
ProductFamilyId : v . ProductFamilyId ,
PartId : val . ProductId ,
OrderType : baseModel . ODER_TYPE_SEQ ,
OrderInfo : familyInfo . Descr ,
ProjectId : familyInfo . ProjectId ,
ConfigValue : familyInfo . ConfigValue ,
ModelValue : familyInfo . ModelValue ,
ColorValue : familyInfo . ColorValue ,
PlanQty : v . PlanQty ,
} )
custOrderStatus = append ( custOrderStatus , model . CustOrderStatus {
CustOrderId : custOrderId ,
Status : baseModel . ORDER_STATUS_UNPLANED ,
} )
}
} else {
_ = errDao . UpdateOne ( & errorInfo )
errList = append ( errList , model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : v . Pos ,
ErrorType : "" ,
ErrorInfo : "车型配置未找到:" + v . ProductFamilyId ,
ErrorStatus : "开" ,
} )
}
//修改主表为带解析
}
session . Begin ( )
if len ( errList ) > 0 {
entity . Parsed = 3
_ = dao . UpdateOne ( & entity )
return false , info
err = dao . UpdateOne ( & entity )
if err != nil {
panic ( "文件解析失败,更新状态异常:" + err . Error ( ) )
}
err = errDao . Insert ( & errList )
if err != nil {
panic ( "文件解析失败,写入错误信息异常:" + err . Error ( ) )
}
} else {
entity . Parsed = 2
err = dao . UpdateOne ( & entity )
if err != nil {
panic ( "文件解析成功,修改状态异常:" + err . Error ( ) )
}
err = custDao . Insert ( & custOrder )
if err != nil {
panic ( "文件解析成功,写入客户订单异常:" + err . Error ( ) )
}
err = custStatusDao . Insert ( & custOrderStatus )
if err != nil {
panic ( "文件解析成功,写入客户订单状态异常:" + err . Error ( ) )
}
}
_ = session . Commit ( )
return false , info
}
func ( impl * HondaDemandServiceImplement ) fileUpload ( entity * model . HondaDemand ) ( [ ] model . HondaDemandErrorLst , [ ] model . HondaDemandItemLst ) {
var errList [ ] model . HondaDemandErrorLst
engine := db . Eloquent . Master ( )
session := engine . NewSession ( )
defer session . Close ( )
_ , err := os . Stat ( "web/public/" + entity . DemandType + "/" + entity . EdiFile )
if err != nil {
errList = append ( errList , model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 1 ,
ErrorType : "" ,
ErrorInfo : "文件不存在" ,
ErrorStatus : "开" ,
} )
return errList , nil
}
file , err := os . Open ( "web/public/" + entity . DemandType + "/" + entity . EdiFile )
if err != nil {
errList = append ( errList , model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 1 ,
ErrorType : "" ,
ErrorInfo : "文件不存在" ,
ErrorStatus : "开" ,
} )
return errList , nil
}
defer file . Close ( )
reader := bufio . NewReader ( file )
@ -217,7 +448,6 @@ func (impl *HondaDemandServiceImplement) AnalysisFile(info utils.ChannelsInfo) (
bodyRow := 0
totalQty := 0
var infoList [ ] model . HondaDemandItemLst
var errList [ ] model . HondaDemandErrorLst
_planCode := ""
_DemandYear := 0
_analysis := time . Time { }
@ -288,22 +518,14 @@ func (impl *HondaDemandServiceImplement) AnalysisFile(info utils.ChannelsInfo) (
_planCode = planCode
} else if _planCode != planCode {
//插入错误
errorInfo := model . HondaDemandErrorLst {
errList = append ( errList , model . HondaDemandErrorLst {
DemandId : entity . DemandId ,
Pos : - 8 ,
ErrorType : "" ,
ErrorInfo : "文件内PlanCode不一致无法解析" ,
ErrorStatus : "开" ,
}
if entity . Parsed == 1 {
_ = errDao . InsertOne ( & errorInfo )
} else {
_ = errDao . UpdateOne ( & errorInfo )
}
//修改主表为带解析
entity . Parsed = 3
_ = dao . UpdateOne ( & entity )
return false , info
} )
return errList , nil
}
entity . DemandWeek = demandWeek
entity . PlanCode = planCode
@ -331,8 +553,10 @@ func (impl *HondaDemandServiceImplement) AnalysisFile(info utils.ChannelsInfo) (
info := & model . HondaDemandItemLst { }
info . DemandId = entity . DemandId
info . Pos = bodyRow
_strArr2 := impl . bodyRoArr ( str )
//读取body
strArr := strings . Split ( str , " " )
str := impl . DeleteExtraSpace ( str )
_strArr := strings . Split ( str , " " )
if _strArr [ 1 ] == "GRAND" {
@ -345,7 +569,8 @@ func (impl *HondaDemandServiceImplement) AnalysisFile(info utils.ChannelsInfo) (
}
break
}
dateStr , errList = impl . bodyInfo ( _strArr , dateStr , info , strArr , errList , totalRow )
//
dateStr , errList = impl . bodyInfo ( _strArr2 , dateStr , info , errList , totalRow )
totalQty += info . PlanQty
infoList = append ( infoList , * info )
}
@ -361,29 +586,7 @@ func (impl *HondaDemandServiceImplement) AnalysisFile(info utils.ChannelsInfo) (
} )
}
if len ( infoList ) > 100 {
var _infoList [ ] model . HondaDemandItemLst
for k , v := range infoList {
_infoList = append ( _infoList , v )
if ( k > 0 && k % 50 == 0 ) || k + 1 == len ( infoList ) {
_ = infoDao . Insert ( & _infoList )
_infoList = [ ] model . HondaDemandItemLst { }
}
}
} else {
_ = infoDao . Insert ( & infoList )
}
if len ( errList ) > 0 {
entity . Parsed = 3
_ = dao . UpdateOne ( & entity )
_ = errDao . Insert ( & errList )
} else {
entity . Parsed = 2
_ = dao . UpdateOne ( & entity )
}
return false , info
return nil , infoList
}
func ( impl * HondaDemandServiceImplement ) headAnalysis ( str string ) ( time . Time , int , error ) {
@ -494,7 +697,7 @@ func (impl *HondaDemandServiceImplement) headWeek(str string, demandYear int) (i
}
return demandWeek , planCode , nil
}
func ( impl * HondaDemandServiceImplement ) bodyInfo ( _strArr [ ] string , dateStr string , info * model . HondaDemandItemLst , strArr [ ] string , _errList [ ] model . HondaDemandErrorLst , totalRow int ) ( string , [ ] model . HondaDemandErrorLst ) {
func ( impl * HondaDemandServiceImplement ) bodyInfo ( _strArr [ ] string , dateStr string , info * model . HondaDemandItemLst , _errList [ ] model . HondaDemandErrorLst , totalRow int ) ( string , [ ] model . HondaDemandErrorLst ) {
defer func ( ) {
if err := recover ( ) ; err != nil {
_errList = append ( _errList , model . HondaDemandErrorLst {
@ -506,42 +709,17 @@ func (impl *HondaDemandServiceImplement) bodyInfo(_strArr []string, dateStr stri
} )
}
} ( )
//按空格拆分数组 如果下角标2不为空字符串 既是时间
oKey := 2
codeKey := 7
colorKey := 9
planQtyKey := 11
if strArr [ 4 ] != "" {
dateArr := strings . Split ( strArr [ 4 ] , "/" )
dateStr = ""
for i := 2 ; i >= 0 ; i -- {
if i != 2 {
dateStr += "-"
}
dateStr += dateArr [ i ]
}
oKey += 1
codeKey += 1
colorKey += 1
planQtyKey += 1
if _strArr [ 0 ] != "" {
//为时间
dateStr = _strArr [ 0 ]
}
if _strArr [ oKey ] == "M" {
codeKey -= 2
colorKey -= 2
planQtyKey -= 2
}
//时间转换
if result , err := time . ParseInLocation ( "2006-01-02" , dateStr , TimeLocationShangHai ) ; err == nil {
info . DeliveryDate = grmi . Date ( result . In ( TimeLocationShangHai ) )
}
code := _strArr [ codeKey ]
color := _strArr [ colorKey ]
planQty := _strArr [ planQtyKey ]
info . Color = color
if code == "" {
info . Color = _strArr [ 4 ]
if info . Color == "" {
_errList = append ( _errList , model . HondaDemandErrorLst {
DemandId : info . DemandId ,
Pos : info . Pos ,
@ -549,23 +727,12 @@ func (impl *HondaDemandServiceImplement) bodyInfo(_strArr []string, dateStr stri
ErrorInfo : fmt . Sprintf ( "未获取到车型配置代码,文件行数:%d" , totalRow ) ,
ErrorStatus : "开" ,
} )
} else {
codeArr := strings . Split ( code , "-" )
if len ( codeArr ) != 4 {
_errList = append ( _errList , model . HondaDemandErrorLst {
DemandId : info . DemandId ,
Pos : info . Pos ,
ErrorType : "" ,
ErrorInfo : fmt . Sprintf ( "车型配置代码解析失败,文件行数:%d;" , totalRow ) ,
ErrorStatus : "开" ,
} )
} else {
code = codeArr [ 0 ] + codeArr [ 1 ] + "-" + codeArr [ 2 ] + color
}
}
if i , err := strconv . Atoi ( planQty ) ; err == nil {
i , err := strconv . Atoi ( _strArr [ 5 ] )
if err == nil {
info . PlanQty = i
} else {
}
if err != nil || info . PlanQty == 0 {
_errList = append ( _errList , model . HondaDemandErrorLst {
DemandId : info . DemandId ,
Pos : info . Pos ,
@ -574,9 +741,64 @@ func (impl *HondaDemandServiceImplement) bodyInfo(_strArr []string, dateStr stri
ErrorStatus : "开" ,
} )
}
info . ProductFamilyId = code
info . ProductFamilyId = _strArr [ 2 ] + "-" + _strArr [ 3 ] + "-" + _strArr [ 4 ]
return dateStr , _errList
}
func ( impl * HondaDemandServiceImplement ) bodyRoArr ( str string ) [ ] string {
bodyArr := [ ] string { "" , "" , "" , "" , "" , "" }
_str := ""
_dateArr := [ ] string { "" , "" , "" }
for k , v := range str {
if k == 4 || k == 5 {
if string ( v ) == "" {
_dateArr [ 0 ] += "0"
} else {
_dateArr [ 0 ] += string ( v )
}
}
if k == 7 || k == 8 {
if string ( v ) == "" {
_dateArr [ 1 ] += "0"
} else {
_dateArr [ 1 ] += string ( v )
}
}
if k == 10 || k == 11 || k == 12 || k == 13 {
if string ( v ) == "" {
_dateArr [ 2 ] += "0"
} else {
_dateArr [ 2 ] += string ( v )
}
bodyArr [ 0 ] = _dateArr [ 2 ] + "-" + _dateArr [ 1 ] + "-" + _dateArr [ 0 ]
}
if k == 15 || k == 16 || k == 17 {
bodyArr [ 1 ] += string ( v )
}
if k == 57 || k == 59 || k == 60 || k == 61 {
bodyArr [ 2 ] += string ( v )
}
if k == 63 || k == 64 || k == 65 {
bodyArr [ 3 ] += string ( v )
}
if k == 82 {
bodyArr [ 4 ] = string ( v )
}
if k == 85 || k == 86 || k == 87 || k == 88 || k == 89 || k == 90 || k == 91 || k == 92 || k == 93 || k == 94 || k == 95 || k == 96 || k == 97 || k == 98 || k == 99 || k == 100 || k == 101 {
_str += string ( v )
if k == 101 {
//字符串转数组 去数组第二位
_strArr := strings . Split ( impl . DeleteExtraSpace ( _str ) , " " )
if len ( _strArr ) < 2 {
bodyArr [ 5 ] = ""
} else {
bodyArr [ 5 ] = _strArr [ 1 ]
}
}
}
}
return bodyArr
}
func ( impl * HondaDemandServiceImplement ) DeleteExtraSpace ( s string ) string {
//删除字符串中的多余空格,有多个空格时,仅保留一个空格
s1 := strings . Replace ( s , " " , " " , - 1 ) //替换tab为空格