Browse Source

Merge branch 'feature_sap_contracts' of baishaojie/kpt_xdmy into master

合同内容上传SAP
xuyiping 1 year ago
parent
commit
7350f6cc61

+ 49 - 0
.gitignore

@@ -0,0 +1,49 @@
+# ---> Go
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+.idea/
+bin/
+.vscode/
+logger/

+ 0 - 8
.idea/.gitignore

@@ -1,8 +0,0 @@
-# 默认忽略的文件
-/shelf/
-/workspace.xml
-# 基于编辑器的 HTTP 客户端请求
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml

+ 0 - 4
.idea/encodings.xml

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="Encoding" addBOMForNewFiles="with NO BOM" />
-</project>

+ 0 - 8
.idea/modules.xml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/xdmy.iml" filepath="$PROJECT_DIR$/.idea/xdmy.iml" />
-    </modules>
-  </component>
-</project>

+ 0 - 7
.idea/vcs.xml

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-    <mapping directory="$PROJECT_DIR$/cmd" vcs="Git" />
-  </component>
-</project>

+ 0 - 9
.idea/xdmy.iml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="WEB_MODULE" version="4">
-  <component name="Go" enabled="true" />
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$" />
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>

+ 0 - 19
.vscode/launch.json

@@ -1,19 +0,0 @@
-{
-    // Use IntelliSense to learn about possible attributes.
-    // Hover to view descriptions of existing attributes.
-    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
-    "version": "0.2.0",
-    "configurations": [
-    
-    
-
-        {
-            "name": "Launch Package",
-            "type": "go",
-            "request": "launch",
-            "mode": "auto",
-            "program": "${fileDirname}",
-            // "args":["--conf","/Users/desire/kptdev/xdmy_mod/cmd/"]
-        }
-    ]
-}

+ 10 - 0
apiserver/model/contract.go

@@ -35,7 +35,13 @@ type BigContract struct {
 	StopTimeTem     time.Time `gorm:"column:stopTimeTem"`
 	WorkflowID      int       `gorm:"column:workflowId"`
 	WorkflowNote    string    `gorm:"column:workflowNote"`
+	IsToSap         int32     `gorm:"IsToSap"`
 }
