package task
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/go-xorm/xorm"
|
|
dal "leit.com/LAPP_CHEERSSON_BACKEND/dao/base"
|
|
"leit.com/LAPP_CHEERSSON_BACKEND/db"
|
|
"leit.com/LAPP_CHEERSSON_BACKEND/grmi"
|
|
meta "leit.com/LAPP_CHEERSSON_BACKEND/meta/base"
|
|
model "leit.com/LAPP_CHEERSSON_BACKEND/models/base"
|
|
svrAp "leit.com/LAPP_CHEERSSON_BACKEND/services/ap"
|
|
"leit.com/LAPP_CHEERSSON_BACKEND/services/ap/implments"
|
|
svr "leit.com/LAPP_CHEERSSON_BACKEND/services/base"
|
|
"leit.com/LAPP_CHEERSSON_BACKEND/services/erp"
|
|
svrMe "leit.com/LAPP_CHEERSSON_BACKEND/services/me"
|
|
"leit.com/LAPP_CHEERSSON_BACKEND/utils"
|
|
utilService "leit.com/LAPP_CHEERSSON_BACKEND/utils/k3cloud/service"
|
|
"math"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
type TypeTime struct {
|
|
OneTime time.Time
|
|
}
|
|
|
|
var lastTime = TypeTime{}
|
|
var serviceOfArticle = svr.NewArticleService()
|
|
var serviceOfBomList = svrMe.NewBomLstService()
|
|
var serviceOfCustomer = svr.NewCustomerService()
|
|
var serviceOfSaleOrder = svr.NewSalesOrderService()
|
|
var serviceOfStdef = svr.NewStdefService()
|
|
var serviceOfCustArtlst = svrAp.NewCustArtlstService()
|
|
var serviceOfProject = svrMe.NewProjectService()
|
|
var serviceOfUom = svr.NewUomService()
|
|
var balanceService = svrAp.NewBalanceService()
|
|
|
|
func TaskInit() {
|
|
time.AfterFunc(10*time.Second, func() {
|
|
balanceService.RefreshData()
|
|
})
|
|
//go func() {
|
|
// timer := time.NewTicker(30 * time.Second)
|
|
// for {
|
|
// select {
|
|
// case <-timer.C:
|
|
// erp.PublishPlan(100, "admin")
|
|
// }
|
|
// }
|
|
//}()
|
|
i := true
|
|
for true {
|
|
oneTask(time.Time{})
|
|
if i {
|
|
//erp.PublishPlan(100, "admin")
|
|
i = false
|
|
}
|
|
time.Sleep(time.Minute * 5)
|
|
}
|
|
}
|
|
|
|
//1天任务
|
|
func oneTask(_date time.Time) {
|
|
//需要定时登录erp
|
|
utils.K3configInit()
|
|
|
|
//if DaysBetweenDates(lastTime.OneTime, _date) >= 1 {
|
|
|
|
//go func() {
|
|
//ImportMaterial()
|
|
//ImportMaterialGroupSearch()
|
|
//val := make(map[string]string)
|
|
//val["ResourceId"] = "0105"
|
|
//ImportArticle(val)
|
|
//ImportBomList()
|
|
//ImportCustomer()
|
|
//ImportSaleOrder()
|
|
//ImportCustomerMaterialSearch()
|
|
//ImportProjectSearch()
|
|
//}()
|
|
//ImportUnit()
|
|
lastTime.OneTime = _date
|
|
//}
|
|
}
|
|
|
|
//物料
|
|
func ImportArticle(taskVal map[string]string, ids string) {
|
|
fiterString := ""
|
|
if ids != "" {
|
|
fiterString = "FMaterialGroup IN(" + ids + ")"
|
|
}
|
|
response := utilService.BdMAterialServiceInit().MaterialSearch(fiterString, "")
|
|
//将数据发送到servvice
|
|
serviceOfArticle.ImportArticle(response, taskVal)
|
|
}
|
|
|
|
//导入bom
|
|
func ImportBomList() {
|
|
response := utilService.EngBomServiceInit().EngBomSearch("", "")
|
|
serviceOfBomList.ImportBomList(response)
|
|
}
|
|
|
|
//导入客户
|
|
func ImportCustomer() {
|
|
response := utilService.CustomerInit().CustomerSearch("", "")
|
|
serviceOfCustomer.ImportCustomer(response)
|
|
}
|
|
|
|
func ImportQichu(){
|
|
impl := implments.NewBalanceServiceImplement()
|
|
alldata_Article := impl.GetGlobalArticleData()
|
|
erp.GetQiChuQty(model.PlantNr,"system", &alldata_Article)
|
|
}
|
|
|
|
func ImportZhaizhi(){
|
|
impl := implments.NewBalanceServiceImplement()
|
|
alldata_Article := impl.GetGlobalArticleData()
|
|
erp.GetZhaizhiQty(model.PlantNr,"system", &alldata_Article)
|
|
erp.GetZhaizhiWeekQty(model.PlantNr,"system", &alldata_Article)
|
|
}
|
|
|
|
func ImportChaigou(){
|
|
impl := implments.NewBalanceServiceImplement()
|
|
alldata_Article := impl.GetGlobalArticleData()
|
|
erp.GetChaigouQty(model.PlantNr,"system", &alldata_Article)
|
|
}
|
|
|
|
//销售订单
|
|
func ImportSaleOrder() {
|
|
//response := utilService.SaleOrderInit().SaleOrderSearch("", "")
|
|
//serviceOfSaleOrder.ImportSalesOrder(response)
|
|
impl := implments.NewBalanceServiceImplement()
|
|
alldata_Article := impl.GetGlobalArticleData()
|
|
erp.GetOrderQty(model.PlantNr,"system", &alldata_Article)
|
|
}
|
|
|
|
func ImportDuli(){
|
|
// 独立需求
|
|
impl := implments.NewBalanceServiceImplement()
|
|
alldata_Article := impl.GetGlobalArticleData()
|
|
erp.GetDuliQty(model.PlantNr, "system", &alldata_Article)
|
|
}
|
|
//物料分组
|
|
func ImportMaterialGroupSearch() string {
|
|
response := utilService.MaterialGroupInit().MaterialGroupSearch("", "")
|
|
//将数据放入到map中
|
|
utils.ClearMaterialgroupMap()
|
|
levelMap := make(map[int]int)
|
|
ids := ""
|
|
for _, v := range response {
|
|
//判断层级是第几级
|
|
pid := utils.ValueToInt(v[1], 0)
|
|
id := utils.ValueToInt(v[0], 0)
|
|
fNumber := utils.ValueToString(v[2], "")
|
|
if pid == 0 {
|
|
levelMap[id] = 1
|
|
utils.AppendMaterialgroupMap(id, utils.GetMaterialgroupMap(pid))
|
|
continue
|
|
} else {
|
|
levelMap[id] = levelMap[pid] + 1
|
|
}
|
|
if levelMap[id] == 2 {
|
|
//该层级确认
|
|
if len(fNumber) == 0 {
|
|
utils.AppendMaterialgroupMap(id, "")
|
|
continue
|
|
}
|
|
switch fNumber[len(fNumber)-1 : len(fNumber)] {
|
|
case "F":
|
|
utils.AppendMaterialgroupMap(id, "FINISHED")
|
|
if ids != "" {
|
|
ids += ","
|
|
}
|
|
ids += utils.ValueToString(id, "")
|
|
break
|
|
case "R":
|
|
utils.AppendMaterialgroupMap(id, "MATERIALS")
|
|
if ids != "" {
|
|
ids += ","
|
|
}
|
|
ids += utils.ValueToString(id, "")
|
|
break
|
|
case "S":
|
|
utils.AppendMaterialgroupMap(id, "SEMI_FINISHED")
|
|
if ids != "" {
|
|
ids += ","
|
|
}
|
|
ids += utils.ValueToString(id, "")
|
|
break
|
|
default:
|
|
utils.AppendMaterialgroupMap(id, "")
|
|
break
|
|
}
|
|
} else {
|
|
utils.AppendMaterialgroupMap(id, utils.GetMaterialgroupMap(pid))
|
|
if utils.GetMaterialgroupMap(pid) != "" {
|
|
if ids != "" {
|
|
ids += ","
|
|
}
|
|
ids += utils.ValueToString(id, "")
|
|
}
|
|
}
|
|
}
|
|
return ids
|
|
}
|
|
|
|
//客户物料对应表
|
|
func ImportCustomerMaterialSearch() {
|
|
svrCust := utilService.CustomerMaterialInit()
|
|
response := svrCust.CustomerMaterialSearch("", "")
|
|
serviceOfCustArtlst.ImportCustArtlst(svrCust.FieldKeys, response)
|
|
}
|
|
|
|
//项目
|
|
func ImportProjectSearch() {
|
|
svrProject := utilService.ProjectInit()
|
|
response := svrProject.ProjectSearch("", "")
|
|
serviceOfProject.ImportProject(svrProject.FieldKeys, response)
|
|
}
|
|
|
|
//辅助参数
|
|
func ImportMaterial() {
|
|
//加载map
|
|
response := utilService.BosAssistantdataSelectServiceInit().AssistantdatalSearch("", "")
|
|
utils.ClearMaterialMap()
|
|
for _, v := range response {
|
|
utils.AppendMaterialMap(utils.ValueToString(v[2], ""), utils.ValueToString(v[1], ""))
|
|
}
|
|
return
|
|
}
|
|
|
|
//单位
|
|
func ImportUnit() {
|
|
response := utilService.DdUnitServiceInit().DdUnitSearch("", "")
|
|
serviceOfUom.ImportUom(response)
|
|
}
|
|
|
|
//查询组织
|
|
func ImportOrg() []OrgType {
|
|
response := utilService.OrganizationsServiceInit().OrganizationsSearch("", "")
|
|
var data []OrgType
|
|
for _, v := range response {
|
|
data = append(data, OrgType{
|
|
FNumber: utils.ValueToString(v[0], ""),
|
|
FName: utils.ValueToString(v[1], ""),
|
|
FOrgID: utils.ValueToString(v[2], ""),
|
|
})
|
|
}
|
|
return data
|
|
}
|
|
|
|
//查询员工
|
|
func ImportEmpinfo() []Empinfo {
|
|
response := utilService.EmpinfoServiceInit().EmpinfoSearch("", "")
|
|
var data []Empinfo
|
|
for _, v := range response {
|
|
data = append(data, Empinfo{
|
|
FNumber: utils.ValueToString(v[0], ""),
|
|
FName: utils.ValueToString(v[1], ""),
|
|
FID: utils.ValueToString(utils.ValueToInt(v[2], 0), ""),
|
|
})
|
|
}
|
|
return data
|
|
}
|
|
|
|
//导入库存
|
|
func ImportBalance() {
|
|
engine := db.Eloquent.Master()
|
|
session := engine.NewSession()
|
|
defer session.Close()
|
|
dao := dal.NewArticleStockDAO(session,model.PlantNr, "system")
|
|
dao.DeleteWhere([]grmi.Predicate{meta.ArticleStock_PlantNr.NewPredicate(grmi.Equal, model.PlantNr)})
|
|
|
|
impl_Balance := implments.NewBalanceServiceImplement()
|
|
alldata_Article := impl_Balance.GetGlobalArticleDataNew()
|
|
erp.GetQiChuQty(model.PlantNr, "system", &alldata_Article)
|
|
erp.GetZhaizhiQty(model.PlantNr, "system", &alldata_Article)
|
|
//erp.GetChaigouiQty(model.PlantNr, "system", &alldata_Article)
|
|
}
|
|
|
|
type Empinfo struct {
|
|
FNumber string `json:"FNumber"`
|
|
FName string `json:"FName"`
|
|
FID string `json:"FID"`
|
|
}
|
|
type OrgType struct {
|
|
FNumber string `json:"FNumber"`
|
|
FName string `json:"FName"`
|
|
FOrgID string `json:"FOrgID"`
|
|
}
|
|
|
|
//DaysBetweenDates 返回前后两个日期共包含多少天
|
|
func DaysBetweenDates(startDate, endDate time.Time) int {
|
|
return int(math.Floor(math.Abs(endDate.Sub(startDate).Hours()/24))) + 1
|
|
}
|
|
|
|
type TaskParam struct {
|
|
TaskId int `xorm:"int 'TaskId'"`
|
|
ShellName string `xorm:"nvarchar(255) 'ShellName'"`
|
|
ParamName string `xorm:"nvarchar(255) 'ParamName'"`
|
|
ParamValue string `xorm:"nvarchar(255) 'ParamValue'"`
|
|
ValueType string `xorm:"int 'ValueType'"`
|
|
}
|
|
|
|
func EtlTaskInit() error {
|
|
|
|
var err error
|
|
utils.TimezoneLocation, err = time.LoadLocation("Asia/Shanghai")
|
|
if err != nil {
|
|
return fmt.Errorf("init time zone failed:" + err.Error())
|
|
}
|
|
//获取参数
|
|
if len(os.Args) < 6 {
|
|
return fmt.Errorf("参数长度错误")
|
|
}
|
|
//目标链接
|
|
var targetDsn = os.Args[2]
|
|
var taskDsn = os.Args[3]
|
|
var taskID = os.Args[5]
|
|
//需要查询任务 配置
|
|
//实例化任务数据库
|
|
task, err := xorm.NewEngine("mssql", taskDsn)
|
|
if err != nil {
|
|
return fmt.Errorf("初始化任务数据库引擎错误:" + err.Error())
|
|
}
|
|
var taskList []TaskParam
|
|
//查询任务参数
|
|
err = task.Table("ShellParam").Where("TaskId=?", taskID).Find(&taskList)
|
|
if err != nil {
|
|
return fmt.Errorf("任务参数查询错误:" + err.Error())
|
|
}
|
|
valMap := make(map[string]string)
|
|
for _, v := range taskList {
|
|
valMap[v.ParamName] = v.ParamValue
|
|
}
|
|
//实例化金蝶云
|
|
utils.K3configInit()
|
|
if _info, ok := valMap["FUseOrgId"]; ok {
|
|
utils.K3Obj.FUseOrgId = _info
|
|
} else {
|
|
return fmt.Errorf("缺少参数配置FUseOrgId")
|
|
}
|
|
|
|
if _info, ok := valMap["FUseOrgNo"]; ok {
|
|
utils.K3Obj.FUseOrgNo = _info
|
|
} else {
|
|
return fmt.Errorf("缺少参数配置FUseOrgNo")
|
|
}
|
|
|
|
//实例化目标数据库
|
|
var slaves []*xorm.Engine
|
|
var master *xorm.Engine
|
|
master, err = xorm.NewEngine("mssql", targetDsn)
|
|
if err != nil {
|
|
return fmt.Errorf("链接目标库失败:" + err.Error())
|
|
}
|
|
if err = master.Ping(); err != nil {
|
|
return fmt.Errorf("链接目标库失败:" + err.Error())
|
|
}
|
|
master.SetTZLocation(utils.TimezoneLocation)
|
|
master.SetTZDatabase(utils.TimezoneLocation)
|
|
db.Eloquent, err = xorm.NewEngineGroup(master, slaves)
|
|
if err != nil {
|
|
return fmt.Errorf("目标库使用错误:" + err.Error())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func EtlTaskArticleInit() (error, map[string]string) {
|
|
|
|
var err error
|
|
utils.TimezoneLocation, err = time.LoadLocation("Asia/Shanghai")
|
|
if err != nil {
|
|
return fmt.Errorf("init time zone failed:" + err.Error()), nil
|
|
}
|
|
//获取参数
|
|
if len(os.Args) < 6 {
|
|
return fmt.Errorf("参数长度错误"), nil
|
|
}
|
|
//目标链接
|
|
var targetDsn = os.Args[2]
|
|
var taskDsn = os.Args[3]
|
|
var taskID = os.Args[5]
|
|
//需要查询任务 配置
|
|
//实例化任务数据库
|
|
task, err := xorm.NewEngine("mssql", taskDsn)
|
|
if err != nil {
|
|
return fmt.Errorf("初始化任务数据库引擎错误:" + err.Error()), nil
|
|
}
|
|
var taskList []TaskParam
|
|
//查询任务参数
|
|
err = task.Table("ShellParam").Where("TaskId=?", taskID).Find(&taskList)
|
|
if err != nil {
|
|
return fmt.Errorf("任务参数查询错误:" + err.Error()), nil
|
|
}
|
|
valMap := make(map[string]string)
|
|
for _, v := range taskList {
|
|
valMap[v.ParamName] = v.ParamValue
|
|
}
|
|
//实例化金蝶云
|
|
utils.K3configInit()
|
|
if _info, ok := valMap["FUseOrgId"]; ok {
|
|
utils.K3Obj.FUseOrgId = _info
|
|
} else {
|
|
return fmt.Errorf("缺少参数配置FUseOrgId"), nil
|
|
}
|
|
|
|
if _info, ok := valMap["FUseOrgNo"]; ok {
|
|
utils.K3Obj.FUseOrgNo = _info
|
|
} else {
|
|
return fmt.Errorf("缺少参数配置FUseOrgNo"), nil
|
|
}
|
|
|
|
//实例化目标数据库
|
|
var slaves []*xorm.Engine
|
|
var master *xorm.Engine
|
|
master, err = xorm.NewEngine("mssql", targetDsn)
|
|
if err != nil {
|
|
return fmt.Errorf("链接目标库失败:" + err.Error()), nil
|
|
}
|
|
if err = master.Ping(); err != nil {
|
|
return fmt.Errorf("链接目标库失败:" + err.Error()), nil
|
|
}
|
|
master.SetTZLocation(utils.TimezoneLocation)
|
|
master.SetTZDatabase(utils.TimezoneLocation)
|
|
db.Eloquent, err = xorm.NewEngineGroup(master, slaves)
|
|
if err != nil {
|
|
return fmt.Errorf("目标库使用错误:" + err.Error()), nil
|
|
}
|
|
return nil, valMap
|
|
}
|