6 Commits

10 changed files with 4062 additions and 103 deletions
Split View
  1. +2
    -5
      main.go
  2. +26
    -22
      services/ap/implments/Balance.service.impl.go
  3. +161
    -70
      services/ap/implments/CustDemandVerHead.service.impl.go
  4. +20
    -2
      utils/k3cloud.go
  5. +7
    -3
      utils/k3cloud/base/curl.go
  6. +49
    -0
      utils/k3cloud/service/cust.go
  7. +1
    -1
      utils/k3cloud/service/voucher.go
  8. +11
    -0
      utils/k3cloud/struct/request/search.go
  9. +6
    -0
      utils/k3cloud/struct/response/responseToStruct.go
  10. +3779
    -0
      utils/k3cloud/table/cust.json

+ 2
- 5
main.go View File

@ -9,8 +9,6 @@ import (
"leit.com/LAPP_CHEERSSON_BACKEND/db"
"leit.com/LAPP_CHEERSSON_BACKEND/infra/logger"
"leit.com/LAPP_CHEERSSON_BACKEND/utils"
utilService "leit.com/LAPP_CHEERSSON_BACKEND/utils/k3cloud/service"
_struct "leit.com/LAPP_CHEERSSON_BACKEND/utils/k3cloud/struct"
"leit.com/LAPP_CHEERSSON_BACKEND/web/middleware/glog"
"leit.com/LAPP_CHEERSSON_BACKEND/web/routes"
"log"
@ -115,10 +113,9 @@ func imain() {
//加载配置
conf.AppOtherParse()
//加载金蝶云系统
utils.K3configInit()
//utils.K3configInit()
//测试
var root11 _struct.Root
utilService.VoucherInit().GetVoucher(root11)
//utilService.CustInit().Search("FName,FNumber", "", "")
app := iris.New()
//注册中间件
//conf.PreSettring(app)


+ 26
- 22
services/ap/implments/Balance.service.impl.go View File

@ -829,7 +829,7 @@ func (impl *BalanceServiceImplement) refreshMpsArticleDemand(isRefresh bool,data
MinInventory += data_ArticleDemand[now].ForecastDemandQty
}
}
articleDemandInfo.MinInventory = MinInventory
data_ArticleDemand[index].MinInventory = MinInventory
//目标库存水平
TargetInventory := 0.0
@ -839,42 +839,46 @@ func (impl *BalanceServiceImplement) refreshMpsArticleDemand(isRefresh bool,data
TargetInventory += data_ArticleDemand[now].ForecastDemandQty
}
}
articleDemandInfo.TargetInventory = TargetInventory
data_ArticleDemand[index].TargetInventory = TargetInventory
// 需求
for index, _ := range data_ArticleDemand {
//需求 = 预测和订单需求最大值 + 外购 + 独立
needQty := data_ArticleDemand[index].OrderQty + data_ArticleDemand[index].OutSourcingQty + data_ArticleDemand[index].IndependentDemandQty
if data_ArticleDemand[index].ForecastDemandQty > data_ArticleDemand[index].OrderQty {
needQty = data_ArticleDemand[index].ForecastDemandQty + data_ArticleDemand[index].OutSourcingQty + data_ArticleDemand[index].IndependentDemandQty
}
data_ArticleDemand[index].NeedQty = needQty
}
//IF (期初库存 – 需求) < 最低库存
//触发生产
//MPS 计划量 = 目标库存 - ( 期初库存 – 需求 )
//净生产量 = 目标库存 - ( 期初库存 – 需求 )
//ELSE
//不触发生产
//MPS 计划量 = 0
//净生产量 = 0
//END IF
//计算需求
for index, articleDemandInfo := range data_ArticleDemand {
needQty := articleDemandInfo.IndependentDemandQty + articleDemandInfo.OutSourcingQty + articleDemandInfo.OrderQty
if articleDemandInfo.ForecastDemandQty > articleDemandInfo.OrderQty {
needQty = articleDemandInfo.ForecastDemandQty + articleDemandInfo.OutSourcingQty + articleDemandInfo.OrderQty
}
data_ArticleDemand[index].NeedQty = needQty
}
if !isRefresh {
if articleDemandInfo.OpeningInventory-articleDemandInfo.NeedQty < articleDemandInfo.MinInventory {
articleDemandInfo.NetDemandQty = articleDemandInfo.TargetInventory - (articleDemandInfo.OpeningInventory - articleDemandInfo.NeedQty)
if data_ArticleDemand[index].OpeningInventory-data_ArticleDemand[index].NeedQty < data_ArticleDemand[index].MinInventory {
data_ArticleDemand[index].NetDemandQty = data_ArticleDemand[index].TargetInventory - (data_ArticleDemand[index].OpeningInventory - data_ArticleDemand[index].NeedQty)
} else {
articleDemandInfo.NetDemandQty = 0
data_ArticleDemand[index].NetDemandQty = 0
}
}
// 期末库存
articleDemandInfo.EndingInventory = articleDemandInfo.NetDemandQty + articleDemandInfo.OpeningInventory - articleDemandInfo.NeedQty
// 期末库存 = 净生产量 + 期初库存 - 需求
data_ArticleDemand[index].EndingInventory = data_ArticleDemand[index].NetDemandQty + data_ArticleDemand[index].OpeningInventory - data_ArticleDemand[index].NeedQty
data_ArticleDemand[index].MinInventory = articleDemandInfo.MinInventory
data_ArticleDemand[index].TargetInventory = articleDemandInfo.TargetInventory
data_ArticleDemand[index].NetDemandQty = articleDemandInfo.NetDemandQty
data_ArticleDemand[index].EndingInventory = articleDemandInfo.EndingInventory
//data_ArticleDemand[index].MinInventory = articleDemandInfo.MinInventory
//data_ArticleDemand[index].TargetInventory = articleDemandInfo.TargetInventory
//data_ArticleDemand[index].NetDemandQty = articleDemandInfo.NetDemandQty
//data_ArticleDemand[index].EndingInventory = articleDemandInfo.EndingInventory
if index != len(data_ArticleDemand)-1 {
//下期期初 = 本期期末
data_ArticleDemand[index+1].OpeningInventory = data_ArticleDemand[index].EndingInventory
}
}
@ -883,7 +887,7 @@ func (impl *BalanceServiceImplement) refreshMpsArticleDemand(isRefresh bool,data
for index, ArticleDemandDDataInfo := range data_ArticleDemand {
for _, articleResourceInfo := range data_ArticleResource {
if articleResourceInfo.ArtId == ArticleDemandDDataInfo.ArtId {
data_ArticleDemand[index].MpsWorkTime = ArticleDemandDDataInfo.NetDemandQty / articleResourceInfo.QuantityPerHour
data_ArticleDemand[index].MpsWorkTime = data_ArticleDemand[index].NetDemandQty / articleResourceInfo.QuantityPerHour
break
}
}


+ 161
- 70
services/ap/implments/CustDemandVerHead.service.impl.go View File

@ -1268,7 +1268,7 @@ func (impl *CustDemandVerHeadServiceImplement) DeviationAnalysis(user *global.Us
custDao := basedal.NewCustomerDAO(session, user.PlantNr, user.UserId)
result := new(model.CustomerDeviation)
data := make([]model.CustomerDeviationDetailItem, 0)
perData := make([]model.PerCustomerDeviationDetailItem, 0)
perData := model.PerCustomerDeviationDetailItem{}
var versionIds []string
if len(versionId) > 0 {
versionIds = strings.Split(strings.TrimSpace(versionId), ",")
@ -1318,94 +1318,185 @@ func (impl *CustDemandVerHeadServiceImplement) DeviationAnalysis(user *global.Us
key := v.CustomerId + "_" + v.VersionId
mapDetailData[key] = append(mapDetailData[key], v)
}
//第二步: 查询对应的需求数量,如果长度不够,用0补齐
for k, details := range mapDetailData {
temLen := 0
var allWeeks []string
var temDemandDate time.Time
info := strings.Split(k, "_")
one := model.CustomerDeviationDetailItem{}
one.CustomerId = info[0]
one.VersionId = info[1]
one.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit
one.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit
if len(versionIds) == 1 && searchType == "seq" {
//第二步: 查询对应的需求数量,如果长度不够,用0补齐
for k, details := range mapDetailData {
temLen := 0
var allWeeks []string
var temDemandDate time.Time
info := strings.Split(k, "_")
one := model.CustomerDeviationDetailItem{}
one.CustomerId = info[0]
one.VersionId = info[1]
one.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit
one.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit
perOne := model.PerCustomerDeviationDetailItem{}
perOne.CustomerId = info[0]
perOne.VersionId = info[1]
perOne.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit
perOne.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit
perOne := model.PerCustomerDeviationDetailItem{}
perOne.CustomerId = info[0]
perOne.VersionId = info[1]
perOne.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit
perOne.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit
mapWeeks := make(map[string]int)
for _, vv := range details {
if temLen > lenData {
continue
mapWeeks := make(map[string]int)
for _, vv := range details {
if temLen > lenData {
continue
}
key := utils.ValueToString(vv.DemandYear, "") + "." + utils.ValueToString(vv.DemandWeek, "")
val, ok := mapWeeks[key]
if !ok {
temLen++
mapWeeks[key] = utils.ValueToInt(vv.DemandQty, 0)
allWeeks = append(allWeeks, key)
} else {
mapWeeks[key] = val + utils.ValueToInt(vv.DemandQty, 0)
}
weekDate, err := time.Parse("2006-01-02", vv.DemandDate.ToString())
if err != nil {
return nil, err
}
temDemandDate = weekDate
}
key := utils.ValueToString(vv.DemandYear, "") + "." + utils.ValueToString(vv.DemandWeek, "")
val, ok := mapWeeks[key]
if !ok {
temLen++
mapWeeks[key] = utils.ValueToInt(vv.DemandQty, 0)
allWeeks = append(allWeeks, key)
} else {
mapWeeks[key] = val + utils.ValueToInt(vv.DemandQty, 0)
//不足的周,用空位补齐
lenInfo := lenData - temLen
if lenInfo > 0 {
for k := 0; k < lenInfo; k++ {
weekDate := temDemandDate.AddDate(0, 0, 7*(k+1))
year, _, _ := weekDate.Date()
week := utils.WeekByDate(weekDate)
key := utils.ValueToString(year, "") + "." + utils.ValueToString(week, "")
allWeeks = append(allWeeks, key)
}
}
weekDate, err := time.Parse("2006-01-02", vv.DemandDate.ToString())
if err != nil {
return nil, err
pevNum := 0
items := make(map[string]int, 0)
peritems := make(map[string]float64, 0)
//排序
sort.Strings(allWeeks)
for kkk, vvv := range allWeeks {
key := vvv
val, ok := mapWeeks[key]
if ok {
if kkk == 0 {
pevNum = val
}
items[key] = val
if pevNum == 0 {
peritems[key] = 0
} else {
num := (float64(val) - float64(pevNum)) / float64(pevNum)
peritems[key] = utils.Decimal(num*100, 2)
}
pevNum = val
} else {
items[key] = 0
peritems[key] = 0
pevNum = 0
}
}
temDemandDate = weekDate
one.Item = items
one.SortKeys = allWeeks
data = append(data, one)
perOne.Item = peritems
perOne.SortKeys = allWeeks
perData = perOne
}
} else {
if len(versionIds) != 2 {
return result, errors.New("请选择两个版本比较!")
}
//第二步: 查询对应的需求数量,如果长度不够,用0补齐
for k, details := range mapDetailData {
temLen := 0
var allWeeks []string
var temDemandDate time.Time
info := strings.Split(k, "_")
one := model.CustomerDeviationDetailItem{}
one.CustomerId = info[0]
one.VersionId = info[1]
one.PeriodOnPeriodUpperLimit = tInfo.PeriodOnPeriodUpperLimit
one.PeriodOverPeriodLowerLimit = tInfo.PeriodOverPeriodLowerLimit
//不足的周,用空位补齐
lenInfo := lenData - temLen
if lenInfo > 0 {
for k := 0; k < lenInfo; k++ {
weekDate := temDemandDate.AddDate(0, 0, 7*(k+1))
year, _, _ := weekDate.Date()
week := utils.WeekByDate(weekDate)
key := utils.ValueToString(year, "") + "." + utils.ValueToString(week, "")
allWeeks = append(allWeeks, key)
mapWeeks := make(map[string]int)
for _, vv := range details {
if temLen > lenData {
continue
}
key := utils.ValueToString(vv.DemandYear, "") + "." + utils.ValueToString(vv.DemandWeek, "")
val, ok := mapWeeks[key]
if !ok {
temLen++
mapWeeks[key] = utils.ValueToInt(vv.DemandQty, 0)
allWeeks = append(allWeeks, key)
} else {
mapWeeks[key] = val + utils.ValueToInt(vv.DemandQty, 0)
}
weekDate, err := time.Parse("2006-01-02", vv.DemandDate.ToString())
if err != nil {
return nil, err
}
temDemandDate = weekDate
}
}
pevNum := 0
items := make(map[string]int, 0)
peritems := make(map[string]float64, 0)
//排序
sort.Strings(allWeeks)
for kkk, vvv := range allWeeks {
key := vvv
val, ok := mapWeeks[key]
if ok {
if kkk == 0 {
pevNum = val
//不足的周,用空位补齐
lenInfo := lenData - temLen
if lenInfo > 0 {
for k := 0; k < lenInfo; k++ {
weekDate := temDemandDate.AddDate(0, 0, 7*(k+1))
year, _, _ := weekDate.Date()
week := utils.WeekByDate(weekDate)
key := utils.ValueToString(year, "") + "." + utils.ValueToString(week, "")
allWeeks = append(allWeeks, key)
}
items[key] = val
if pevNum == 0 {
peritems[key] = 0
}
items := make(map[string]int, 0)
//排序
sort.Strings(allWeeks)
for _, vvv := range allWeeks {
key := vvv
val, ok := mapWeeks[key]
if ok {
items[key] = val
} else {
num := (float64(val)-float64(pevNum)) / float64(pevNum)
peritems[key] = utils.Decimal(num*100, 2)
items[key] = 0
}
pevNum = val
}
one.Item = items
one.SortKeys = allWeeks
data = append(data, one)
}
perData.SortKeys = data[0].SortKeys
perData.PeriodOverPeriodLowerLimit = data[0].PeriodOverPeriodLowerLimit
perData.PeriodOnPeriodUpperLimit = data[0].PeriodOnPeriodUpperLimit
itemMap1 := data[0].Item
itemMap2 := data[1].Item
ItemMap := make(map[string]float64)
for _, vvvv := range perData.SortKeys {
key := vvvv
val1, ok1 := itemMap1[key]
val2, ok2 := itemMap2[key]
if !ok1 || !ok2 {
ItemMap[key] = 0
}
if val1 == 0 {
ItemMap[key] = 0
} else {
items[key] = 0
peritems[key] = 0
pevNum = 0
num := (float64(val2) - float64(val1)) / float64(val1)
ItemMap[key] = utils.Decimal(num*100, 2)
}
}
one.Item = items
one.SortKeys = allWeeks
data = append(data, one)
perOne.Item = peritems
perOne.SortKeys = allWeeks
perData = append(perData, perOne)
perData.Item = ItemMap
}
result.CustomerDeviationDetailItem = data
result.PerCustomerDeviationDetailItem = perData
result.PerCustomerDeviationDetailItem = append(result.PerCustomerDeviationDetailItem,perData)
return result, nil
}
/******************************************************************************
*
* @Reference leit.com/LAPP_CHEERSSON_BACKEND/services/ap/CustDemandVerHeadService.CompareVersionInfoByArtcle


+ 20
- 2
utils/k3cloud.go View File

@ -41,7 +41,7 @@ K3cloud 登录
*/
func (k3config *K3config) Login() {
formParams := util.CreateLoginPostData(k3config.AcctID, k3config.Username, k3config.Password, k3config.LcID)
res := k3config.session.PostJson(k3config.CloudUrl+util.LOGIN_API, formParams)
res, _ := k3config.session.PostJson(k3config.CloudUrl+util.LOGIN_API, formParams)
k3Response := response.K3LoginResponseToStruct(res)
if k3Response.LoginResultType == 0 {
panic(k3Response.Message)
@ -49,8 +49,26 @@ func (k3config *K3config) Login() {
}
/**
查询数据
*/
func (K3config *K3config) SearchApi(formId string, search interface{}) ([][]string, error) {
//root.Model
formParams := util.CreateBusinessPostData(formId, util.Struct2Map(search))
res, err := K3config.GetSession().PostJson(K3config.CloudUrl+util.GETBILL_API, formParams)
if err != nil {
return nil, err
}
return response.K3ResponseToMap(res), nil
//K3config.K3Response = response.K3ResponseToStruct(res)
//if K3config.K3Response.Result.ResponseStatus.IsSuccess == false {
// return fmt.Errorf(string(res))
//}
//return nil
}
*/
/**
返回session
*/
func (k3config *K3config) GetSession() *util.Browser {
return k3config.session
}


+ 7
- 3
utils/k3cloud/base/curl.go View File

@ -85,21 +85,24 @@ func (self *Browser) Post(requestUrl string, params map[string]string) []byte {
}
//发送PostJson请求
func (self *Browser) PostJson(requestUrl string, params map[string]interface{}) []byte {
func (self *Browser) PostJson(requestUrl string, params map[string]interface{}) ([]byte, error) {
postData := self.jsonParams(params)
fmt.Println(postData)
request, _ := http.NewRequest("POST", requestUrl, strings.NewReader(postData))
request.Header.Set("Content-Type", "application/json")
self.setRequestCookie(request)
response, err := self.client.Do(request)
fmt.Println(err)
if err != nil {
return []byte{}, err
}
defer response.Body.Close()
//保存响应的 cookie
respCks := response.Cookies()
self.cookies = append(self.cookies, respCks...)
data, _ := ioutil.ReadAll(response.Body)
return data
return data, nil
}
//为请求设置 cookie
@ -120,6 +123,7 @@ func (self *Browser) encodeParams(params map[string]string) string {
//参数 json
func (self *Browser) jsonParams(params map[string]interface{}) string {
j, _ := json.Marshal(params)
return string(j)
}

+ 49
- 0
utils/k3cloud/service/cust.go View File

@ -0,0 +1,49 @@
package service
import (
"leit.com/LAPP_CHEERSSON_BACKEND/utils"
utils2 "leit.com/LAPP_CHEERSSON_BACKEND/utils"
request2 "leit.com/LAPP_CHEERSSON_BACKEND/utils/k3cloud/struct/request"
)
type CustService struct {
*utils.K3config
FormID string
}
func CustInit() *CustService {
cust := &CustService{
K3config: utils2.K3Obj,
FormID: "CRM_CUST",
}
return cust
}
func (_this *CustService) Search(FieldKeys, FilterString, OrderString string) [][]string {
var data [][]string
request := request2.SearchRequest{
Formid: _this.FormID,
FieldKeys: FieldKeys,
FilterString: FilterString,
OrderString: OrderString,
TopRowCount: 0,
StartRow: 0,
Limit: 1000,
}
for true {
response, err := _this.SearchApi(_this.FormID, request)
if err != nil {
return data
}
for _, v := range response {
data = append(data, v)
}
if len(response) == request.Limit {
request.StartRow = request.StartRow + request.Limit
} else {
break
}
}
return data
}

+ 1
- 1
utils/k3cloud/service/voucher.go View File

@ -25,7 +25,7 @@ func (_this *VoucherService) GetVoucher(root _struct.Root) *VoucherService {
//root.Model
formParams := util.CreateBusinessPostData("GL_VOUCHER", util.Struct2Map(root))
res := _this.GetSession().PostJson(_this.CloudUrl+util.SAVE_API, formParams)
res, _ := _this.GetSession().PostJson(_this.CloudUrl+util.SAVE_API, formParams)
_this.K3Response = response.K3ResponseToStruct(res)
if _this.K3Response.Result.ResponseStatus.IsSuccess == false {
panic(_this.K3Response.Result.ResponseStatus.Errors)


+ 11
- 0
utils/k3cloud/struct/request/search.go View File

@ -0,0 +1,11 @@
package request
type SearchRequest struct {
Formid string `json:"formid"`
FieldKeys string `json:"FieldKeys"`
FilterString string `json:"FilterString"`
OrderString string `json:"OrderString"`
TopRowCount int `json:"TopRowCount"`
StartRow int `json:"StartRow"`
Limit int `json:"Limit"`
}

+ 6
- 0
utils/k3cloud/struct/response/responseToStruct.go View File

@ -60,3 +60,9 @@ func K3ResponseToStruct(data []byte) K3ResponseStruct {
_ = json.Unmarshal(data, &response)
return response
}
func K3ResponseToMap(data []byte) [][]string {
var response [][]string
_ = json.Unmarshal(data, &response)
return response
}

+ 3779
- 0
utils/k3cloud/table/cust.json
File diff suppressed because it is too large
View File


Loading…
Cancel
Save