+
+func (b *BigContract) TableName() string {
+	return "bigcontract"
+}
+
 type Contract struct {
 	ID            int     `gorm:"column:id"`
 	BigID         int     `gorm:"column:bigId"`
@@ -56,3 +62,7 @@ type Contract struct {
 	Specification string  `gorm:"column:specification"`
 	Unit          string  `gorm:"column:unit"`
 }
+
+func (c *Contract) TableName() string {
+	return "contract"
+}

+ 5 - 0
apiserver/model/http/order.go

@@ -110,3 +110,8 @@ type ManaulReq struct {
 	Id        float64 `json:"id"`
 	Pastureid string  `json:"pastureid"`
 }
+
+type SapContractReq struct {
+	*Dest `json:"DEST"`
+	DATA  *ContractDataToASP `json:"DATA"`
+}

+ 16 - 0
apiserver/model/http/sap.go

@@ -56,3 +56,19 @@ type SrmResp struct {
 	Code    string `json:"code"`
 	Message string `json:"message"`
 }
+
+type ContractDataToASP struct {
+	MATNR string `json:"MATNR "` // 物理编码
+	LIFNR string `json:"LIFNR"`  // 供应商编码
+	EKORG string `json:"EKORG"`  // 采购组织
+	WERKS string `json:"WERKS"`  // 工厂
+	NETPR string `json:"NETPR"`  // 净价
+	WAERS string `json:"WAERS"`  // 货币
+	BPRME string `json:"BPRME"`  // 订单价格单位
+	PEINH string `json:"PEINH"`  // 订单价格
+	MWSKZ string `json:"MWSKZ"`  // 税代码
+	EKGRP string `json:"EKGRP"`  // 采购组
+	DATAB string `json:"DATAB"`  // 生效起始时间
+	DATBI string `json:"DATBI"`  // 生效结束时间
+	LOEKZ string `json:"LOEKZ"`  // 删除标识
+}

+ 11 - 0
apiserver/model/pasture.go

@@ -32,3 +32,14 @@ type Pasture struct {
 	// PurchasingGroup      string `gorm:"column:purchasing_group"` //采购组
 	// CompanyName   string `gorm:"column:companyName"`
 }
+
+type PastureBigcontract struct {
+	ID            int `gorm:"column:id" json:"id"`
+	PastureId     int `gorm:"column:pasture_id" json:"pasture_id"`
+	BigcontractId int `gorm:"column:bigcontract_id" json:"bigcontract_id"`
+	Enable        int `gorm:"column:enable" json:"enable"`
+}
+
+func (p *PastureBigcontract) TableName() string {
+	return "pasture_bigcontract"
+}

+ 3 - 1
apiserver/routers/api/db.go

@@ -5,7 +5,6 @@ import (
 	"encoding/json"
 	"fmt"
 	"io/ioutil"
-	"kpt.xdmy/apiserver/service"
 	"log"
 	"math"
 	"net/http"
@@ -16,6 +15,8 @@ import (
 	"strings"
 	"time"
 
+	"kpt.xdmy/apiserver/service"
+
 	"github.com/360EntSecGroup-Skylar/excelize"
 	"github.com/jmoiron/sqlx"
 	"github.com/pkg/errors"
@@ -135,6 +136,7 @@ func TestData(c *gin.Context) {
 	appG.Response(http.StatusOK, e.SUCCESS, "你录入的名字是:"+sqlstr+";token:"+token)
 }
 
+// GetDataByName
 // @Summary   根据APISQL表中SQL执行得到数据集
 // @Tags GetDataByName
 // @Accept json

+ 9 - 7
apiserver/routers/restful/sql_utils.go

@@ -435,7 +435,7 @@ func QueryByMap(sqlstr string, offset, count int, params []interface{}) (interfa
 	return data, nil
 }
 
-// func QueryByMapT(sqlstr string, offset, count int, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
+// QueryByMapT (sqlstr string, offset, count int, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
 func QueryByMapT(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
 	if err := sqlCheckParam(sqlstr); err != nil {
 		return 0, err
@@ -1196,7 +1196,8 @@ func MapStrList(sql string, param ...interface{}) ([]map[string]string, error) {
 	return ress, nil
 }
 
-// func MapInterList(sql string, param ...interface{}) ([]map[string]interface{}, error) {
+// MapInterList
+//func MapInterList(sql string, param ...interface{}) ([]map[string]interface{}, error) {
 // 	ress := make([]map[string]interface{}, 0, 0)
 // 	rows, err := Dbs.Queryx(sql, param...)
 // 	if err != nil {
@@ -1232,9 +1233,15 @@ func MapStrList(sql string, param ...interface{}) ([]map[string]string, error) {
 // 	}()
 // 	return ress, nil
 // }
+
 func MapInterList(sql string, param ...interface{}) ([]map[string]interface{}, error) {
 	ress := make([]map[string]interface{}, 0, 0)
 	rows, err := Dbs.Queryx(sql, param...)
+	defer func() {
+		if err = rows.Close(); err != nil {
+			log.Default().Printf("sqlx row  close:%v", err)
+		}
+	}()
 	if err != nil {
 		log.Default().Printf("MapInterList Queryx: %v", err)
 		return ress, err
@@ -1263,11 +1270,6 @@ func MapInterList(sql string, param ...interface{}) ([]map[string]interface{}, e
 		}
 		ress = append(ress, m)
 	}
-	defer func() {
-		if err := rows.Close(); err != nil {
-			log.Default().Printf("sqlx row  close:%v", err)
-		}
-	}()
 	return ress, nil
 }
 

+ 162 - 0
apiserver/service/contract.go

@@ -0,0 +1,162 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"strings"
+	"sync"
+
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+)
+
+const (
+	ContractToAspUrl    = "http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo"
+	ContractToAspDestID = "EQMAN"
+	ContractToAspBussTp = "MM007"
+	ContractLimit       = 10
+)
+
+var (
+	ContractCodeMap = make(map[string][]*model.PastureBigcontract, 0)
+	sapContractReq  = &http.SapContractReq{
+		Dest: &http.Dest{
+			DestID: ContractToAspDestID,
+			BussTp: ContractToAspBussTp,
+			Url:    ContractToAspUrl,
+		},
+		DATA: &http.ContractDataToASP{},
+	}
+)
+
+type ContractInfo struct {
+	PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
+	Contract           *model.Contract           // 合同子表
+	Provider           *model.Provider           // 供应商
+	Pasture            *model.Pasture            // 牧场
+}
+
+func GetBigContractData() []*model.BigContract {
+	bigContractData := make([]*model.BigContract, ContractLimit)
+	if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil {
+		log.Errorf("AutoContractToASP Error:%v", err)
+	}
+	return bigContractData
+}
+
+func GetPastureBigContract(contractCode string) ([]*model.PastureBigcontract, error) {
+	pastureBigContract := make([]*model.PastureBigcontract, 0)
+	SQL := fmt.Sprintf("SELECT * FROM pasture_bigcontract WHERE bigcontract_id IN (SELECT id FROM bigcontract WHERE contractCode LIKE '%s%' AND enable = 1", contractCode)
+	if err := s.d.DB.Raw(SQL).Find(&pastureBigContract).Error; err != nil {
+		return nil, err
+	}
+
+	return pastureBigContract, nil
+}
+
+// GetContractInfo 获取合同相关信息
+func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.PastureBigcontract) *ContractInfo {
+	wg := sync.WaitGroup{}
+	wg.Add(3)
+	contractInfo := &ContractInfo{}
+	// 获取牧场数据合同数据
+	go func() {
+		pasture := &model.Pasture{
+			ID: pastureBigContract.PastureId,
+		}
+		if err := s.d.DB.First(pasture).Error; err != nil {
+			log.Errorf("AutoContractToASP Pasture Err:%v,bigContractData:%v", err, bigContract)
+		}
+		contractInfo.Pasture = pasture
+		wg.Done()
+	}()
+
+	// 获取合同子表数据
+	go func() {
+		contract := &model.Contract{}
+		if err := s.d.DB.Where("bigId = ?", bigContract.ID).First(contract).Error; err != nil {
+			log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
+		}
+		if contract.ID > 0 {
+			contractInfo.Contract = contract
+		}
+		wg.Done()
+	}()
+
+	// 获取供应商数据
+	go func() {
+		provider := &model.Provider{
+			ID: bigContract.ProviderID,
+		}
+		if err := s.d.DB.First(provider).Error; err != nil {
+			log.Errorf("AutoContractToASP Provider Err:%v,bigContractData:%v", err, bigContract)
+		}
+		contractInfo.Provider = provider
+		wg.Done()
+	}()
+	wg.Wait()
+	return contractInfo
+}
+
+// AutoContractToASP 合同信息自动同步到ASP
+func AutoContractToASP() {
+
+	bigContractData := GetBigContractData()
+	for _, bigContract := range bigContractData {
+		contractCode := bigContract.ContractCode
+		if strings.Contains(bigContract.ContractCode, "-") {
+			contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
+			contractCode = contractCodeSlice[0]
+		}
+
+		if _, ok := ContractCodeMap[contractCode]; ok {
+			continue
+		}
+
+		pastureBigContractSlice, err := GetPastureBigContract(contractCode)
+		if err != nil {
+			log.Errorf("AutoContractToASP pastureBigContractSlice Err:%v", err)
+			continue
+		}
+
+		for _, pastureBigContract := range pastureBigContractSlice {
+			// 获取合同相关数据集合
+			contractInfo := GetContractInfo(bigContract, pastureBigContract)
+			ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
+			contractDataToASP := &http.ContractDataToASP{
+				MATNR: contractInfo.Contract.PartCode,
+				LIFNR: contractInfo.Provider.SapCode,
+				EKORG: contractInfo.Pasture.ParchaseOrganization,
+				WERKS: contractInfo.Pasture.FactoryCode,
+				NETPR: "",
+				WAERS: "CNY",
+				BPRME: "",
+				PEINH: "",
+				MWSKZ: "J0",
+				EKGRP: contractInfo.Pasture.PurchasingGroup,
+				DATAB: bigContract.StartTime,
+				DATBI: bigContract.StopTime,
+				LOEKZ: "",
+			}
+			sapContractReq.DATA = contractDataToASP
+			bodyByte, _ := json.Marshal(sapContractReq.DATA)
+			rp := &http.OrderResp{}
+			if err = s.SyncSap(sapContractReq, rp, bodyByte); err != nil {
+				log.Errorf("AutoContractToASP SyncSap Err:%v", err)
+				continue
+			}
+
+			if rp.Data.Status != "S" {
+				log.Errorf("AutoContractToASP SyncSap Data:%v", rp.Data)
+				continue
+			}
+		}
+
+		if err = s.d.DB.Model(bigContract).Where(fmt.Sprintf("like %s", contractCode)).Update("isToSap", 1).Error; err != nil {
+			log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
+		}
+
+	}
+	log.Info("AutoContractToASP Success")
+}

+ 10 - 1
apiserver/service/job.go

@@ -2,9 +2,10 @@ package service
 
 import (
 	"fmt"
+	"time"
+
 	"github.com/robfig/cron"
 	"kpt.xdmy/apiserver/model"
-	"time"
 )
 
 var s *Service
@@ -74,6 +75,14 @@ func SapJobInit() {
 	c1.AddFunc(spec2, func() {
 		s.d.DB.Exec(`call wxmsg()`)
 	})
+
+	// 合同信息同步SAP 5分钟同步一次,一次同步limit条数据
+	timeLocalSub, _ := time.ParseInLocation("15:04:05", "00:05:00", time.Local)
+	timeLocal, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
+	c1.AddFunc(fmt.Sprintf("@every %v", timeLocalSub.Sub(timeLocal)), func() {
+		AutoContractToASP()
+	})
+
 	c1.Start()
 }
 

+ 6 - 8
apiserver/service/order.go

@@ -3,17 +3,15 @@ package service
 import (
 	"encoding/json"
 	"fmt"
-	"github.com/jmoiron/sqlx"
-	"kpt.xdmy/apiserver/config"
 	"strconv"
 	"strings"
 	"time"
 
-	"github.com/pkg/errors"
-
 	_ "github.com/go-sql-driver/mysql"
-
+	"github.com/jmoiron/sqlx"
+	"github.com/pkg/errors"
 	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/config"
 	"kpt.xdmy/apiserver/model"
 	"kpt.xdmy/apiserver/model/http"
 	"kpt.xdmy/pkg/util"
@@ -60,7 +58,7 @@ func (s *Service) PurchaseOrder(p interface{}) {
 	}
 }
 
-// 定时(每分钟 一次)读取未同步的采购订单,同步到sap
+// AutoSapOrderJob 定时(每分钟 一次)读取未同步的采购订单,同步到sap
 // 同步失败的采购订单,变更状态,改为手动同步
 // 状态(sapStatus):0,未同步;1,成功;2,失败
 func AutoSapOrderJob() {
@@ -489,7 +487,7 @@ func SrmOrder(p *model.BigBuyDetail, IsReturn string) {
 	}
 }
 
-// 定时(每分钟 一次)读取未同步的采购订单,同步到sap
+// AutoSapReturnOrderJob 定时(每分钟 一次)读取未同步的采购订单,同步到sap
 // 同步失败的采购订单,变更状态,改为手动同步
 // 状态(sapStatus):0,未同步;1,成功;2,失败
 func AutoSapReturnOrderJob() {
@@ -530,7 +528,7 @@ WHERE
 	}
 }
 
-// 发送采购订单到sap
+// SapReturnOrder 发送采购订单到sap
 func SapReturnOrder(p *model.BigRefunddetail, dflag string) (error, string) {
 	r := new(http.SapOrderReq)
 	rp := new(http.OrderResp)

+ 11 - 11
cmd/conf/app.ini

@@ -71,8 +71,8 @@ EasUrl = http://60.174.151.11:6888
 
 
 [database]
-DsnDsn = eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local
-; ####DsnDsn = root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230328?charset=utf8&parseTime=True&loc=Local
+; DsnDsn = eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local
+DsnDsn = root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230328?charset=utf8&parseTime=True&loc=Local
 ; ####DsnDsn = eq:Xdmy@1234@tcp(192.168.63.42:3306)/eq?charset=utf8&parseTime=True&loc=Local
 ; ####DsnDsn = root:root@tcp(127.0.0.1:3309)/test?charset=utf8&parseTime=True&loc=Local
 ; ####DsnDsn = root:root@tcp(192.168.1.93:3326)/eqdev?charset=utf8&parseTime=True&loc=Local
@@ -80,17 +80,17 @@ DsnDsn = eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc
 
 Type = mysql
 #####本地
-#User = root
-#Password = kepaiteng!QAZ
-#Host = 222.73.129.15:31306
-#Name = eq230328
+User = root
+Password = kepaiteng!QAZ
+Host = 222.73.129.15:31306
+Name = eq230328
 
 #####线上
-User = eq
-Password = Xdmy@1234
-Host = 192.168.61.42:3306
-Name = eq
-TablePrefix =
+#User = eq
+#Password = Xdmy@1234
+#Host = 192.168.61.42:3306
+#Name = eq
+#TablePrefix =
 
 #####现代牧业测试线
 #User = eq

+ 2 - 2
cmd/conf/conf.toml

@@ -1,7 +1,7 @@
 [db]
 #dsn = "root:root@tcp(127.0.0.1:3309)/test?charset=utf8&parseTime=True&loc=Local"
-#dsn = "root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230328?charset=utf8&parseTime=True&loc=Local"
-dsn = "eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local"
+dsn = "root:kepaiteng!QAZ@tcp(222.73.129.15:31306)/eq230328?charset=utf8&parseTime=True&loc=Local"
+#dsn = "eq:Xdmy@1234@tcp(192.168.61.42:3306)/eq?charset=utf8&parseTime=True&loc=Local"
 #dsn = "eq:Xdmy@1234@tcp(192.168.63.42:3306)/eq?charset=utf8&parseTime=True&loc=Local"
 #dsn = "root:root@tcp(192.168.1.93:3326)/eqdev?charset=utf8&parseTime=True&loc=Local"
 

+ 1 - 0
cmd/main.go

@@ -7,6 +7,7 @@ import (
 	"net/http"
 	"os"
 	"strings"
+
 	// logrus "github.com/sirupsen/logrus"
 
 	"github.com/kardianos/service"

+ 8 - 5
go.mod

@@ -46,22 +46,25 @@ require (
 )
 
 require (
-	github.com/faabiosr/cachego v0.17.0 // indirect
+	github.com/faabiosr/cachego v0.17.0
 	github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect
 	github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
 	github.com/facebookgo/structtag v0.0.0-20150214074306-217e25fb9691 // indirect
 	github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect
-	github.com/fastwego/dingding v1.0.0-beta.4 // indirect
+	github.com/fastwego/dingding v1.0.0-beta.4
 	github.com/go-openapi/spec v0.20.6 // indirect
 	github.com/go-openapi/swag v0.21.1 // indirect
 	github.com/go-playground/validator/v10 v10.11.0 // indirect
+	github.com/google/go-cmp v0.5.9 // indirect
+	github.com/kr/pretty v0.3.1 // indirect
 	github.com/lib/pq v1.10.2 // indirect
-	github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea // indirect
+	github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea
 	github.com/mailru/easyjson v0.7.7 // indirect
-	github.com/makiuchi-d/gozxing v0.1.1 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.2 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/swaggo/gin-swagger v1.5.3
 	golang.org/x/crypto v0.1.0 // indirect
-	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
+	golang.org/x/net v0.7.0 // indirect
+	golang.org/x/sys v0.7.0 // indirect
+	google.golang.org/protobuf v1.30.0 // indirect
 )

+ 16 - 12
go.sum

@@ -139,8 +139,9 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
@@ -179,8 +180,9 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
 github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -199,8 +201,6 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/makiuchi-d/gozxing v0.1.1 h1:xxqijhoedi+/lZlhINteGbywIrewVdVv2wl9r5O9S1I=
-github.com/makiuchi-d/gozxing v0.1.1/go.mod h1:eRIHbOjX7QWxLIDJoQuMLhuXg9LAuw6znsUtRkNw9DU=
 github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
 github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
 github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
@@ -273,8 +273,9 @@ github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfm
 github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E=
 github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
@@ -381,8 +382,9 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
 golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
+golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -420,20 +422,24 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@@ -445,10 +451,7 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
-golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -456,8 +459,9 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE
 google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

+ 3 - 0
migration/v0001_alter_contract.sql

@@ -0,0 +1,3 @@
+ALTER TABLE `bigcontract`
+    ADD COLUMN `isToSap` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否同步至asp 0 未同步 1 已同步' AFTER `taxcode`,
+    ADD INDEX idx_is_to_sap (`isToSap`);

+ 2 - 2
pkg/setting/setting.go

@@ -135,8 +135,8 @@ func Setup(dir string) {
 	}
 	cfg, err = ini.Load(CurrentPath + "conf/app.ini")
 	if err != nil {
-		log.Fatalf("setting.Setup, fail to parse 'conf/app.ini': %s", CurrentPath)
-		log.Fatalf("setting.Setup, fail to parse 'conf/app.ini': %v", err)
+		log.Fatalf("setting.Setup, fail to parse 'conf/app.ini' CurrentPath: %s,Err: %v", CurrentPath, err)
+		panic(err)
 	}
 	DatabaseSetting.ShowXormlog = false
 	DatabaseSetting.ShowGetSqllog = false