baishaojie 2 жил өмнө
parent
commit
a563267415
100 өөрчлөгдсөн 14790 нэмэгдсэн , 0 устгасан
  1. BIN
      .DS_Store
  2. 8 0
      .idea/.gitignore
  3. 4 0
      .idea/encodings.xml
  4. 8 0
      .idea/modules.xml
  5. 7 0
      .idea/vcs.xml
  6. 9 0
      .idea/xdmy.iml
  7. 19 0
      .vscode/launch.json
  8. 21 0
      LICENSE
  9. 173 0
      README2.md
  10. BIN
      apiserver/.DS_Store
  11. 51 0
      apiserver/config/config.go
  12. 84 0
      apiserver/dao/dao.go
  13. 8 0
      apiserver/dao/db.go
  14. 130 0
      apiserver/model/PartRefund.go
  15. 121 0
      apiserver/model/Partquit.go
  16. 15 0
      apiserver/model/assetstt.go
  17. 10 0
      apiserver/model/brand.go
  18. 160 0
      apiserver/model/buydetail.go
  19. 58 0
      apiserver/model/contract.go
  20. 26 0
      apiserver/model/department.go
  21. 12 0
      apiserver/model/distlist.go
  22. 12 0
      apiserver/model/eqclass.go
  23. 70 0
      apiserver/model/equipment.go
  24. 69 0
      apiserver/model/http/asset.go
  25. 52 0
      apiserver/model/http/charge_off.go
  26. 10 0
      apiserver/model/http/http.go
  27. 47 0
      apiserver/model/http/material.go
  28. 112 0
      apiserver/model/http/order.go
  29. 83 0
      apiserver/model/http/proof.go
  30. 58 0
      apiserver/model/http/sap.go
  31. 51 0
      apiserver/model/http/supplier.go
  32. 58 0
      apiserver/model/http/transfer.go
  33. 51 0
      apiserver/model/log.go
  34. 42 0
      apiserver/model/maintain.go
  35. 90 0
      apiserver/model/mcs.go
  36. 54 0
      apiserver/model/models.go
  37. 20 0
      apiserver/model/oversee.go
  38. 35 0
      apiserver/model/part.go
  39. 31 0
      apiserver/model/part_purchase.go
  40. 28 0
      apiserver/model/part_reportery.go
  41. 143 0
      apiserver/model/partlaid.go
  42. 189 0
      apiserver/model/partuse.go
  43. 34 0
      apiserver/model/pasture.go
  44. 39 0
      apiserver/model/proof.go
  45. 33 0
      apiserver/model/provider.go
  46. 1 0
      apiserver/model/refunddetail.go
  47. 74 0
      apiserver/model/transfer.go
  48. 8 0
      apiserver/model/user.go
  49. 16 0
      apiserver/model/warehouse.go
  50. BIN
      apiserver/routers/.DS_Store
  51. 168 0
      apiserver/routers/api/api.go
  52. 3415 0
      apiserver/routers/api/db.go
  53. 553 0
      apiserver/routers/api/upload.go
  54. 118 0
      apiserver/routers/api/user.go
  55. 223 0
      apiserver/routers/api/v1/menu.go
  56. 228 0
      apiserver/routers/api/v1/role.go
  57. 131 0
      apiserver/routers/mcs.go
  58. 15 0
      apiserver/routers/part.go
  59. 159 0
      apiserver/routers/report.go
  60. BIN
      apiserver/routers/restful/.DS_Store
  61. 1369 0
      apiserver/routers/restful/sql_utils.go
  62. 91 0
      apiserver/routers/restful/test.go
  63. 98 0
      apiserver/routers/restful/user.go
  64. 236 0
      apiserver/routers/router.go
  65. 308 0
      apiserver/routers/sap.go
  66. 47 0
      apiserver/routers/server.go
  67. BIN
      apiserver/service/.DS_Store
  68. 104 0
      apiserver/service/apisql_service/apisql_service.go
  69. 244 0
      apiserver/service/asset.go
  70. 448 0
      apiserver/service/charge_off.go
  71. 42 0
      apiserver/service/eas.go
  72. 2 0
      apiserver/service/equipment.go
  73. 87 0
      apiserver/service/job.go
  74. 243 0
      apiserver/service/loadData.go
  75. 625 0
      apiserver/service/material.go
  76. 192 0
      apiserver/service/mcs.go
  77. 912 0
      apiserver/service/order.go
  78. 939 0
      apiserver/service/proof.go
  79. 15 0
      apiserver/service/raise.go
  80. 678 0
      apiserver/service/report.go
  81. 168 0
      apiserver/service/sap.go
  82. 72 0
      apiserver/service/service.go
  83. 118 0
      apiserver/service/supplier.go
  84. 265 0
      apiserver/service/transfer.go
  85. 29 0
      apiserver/service/user_service/user.go
  86. 3 0
      bk/bat/arm.bat
  87. 1 0
      bk/bat/doc.bat
  88. 3 0
      bk/bat/linux64.bat
  89. 3 0
      bk/bat/win32.bat
  90. 4 0
      bk/bat/win64.bat
  91. BIN
      bk/browse/dist0624/.DS_Store
  92. 0 0
      bk/browse/dist0624/datas/myMap.json
  93. BIN
      bk/browse/dist0624/favicon.ico
  94. 0 0
      bk/browse/dist0624/index.html
  95. 0 0
      bk/browse/dist0624/static/css/app.1c97fb9d.css
  96. 0 0
      bk/browse/dist0624/static/css/chunk-elementUI.45ab9bc1.css
  97. 0 0
      bk/browse/dist0624/static/css/chunk-libs.2e418612.css
  98. BIN
      bk/browse/dist0624/static/fonts/element-icons.535877f5.woff
  99. BIN
      bk/browse/dist0624/static/fonts/element-icons.732389de.ttf
  100. BIN
      bk/browse/dist0624/static/img/1.1ddf085a.png

BIN
.DS_Store


+ 8 - 0
.idea/.gitignore

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

+ 4 - 0
.idea/encodings.xml

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

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?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>

+ 7 - 0
.idea/vcs.xml

@@ -0,0 +1,7 @@
+<?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>

+ 9 - 0
.idea/xdmy.iml

@@ -0,0 +1,9 @@
+<?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>

+ 19 - 0
.vscode/launch.json

@@ -0,0 +1,19 @@
+{
+    // 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/"]
+        }
+    ]
+}

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) The go-admin Authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 173 - 0
README2.md

@@ -0,0 +1,173 @@
+# KPTYUN
+
+一个go api 后端例子,包含JWT,RBAC(Casbin),增删改查, 一键生成 Restful API接口(不依赖orm)。
+
+## 主要说明
+* v1.1.2
+
+### 表
+* user     
+    * username  password   
+* role      
+    * name 
+* menu     
+    * name path   method
+
+### 目录结构
+* conf:用于存储配置文件
+* docs: 文档(SQL和API注释)
+* logs: 日志
+* middleware:应用中间件
+* models:应用数据库模型
+* pkg:第三方包
+* routers: 路由逻辑处理
+* service: 逻辑处理
+* test: 单元测试
+
+
+### 权限验证说明
+>  利用的casbin库, 将  user  role  menu 进行自动关联
+
+```
+项目启动时,会自动加载权限. 如有更改,会删除对应的权限,重新加载.
+
+用户关联角色  
+角色关联菜单  
+
+权限关系为:
+角色(role.name,menu.path,menu.method)  
+用户(user.username,role.name)
+
+例如:
+test      /api/v1/users       GET
+zhuhongbin     test
+
+当zhuhongbin  GET  /api/v1/users 地址的时候,会去检查权限,因为他属于test组,同时组有对应权限,所以本次请求会通过。
+
+用户 admin 有所有的权限,不进行权限匹配
+
+登录接口 /auth  不进行验证
+```
+
+### 请求
+
+> 请求和接收 都是 传递 json 格式 数据
+```
+例如:
+访问 /auth    获取token
+{
+	"username": "admin",
+	"password": "123456"
+}
+
+访问  /api/v1/users   
+请求头设置  Authorization: Token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+```
+
+## How to run
+
+### Required
+
+- Mysql
+
+### Ready
+
+Create a **go database** and import [SQL](docs/sql/go.sql)
+
+创建一个库,然后导入sql,创建表!
+
+### Conf
+
+You should modify `conf/app.ini`
+
+```
+[database]
+Type = mysql
+User = root
+Password =
+Host = 127.0.0.1:3306
+Name = go
+TablePrefix = go_
+```
+
+## Installation
+```
+
+yum install go -y 
+
+
+cd $GOPATH/src/github.com/kptyun/go-admin
+go build main.go
+go run  main.go 
+
+## 热编译,开发时使用
+
+go get github.com/silenceper/gowatch
+
+gowatch   
+
+```
+
+### Run
+```
+Project information and existing API
+
+[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
+ - using env:	export GIN_MODE=release
+ - using code:	gin.SetMode(gin.ReleaseMode)
+
+Listening port is 8000
+
+默认 账户 密码 都为  123456
+
+```
+
+* 不用orm依赖,直接输入表名字就可以 增删改查 
+
+``` 
+
+get   http://127.0.0.1:8000/api/restful/go_user
+get   http://127.0.0.1:8000/api/restful/go_user/1
+post   http://127.0.0.1:8000/api/restful/go_user
+数据格式  json  支持批量
+[{
+	"username":"hequan",
+	"password":"hequan1",
+	"created_on": "0",
+	"modified_on":"0",
+	"deleted_on":"0"
+}]
+put  http://127.0.0.1:8000/api/restful/go_user/2
+数据格式  json
+{
+	"password":"654321"
+}
+delete http://127.0.0.1:8000/api/restful/go_user/2
+```
+
+###  API  注释
+
+> http://127.0.0.1:8000/swagger/index.html
+
+
+## Features
+```
+- RESTful API
+- Gorm
+- logging
+- Jwt-go
+- Swagger
+- Gin
+- Graceful restart or stop (fvbock/endless)
+- App configurable
+- 一键生成 Restful API接口
+```
+
+## 其他
+```shell
+##更新注释
+swag init
+
+
+```

BIN
apiserver/.DS_Store


+ 51 - 0
apiserver/config/config.go

@@ -0,0 +1,51 @@
+package config
+
+import (
+	"time"
+
+	"github.com/BurntSushi/toml"
+	"kpt.xdmy/pkg/log"
+	"kpt.xdmy/pkg/setting"
+)
+
+var (
+	confPath string
+	Conf     = &Config{}
+)
+
+type Http struct {
+	TimeOut time.Duration `toml:"timeout"`
+	SapName string        `toml:"sapname"`
+	SapPwd  string        `toml:"sappwd"`
+	SrmName string        `toml:"srmname"`
+	SrmPwd  string        `toml:"srmpwd"`
+	Routing string        `toml:"routing"`
+}
+type Config struct {
+	DB   *MySQLConfig `toml:"db"`
+	Http *Http        `toml:"http"`
+}
+type MySQLConfig struct {
+	DSN         string        `toml:"dsn"`
+	Active      int           `toml:"active"`
+	Idle        int           `toml:"idle"`
+	IdleTimeout time.Duration `toml:"idle_timeout"`
+}
+
+// func init() {
+// 	flag.StringVar(&confPath, "tconf", "", "default config path")
+// }
+
+func Init(p string) (err error) {
+	if p != "" {
+		confPath = p
+	} else {
+		confPath, err = setting.GetCurrentPath()
+	}
+	confPath += "conf/conf.toml"
+	if _, err = toml.DecodeFile(confPath, &Conf); err != nil {
+		log.Error("config Init : %v", err)
+		return
+	}
+	return
+}

+ 84 - 0
apiserver/dao/dao.go

@@ -0,0 +1,84 @@
+package dao
+
+import (
+	"fmt"
+	"os"
+	"time"
+
+	"gorm.io/gorm/logger"
+	"gorm.io/gorm/schema"
+
+	// "github.com/xormplus/xorm"
+	// "github.com/xormplus/xorm"
+
+	"gorm.io/driver/mysql"
+	"gorm.io/gorm"
+
+	// _ "github.com/jinzhu/gorm/dialects/mysql"
+	// "github.com/jinzhu/gorm"
+	"kpt.xdmy/apiserver/config"
+	"kpt.xdmy/apiserver/routers/restful"
+	"kpt.xdmy/pkg/log"
+	"kpt.xdmy/pkg/setting"
+)
+
+var D *Dao
+
+type Dao struct {
+	DB *gorm.DB
+}
+
+func New(conf *config.Config) *Dao {
+	newLogger := logger.New(
+		log.New(os.Stdout, "\r\n"), // io writer
+		logger.Config{
+			SlowThreshold:             time.Second,  // Slow SQL threshold
+			LogLevel:                  logger.Error, // Log level
+			IgnoreRecordNotFoundError: false,        // Ignore ErrRecordNotFound error for logger
+			Colorful:                  true,         // Disable color
+			// LogMode:
+		})
+	gc := &gorm.Config{
+		NamingStrategy: schema.NamingStrategy{
+			SingularTable: true,
+			NoLowerCase:   true,
+		},
+		//Logger: newLogger,
+		Logger: logger.Default.LogMode(logger.Silent),
+	}
+
+	db, err := gorm.Open(mysql.Open(conf.DB.DSN), gc)
+	tx := db.Session(&gorm.Session{Logger: newLogger})
+	if err != nil {
+		log.Error("model.Setup err: %v", err, conf.DB.DSN)
+	}
+	sqlDB, _ := db.DB()
+	// SetMaxOpenConns 设置打开数据库连接的最大数量。
+	sqlDB.SetMaxOpenConns(100)
+	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
+	sqlDB.SetMaxIdleConns(10)
+	// SetConnMaxLifetime 设置了连接可复用的最大时间。
+	sqlDB.SetConnMaxLifetime(300 * time.Second)
+	D = &Dao{
+		DB: tx,
+	}
+
+	return D
+}
+func Setup() {
+	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
+		setting.DatabaseSetting.User,
+		setting.DatabaseSetting.Password,
+		setting.DatabaseSetting.Host,
+		setting.DatabaseSetting.Name)
+	// restful  接口的 数据库初始化
+	err := restful.SQLInit("mysql", dsn, 500, 50, setting.DatabaseSetting.ShowXormlog)
+	if err != nil {
+		log.Fatal("dao Setup ", err)
+		fmt.Println("dbs 数据库初始化失败 ")
+	}
+
+	if err != nil {
+		log.Fatal("dao  Setup ", err)
+	}
+}

+ 8 - 0
apiserver/dao/db.go

@@ -0,0 +1,8 @@
+package dao
+
+import "github.com/pkg/errors"
+
+func (d *Dao) Raw(sql string, args map[string]interface{}, r interface{}) error {
+	e := d.DB.Raw(sql, args).Scan(r).Error
+	return errors.Wrapf(e, "model Raw %s, %v", sql, args)
+}

+ 130 - 0
apiserver/model/PartRefund.go

@@ -0,0 +1,130 @@
+package model
+
+import (
+	"time"
+
+	"github.com/pkg/errors"
+	"kpt.xdmy/pkg/util"
+)
+
+type BigPartRefundReq struct {
+	PastureID  int    `json:"pastureId"`
+	ProviderID int    `json:"providerId"`
+	UseForm    string `json:"useForm"`
+	EmployeID  int    `json:"employeId"`
+	CreateTime string `json:"createTime"`
+	Note       string `json:"note"`
+}
+
+type BigPartRefund struct {
+	// 退货
+	ID            int `gorm:"column:id"`
+	CGChargeID    int `gorm:"column:CGChargeId"`
+	ChargeID      int `gorm:"column:chargeId"`
+	EmployeID     int `gorm:"column:employeId"`
+	BigPartlaidID int `gorm:"column:bigPartlaidId"`
+	PastureID     int `gorm:"column:pastureId"`
+	ProviderID    int `gorm:"column:providerId"`
+
+	UseForm     string `gorm:"column:useForm"`
+	RefundClass int    `gorm:"column:refundClass"`
+	Issync      int    `gorm:"column:issync"`
+
+	CGChargedate string    `gorm:"column:CGChargedate"`
+	ChargeDate   string    `gorm:"column:chargeDate"`
+	CreateTime   time.Time `gorm:"column:createTime"`
+
+	Msg          string `gorm:"column:msg"`
+	Note         string `gorm:"column:note"`
+	Statue       int    `gorm:"column:statue"`
+	WorkflowNote string `gorm:"column:workflowNote"`
+	ProofCode    string `gorm:"column:proofCode"`
+	PurchaseId   string `gorm:"column:purchaseId"`
+}
+
+type PartRefund struct {
+	// 退货明细
+	ID            int     `gorm:"column:id"`
+	BigID         int     `gorm:"column:bigId"`
+	ContractID    int     `gorm:"column:contractId"`
+	PartID        int     `gorm:"column:partId"`
+	Brand         string  `gorm:"column:brand"`
+	Location      string  `gorm:"column:location"`
+	Note          string  `gorm:"column:note"`
+	PartCode      string  `gorm:"column:partCode"`
+	PartName      string  `gorm:"column:partName"`
+	Price         float32 `gorm:"column:price"`
+	RefundNumber  float32 `gorm:"column:refundNumber"`
+	Reportery     string  `gorm:"column:reportery"`
+	Specification string  `gorm:"column:specification"`
+	SumPrice      float32 `gorm:"column:sumPrice"`
+	Unit          string  `gorm:"column:unit"`
+	Dflag         int     `gorm:"column:dflag"`
+	RowNumber     int     `gorm:"column:rowNumber"`
+}
+
+func (p *PartRefund) ToProofPart() (r *ProofPart) {
+	r = &ProofPart{
+		RowNumber:     p.RowNumber,
+		PartCode:      p.PartCode,
+		PartName:      p.PartName,
+		Specification: p.Specification,
+		PartBrand:     p.Brand,
+		Warehouse:     p.Location,
+		ChangeCount:   p.RefundNumber,
+		UnitPrice:     p.Price,
+		TotalPrice:    p.SumPrice,
+	}
+	return
+}
+
+func (p *BigPartRefund) NewProof(pa *ProofReq) {
+	pa.ChargeDate = p.CreateTime.Format("2006-01-02")
+	pa.ProofCode = p.UseForm
+	pa.ProofYear = p.CreateTime.Format("2006")
+	pa.OrderNumberId = p.ID
+}
+
+func (p *BigPartRefund) NewProofPart() (mps []ProofPart, e error) {
+	path := " BigPartRefund NewProofPart()"
+
+	c := util.NewMap("bigid", p.ID)
+	m := make([]PartRefund, 0)
+	if e = Find(c, &m); e != nil {
+		e = errors.Wrapf(e, path)
+		return
+	}
+	mps = make([]ProofPart, 0)
+	mp := new(ProofPart)
+	for i, v := range m {
+		mp = v.ToProofPart()
+		mp.RowNumber = i
+		mps = append(mps, *mp)
+	}
+	return
+}
+
+type RefundParam struct {
+	ID int `json:"id"`
+}
+
+type PartRefundStr struct {
+	// 退货明细
+	ID            interface{} `gorm:"column:id"`
+	BigID         interface{} `gorm:"column:bigId"`
+	ContractID    interface{} `gorm:"column:contractId"`
+	PartID        interface{} `gorm:"column:partId"`
+	Brand         interface{} `gorm:"column:brand"`
+	Location      interface{} `gorm:"column:location"`
+	Note          interface{} `gorm:"column:note"`
+	PartCode      interface{} `gorm:"column:partCode"`
+	PartName      interface{} `gorm:"column:partName"`
+	Price         interface{} `gorm:"column:price"`
+	RefundNumber  interface{} `gorm:"column:refundNumber"`
+	Reportery     interface{} `gorm:"column:reportery"`
+	Specification interface{} `gorm:"column:specification"`
+	SumPrice      interface{} `gorm:"column:sumPrice"`
+	Unit          interface{} `gorm:"column:unit"`
+	Dflag         interface{} `gorm:"column:dflag"`
+	RowNumber     interface{} `gorm:"column:rowNumber"`
+}

+ 121 - 0
apiserver/model/Partquit.go

@@ -0,0 +1,121 @@
+package model
+
+import (
+	"time"
+
+	"github.com/pkg/errors"
+	"kpt.xdmy/pkg/util"
+)
+
+type BigPartquit struct {
+	// 退库
+	CreatDate string    `gorm:"column:creatDate"`
+	DeptID    int       `gorm:"column:deptId"`
+	ID        int       `gorm:"column:id"`
+	Issync    int       `gorm:"column:issync"`
+	ListType  int       `gorm:"column:listType"`
+	Msg       string    `gorm:"column:msg"`
+	Note      string    `gorm:"column:note"`
+	OddNumber string    `gorm:"column:oddNumber"`
+	PastureID int       `gorm:"column:pastureId"`
+	QuitDate  time.Time `gorm:"column:quitDate"`
+	QuitID    int       `gorm:"column:quitId"`
+	SumPrice  float32   `gorm:"column:sumPrice"`
+	UseForm   string    `gorm:"column:useForm"` // 出库单号
+	ProofCode string    `gorm:"column:proofCode"`
+}
+
+type Partquit struct {
+	// 退库详情
+	ApplyNumber   string  `gorm:"column:applyNumber"`
+	BigID         int     `gorm:"column:bigId"`
+	Brand         string  `gorm:"column:brand"`
+	ContractID    int     `gorm:"column:contractId"`
+	ID            int     `gorm:"column:id"`
+	Location      string  `gorm:"column:location"`
+	Note          string  `gorm:"column:note"`
+	PartCode      string  `gorm:"column:partCode"`
+	PartID        int     `gorm:"column:partId"`
+	PartName      string  `gorm:"column:partName"`
+	PartUseID     int     `gorm:"column:partUseId"`
+	Price         float32 `gorm:"column:price"`
+	ProviderID    int     `gorm:"column:providerId"`
+	ProviderName  string  `gorm:"column:providerName"`
+	QuitNumber    float32 `gorm:"column:quitNumber"`
+	Reportery     string  `gorm:"column:reportery"`
+	Specification string  `gorm:"column:specification"`
+	SumPrice      float32 `gorm:"column:sumPrice"`
+	Unit          string  `gorm:"column:unit"`
+	UseNumber     string  `gorm:"column:useNumber"`
+	Dflag         int     `gorm:"column:dflag"`
+	RowNumber     int     `gorm:"column:rowNumber"`
+}
+
+func (p *Partquit) ToProofPart() (r *ProofPart) {
+
+	r = &ProofPart{
+		RowNumber:     p.RowNumber,
+		PartCode:      p.PartCode,
+		PartName:      p.PartName,
+		Specification: p.Specification,
+		PartBrand:     p.Brand,
+		Supplier:      p.ProviderName,
+		Warehouse:     p.Location,
+		ChangeCount:   p.QuitNumber,
+		UnitPrice:     p.Price,
+		TotalPrice:    p.SumPrice,
+	}
+	return
+}
+
+func (p *BigPartquit) NewProof(pa *ProofReq) {
+	pa.ChargeDate = p.QuitDate.Format("2006-01-02")
+	pa.ProofCode = p.UseForm
+	pa.ProofYear = p.QuitDate.Format("2006")
+	pa.OrderNumberId = p.ID
+}
+
+func (p *BigPartquit) NewProofPart() (mps []ProofPart, e error) {
+	path := " BigPartquit NewProofPart()"
+
+	c := util.NewMap("bigid", p.ID)
+	m := make([]Partquit, 0)
+	if e = Find(c, &m); e != nil {
+		e = errors.Wrapf(e, path)
+		return
+	}
+	mps = make([]ProofPart, 0)
+	mp := new(ProofPart)
+	for i, v := range m {
+		mp = v.ToProofPart()
+		mp.RowNumber = i
+		mps = append(mps, *mp)
+	}
+	return
+}
+
+type PartquitStr struct {
+	// 退库详情
+	ApplyNumber   interface{} `gorm:"column:applyNumber"`
+	BigID         interface{} `gorm:"column:bigId"`
+	Brand         interface{} `gorm:"column:brand"`
+	ContractID    interface{} `gorm:"column:contractId"`
+	ID            interface{} `gorm:"column:id"`
+	Location      interface{} `gorm:"column:location"`
+	Note          interface{} `gorm:"column:note"`
+	PartCode      interface{} `gorm:"column:partCode"`
+	PartID        interface{} `gorm:"column:partId"`
+	PartName      interface{} `gorm:"column:partName"`
+	PartUseID     interface{} `gorm:"column:partUseId"`
+	Price         interface{} `gorm:"column:price"`
+	ProviderID    interface{} `gorm:"column:providerId"`
+	ProviderName  interface{} `gorm:"column:providerName"`
+	QuitNumber    interface{} `gorm:"column:quitNumber"`
+	Reportery     interface{} `gorm:"column:reportery"`
+	Specification interface{} `gorm:"column:specification"`
+	SumPrice      interface{} `gorm:"column:sumPrice"`
+	Unit          interface{} `gorm:"column:unit"`
+	UseNumber     interface{} `gorm:"column:useNumber"`
+	Dflag         interface{} `gorm:"column:dflag"`
+	RowNumber     interface{} `gorm:"column:rowNumber"`
+}

+ 15 - 0
apiserver/model/assetstt.go

@@ -0,0 +1,15 @@
+package model
+
+import "time"
+
+type AssetStt struct {
+	ID           int64     `gorm:"column:id"`
+	PastureId    string    `gorm:"column:pastureId" json:"pastureId"`
+	EqId         int64     `gorm:"column:eqId" json:"eqId"`
+	Shift        string    `gorm:"column:shift" json:"shift"`
+	EnablePerson string    `gorm:"column:enablePerson" json:"enablePerson"`
+	EnabledTime  time.Time `gorm:"column:enabledTime" json:"enabledTime"`
+	BlockPerson  string    `gorm:"column:blockPerson" json:"blockPerson"`
+	BlockTime    time.Time `gorm:"column:blockTime" json:"blockTime"`
+	IntervalA    string    `gorm:"column:intervalA" json:"intervalA"`
+}

+ 10 - 0
apiserver/model/brand.go

@@ -0,0 +1,10 @@
+package model
+
+import "time"
+
+type Brand struct {
+	ID         int       `gorm:"column:id" `
+	BrandName  string    `gorm:"column:brandName" `
+	Enable     int       `gorm:"column:enable" `
+	CreateTime time.Time `gorm:"column:createTime" `
+}

+ 160 - 0
apiserver/model/buydetail.go

@@ -0,0 +1,160 @@
+package model
+
+import (
+	"time"
+)
+
+type BigBuyDetail struct {
+	// 采购订单
+	ID           int       `gorm:"column:id"`
+	DoneDate     time.Time `gorm:"column:DoneDate"`
+	ArrivalStatu int       `gorm:"column:arrivalStatu"`
+	BuyeCode     string    `gorm:"column:buyeCode"` //申购单号
+	BuyerDate    time.Time `gorm:"column:buyerDate"`
+	BuyerPerson  int       `gorm:"column:buyerPerson"`
+	Enable       int       `gorm:"column:enable"`    //是否删除
+	MatchCode    string    `gorm:"column:matchCode"` //配单
+	Note         string    `gorm:"column:note"`      //关闭原因
+	PastureID    int       `gorm:"column:pastureId"`
+	ProviderID   int       `gorm:"column:providerId"`
+	Statu        int       `gorm:"column:statu"`     // 到货状态
+	ZeroCou      int       `gorm:"column:zeroCou"`   //配单数量
+	SapNumber    string    `gorm:"column:sapNumber"` //sap采购单号
+	SapStatus    int       `gorm:"column:sapStatus"` // 同步状态
+	SapError     string    `gorm:"column:sapError"`  // sap接口错误信息
+	SrmStatus    int       `gorm:"column:srmStatus"`
+	SrmNumber    string    `gorm:"column:srmNumber"`
+	SrmError     string    `gorm:"column:srmError"`
+}
+type BuyDetail struct {
+	// 采购订单明细
+	ID int `json:"id" gorm:"column:id"`
+	// Model
+	Amount         int       `json:"amount" gorm:"column:amount"` //采购数量
+	BigID          int       `json:"bigId" gorm:"column:bigId"`
+	BrandID        int       `json:"brandId" gorm:"column:brandId"`
+	ContractID     int       `json:"contractId" gorm:"column:contractId"`
+	PastureID      int       `json:"pastureId" gorm:"column:pastureId"`
+	ContractCode   string    `json:"contractCode" gorm:"column:contractCode"`
+	DepartmentName string    `json:"departmentName" gorm:"column:departmentName"`
+	IsStorage      int       `json:"isStorage" gorm:"column:isStorage"`     //'判断是否完全是否入库(0:否  1: 是)'
+	ReceiveDate    time.Time `json:"receiveDate" gorm:"column:receiveDate"` // '入库时间',
+	PartCode       string    `json:"partCode" gorm:"column:partCode"`
+	Price          float64   `json:"price" gorm:"column:price"`
+	ReceiveAmount  string    `json:"receiveAmount" gorm:"column:receiveAmount"` // '入库数量',
+	Salesreturn    string    `json:"salesreturn" gorm:"column:salesreturn"`     //退货数量
+	Statue         int       `json:"statue" gorm:"column:statue"`               // '采购状态状态(0,未到货,1部分到货,3全部到货)',
+	Remark         string    `json:"remark" gorm:"column:remark"`
+	Note           string    `json:"note" gorm:"column:note"`
+	StoredQuantity string    `json:"storedQuantity" gorm:"column:storedQuantity"`
+	SumAmount      int       `json:"sumAmount" gorm:"column:sumAmount"` //申购数量',
+	Enable         int       `json:"enable" gorm:"column:enable"`
+	Dflag          int       `json:"dflag" gorm:"column:dflag"`
+	Unit           string
+	IsZeroStock    int
+	RowNumber      int `json:"rowNumber" gorm:"column:rowNumber"`
+}
+type BigBuyDetailReq struct {
+	Code string `json:"matchCode" gorm:"column:matchcode"` //配单号
+	ID   string `json:"id" gorm:"column:id"`               //申购单id
+}
+
+func (BuyDetail) TableName() string {
+	return "buydetail"
+}
+
+func (BigBuyDetail) TableName() string {
+	return "bigbuydetail"
+}
+
+type BigBuyDetailStr struct {
+	// 采购订单
+	ID           string `gorm:"column:id"`
+	DoneDate     string `gorm:"column:DoneDate"`
+	ArrivalStatu string `gorm:"column:arrivalStatu"`
+	BuyeCode     string `gorm:"column:buyeCode"` //申购单号
+	BuyerDate    string `gorm:"column:buyerDate"`
+	BuyerPerson  string `gorm:"column:buyerPerson"`
+	Enable       string `gorm:"column:enable"`    //是否删除
+	MatchCode    string `gorm:"column:matchCode"` //配单
+	Note         string `gorm:"column:note"`      //关闭原因
+	PastureID    string `gorm:"column:pastureId"`
+	ProviderID   string `gorm:"column:providerId"`
+	Statu        string `gorm:"column:statu"`     // 到货状态
+	ZeroCou      string `gorm:"column:zeroCou"`   //配单数量
+	SapNumber    string `gorm:"column:sapNumber"` //sap采购单号
+	SapStatus    string `gorm:"column:sapStatus"` // 同步状态
+	SapError     string `gorm:"column:sapError"`  // sap接口错误信息
+	SrmStatus    string `gorm:"column:srmStatus"`
+	SrmNumber    string `gorm:"column:srmNumber"`
+	SrmError     string `gorm:"column:srmError"`
+}
+
+type BuyDetailStr struct {
+	// 采购订单明细
+	ID string `json:"id" gorm:"column:id"`
+	// Model
+	Amount         string `json:"amount" gorm:"column:amount"` //采购数量
+	BigID          string `json:"bigId" gorm:"column:bigId"`
+	BrandID        string `json:"brandId" gorm:"column:brandId"`
+	ContractID     string `json:"contractId" gorm:"column:contractId"`
+	PastureID      string `json:"pastureId" gorm:"column:pastureId"`
+	ContractCode   string `json:"contractCode" gorm:"column:contractCode"`
+	DepartmentName string `json:"departmentName" gorm:"column:departmentName"`
+	IsStorage      string `json:"isStorage" gorm:"column:isStorage"`     //'判断是否完全是否入库(0:否  1: 是)'
+	ReceiveDate    string `json:"receiveDate" gorm:"column:receiveDate"` // '入库时间',
+	PartCode       string `json:"partCode" gorm:"column:partCode"`
+	Price          string `json:"price" gorm:"column:price"`
+	ReceiveAmount  string `json:"receiveAmount" gorm:"column:receiveAmount"` // '入库数量',
+	Salesreturn    string `json:"salesreturn" gorm:"column:salesreturn"`     //退货数量
+	Statue         string `json:"statue" gorm:"column:statue"`               // '采购状态状态(0,未到货,1部分到货,3全部到货)',
+	Remark         string `json:"remark" gorm:"column:remark"`
+	Note           string `json:"note" gorm:"column:note"`
+	StoredQuantity string `json:"storedQuantity" gorm:"column:storedQuantity"`
+	SumAmount      string `json:"sumAmount" gorm:"column:sumAmount"` //申购数量',
+	Enable         string `json:"enable" gorm:"column:enable"`
+	Dflag          string `json:"dflag" gorm:"column:dflag"`
+	Unit           string
+	IsZeroStock    string
+	RowNumber      string `json:"rowNumber" gorm:"column:rowNumber"`
+}
+
+type BigRefunddetail struct {
+	// 采购订单
+	ID           int       `gorm:"column:id"`
+	ArrivalStatu int       `gorm:"column:arrivalStatu"`
+	BuyeCode     string    `gorm:"column:buyeCode"` //申购单号
+	BuyerDate    time.Time `gorm:"column:buyerDate"`
+	BuyerPerson  int       `gorm:"column:buyerPerson"`
+	Enable       int       `gorm:"column:enable"` //是否删除
+	Note         string    `gorm:"column:note"`   //关闭原因
+	PastureID    int       `gorm:"column:pastureId"`
+	ProviderID   int       `gorm:"column:providerId"`
+	Statu        int       `gorm:"column:statu"`     // 到货状态
+	SapNumber    string    `gorm:"column:sapNumber"` //sap采购单号
+	SapStatus    int       `gorm:"column:sapStatus"` // 同步状态
+	SapError     string    `gorm:"column:sapError"`  // sap接口错误信息
+	SrmStatus    int       `gorm:"column:srmStatus"`
+	SrmNumber    string    `gorm:"column:srmNumber"`
+	SrmError     string    `gorm:"column:srmError"`
+}
+
+type Refunddetail struct {
+	// 采购订单明细
+	ID int `json:"id" gorm:"column:id"`
+	// Model
+	Amount         int     `json:"amount" gorm:"column:amount"` //采购数量
+	BigID          int     `json:"bigId" gorm:"column:bigId"`
+	BrandID        int     `json:"brandId" gorm:"column:brandId"`
+	ContractID     int     `json:"contractId" gorm:"column:contractId"`
+	PastureID      int     `json:"pastureId" gorm:"column:pastureId"`
+	ContractCode   string  `json:"contractCode" gorm:"column:contractCode"`
+	DepartmentName string  `json:"departmentName" gorm:"column:departmentName"`
+	PartCode       string  `json:"partCode" gorm:"column:partCode"`
+	Price          float64 `json:"price" gorm:"column:price"`
+	Statue         int     `json:"statue" gorm:"column:statue"` // '采购状态状态(0,未到货,1部分到货,3全部到货)',
+	Remark         string  `json:"remark" gorm:"column:remark"`
+	Note           string  `json:"note" gorm:"column:note"`
+	Enable         int     `json:"enable" gorm:"column:enable"`
+	RowNumber      int     `json:"rowNumber" gorm:"column:rowNumber"`
+}

+ 58 - 0
apiserver/model/contract.go

@@ -0,0 +1,58 @@
+package model
+
+import "time"
+
+type BigContract struct {
+	ID              int       `gorm:"column:id"`
+	CGChargeID      int       `gorm:"column:CGChargeId"`
+	CGChargedate    time.Time `gorm:"column:CGChargedate"`
+	KGChargeID      int       `gorm:"column:KGChargeId"`
+	KGChargedate    time.Time `gorm:"column:KGChargedate"`
+	SHStatus        int       `gorm:"column:SHStatus"`
+	SHdateTime      time.Time `gorm:"column:SHdateTime"`
+	SHtype          int       `gorm:"column:SHtype"`
+	ChargeDate      time.Time `gorm:"column:chargeDate"`
+	ChargeID        int       `gorm:"column:chargeId"`
+	ContractCode    string    `gorm:"column:contractCode"`
+	CreatorID       int       `gorm:"column:creatorId"`
+	ProviderID      int       `gorm:"column:providerId"`
+	CreatorMan      string    `gorm:"column:creatorMan"`
+	CreatorTime     string    `gorm:"column:creatorTime"`
+	Enable          int       `gorm:"column:enable"`
+	Flag            int       `gorm:"column:flag"`
+	FlowCompeleted  int       `gorm:"column:flowCompeleted"`
+	IsZeroStock     int       `gorm:"column:isZeroStock"`
+	PastureID       int       `gorm:"column:pastureId"`
+	PastureNamesNow string    `gorm:"column:pastureNamesNow"`
+	PastureNamesOld string    `gorm:"column:pastureNamesOld"`
+	PrecontractCode string    `gorm:"column:precontractCode"`
+	ProviderName    string    `gorm:"column:providerName"`
+	Remark          string    `gorm:"column:remark"`
+	StartTime       string    `gorm:"column:startTime"`
+	Statue          int       `gorm:"column:statue"`
+	StopTime        string    `gorm:"column:stopTime"`
+	StopTimeHis     time.Time `gorm:"column:stopTimeHis"`
+	StopTimeTem     time.Time `gorm:"column:stopTimeTem"`
+	WorkflowID      int       `gorm:"column:workflowId"`
+	WorkflowNote    string    `gorm:"column:workflowNote"`
+}
+type Contract struct {
+	ID            int     `gorm:"column:id"`
+	BigID         int     `gorm:"column:bigId"`
+	Brand         string  `gorm:"column:brand"`
+	BrandID       int     `gorm:"column:brandId"`
+	ChangeID      int     `gorm:"column:changeId"`
+	Enable        int     `gorm:"column:enable"`
+	InventoryType int     `gorm:"column:inventoryType"`
+	IsZeroStock   int     `gorm:"column:isZeroStock"`
+	PartCode      string  `gorm:"column:partCode"`
+	PartID        int     `gorm:"column:partId"`
+	PartName      string  `gorm:"column:partName"`
+	PastureID     int     `gorm:"column:pastureId"`
+	PastureName   string  `gorm:"column:pastureName"`
+	PlanAmount    string  `gorm:"column:planAmount"`
+	Price         float64 `gorm:"column:price"`
+	Remark        string  `gorm:"column:remark"`
+	Specification string  `gorm:"column:specification"`
+	Unit          string  `gorm:"column:unit"`
+}

+ 26 - 0
apiserver/model/department.go

@@ -0,0 +1,26 @@
+package model
+
+type Department struct {
+	// 组织机构
+	KCcode         string `gorm:"column:KCcode"`
+	XRCode         string `gorm:"column:XRCode"`
+	Address        string `gorm:"column:address"`
+	DeptCode       string `gorm:"column:deptCode"`
+	Enable         int    `gorm:"column:enable"`
+	ID             int    `gorm:"column:id"`
+	IsDel          int    `gorm:"column:isDel"`
+	IsGroupco      int    `gorm:"column:isGroupco"`
+	IsPasture      int    `gorm:"column:isPasture"`
+	Iscal          int    `gorm:"column:iscal"`
+	Name           string `gorm:"column:name"`
+	Parentid       int    `gorm:"column:parentid"`
+	PastureID      int    `gorm:"column:pastureId"`
+	Remark         string `gorm:"column:remark"`
+	Sort           string `gorm:"column:sort"`
+	CostCenterCode string `gorm:"column:costCenter_code"`
+
+	CompanyCode          string `gorm:"column:company_code"`     //公司代码
+	PurchasingGroup      string `gorm:"column:purchasing_group"` //采购组织
+	Factory              string `gorm:"column:factory"`          //工厂
+	ParchaseOrganization string `gorm:"column:parchase_organization"`
+}

+ 12 - 0
apiserver/model/distlist.go

@@ -0,0 +1,12 @@
+package model
+
+type Dictlist struct {
+	// 组织机构
+	ID        int    `gorm:"column:id"`
+	Pid       int    `gorm:"column:pid"`
+	PastureId int    `gorm:"column:pastureId"`
+	Label     string `gorm:"column:label"`
+	Value     string `gorm:"column:value"`
+	Orderby   int    `gorm:"column:orderby"`
+	Enable    int    `gorm:"column:enable"`
+}

+ 12 - 0
apiserver/model/eqclass.go

@@ -0,0 +1,12 @@
+package model
+
+type EqClass struct {
+	ID       int    `gorm:"column:id"`
+	TypeName string `gorm:"column:typeName" json:"typeName"`
+	TypeCode string `gorm:"column:typeCode" json:"typeCode"`
+}
+
+type EqClassAndPasture struct {
+	EqClass `xorm:"extends"`
+	Pasture `xorm:"extends"`
+}

+ 70 - 0
apiserver/model/equipment.go

@@ -0,0 +1,70 @@
+package model
+
+import "time"
+
+type Equipment struct {
+	PastureId        int       `gorm:"column:pastureId" json:"pastureId"`
+	PastureName      string    `gorm:"column:pastureName" json:"pastureName"`
+	EqName           string    `gorm:"column:eqName" json:"eqName"`
+	AssetCode        string    `gorm:"column:assetCode" json:"assetCode"`
+	EqClassName      string    `gorm:"column:eqClassName" json:"eqClassName"`
+	Specification    string    `gorm:"column:specification" json:"specification"`
+	DepartmentId     string    `gorm:"column:departmentId" json:"departmentId"`
+	DepartmentName   string    `gorm:"column:departmentName" json:"departmentName"`
+	EntranceDate     string    `gorm:"column:entranceDate" json:"entranceDate"`
+	Purpose          string    `gorm:"column:purpose" json:"purpose"`
+	Yuanzhi          string    `gorm:"column:yuanzhi" json:"yuanzhi"`
+	Id               int       `gorm:"column:id" json:"id"`
+	EqCode           string    `gorm:"column:eqCode" json:"eqCode"`
+	EqClassId        int       `gorm:"column:eqClassId" json:"eqClassId"`
+	FinanceCode      string    `gorm:"column:financeCode" json:"financeCode"`
+	ProName          string    `gorm:"column:proName" json:"proName"`
+	ProId            int       `gorm:"column:proId" json:"proId"`
+	BrandId          string    `gorm:"column:brandId" json:"brandId"`
+	Brand            string    `gorm:"column:brand" json:"brand"`
+	PurchaseDate     string    `gorm:"column:purchaseDate" json:"purchaseDate"`
+	Subtractvalue    string    `gorm:"column:subtractvalue" json:"subtractvalue"`
+	Salvage          string    `gorm:"column:salvage" json:"salvage"`
+	Upkeepgrade      string    `gorm:"column:upkeepgrade" json:"upkeepgrade"`
+	YearMaintainCost string    `gorm:"column:yearMaintainCost" json:"yearMaintainCost"`
+	YearUpkeepCost   string    `gorm:"column:yearUpkeepCost" json:"yearUpkeepCost"`
+	Status           int       `gorm:"column:status" json:"status"`
+	EmployeName      string    `gorm:"column:employeName" json:"employeName"`
+	EmployeeId       string    `gorm:"column:employeeId" json:"employeeId"`
+	InputDatetime    string    `gorm:"column:inputDatetime" json:"inputDatetime"`
+	LeaveDate        time.Time `gorm:"column:leaveDate" json:"leaveDate"`
+	InputUser        string    `gorm:"column:inputUser" json:"inputUser"`
+	EnabledTime      time.Time `gorm:"column:enabledTime" json:"enabledTime"`
+	BlockTime        time.Time `gorm:"column:blockTime" json:"blockTime"`
+	ChangeStatue     string    `gorm:"column:changeStatue" json:"changeStatue"`
+	EnabledPerson    int       `gorm:"column:enabledPerson" json:"enabledPerson"`
+	BlockPerson      int       `gorm:"column:blockPerson" json:"blockPerson"`
+	SttId            int       `gorm:"column:sttId" json:"sttId"`
+	BaseHours        string    `gorm:"column:baseHours" json:"baseHours"`
+	ApplicatId       int       `gorm:"column:applicatId" json:"applicatId"`
+	ApplicatDate     time.Time `gorm:"column:applicatDate" json:"applicatDate"`
+	WorkflowId       int       `gorm:"column:workflowId" json:"workflowId"`
+	FlowCompeleted   int       `gorm:"column:flowCompeleted" json:"flowCompeleted"`
+	Enable           int       `gorm:"column:enable" json:"enable"`
+	ChangeTime       time.Time `gorm:"column:changeTime" json:"changeTime"`
+	SSTstatue        string    `gorm:"column:SSTstatue" json:"SSTstatue"`
+	SHStatus         int       `gorm:"column:SHStatus" json:"SHStatus"`
+	ChargeId         int       `gorm:"column:chargeId" json:"chargeId"`
+	ChargeDate       time.Time `gorm:"column:chargeDate" json:"chargeDate"`
+	WorkflowNote     string    `gorm:"column:workflowNote" json:"workflowNote"`
+	Picpath          string    `gorm:"column:picpath" json:"picpath"`
+	Depreciation     string    `gorm:"column:depreciation" json:"depreciation"`
+	Statue           int       `gorm:"column:statue" json:"statue"`
+	ModifyTime       time.Time `gorm:"column:modifyTime" json:"modifyTime"`
+	CompanyCode      string    `gorm:"column:companyCode" json:"companyCode"`
+
+	CreatedAt    time.Time `gorm:"column:created_at" json:"created_at"`
+	UpdatedAt    time.Time `gorm:"column:updated_at" json:"updated_at"`
+	Quantity     string    `gorm:"column:quantity" json:"quantity"`
+	CostCenter   string    `gorm:"column:costCenter" json:"costCenter"`
+	Unit         string    `gorm:"column:unit" json:"unit"`
+	ProfitCenter string    `gorm:"column:profitCenter" json:"profitCenter"`
+	SonCode      string    `gorm:"column:sonCode" json:"sonCode"`
+
+	SapCode string `gorm:"column:sapCode" json:"sapCode"`
+}

+ 69 - 0
apiserver/model/http/asset.go

@@ -0,0 +1,69 @@
+package http
+
+type AssetResp struct {
+	Dest Dest          `json:"DEST"`
+	Data AssetRespData `json:"DATA"`
+}
+type AssetRespData struct {
+	RespMsg SapRespMsg `json:"MSGER"`
+	Master  []Asset    `json:"TANLA"`
+}
+type Asset struct {
+	CompanyCode string `json:"BUKRS"` //公司代码
+	SonCode     string `json:"ANLN2"` //资产子编号  默认0
+	Quantity    string `json:"MENGE"` //数量
+
+	Name       string `json:"TXT50"` //资产名称
+	AssetCode  string `json:"ANLN1"` //资产编码
+	Type       string `json:"ANLKL"` //资产类型
+	Model      string `json:"TXA50"` //资产规格
+	CostCenter string `json:"KOSTL"` //成本中心
+
+	Unit             string `json:"MEINS"`  //计量单位
+	ProfitCenter     string `json:"PRCTR"`  //利润中心
+	BuyDate          string `json:"ZUGDT"`  //购买日期
+	BuyValue         string `json:"KANSW"`  //购买价值
+	Salvage          string `json:"AHPROZ"` //残值率  百分比
+	Udate            string `json:"UDATE"`  //更新日期
+	Utime            string `json:"UTIME"`  //更新时间
+	NDPER            string `json:"NDPER"`  //计划 使用时间
+	Dflag            string `json:"XSPEB"`  // 删除标记
+	DepreciationYear string `json:"NDJAR"`  //折旧年限
+	Supplier         string `json:"LIFNR"`  //供应商
+	TransferFlag     string `json:"ORD44"`  //传输Y/不传输N ,删除X
+	ORD41            string `json:"ORD41"`  // 资产状态
+
+	Segment string `json:"SEGMENT"` //细分	段
+	ORD42   string `json:"ORD42"`   //资产变动方式	出售/购入/其他/其他减少/其他增加/调拨/在建工程转入
+	RAUMN   string `json:"RAUMN"`   //房间	存储资产的位置
+}
+
+type AssetReq struct {
+	Dest `json:"DEST"`
+	Data AssetReqData `json:"DATA"`
+}
+
+type Company struct {
+	Code string `json:"BUKRS"`
+}
+type AssetReqData struct {
+	BudatB      string    `json:"BUDAT_B"` //查询开始日期	YYYYMMDD,资产创建/变更
+	BudatE      string    `json:"BUDAT_E"` //查询结束日期	YYYYMMDD,资产创建/变更
+	CompanyCode []Company `json:"TBUKRS"`  //公司代码	现代牧业的法人
+	Codes       []TANLN1  `json:"TANLN1"`  //主资产号	财务资产码
+	EqType      []ANLKL   `json:"TANLKL"`  //资产类	设备类别
+	Tord41      []ORD41   `json:"TORD41"`  //资产状态	在用/转移/报废
+	Tzugdt      []ZUGDT   `json:"TZUGDT"`  //购置日期	购置日期(首次)
+}
+type TANLN1 struct {
+	Code string `json:"ANLN1"` //主资产号,	财务资产码
+}
+type ANLKL struct {
+	ANLKL string `json:"ANLKL"`
+}
+type ORD41 struct {
+	ORD41 string `json:"ORD41"`
+}
+type ZUGDT struct {
+	ZUGDT string `json:"ZUGDT"`
+}

+ 52 - 0
apiserver/model/http/charge_off.go

@@ -0,0 +1,52 @@
+package http
+
+import (
+	"fmt"
+	"kpt.xdmy/apiserver/config"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/pkg/util"
+)
+
+type ChargeOffReq struct {
+	Dest `json:"DEST"`
+	Data ChargeOff `json:"DATA"`
+}
+
+type ChargeOffDetail struct {
+	RowNumber int `json:"ZEILE"`
+}
+
+type ChargeOff struct {
+	ProofCode   string            `json:"MBLNR"`  // 物料凭证号
+	ProofYear   string            `json:"MJAHR"`  // 物料凭证年度
+	ChargeDate  string            `json:"BUDAT"`  // 凭证中的过帐日期 YYYYMMDD
+	OrderNumber string            `json:"FRBNR"`  // 设备管理平台单号
+	RowsNumber  []ChargeOffDetail `json:"TMSEG"`  // 设备管理平台行号
+	HasTicket   string            `json:"ZTHFLG"` // 是否已开票退货单	"是: X ,※仅采购业务需要
+}
+
+func (c *ChargeOffReq) NewDest() {
+
+	c.Dest = Dest{
+		DestID: "EQMAN",
+		BussTp: "MM015",
+		//Url:    "http://192.168.61.117/SAPP0/Common/MM015/CancelMblnr",
+		Url: fmt.Sprintf("%s/Common/MM015/CancelMblnr", config.Conf.Http.Routing),
+	}
+}
+func (c *ChargeOffReq) NewReq(p *model.ProofReq) {
+	c.NewDest()
+	h := ChargeOff{
+		ProofCode:   p.ProofCode,
+		ProofYear:   p.ProofYear,
+		ChargeDate:  p.ChargeDate,
+		OrderNumber: p.OrderNumber,
+		HasTicket:   util.ZeroStr(p.HasTicket == 1, "X"),
+	}
+	s := make([]ChargeOffDetail, len(p.RowsNumber))
+	for v := range p.RowsNumber {
+		s = append(s, ChargeOffDetail{RowNumber: v})
+	}
+	h.RowsNumber = s
+	c.Data = h
+}

+ 10 - 0
apiserver/model/http/http.go

@@ -0,0 +1,10 @@
+package http
+
+type Response struct {
+	Success bool        `json:"success"`
+	
+	Code    int         `json:"code"`
+	Message string      `json:"message"`
+	Data    interface{} `json:"data"`
+	Msg     string      `json:"msg"`
+}

+ 47 - 0
apiserver/model/http/material.go

@@ -0,0 +1,47 @@
+package http
+
+type MaterialReqData struct {
+	BudatB string  `json:"BUDAT_B"` //起始日期
+	BudatE string  `json:"BUDAT_E"` //结束日期
+	Codes  []MATNR `json:"TMATNR"`  //物料编码
+	Type   MTART   `json:"TMTART"`  //物料类型
+	Group  []MATKL `json:"TMATKL"`  //物料组
+}
+type MATKL struct {
+	MATKL string `json:"MATKL"` //物料组
+}
+type MATNR struct {
+	Code string `json:"MATNR"` //物料编码
+}
+type MTART struct {
+	MTART string `json:"MTART"`
+}
+// 接口请求对象
+type MaterialReq struct {
+	Dest `json:"DEST"`
+	Data MaterialReqData `json:"DATA"`
+}
+// 接口返回对象
+type MaterialResp struct {
+	Dest `json:"DEST"`
+	Data Material `json:"DATA"`
+}
+type Material struct {
+	Master []MaterialDetail `json:"TMARA"`
+	Msger  SapRespMsg       `json:"MSGER"`
+}
+
+type MaterialDetail struct {
+	Code          string `json:"MATNR"` // 物料号
+	Type          string `json:"MTART"` // 物料类型
+	Group         string `json:"MATKL"` // 物料组
+	Description   string `json:"MAKTX"` // 物料描述
+	Unit          string `json:"MEINS"` // 基本计量单位
+	UnitNum       string `json:"UMREZ"` // 基本计量单位数量
+	SwitchUnit    string `json:"MEINH"` // 转换单位
+	SwitchUnitNum string `json:"UMREN"` // 转换单位数量
+	Name          string `json:"ZMINC"` // 物料名称
+	Model         string `json:"ZGUIG"` // 规格型号
+	Dflag         string `json:"LVORM"` // 物料删除标记
+	ModifyTime    string `json:"LAEDA"` // 修改日期
+}

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

@@ -0,0 +1,112 @@
+package http
+
+type OrderResp struct {
+	Dest `json:"DEST"`
+	Data OrderRespData `json:"DATA"`
+}
+
+type OrderRespData struct {
+	Status    string `json:"MSGTY"` //消息类型	S:成功,E:失败
+	MsgText   string `json:"MSGTX"` //消息文本	成功/失败信息
+	EqNumber  string `json:"EXT01"` //设备管理平台单号
+	SapNumber string `json:"EXT02"` //SAP单号
+
+}
+type SapOrderReq struct {
+	Dest `json:"DEST"`
+	Data SapOrderData `json:"DATA"`
+}
+type SapOrderData struct {
+	CompanyCode  string `json:"BUKRS"`  // 公司代码
+	SupplierCode string `json:"LIFNR"`  // 供应商编码
+	IsCancle     string `json:"ZKHFLG"` // 是否退货  "是:X
+	ProofType    string `json:"BSART"`  // 采购凭证类型 字典
+	OrderDate    string `json:"BEDAT"`  // 订单日期
+	Organization string `json:"EKORG"`  // 采购组织 字典
+	Group        string `json:"EKGRP"`  // 采购组 字典
+	PayCondition string `json:"ZTERM"`  // 付款条件 字典
+	CurrencyCode string `json:"WAERS"`  // 货币码	默认:CNY
+	EqSysCode    string `json:"ZEBELN"` // 订单编号
+
+	Detail []SapOrderDetail `json:"TEKPO"`
+}
+type SapOrderDetail struct {
+	IsOwn        string  `json:"PSTYP"` // 自有订单,"自有:空// 寄售:'K' "
+	MaterialCode string  `json:"MATNR"` //物料编
+	DeliveryDate string  `json:"EINDT"` // 交货码
+	Quantity     string  `json:"MENGE"` // 数量日期
+	Unit         string  `json:"MEINS"` // 单位
+	NetPrice     float64 `json:"NETPR"` // 净价
+	Per          string  `json:"PEINH"` // 每	默认:1
+	Factory      string  `json:"WERKS"` // 工厂
+	Location     string  `json:"LGORT"` //库存地点 字典
+	IsFree       string  `json:"UMSON"` //是否免费 "是:X
+	TaxCode      string  `json:"MWSKZ"` // 税码 字典
+	RowNumber    string  `json:"EBELP"` //行号
+	Dflag        string  `json:"LOEKZ"` // 删除标识 "是:L// 否:空"
+}
+
+type SrmOrderDetail struct {
+	RowNo              string  `json:"rowNo"`              //行号
+	MaterialCode       string  `json:"materialCode"`       //物料编码
+	MaterialName       string  `json:"materialName"`       //物料名称
+	MaterialDesc       string  `json:"materialDesc"`       //规格型号
+	Manufacturer       string  `json:"manufacturer"`       //厂家
+	MaterialGroupCode  string  `json:"materialGroupCode"`  //物料组
+	PurchaseCategory   string  `json:"purchaseCategory"`   //采购类别
+	OrderUnitCode      string  `json:"orderUnitCode"`      //订单单位
+	OrderQty           string  `json:"orderQty"`           //订单数量
+	IsFree             string  `json:"isFree"`             //是否免费
+	PriceBase          string  `json:"priceBase"`          //价格基数
+	PricingUnitCode    string  `json:"pricingUnitCode"`    //定价单位
+	TaxRateCode        string  `json:"taxRateCode"`        //税率
+	NonTaxPrice        float64 `json:"nonTaxPrice"`        //未税单价
+	TaxPrice           float64 `json:"taxPrice"`           //含税单价
+	NonTaxAmount       float64 `json:"nonTaxAmount"`       //未税金额
+	Tax                string  `json:"tax"`                //税额
+	TaxAmount          float64 `json:"taxAmount"`          //含税金额
+	DeliveryDate       string  `json:"deliveryDate"`       //交货日期
+	ConfirmDate        string  `json:"confirmDate"`        //确认交货日期
+	PlantCode          string  `json:"plantCode"`          //牧场工厂
+	StockLocationCode  string  `json:"stockLocationCode"`  //库存地点
+	QualityCheck       string  `json:"qualityCheck"`       //质检标识
+	IsReturn           string  `json:"isReturn"`           //是否退货
+	OverDeliveryLimit  string  `json:"overDeliveryLimit"`  //过量交货限度
+	ShortDeliveryLimit string  `json:"shortDeliveryLimit"` //交货不足限度
+	SourceNo           string  `json:"sourceNo"`           //来源单号
+	ContractCode       string  `json:"contractCode"`       //合同编码
+	Remark             string  `json:"remark"`             //备注
+	PaymentTermCode    string  `json:"paymentTermCode"`    //付款条件
+}
+
+type SrmOrderData struct {
+	PurchaseOrderType   string  `json:"purchaseOrderType"`   //  采购订单类型
+	PurchaseOrderDate   string  `json:"purchaseOrderDate"`   //  订单日期
+	PurchasingOrgCode   string  `json:"purchasingOrgCode"`   //  采购组织
+	PurchasingGroupCode string  `json:"purchasingGroupCode"` //  采购组
+	CompanyCode         string  `json:"companyCode"`         //  公司
+	VendorErpCode       string  `json:"vendorErpCode"`       //  供应商编码
+	SapCode             string  `json:"sapcode"`             //  SAP供应商编码
+	VendorName          string  `json:"vendorName"`          //  供应商名称
+	DeliveryTypeCode    string  `json:"deliveryTypeCode"`    //  配送类型
+	CurrencyCode        string  `json:"currencyCode"`        //  货币
+	ExchangeRate        string  `json:"exchangeRate"`        //  汇率
+	TotalNonTaxAmount   float64 `json:"totalNonTaxAmount"`   //  订单未税金
+	TotalTaxAmount      float64 `json:"totalTaxAmount"`      //  订单含税金额
+	IsReturn            string  `json:"isReturn"`            //  是否退货
+	Remark              string  `json:"remark"`              //  备注
+
+	ErpPurchaseOrderNo string           `json:"erpPurchaseOrderNo"` //  sap单号
+	PurchaseOrderNo    string           `json:"purchaseOrderNo"`    //  备注
+	Detail             []SrmOrderDetail `json:"purchaseOrderDetails"`
+}
+type SrmOrderReq struct {
+	Dest `json:"DEST"`
+	Data SrmOrderData `json:"DATA"`
+}
+
+type ManaulReq struct {
+	Code      string  `json:"code"`
+	Id        float64 `json:"id"`
+	Pastureid string  `json:"pastureid"`
+}

+ 83 - 0
apiserver/model/http/proof.go

@@ -0,0 +1,83 @@
+package http
+
+type ProofReq struct {
+	Dest `json:"DEST"`
+	Data ProofReqData `json:"DATA"`
+}
+
+type ProofReqData struct {
+	CreateTime string        `json:"BLDAT"` //业务日期
+	PostDate   string        `json:"BUDAT"` //过账日期
+	EqNumber   string        `json:"FRBNR"` //设备管理平台单号(入库、退货、领用、退库)
+	Detail     []ProofDetail `json:"MSEG"`
+}
+type ProofDetail struct {
+	RowNumber   string `json:"ZEILE"` //行号,入库单行号
+	Code        string `json:"MATNR"` //物料编码
+	Factory     string `json:"WERKS"` //工厂
+	Location    string `json:"LGORT"` //库存地点
+	Quantity    string `json:"MENGE"` //数量
+	Unit        string `json:"MEINS"` //单位
+	OrderNumber string `json:"EBELN"` //采购订单号,※仅采购入库业务传输,SAP的采购订单号
+	OrderRowNum string `json:"EBPLP"` //采购订单行项目号,※仅采购入库业务传输,SAP的采购订单行项目号
+	MoveType    string `json:"BWART"` //出入库类型 ,"采购入库:101// 退货:161// 领用:201// 退库:202(字典)// 报废:Z19"
+	SaveType    string `json:"SOBKZ"` //库存类型 特殊库存标识	"自有:空// 寄售:'K' " ,寄售表示零库存,1
+	CostCenter  string `json:"KOSTL"` //成本中心,※仅领用、退库时,输入,编码
+	AssetCode   string `json:"ANLN1"` //资产,※仅领用、退库时,财务资产码
+	AssetSon    string `json:"ANLN2"` //资产子项
+	Provider    string `json:"LIFNR"` //供应商编码,仅寄售入库业务时,输入
+	EXT01       string `json:"EXT01"` //科目
+}
+type ProofResp struct {
+	Dest Dest          `json:"DEST"`
+	Data ProofRespData `json:"DATA"`
+}
+
+type ProofRespData struct {
+	Status    string `json:"MSGTY"`
+	MsgText   string `json:"MSGTX"`
+	EqNumber  string `json:"EXT01"`
+	SapNumber string `json:"EXT02"`
+	Ext03     string `json:"EXT03"`
+}
+
+type BigPartRefundReq struct {
+	PastureID  int    `json:"pastureId"`
+	ProviderID int    `json:"providerId"`
+	UseForm    string `json:"useForm"`
+	EmployeID  int    `json:"employeId"`
+	CreateTime string `json:"createTime"`
+	Note       string `json:"note"`
+}
+
+type ProofPartReq struct {
+	ID           int    `json:"id"`
+	PastureID    int    `json:"pastureId"`
+	ProviderID   int    `json:"providerId"`
+	DepartmentID int    `json:"departmentId"`
+	EmpID        int    `json:"empId"`
+	EmployeID    int    `json:"employeId"`
+	Note         string `json:"note"`
+
+	ApplicatID int `json:"applicatId"`
+	LaidType   int `json:"laidType"` //入库类型
+	UseType    int `json:"useType"`  //出库类型
+
+	LaidCode   string `json:"laidCode"`   // 入库单号
+	PurchaseID string `json:"purchaseId"` // 入库单采购单号
+	BuyCode    string `json:"No1Id"`      // 入库单采购订单号
+	UseForm    string `json:"useForm"`    // 出库单号,退库单号,退货单号
+	OddCode    string `json:"oddCode"`    // 领用单号
+
+	StorageTime string `json:"storageTime"` // 入库时间
+	CreateTime  string `json:"createTime"`  // 退货时间
+	ReceiveTime string `json:"receiveTime"` // 出库时间
+	QuitDate    string `json:"quitDate"`    // 退库时间
+
+	PartCode  string
+	SapNumber string `json:"sapNumber"`
+}
+
+func (p *ProofPartReq) Validate() bool {
+	return true
+}

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

@@ -0,0 +1,58 @@
+package http
+
+import "kpt.xdmy/pkg/http"
+
+type Dest struct {
+	DestID    string `json:"DEST_ID"`
+	BussTp    string `json:"BUSS_TP"`
+	MessID    string `json:"MESS_ID"`
+	Status    string `json:"STATUS"`
+	MessText  string `json:"MESS_TEXT"`
+	StatusOs  string `json:"STATUS_OS"`
+	Url       string
+	MESSIDOS  string `json:"MESS_ID_OS"`
+	BUSSDOCOS string `json:"BUSS_DOC_OS"`
+}
+
+type SapResp struct {
+	Dest `json:"DEST"`
+	Data SapRespMsg `json:"DATA"`
+}
+
+type SapRespMsg struct {
+	Status      string `json:"MSGTY"`
+	Text        string `json:"MSGTX"`
+	ProofNumber string `json:"EXT01"`
+	ProofYear   string `json:"EXT02"`
+	EqNumber    string `json:"EXT03"`
+}
+
+var SapAuth *http.Auth
+
+type SapQueryReq struct {
+	Dest Dest            `json:"DEST"`
+	Data SapQueryReqData `json:"DATA"`
+}
+type SapQueryReqData struct {
+}
+type SapDest interface {
+	GetUrl() string
+	GetName() string
+	GetDest() *Dest
+}
+
+func (d *Dest) GetUrl() string {
+	return d.Url
+}
+func (d *Dest) GetName() string {
+	return d.BussTp
+}
+func (d *Dest) GetDest() *Dest {
+	return d
+}
+
+type SrmResp struct {
+	Success bool   `json:"success"`
+	Code    string `json:"code"`
+	Message string `json:"message"`
+}

+ 51 - 0
apiserver/model/http/supplier.go

@@ -0,0 +1,51 @@
+package http
+
+type SupplierReq struct {
+	Dest `json:"DEST"`
+	Data SupplierReqData `json:"DATA"`
+}
+
+type SupplierReqData struct {
+	BudatB      string   `json:"BUDAT_B"` //开始日期
+	BudatE      string   `json:"BUDAT_E"` //结束日期
+	CompanyCode string   `json:"BUKRS"`   //公司代码
+	Code        []string `json:"TLIFNR"`  //供应商编码
+	Types       []ZSORT  `json:"TZSORT"`  //供应商类型
+}
+type ZSORT struct {
+	Type string `json:"ZSORT"`
+}
+type SupplierResp struct {
+	Dest Dest         `json:"DEST"`
+	Data SupplierData `json:"DATA"`
+}
+type SupplierData struct {
+	Master []Supplier `json:"TLFA1"`
+	MSGER  SapRespMsg `json:"MSGER"`
+}
+
+type Supplier struct {
+	Code        string `json:"LIFNR"` //供应商编码
+	Name        string `json:"NAME1"` //供应商名称
+	ShortName   string `json:"SORTL"` //简称
+	Contact     string `json:"ZCONT"` //供应商联系人
+	Phone       string `json:"ZTELP"` //供应商联系方式
+	Mail        string `json:"ZEMAL"` //邮箱
+	Dflag       string `json:"LOEVM"` //删除标记
+	UpDate      string `json:"UDATE"` //修改日期
+	UpTime      string `json:"UTIME"` //修改时间
+	CompanyCode string `json:"BUKRS"` //公司代码
+
+	TAXNUMBER  string `json:"TAXNUMBER"`    //税号
+	COUNTRY    string `json:"COUNTRY"`      //国家
+	REGION     string `json:"REGION"`       //地区
+	POST_CODE1 string `json:"POST_CODE1"`   //邮编
+	ZSORT      string `json:"ZSORT"`        //供应商分类
+	CITY1      string `json:"CITY1"`        //城市
+	STREET     string `json:"STREET"`       //街道门牌号
+	BANKS      string `json:"BANK_COUNTRY"` //开户行国家
+	BANKL      string `json:"BANKL"`        //银行代码
+	BANKN      string `json:"BANKN"`        //银行账号
+	KOINH      string `json:"KOINH"`        //账户持有人
+	ZRESP      string `json:"ZRESP"`        //法人
+}

+ 58 - 0
apiserver/model/http/transfer.go

@@ -0,0 +1,58 @@
+package http
+
+type TransferReq struct {
+	Dest `json:"DEST"`
+	Data TransferMaster `json:"DATA"`
+}
+
+type TransferMaster struct {
+	TransferCode string           `json:"ZEBELN"` //调拨单号
+	OrderDate    string           `json:"BEDAT"`  //订单日期	YYYYMMDD
+	PostDate     string           `json:"BUDAT"`  //过账日期	YYYYMMDD
+	Group        string           `json:"EKGRP"`  //采购组
+	Detail       []TransferDetail `json:"TEKPO"`  //行项目
+}
+type TransferDetail struct {
+	RowNumber    string `json:"EBELP"` //行号
+	MaterialCode string `json:"MATNR"` //物料编码
+	Quantity     string `json:"MENGE"` //数量
+	Unit         string `json:"MEINS"` //单位
+	NetPrice     string `json:"NETPR"` //净价
+	DeliverDate  string `json:"EINDT"` // 交货日期
+	Per          string `json:"PEINH"` //每
+	OutFactory   string `json:"UMWRK"` //出厂工厂 ,对应sap的供应商
+	OutLocation  string `json:"UMLGO"` //出厂仓库
+	InFactory    string `json:"WERKS"` //入厂工厂,对应sap的供应商
+	InLocation   string `json:"LGORT"` //入厂仓库
+	TaxCode      string `json:"MWSKZ"` //税代码
+}
+
+type TransferResp struct {
+	Data TransferRespData `json:"DATA"`
+	Dest Dest             `json:"DEST"`
+}
+
+//type OrderResp struct {
+//	Dest `json:"DEST"`
+//	Data OrderRespData `json:"DATA"`
+//}
+//
+//type OrderRespData struct {
+//	Status    string `json:"MSGTY"` //消息类型	S:成功,E:失败
+//	MsgText   string `json:"MSGTX"` //消息文本	成功/失败信息
+//	EqNumber  string `json:"EXT01"` //设备管理平台单号
+//	SapNumber string `json:"EXT02"` //SAP单号
+//
+//}
+
+type TransferRespData struct {
+	Proof TransferProof `json:"EKKO"`
+}
+
+type TransferProof struct {
+	SapInCode      string `json:"EBELN"`  //					SAP调拨单号	SAP调入单号
+	SapOutCode     string `json:"VBELN"`  //					SAP交货单号	SAP调出单号
+	ProofCode      string `json:"MBLNR"`  //					SAP物料凭证号	SAP调入/调出凭证号
+	ProofYear      string `json:"MJAHR"`  //					SAP物料凭证年度	SAP调入/调出凭证号年度
+	EqTransferCode string `json:"ZEBELN"` //					设备管理平台的调拨单号
+}

+ 51 - 0
apiserver/model/log.go

@@ -0,0 +1,51 @@
+package model
+
+import (
+	"time"
+
+	"kpt.xdmy/pkg/util"
+)
+
+type SapLog struct {
+	ID        int       `gorm:"column:id" `
+	Flag      int       `gorm:"column:Flag"`
+	SysName   string    `gorm:"column:SysName"`
+	Name      string    `gorm:"column:Name"`
+	Url       string    `gorm:"column:Url"`
+	Status    string    `gorm:"column:Status"`
+	MsgText   string    `gorm:"column:MsgText"`
+	Param     string    `gorm:"column:Param"`
+	CreatedAt time.Time `gorm:"column:Created_At"`
+}
+
+type SapDetailLog struct {
+	ID        int       `gorm:"column:id " `
+	Name      string    `gorm:"column:name"`
+	Code      string    `gorm:"column:code"`
+	ErrorText string    `gorm:"column:error_text"`
+	CreatedAt time.Time `gorm:"column:created_at"`
+}
+
+type SapApiLog struct {
+	ID        int       `gorm:"column:id" `
+	Flag      int       `gorm:"column:flag"`
+	Name      string    `gorm:"column:name"`
+	Request   string    `gorm:"column:request"`
+	Response  string    `gorm:"column:response"`
+	Url       string    `gorm:"column:url"`
+	Status    string    `gorm:"column:status"`
+	MsgText   string    `gorm:"column:msgText"`
+	Param     string    `gorm:"column:param"`
+	CreatedAt time.Time `gorm:"column:created_at"`
+}
+
+func SapLogTime(name string) time.Time {
+	sql := "select created_at from saplog where name=@name and flag=1 order by id desc limit 1"
+	c := util.NewMap("name", name)
+	var t time.Time
+	d.Raw(sql, c, &t)
+	if t.IsZero() {
+		return time.Now().Add(-24 * time.Hour)
+	}
+	return t
+}

+ 42 - 0
apiserver/model/maintain.go

@@ -0,0 +1,42 @@
+package model
+
+import "time"
+
+type Maintain struct {
+	ID             int64     `gorm:"column:id"`
+	PastureId      string    `gorm:"column:pastureId" json:"pastureId"`
+	DepartmentId   int64     `gorm:"column:departmentId" json:"departmentId"`
+	RepairCode     string    `gorm:"column:repairCode" json:"repairCode"`
+	EqId           int64     `gorm:"column:eqId" json:"eqId"`
+	EqName         string    `gorm:"column:eqName" json:"eqName"`
+	EqCode         string    `gorm:"column:eqCode" json:"eqCode"`
+	EqClassId      int64     `gorm:"column:eqClassId" json:"eqClassId"`
+	PositionId     int64     `gorm:"column:positionId" json:"positionId"`
+	PhenomenId     int64     `gorm:"column:phenomenId" json:"phenomenId"`
+	Details        string    `gorm:"column:details" json:"details"`
+	RequesterId    int64     `gorm:"column:requesterId" json:"requesterId"`
+	RequestTime    time.Time `gorm:"column:requestTime" json:"requestTime"`
+	RequestImg     string    `gorm:"column:requestImg" json:"requestImg"`
+	PickId         int64     `gorm:"column:pickId" json:"pickId"`
+	OrderTime      time.Time `gorm:"column:orderTime" json:"orderTime"`
+	OrderStatue    int64     `gorm:"column:orderStatue" json:"orderStatue"`
+	DisposeId      int64     `gorm:"column:disposeId" json:"disposeId"`
+	DealTime       time.Time `gorm:"column:dealTime" json:"dealTime"`
+	DealImg        string    `gorm:"column:dealImg" json:"dealImg"`
+	StopTime       time.Time `gorm:"column:stopTime" json:"stopTime"`
+	RepairDept     int64     `gorm:"column:repairDept " json:"repairDept"`
+	CheckResult    string    `gorm:"column:checkResult" json:"checkResult"`
+	RepairNote     string    `gorm:"column:repairNote" json:"repairNote"`
+	WorkflowId     int64     `gorm:"column:workflowId" json:"workflowId"`
+	FlowCompeleted int64     `gorm:"column:flowCompeleted" json:"flowCompeleted"`
+	WorkflowNote   string    `gorm:"column:workflowNote" json:"workflowNote"`
+	ChargeId       int64     `gorm:"column:chargeId" json:"chargeId"`
+	ChargeDate     time.Time `gorm:"column:chargeDate" json:"chargeDate"`
+	UseChargeId    int64     `gorm:"column:useChargeId" json:"useChargeId"`
+	UseChargeDate  time.Time `gorm:"column:useChargeDate" json:"useChargeDate"`
+	RepairCost     float64   `gorm:"column:repairCost" json:"repairCost"`
+	Scores         string    `gorm:"column:scores" json:"scores"`
+	ShutdownDate   time.Time `gorm:"column:shutdownDate" json:"shutdownDate"`
+	ShutdownPerson int64     `gorm:"column:shutdownPerson" json:"shutdownPerson"`
+	ShutdownReason string    `gorm:"column:shutdownReason" json:"shutdownReason"`
+}

+ 90 - 0
apiserver/model/mcs.go

@@ -0,0 +1,90 @@
+package model
+
+import (
+	"fmt"
+	"time"
+)
+
+type McsPostDataResp struct {
+	Message string `json:"message"`
+	Error   int    `json:"error"`
+}
+type McsPostDataReq struct {
+	Method string  `json:"method"`
+	Data   McsData `json:"data"`
+	// can be null
+	Token string `json:"token"`
+	// no use param
+	Request bool  `json:"request"`
+	ID      int64 `json:"id"`
+}
+type McsData struct {
+	DevID    string `json:"devId"`
+	PeopleNo int    `json:"peopleNo"`
+	WorkNo   int    `json:"workNo"`
+	StorType int    `json:"storType"`
+}
+type McsVideo struct {
+	Id int `json:"id" gorm:"column:id"`
+
+	EmpId    int    `json:"empId" gorm:"column:empId"`
+	DeviceId string `json:"deviceId" gorm:"column:deviceId"`
+	UpkeepId int    `json:"upkeepId" gorm:"column:upkeepId"`
+
+	CreatedAt    time.Time `json:"createTime" gorm:"column:createTime"`
+	NewCreatedAt time.Time `json:"newCreateTime" gorm:"column:newCreateTime"`
+	Location     string    `json:"location"  gorm:"column:location"`
+	EndRecord    int       `json:"endRecord" gorm:"column:endRecord"`
+}
+type McsFilesRequest struct {
+	Did       string `json:"did"`
+	SessionId string `json:"sessionId"`
+	St        string `json:"St"`
+	Et        string `json:"et"`
+	Ft        string `json:"ft"`
+	Lt        string `json:"lt"`
+	Wno       int    `json:"wno"`
+	Pagesize  string `json:"pagesize"`
+	// can be null
+	Key  string `json:"key"`
+	Page string `json:"page"`
+}
+
+type McsFilesResponse struct {
+	Data []McsFile `json:"data"`
+}
+
+type McsFile struct {
+	Path      string `json:"path" gorm:"location"`
+	PeopleNo  string `json:"peopleNo" gorm:"empId"`
+	WorkNo    string `json:"workNo" gorm:"upkeepId"`
+	StartTime string `json:"startTime" gorm:"createTime"`
+	DevId     string `json:"devId" gorm:"deviceId"`
+	// EmpId     string `json:"empId" gorm:"empId"`
+}
+
+type McsAccount struct {
+	DeviceId string `json:"deviceId"`
+	UserID   string `json:"uId"`
+	Password string `json:"pwd"`
+}
+type McsResponse struct {
+	Success bool        `json:"success"`
+	Code    int         `json:"code"`
+	Message string      `json:"message"`
+	Data    interface{} `json:"data"`
+}
+
+func (m McsPostDataReq) Validate() bool {
+	return true
+}
+
+func (p *McsFilesRequest) Encode() string {
+	return "sessionId=" + p.SessionId + "&st=" + p.St + "&et=" + p.Et + "&did=" + p.Did + "&ft=" + p.Ft + "&lt=" + p.Lt + "&key=" + p.Key + "&page=" + p.Page + "&pagesize=" + p.Pagesize + "&wno=" + fmt.Sprintf("%d", p.Wno)
+}
+func (p *McsFilesRequest) Validate() bool {
+	return true
+}
+func (p *McsVideo) Validate() bool {
+	return true
+}

+ 54 - 0
apiserver/model/models.go

@@ -0,0 +1,54 @@
+package model
+
+import (
+	"github.com/pkg/errors"
+	"kpt.xdmy/apiserver/dao"
+	"kpt.xdmy/pkg/log"
+)
+
+var d *dao.Dao
+var m *Model
+
+type Model struct {
+	d *dao.Dao
+}
+
+func ModelInit(dao *dao.Dao) {
+	d = dao
+}
+
+// type Model struct {
+// 	ID int `json:"id" gorm:"column:id" `
+// }
+type Request interface {
+	Validate() bool
+}
+
+func First(pi interface{}) error {
+	e := d.DB.Where(pi).First(pi).Error
+	return errors.Wrapf(e, "model First ")
+}
+func Insert(pi interface{}) error {
+	e := d.DB.Create(pi).Error
+	return errors.Wrapf(e, "model Insert")
+}
+func Find(c map[string]interface{}, pi interface{}) error {
+	e := d.DB.Where(c).Find(pi).Error
+	log.ErrorJ(e, "model Find ", c)
+	return e
+}
+func Update(c interface{}, pi interface{}) error {
+	e := d.DB.Where(c).Updates(pi).Error
+	log.Errorf(e, "model Update %v, %v", c, pi)
+	return errors.Wrapf(e, "model Update ")
+}
+func UpdateAll(c map[string]interface{}, pi interface{}) error {
+	e := d.DB.Where(c).Select("*").Updates(pi).Error
+	log.ErrorJ(e, "model UpdateAll", c, pi)
+	return e
+}
+
+func Raw(sql string, args map[string]interface{}, r interface{}) error {
+	e := d.DB.Raw(sql, args).Scan(r).Error
+	return errors.Wrapf(e, "model Raw %s, %v", sql, args)
+}

+ 20 - 0
apiserver/model/oversee.go

@@ -0,0 +1,20 @@
+package model
+
+import "time"
+
+type Oversee struct {
+	ID             int       `gorm:"column:id" `
+	PastureName    string    `gorm:"column:pastureName" json:"pastureName"`
+	PastureId      int64     `gorm:"column:pastureId" json:"pastureId"`
+	DepartmentId   int64     `gorm:"column:departmentId" json:"departmentId"`
+	EqClassId      int64     `gorm:"column:eqClassId" json:"eqClassId"`
+	Maintenance    string    `gorm:"column:maintenance" json:"maintenance"` //指定维修人
+	Levelone       string    `gorm:"column:levelone" json:"levelone"`       //一级督办
+	Leveltwo       string    `gorm:"column:leveltwo" json:"leveltwo"`       //二级督办
+	Levelthree     string    `gorm:"column:levelthree" json:"levelthree"`   //三级督办
+	PushTime       int64     `gorm:"column:pushTime" json:"pushTime"`       //推送时间间隔
+	Entryperson    string    `gorm:"column:entryperson" json:"entryperson"` //录入人
+	InputTime      time.Time `gorm:"column:inputTime" json:"inputTime"`     //录入时间
+	EqClassName    string    `gorm:"column:eqClassName" json:"eqClassName"`
+	DepartmentName string    `gorm:"column:departmentName" json:"departmentName"`
+}

+ 35 - 0
apiserver/model/part.go

@@ -0,0 +1,35 @@
+package model
+
+import (
+	"time"
+)
+
+type Parts struct {
+	ID            int    `gorm:"column:id" `
+	PartCode      string `gorm:"column:partCode"`      // 物料号
+	Name          string `gorm:"column:name"`          // 物料名称
+	Specification string `gorm:"column:specification"` // 规格型号
+	Unit          string `gorm:"column:unit"`          // 基本计量单位
+	Category      string `gorm:"column:category"`      // 物料类型
+	Note          string `gorm:"column:note"`          // 物料描述
+
+	Purpose      string `gorm:"column:purpose"`
+	Category2    string `gorm:"column:category2"`
+	Category3    string `gorm:"column:category3"`
+	Picpath      string `gorm:"column:picpath"`
+	WorkflowNote string `gorm:"column:workflowNote"`
+	Msg          string `gorm:"column:msg"`
+
+	CategoryId     int       `gorm:"column:categoryId"`
+	CategoryId2    int       `gorm:"column:categoryId2"`
+	CategoryId3    int       `gorm:"column:categoryId3"`
+	IsCommon       int       `gorm:"column:isCommon"`
+	CreatePersonId int       `gorm:"column:createPersonId"`
+	Enable         int       `gorm:"column:enable"`
+	Statue         int       `gorm:"column:statue"`
+	ChargeId       int       `gorm:"column:chargeId"`
+	Issync         int       `gorm:"column:issync"`
+	CreatedAt      time.Time `gorm:"column:created_at"`
+	ModifyTime     time.Time `gorm:"column:modifyTime"`
+	ChargeDate     time.Time `gorm:"column:chargeDate"`
+}

+ 31 - 0
apiserver/model/part_purchase.go

@@ -0,0 +1,31 @@
+package model
+
+type Bigpartpurchase struct {
+	// 申购单
+	ID             int    `gorm:"column:id"`
+	CGChargeID     int    `gorm:"column:CGChargeId"`
+	CGChargedate   string `gorm:"column:CGChargedate"`
+	KGChargeID     int    `gorm:"column:KGChargeId"`
+	KGChargedate   string `gorm:"column:KGChargedate"`
+	BuyStatu       int    `gorm:"column:buyStatu"`
+	ChargeDate     string `gorm:"column:chargeDate"`
+	ChargeID       int    `gorm:"column:chargeId"`
+	CreateTime     string `gorm:"column:createTime"`
+	DepartmentID   int    `gorm:"column:departmentId"`
+	EmployeID      int    `gorm:"column:employeId"`
+	FlowCompeleted int    `gorm:"column:flowCompeleted"`
+	FlowworkNote   string `gorm:"column:flowworkNote"`
+	IsUrgent       int    `gorm:"column:isUrgent"`
+	MatchCode      string `gorm:"column:matchCode"`
+	OrderNumber    string `gorm:"column:orderNumber"`
+	PastureID      int    `gorm:"column:pastureId"`
+	ProviderID     int    `gorm:"column:providerId"`
+	Statue         int    `gorm:"column:statue"`
+	WorkflowID     int    `gorm:"column:workflowId"`
+	WorkflowNote   string `gorm:"column:workflowNote"`
+}
+
+// func (b *Bigpartpurchase) QueryByID(id int) {
+// 	m := util.NewMap("id", "1")
+// 	Fisrt("Bigpartpurchase", m, b)
+// }

+ 28 - 0
apiserver/model/part_reportery.go

@@ -0,0 +1,28 @@
+package model
+
+type PartRepertory struct {
+	Brand         string `gorm:"column:brand"`
+	BrandID       int    `gorm:"column:brandId"`
+	ContractID    int    `gorm:"column:contractId"`
+	Enable        int    `gorm:"column:enable"`
+	ID            int    `gorm:"column:id"`
+	Location      string `gorm:"column:location"`
+	LocationID    int    `gorm:"column:locationId"`
+	MaxRepertory  string `gorm:"column:maxRepertory"`
+	MinRepertory  string `gorm:"column:minRepertory"`
+	PartCode      string `gorm:"column:partCode"`
+	PartID        int    `gorm:"column:partId"`
+	PartName      string `gorm:"column:partName"`
+	PastureID     int    `gorm:"column:pastureId"`
+	PrecontractID string `gorm:"column:precontractId"`
+	Price         string `gorm:"column:price"`
+	ProviderID    int    `gorm:"column:providerId"`
+	ProviderNames string `gorm:"column:providerNames"`
+	Reportery     string `gorm:"column:reportery"`
+	Specification string `gorm:"column:specification"`
+	Unit          string `gorm:"column:unit"`
+}
+
+func (p PartRepertory) TableName() string {
+	return "Part_repertory"
+}

+ 143 - 0
apiserver/model/partlaid.go

@@ -0,0 +1,143 @@
+package model
+
+import (
+	"time"
+
+	"github.com/pkg/errors"
+	"kpt.xdmy/pkg/util"
+)
+
+type BigPartLaid struct {
+	// 入库单
+	CreatDate   time.Time `gorm:"column:creatDate"`
+	EmpID       int       `gorm:"column:empId"`
+	ID          int       `gorm:"column:id"`
+	Issync      int       `gorm:"column:issync"`
+	LaidCode    string    `gorm:"column:laidCode"`
+	LaidType    int       `gorm:"column:laidType"`
+	Msg         string    `gorm:"column:msg"`
+	PastureID   int       `gorm:"column:pastureId"`
+	PurchaseID  string    `gorm:"column:purchaseId"`
+	StorageTime time.Time `gorm:"column:storageTime"`
+	// add
+	ProofCode string ` gorm:"column:proofCode"`
+	ProofYear string ` gorm:"column:proofYear"`
+}
+
+type PartLaid struct {
+	BigID             int         `gorm:"column:bigId"`
+	BigBuyerId        interface{} ` gorm:"column:bigBuyerId"`
+	BrandID           int         `gorm:"column:brandId"`
+	BuydetailID       int         `gorm:"column:buydetailId"`
+	ContractID        int         `gorm:"column:contractId"`
+	LocationID        int         `gorm:"column:locationId"`
+	PartID            int         `gorm:"column:partId"`
+	ProviderID        int         `gorm:"column:providerId"`
+	PastureID         int         `gorm:"column:pastureId"`
+	BuyAmount         int         `gorm:"column:buyAmount"`
+	ID                int         `gorm:"column:id"`
+	Note              string      `gorm:"column:note"`
+	OrderNumber       string      `gorm:"column:orderNumber"`
+	PartCode          string      `gorm:"column:partCode"`
+	PartName          string      `gorm:"column:partName"`
+	Price             float32     `gorm:"column:price"`
+	Purpose           string      `gorm:"column:purpose"`
+	ReceivedAmount    string      `gorm:"column:receivedAmount"`
+	Reportery         string      `gorm:"column:reportery"`
+	Specification     string      `gorm:"column:specification"`
+	StorageAmount     float32     `gorm:"column:storageAmount"`
+	StorageType       int         `gorm:"column:storageType"`
+	SubscribePasture  string      `gorm:"column:subscribePasture"`
+	SubscribeProvider string      `gorm:"column:subscribeProvider"`
+	SumPrice          float32     `gorm:"column:sumPrice"`
+	Unit              string      `gorm:"column:unit"`
+	Dflag             int         `gorm:"column:dflag"`
+	RowNumber         int         `gorm:"column:rowNumber"`
+	IsZeroStock       int         `gorm:"column:isZeroStock"`
+}
+
+func (p *PartLaid) ToProofPart() (r *ProofPart, e error) {
+	mb := &Brand{ID: p.BrandID}
+	mp := &Provider{ID: p.ProviderID}
+	mw := &Warehouse{ID: p.LocationID}
+	e = First(mb)
+	e = First(mp)
+	e = First(mw)
+	if e != nil {
+		e = errors.Wrapf(e, " PartLaid ToProofPart()")
+		return
+	}
+	r = &ProofPart{
+		RowNumber:     p.RowNumber,
+		PartCode:      p.PartCode,
+		PartName:      p.PartName,
+		Specification: p.Specification,
+		PartBrand:     mb.BrandName,
+		Supplier:      mp.ProviderName,
+		Warehouse:     mw.WarehoseCode,
+		ChangeCount:   p.StorageAmount,
+		UnitPrice:     p.Price,
+		TotalPrice:    p.SumPrice,
+	}
+	return
+}
+
+func (p *BigPartLaid) NewProofPart() (mps []ProofPart, e error) {
+	path := " BigPartLaid NewProof()"
+
+	c := util.NewMap("bigid", p.ID)
+	m := make([]PartLaid, 0)
+	if e = Find(c, &m); e != nil {
+		e = errors.Wrapf(e, path)
+		return
+	}
+	mps = make([]ProofPart, 0)
+	mp := new(ProofPart)
+	for i, v := range m {
+		if mp, e = v.ToProofPart(); e != nil {
+			continue
+		}
+		mp.RowNumber = i
+		mps = append(mps, *mp)
+	}
+	return
+}
+
+func (p *BigPartLaid) NewProof(pa *ProofReq) {
+	pa.ChargeDate = p.CreatDate.Format("2006-01-02")
+	pa.ProofCode = p.ProofCode
+	pa.ProofYear = p.CreatDate.Format("2006")
+	pa.OrderNumberId = p.ID
+}
+
+type PartLaidStr struct {
+	BigID             interface{} `gorm:"column:bigId"`
+	BigBuyerId        interface{} ` gorm:"column:bigBuyerId"`
+	BrandID           interface{} `gorm:"column:brandId"`
+	BuydetailID       interface{} `gorm:"column:buydetailId"`
+	ContractID        interface{} `gorm:"column:contractId"`
+	LocationID        interface{} `gorm:"column:locationId"`
+	PartID            interface{} `gorm:"column:partId"`
+	ProviderID        interface{} `gorm:"column:providerId"`
+	PastureID         interface{} `gorm:"column:pastureId"`
+	BuyAmount         interface{} `gorm:"column:buyAmount"`
+	ID                interface{} `gorm:"column:id"`
+	Note              interface{} `gorm:"column:note"`
+	OrderNumber       interface{} `gorm:"column:orderNumber"`
+	PartCode          interface{} `gorm:"column:partCode"`
+	PartName          interface{} `gorm:"column:partName"`
+	Price             interface{} `gorm:"column:price"`
+	Purpose           interface{} `gorm:"column:purpose"`
+	ReceivedAmount    interface{} `gorm:"column:receivedAmount"`
+	Reportery         interface{} `gorm:"column:reportery"`
+	Specification     interface{} `gorm:"column:specification"`
+	StorageAmount     interface{} `gorm:"column:storageAmount"`
+	StorageType       interface{} `gorm:"column:storageType"`
+	SubscribePasture  interface{} `gorm:"column:subscribePasture"`
+	SubscribeProvider interface{} `gorm:"column:subscribeProvider"`
+	SumPrice          interface{} `gorm:"column:sumPrice"`
+	Unit              interface{} `gorm:"column:unit"`
+	Dflag             interface{} `gorm:"column:dflag"`
+	RowNumber         interface{} `gorm:"column:rowNumber"`
+	IsZeroStock       interface{} `gorm:"column:isZeroStock"`
+}

+ 189 - 0
apiserver/model/partuse.go

@@ -0,0 +1,189 @@
+package model
+
+import (
+	"time"
+
+	"github.com/pkg/errors"
+	"kpt.xdmy/pkg/util"
+)
+
+type BigPartUse struct {
+	ApplicatID   int `gorm:"column:applicatId"`
+	DepartmentID int `gorm:"column:departmentId"`
+	EmpID        int `gorm:"column:empId"`
+	FClassID     int `gorm:"column:fClassId"`
+	ID           int `gorm:"column:id"`
+	MaintainID   int `gorm:"column:maintainId"`
+	PastureID    int `gorm:"column:pastureId"`
+	WorkflowID   int `gorm:"column:workflowId"`
+	PlanUpkeepID int `gorm:"column:planUpkeepId"`
+	SClassID     int `gorm:"column:sClassId"`
+
+	ReceiveTime    time.Time `gorm:"column:receiveTime"` //'领用时间'
+	CreatDate      time.Time `gorm:"column:creatDate"`
+	FlowworkNote   string    `gorm:"column:flowworkNote"`
+	ListType       string    `gorm:"column:listType"`
+	OddCode        string    `gorm:"column:oddCode"`
+	RefuseStatue   int       `gorm:"column:refuseStatue"`
+	Msg            string    `gorm:"column:msg"`
+	FlowCompeleted int       `gorm:"column:flowCompeleted"`
+	Issync         int       `gorm:"column:issync"`
+	Note           string    `gorm:"column:note"`
+	SumPrice       string    `gorm:"column:sumPrice"`
+	UseType        int       `gorm:"column:useType"`
+	UseForm        string    `gorm:"column:useForm"`
+	UseStatus      int       `gorm:"column:useStatus"`
+	ProofCode      string    `gorm:"column:proofCode"`
+}
+
+type PartUse struct {
+	ID           int    `gorm:"column:id"`
+	BigID        int    `gorm:"column:bigId"`
+	BrandID      int    `gorm:"column:brandId"`
+	ContractID   int    `gorm:"column:contractId"`
+	LocationID   int    `gorm:"column:locationId"`
+	MaintainID   int    `gorm:"column:maintainId"`
+	PlanUpkeepID int    `gorm:"column:planUpkeepId"`
+	PartID       int    `gorm:"column:partId"`
+	ProID        int    `gorm:"column:proId"`
+	EqCode       string `gorm:"column:eqCode"`
+	EqID         int    `gorm:"column:eqId"`
+
+	Cpm            int     `gorm:"column:CPM"`
+	CheckoutNumber float32 `gorm:"column:checkoutNumber"` // 出库数量
+	EqName         string  `gorm:"column:eqName"`
+	IsRefuse       int     `gorm:"column:isRefuse"`
+	Note           string  `gorm:"column:note"`
+	PartCode       string  `gorm:"column:partCode"`
+	PartName       string  `gorm:"column:partName"`
+	Price          float32 `gorm:"column:price"` // 单价
+	ProName        string  `gorm:"column:proName"`
+	QuitNumber     string  `gorm:"column:quitNumber"`
+	RefuseNumber   int     `gorm:"column:refuseNumber"`
+	RefuseStatue   int     `gorm:"column:refuseStatue"`
+	Reportery      string  `gorm:"column:reportery"`
+	Specification  string  `gorm:"column:specification"`
+	SumPrice       float32 `gorm:"column:sumPrice"` // 总价
+	Unit           string  `gorm:"column:unit"`
+	UseNumber      string  `gorm:"column:useNumber"`
+	UseTypeV       string  `gorm:"column:useTypeV"`
+	Dflag          int     `gorm:"column:dflag"`
+	RowNumber      int     `gorm:"column:rowNumber"`
+}
+
+func (p *PartUse) ToProofPart() (r *ProofPart, e error) {
+	mb := &Brand{ID: p.BrandID}
+	mw := &Warehouse{ID: p.LocationID}
+	e = First(mb)
+	e = First(mw)
+	if e != nil {
+		e = errors.Wrapf(e, "model PartLaid ToProofPart()")
+		return
+	}
+	r = &ProofPart{
+		RowNumber:     p.RowNumber,
+		PartCode:      p.PartCode,
+		PartName:      p.PartName,
+		Specification: p.Specification,
+		PartBrand:     mb.BrandName,
+		Supplier:      p.ProName,
+		Warehouse:     mw.WarehoseCode,
+		ChangeCount:   p.CheckoutNumber,
+		UnitPrice:     p.Price,
+		TotalPrice:    p.SumPrice,
+	}
+	return
+}
+
+func (p *BigPartUse) NewProof(pa *ProofReq) {
+	pa.ChargeDate = p.ReceiveTime.Format("2006-01-02")
+	pa.ProofCode = p.UseForm
+	pa.ProofYear = p.ReceiveTime.Format("2006")
+	pa.OrderNumberId = p.ID
+}
+
+func (p *BigPartUse) NewProofPart() (mps []ProofPart, e error) {
+	path := " BigPartUse NewProofPart()"
+
+	c := util.NewMap("bigid", p.ID)
+	m := make([]PartUse, 0)
+	if e = Find(c, &m); e != nil {
+		e = errors.Wrapf(e, path)
+		return
+	}
+	mps = make([]ProofPart, 0)
+	mp := new(ProofPart)
+	for i, v := range m {
+		mp, e = v.ToProofPart()
+		mp.RowNumber = i
+		mps = append(mps, *mp)
+	}
+	if e != e {
+		e = errors.Wrapf(e, path)
+	}
+	return
+}
+
+type BigPartUseStr struct {
+	ApplicatID   interface{} `gorm:"column:applicatId"`
+	DepartmentID interface{} `gorm:"column:departmentId"`
+	EmpID        interface{} `gorm:"column:empId"`
+	FClassID     interface{} `gorm:"column:fClassId"`
+	ID           interface{} `gorm:"column:id"`
+	MaintainID   interface{} `gorm:"column:maintainId"`
+	PastureID    interface{} `gorm:"column:pastureId"`
+	WorkflowID   interface{} `gorm:"column:workflowId"`
+	PlanUpkeepID interface{} `gorm:"column:planUpkeepId"`
+	SClassID     interface{} `gorm:"column:sClassId"`
+
+	ReceiveTime    interface{} `gorm:"column:receiveTime"` //'领用时间'
+	CreatDate      interface{} `gorm:"column:creatDate"`
+	FlowworkNote   interface{} `gorm:"column:flowworkNote"`
+	ListType       interface{} `gorm:"column:listType"`
+	OddCode        interface{} `gorm:"column:oddCode"`
+	RefuseStatue   interface{} `gorm:"column:refuseStatue"`
+	Msg            interface{} `gorm:"column:msg"`
+	FlowCompeleted interface{} `gorm:"column:flowCompeleted"`
+	Issync         interface{} `gorm:"column:issync"`
+	Note           interface{} `gorm:"column:note"`
+	SumPrice       interface{} `gorm:"column:sumPrice"`
+	UseType        interface{} `gorm:"column:useType"`
+	UseForm        interface{} `gorm:"column:useForm"`
+	UseStatus      interface{} `gorm:"column:useStatus"`
+	ProofCode      interface{} `gorm:"column:proofCode"`
+}
+
+type PartUseStr struct {
+	ID           interface{} `gorm:"column:id"`
+	BigID        interface{} `gorm:"column:bigId"`
+	BrandID      interface{} `gorm:"column:brandId"`
+	ContractID   interface{} `gorm:"column:contractId"`
+	LocationID   interface{} `gorm:"column:locationId"`
+	MaintainID   interface{} `gorm:"column:maintainId"`
+	PlanUpkeepID interface{} `gorm:"column:planUpkeepId"`
+	PartID       interface{} `gorm:"column:partId"`
+	ProID        interface{} `gorm:"column:proId"`
+	EqCode       interface{} `gorm:"column:eqCode"`
+	EqID         interface{} `gorm:"column:eqId"`
+
+	Cpm            interface{} `gorm:"column:CPM"`
+	CheckoutNumber interface{} `gorm:"column:checkoutNumber"` // 出库数量
+	EqName         interface{} `gorm:"column:eqName"`
+	IsRefuse       interface{} `gorm:"column:isRefuse"`
+	Note           interface{} `gorm:"column:note"`
+	PartCode       interface{} `gorm:"column:partCode"`
+	PartName       interface{} `gorm:"column:partName"`
+	Price          interface{} `gorm:"column:price"` // 单价
+	ProName        interface{} `gorm:"column:proName"`
+	QuitNumber     interface{} `gorm:"column:quitNumber"`
+	RefuseNumber   interface{} `gorm:"column:refuseNumber"`
+	RefuseStatue   interface{} `gorm:"column:refuseStatue"`
+	Reportery      interface{} `gorm:"column:reportery"`
+	Specification  interface{} `gorm:"column:specification"`
+	SumPrice       interface{} `gorm:"column:sumPrice"` // 总价
+	Unit           interface{} `gorm:"column:unit"`
+	UseNumber      interface{} `gorm:"column:useNumber"`
+	UseTypeV       interface{} `gorm:"column:useTypeV"`
+	Dflag          interface{} `gorm:"column:dflag"`
+	RowNumber      interface{} `gorm:"column:rowNumber"`
+}

+ 34 - 0
apiserver/model/pasture.go

@@ -0,0 +1,34 @@
+package model
+
+type Pasture struct {
+	// 牧场
+	ID         int    `gorm:"column:id" gorm:"column:id" `
+	Address    string `gorm:"column:address"`
+	Center     string `gorm:"column:center"`
+	CenterID   int    `gorm:"column:center_id"`
+	CenterSort int    `gorm:"column:center_sort"`
+
+	EmployeeID      int    `gorm:"column:employeeId"`
+	Enablesync      int    `gorm:"column:enablesync"`
+	IsDel           int    `gorm:"column:isDel"`
+	Latitude        string `gorm:"column:latitude"`
+	Longitude       string `gorm:"column:longitude"`
+	Name            string `gorm:"column:name"`
+	Note            string `gorm:"column:note"`
+	PastureNumber   string `gorm:"column:pastureNumber"`
+	Prcode          string `gorm:"column:prcode"`
+	Region          string `gorm:"column:region"`
+	RegionID        int    `gorm:"column:region_id"`
+	ShortName       string `gorm:"column:shortName"`
+	Sort            int    `gorm:"column:sort"`
+	PurchasingGroup string `gorm:"column:purchasing_group"`
+
+	CompanyCode string `gorm:"column:company_code"` //公司代码
+	CompanyName string `gorm:"column:company_name"` //公司代码
+	FactoryCode string `gorm:"column:factory_code"` //工厂
+	FactoryName string `gorm:"column:factory_name"` //工厂
+
+	ParchaseOrganization string `gorm:"column:parchase_organization"`
+	// PurchasingGroup      string `gorm:"column:purchasing_group"` //采购组
+	// CompanyName   string `gorm:"column:companyName"`
+}

+ 39 - 0
apiserver/model/proof.go

@@ -0,0 +1,39 @@
+package model
+
+type ProofReq struct {
+	ProofCode     string      `json:"materialCode"`  // 物料凭证号
+	ProofYear     string      `json:"proofYear"`     // 物料凭证年度
+	ChargeDate    string      `json:"chargeDate"`    // 凭证中的过帐日期 YYYYMMDD
+	OrderNumber   string      `json:"orderNumber"`   // 设备管理平台单号
+	OrderNumberId int         `json:"orderNumberId"` // 设备管理平台单号ID
+	HasTicket     int         `json:"hasTicket"`     // 是否已开票退货单	"是: X ,※仅采购业务需要
+	RowsNumber    []int       `json:"rowsNumber"`    // 设备管理平台行号
+	NumberType    int         `json:"NumberType"`    // 1:采购入库,2:采购退货,3:出库,4:退库
+	ProofPart     []ProofPart `json:"parts"`         // 备件信息
+}
+
+// 序号  备件编号  备件名称  备件规格    备件品牌  供应商    库位    变更数量  单价  总价
+type Proof struct {
+	MaterialCode string   `gorm:"column:materialCode"` // 物料凭证号
+	ProofYear    string   `gorm:"column:proofYear"`    // 物料凭证年度
+	ChargeDate   string   `gorm:"column:chargeDate"`   // 凭证中的过帐日期 YYYYMMDD
+	OrderNumber  string   `gorm:"column:orderNumber"`  // 设备管理平台单号
+	HasTicket    string   `gorm:"column:hasTicket"`    // 是否已开票退货单	"是: X ,※仅采购业务需要
+	RowsNumber   []string `gorm:"column:rowsNumber"`   // 设备管理平台行号
+}
+type ProofPart struct {
+	RowNumber     int     `json:"rowNumber"`     // 行号
+	PartCode      string  `json:"partCode"`      // 备件编号
+	PartName      string  `json:"partName"`      // 备件名称
+	Specification string  `json:"specification"` // 备件规格
+	PartBrand     string  `json:"partBrand"`     // 备件品牌
+	Supplier      string  `json:"supplier"`      // 供应商
+	Warehouse     string  `json:"warehouse"`     // 库位
+	ChangeCount   float32 `json:"changeCount"`   // 变更数量
+	UnitPrice     float32 `json:"unitPrice"`     // 单价
+	TotalPrice    float32 `json:"totalPrice"`    // 总价
+}
+
+func (p *ProofReq) Validate() bool {
+	return true
+}

+ 33 - 0
apiserver/model/provider.go

@@ -0,0 +1,33 @@
+package model
+
+import "time"
+
+type Provider struct {
+	ID             int    `gorm:"column:id" json:"id" `
+	ProviderIntro  string `gorm:"column:providerIntro"`  //供应商全称
+	ProviderName   string `gorm:"column:providerName"`   //供应商简称
+	ProviderNumber string `gorm:"column:providerNumber"` //供应商编码
+	Email          string `gorm:"column:email"`          //邮箱
+	Linkman        string `gorm:"column:linkman"`        //联系人
+	Telphone       string `gorm:"column:telphone"`       //联系电话
+	CompanyCode    string `gorm:"column:company_code"`   //公司代码
+	SortName       string `gorm:"column:sort_name"`      //供应商分类
+	SapCode        string `gorm:"column:sapcode"`        //sap供应商编码
+
+	Enable int `gorm:"column:enable"` //是否启用
+
+	PastureId        int       `gorm:"column:pastureId"`
+	FlexPrice        int       `gorm:"column:flexPrice"`
+	BusinessLicense  string    `gorm:"column:businessLicense"`
+	OrganizationCode string    `gorm:"column:organizationCode"`
+	OpenLicence      string    `gorm:"column:openLicence"`
+	IRSregister      string    `gorm:"column:IRSregister"`
+	CreateTime       time.Time `gorm:"column:createTime"`
+	ModifyTime       time.Time `gorm:"column:modifyTime"`
+	CreatedAt        time.Time `gorm:"column:created_at"`
+	UpdatedAt        time.Time `gorm:"column:updated_at"`
+}
+
+func (Provider) TableName() string {
+	return "provider"
+}

+ 1 - 0
apiserver/model/refunddetail.go

@@ -0,0 +1 @@
+package model

+ 74 - 0
apiserver/model/transfer.go

@@ -0,0 +1,74 @@
+package model
+
+import "time"
+
+type TransferParam struct {
+	ID       int    `gorm:"column:id"` //调拨单id
+	Statue   int    `gorm:"column:statue"`
+	LaidCode string `gorm:"column:laidCode"` // 入库单号
+	UseCode  string `gorm:"column:useCode"`
+}
+
+//调拨单
+type BigPartTransfer struct {
+	//调拨单
+	ID          int `gorm:"column:id"`
+	EmpID       int `gorm:"column:empId"`
+	InPastureID int `gorm:"column:inPastureId"` //调入牧场
+	PastureID   int `gorm:"column:pastureId"`   //调出牧场
+
+	ApplyCode string `gorm:"column:applyCode"` // 调拨单号
+	LaidCode  string `gorm:"column:laidCode"`  //入库单号
+	UseCode   string `gorm:"column:useCode"`   //出库单号
+	Emp       string `gorm:"column:emp"`
+
+	ApplyDate time.Time `gorm:"column:applyDate"`
+	CreatDate time.Time `gorm:"column:creatDate"`
+	Statue    int       `gorm:"column:statue"` //'调拨状态(0调拨中,1调拨完成,2驳回中,3已退回)',
+	DeptId    int       `gorm:"column:deptId"`
+	SapStatus int       `gorm:"column:sapStatus"` // sap同步状态
+	SapText   string    `gorm:"column:sapText"`   //同步信息
+}
+type PartTransfer struct {
+	// 调拨明细
+	ID            int    `gorm:"column:id"`
+	BigID         int    `gorm:"column:bigId"`
+	BrandID       int    `gorm:"column:brandId"`
+	PartID        int    `gorm:"column:partId"`
+	PartRepID     int    `gorm:"column:partRepId"`
+	PastureID     int    `gorm:"column:pastureId"`
+	ProviderID    int    `gorm:"column:providerId"`
+	BrandName     string `gorm:"column:brandName"`
+	Amount        string `gorm:"column:amount"`
+	Note          string `gorm:"column:note"`
+	PartCode      string `gorm:"column:partCode"`
+	PartName      string `gorm:"column:partName"`
+	Price         string `gorm:"column:price"`
+	ProviderName  string `gorm:"column:providerName"`
+	Specification string `gorm:"column:specification"`
+	SumPrice      string `gorm:"column:sumPrice"`
+	Unit          string `gorm:"column:unit"`
+	RowNumber     int    `json:"rowNumber" gorm:"column:rowNumber"`
+}
+
+type PartTransferStr struct {
+	// 调拨明细
+	ID            interface{} `gorm:"column:id"`
+	BigID         interface{} `gorm:"column:bigId"`
+	BrandID       interface{} `gorm:"column:brandId"`
+	PartID        interface{} `gorm:"column:partId"`
+	PartRepID     interface{} `gorm:"column:partRepId"`
+	PastureID     interface{} `gorm:"column:pastureId"`
+	ProviderID    interface{} `gorm:"column:providerId"`
+	BrandName     interface{} `gorm:"column:brandName"`
+	Amount        interface{} `gorm:"column:amount"`
+	Note          interface{} `gorm:"column:note"`
+	PartCode      interface{} `gorm:"column:partCode"`
+	PartName      interface{} `gorm:"column:partName"`
+	Price         interface{} `gorm:"column:price"`
+	ProviderName  interface{} `gorm:"column:providerName"`
+	Specification interface{} `gorm:"column:specification"`
+	SumPrice      interface{} `gorm:"column:sumPrice"`
+	Unit          interface{} `gorm:"column:unit"`
+	RowNumber     interface{} `json:"rowNumber" gorm:"column:rowNumber"`
+}

+ 8 - 0
apiserver/model/user.go

@@ -0,0 +1,8 @@
+package model
+
+type User struct {
+	ID       int    `gorm:"column:id" `
+	Username string `gorm:"column:username" json:"username"`
+	Empid    int64  `gorm:"column:empid" json:"empid"`
+	EmpName  string `gorm:"column:empname" json:"empname"`
+}

+ 16 - 0
apiserver/model/warehouse.go

@@ -0,0 +1,16 @@
+package model
+
+type Warehouse struct {
+	Enable        int    `gorm:"column:enable"`
+	ID            int    `gorm:"column:id"`
+	IsWhPostion   int    `gorm:"column:isWhPostion"`
+	PastureID     int    `gorm:"column:pastureId"`
+	Pid           int    `gorm:"column:pid"`
+	Remark        string `gorm:"column:remark"`
+	Section       int    `gorm:"column:section"`
+	Sort          int    `gorm:"column:sort"`
+	WarehoseCode  string `gorm:"column:warehoseCode"`
+	WarehosetName string `gorm:"column:warehosetName"`
+	SapCode       string `gorm:"column:sapcode"`
+	Status        int    `gorm:"column:status"`
+}

BIN
apiserver/routers/.DS_Store


+ 168 - 0
apiserver/routers/api/api.go

@@ -0,0 +1,168 @@
+package api
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/jmoiron/sqlx"
+	"github.com/pkg/errors"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"kpt.xdmy/apiserver/service"
+	"kpt.xdmy/pkg/log"
+)
+
+var svc *service.Service
+
+func Init(s *service.Service) {
+	svc = s
+}
+
+type nextServiceInfo struct {
+	laidType int64
+	useType  int64
+}
+
+func NextService(p []map[string]interface{}, tx *sqlx.Tx, vendor int64) error {
+	isTransfer := false
+	for _, v := range p {
+		if v["name"] == nil || v["parammaps"] == nil {
+			continue
+		}
+		sqlname := v["name"].(string)
+		if sqlname == "updateBigPartTransfer" {
+			isTransfer = true
+		} else if sqlname == "insertBigPartUse" {
+			pf := v["parammaps"].(map[string]interface{})
+			if pf["useType"].(float64) != 5 {
+				if _, ok := pf["oddCode"]; !ok {
+					return errors.New("oddCode 不能为空 !!!")
+				}
+			}
+		}
+	}
+
+	if isTransfer {
+		var bigPartTransferid float64
+		insertBigPartlaid := false
+		for _, v := range p {
+			if v["name"] == nil || v["parammaps"] == nil {
+				continue
+			}
+			pf := v["parammaps"].(map[string]interface{})
+			sqlname := v["name"].(string)
+			if sqlname == "updateBigPartTransfer" {
+				bigPartTransferid = pf["id"].(float64)
+			} else if sqlname == "insertBigPartlaid" {
+				insertBigPartlaid = true
+			}
+		}
+
+		if bigPartTransferid > 0 && insertBigPartlaid {
+			//if laidType == 2 {
+			partTransfer := make([]*model.PartTransferStr, 0)
+			partsByte, err := service.GetDataList(tx, `select * from parttransfer  where bigid = ? `, []interface{}{bigPartTransferid})
+			if err != nil {
+				return errors.New("无调拨信息!!!")
+			}
+			if partsByte != nil {
+				err := json.Unmarshal(partsByte, &partTransfer)
+				if err != nil {
+					return errors.New("调拨信息转码出错!!!")
+				}
+			}
+
+			for _, part := range partTransfer {
+				prByte, err := service.MapStr(tx, `select *  from part_repertory where id = ? and  reportery >= ? `, part.PartRepID, part.Amount)
+				if err != nil {
+					return errors.New("库存信息出错!!!")
+				}
+				if prByte != nil {
+					data := make(map[string]interface{})
+					err := json.Unmarshal(prByte, &data)
+					if err != nil {
+						return errors.New("库存信息出错!!!")
+					}
+					if _, ok := data["id"]; !ok {
+						return errors.New("库存信息出错!!!")
+					}
+
+				} else {
+					return errors.New("库存信息出错!!!")
+				}
+				_, err = tx.Exec(` update part_repertory set reportery = reportery - ?  where id = ? `, part.Amount, part.PartRepID)
+				if err != nil {
+					return errors.New("库存调整出错!!!")
+				}
+			}
+
+			if vendor == 1 {
+				err = service.ManualTransfer(bigPartTransferid, tx)
+				if err != nil {
+					return err
+				}
+			}
+		}
+	} else if vendor == 1 {
+
+		for _, v := range p {
+			if v["name"] == nil || v["parammaps"] == nil {
+				continue
+			}
+			pf := v["parammaps"].(map[string]interface{})
+			sqlname := v["name"].(string)
+			fmt.Println(sqlname)
+			switch sqlname {
+			case "insertBigPartlaid":
+				laidType := pf["laidType"].(float64)
+				log.Info(v)
+
+				//b, _ := json.Marshal(p)
+				//pnext := new(nextServiceInfo)
+				//json.Unmarshal(b, &pnext)
+
+				//switch pnext.laidType {
+				//手动出库没有采购单号,所以不能传SAP
+				//case 0:
+				// 入库-申购、采购(申购、线上、寄售)
+				if laidType != 2 {
+					pr := new(http.ProofPartReq)
+					pr.LaidCode = pf["laidCode"].(string)
+					pr.StorageTime = pf["storageTime"].(string)
+					err := svc.LaidProof(pr, tx)
+					if err != nil {
+						return err
+					}
+				}
+			case "insertBigPartUse":
+				//b, _ := json.Marshal(p)
+				//pnext := new(nextServiceInfo)
+				//json.Unmarshal(b, &pnext)
+				log.Info(v)
+
+				pr := new(http.ProofPartReq)
+				pr.UseForm = pf["useForm"].(string)
+				pr.StorageTime = pf["receiveTime"].(string)
+				err := svc.UseProof(pf, tx)
+				if err != nil {
+					return err
+				}
+				//}
+			case "updatePartRepertoryTHS":
+				log.Info(v)
+				// 退货
+				err := svc.RefundProof(pf, tx)
+				if err != nil {
+					return err
+				}
+			case "insertBigPartquit":
+				log.Info(v)
+				// 退库
+				err := svc.QuitProof(pf, tx)
+				if err != nil {
+					return err
+				}
+			}
+		}
+	}
+	return nil
+}

+ 3415 - 0
apiserver/routers/api/db.go

@@ -0,0 +1,3415 @@
+package api
+
+import (
+	"database/sql"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"kpt.xdmy/apiserver/service"
+	"log"
+	"math"
+	"net/http"
+	"os"
+	"path"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/360EntSecGroup-Skylar/excelize"
+	"github.com/jmoiron/sqlx"
+	"github.com/pkg/errors"
+
+	// "github.com/360EntSecGroup-Skylar/excelize"
+	"github.com/Anderson-Lu/gofasion/gofasion"
+	"github.com/axetroy/go-fs"
+	"github.com/gin-gonic/gin"
+	"github.com/tealeg/xlsx"
+
+	// "github.com/xormplus/xorm"
+
+	"kpt.xdmy/apiserver/routers/restful"
+	"kpt.xdmy/pkg/app"
+	"kpt.xdmy/pkg/e"
+	"kpt.xdmy/pkg/logging"
+	"kpt.xdmy/pkg/setting"
+	"kpt.xdmy/pkg/util"
+)
+
+// @Summary   根据SQL执行得到数据集
+// @Tags getData
+// @Accept json
+// @Produce  json
+// @Param  sql  query   string true "sql"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/getdata  [POST]
+func GetData(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlstr := fsion.Get("sql").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	returntype := fsion.Get("returntype").ValueDefaultStr("map")
+	queryData, err := getDataBySql(sqlstr, offset, pagecount, returntype, nil)
+
+	if err != nil {
+		appG.Response(http.StatusOK, e.ERROR, err.Error())
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, queryData)
+	}
+}
+func Testpartitions(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	databaseName := fsion.Get("databaseName").ValueStr() //获取新数据库名称
+	user := fsion.Get("user").ValueStr()                 //获取新数据库用户
+	passWord := fsion.Get("passWord").ValueStr()         //获取新数据库名称
+	host := fsion.Get("host").ValueStr()                 //获取新数据库名称
+	port := fsion.Get("port").ValueStr()
+	sqlstr := "SELECT sql FROM sql_new "
+	var sqlname string
+	err1 := restful.BasicList(sqlstr, nil, &sqlname)
+	if err1 != nil {
+		appG.Response(http.StatusOK, e.SUCCESS, "失败:"+err1.Error())
+	}
+	sqlstrs := strings.Split(sqlname, ";") //分割sql
+	// sqlstrs := strings.Split(p["sql"].(string), ";") //分割sql
+	connecting := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", user, passWord, host, port, "mysql")
+	mydb, err := sql.Open("mysql", connecting) //连接新连接
+	if err != nil {
+		println("err1", err.Error())
+	}
+	_, err = mydb.Exec("CREATE DATABASE IF NOT EXISTS `" + databaseName + "`") // 创建数据库
+	if err != nil {
+		println("err2", err.Error())
+	}
+
+	mydb.Close()
+
+	connecting = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", user, passWord, host, port, databaseName) //连接新数据库,创建表格
+	mydb, err = sql.Open("mysql", connecting)
+	if err != nil {
+		println("err3", err.Error())
+	}
+	defer mydb.Close()
+	if err == nil {
+		mydb.SetMaxOpenConns(10)
+		mydb.SetMaxIdleConns(10)
+	}
+	errmsg := ""
+	if err == nil {
+		//tx ,_ :=mydb.Begin()
+
+		for _, sqlstr := range sqlstrs {
+			//println("sqlstr---",sqlstr)
+			if sqlstr == "" {
+				continue
+			}
+			_, err = mydb.Exec(sqlstr)
+			if err != nil {
+				println("err4", err.Error())
+				errmsg = err.Error()
+			}
+		}
+	}
+	if errmsg == "" {
+		appG.Response(http.StatusOK, e.SUCCESS, "成功"+databaseName)
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, "失败"+errmsg)
+	}
+
+}
+func TestData(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlstr := fsion.Get("sql").ValueStr()
+	token := ""
+	if tempv, exists := c.Get("jwt_username"); exists {
+		token = tempv.(string)
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, "你录入的名字是:"+sqlstr+";token:"+token)
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags GetDataByName
+// @Accept json
+// @Produce  json
+// @Param  sqlname  body   string true "sqlname"
+// @Param  offset  body   int true "offset"
+// @Param  pagecount  body   int true "pagecount"
+// @Param  returntype  body   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/GetDataByName  [POST]
+func GetDataByName(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	returntype := fsion.Get("returntype").ValueDefaultStr("map")
+	getTotal := fsion.Get("getTotal").ValueStr()
+	paramsTest := fsion.Get("parammaps")
+
+	if sqlnamestr == "getBuyeCode" {
+		pagecount = 9999
+	}
+	fmt.Println(paramsTest.Get("partClass").ValueStr())
+	sql, p := restful.GetSqlByNameDBT(sqlnamestr, nil)
+	if sql != "" {
+		s_params := make([]interface{}, 0)
+		if fsion.HasKey("parammaps") {
+			parammaps := fsion.Get("parammaps")
+			if sqlnamestr != "getNoMesList" && sqlnamestr != "getNoMesCount" {
+				logging.Info("GetDataByName", c.Keys, c.Request.RemoteAddr, sqlnamestr, parammaps.ValueStr())
+			}
+
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+						if tempv, exists := c.Get("jwt_username"); exists {
+							s_params = append(s_params, tempv.(string))
+						} else {
+							s_params = append(s_params, "")
+						}
+					} else {
+						s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+					}
+				}
+			}
+
+		} else if fsion.HasKey("params") {
+			params := fsion.Get("params").Array()
+			logging.Info("GetDataByName", c.Keys, c.Request.RemoteAddr, sqlnamestr, params)
+			for _, v_params := range params {
+				s_params = append(s_params, v_params.ValueStr())
+			}
+		}
+		if returntype == "xlsx" {
+			var xlsxfile *xlsx.File
+			xlsxfile, _ = restful.QueryByXlsx(sql, s_params)
+			//c.File("c:/dd.xlsx")
+			c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+			c.Header("Content-Disposition", "attachment; filename="+"Workbook.xlsx")
+			c.Header("Content-Transfer-Encoding", "binary")
+			_ = xlsxfile.Write(c.Writer)
+
+		} else {
+			// queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params, tx)
+			queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params)
+			if getTotal == "total3" {
+				totalData := make(map[string]interface{})
+				queryData1 := queryData.(map[string]interface{})
+				totalData["total3"] = queryData1["total"]
+				appG.Response(http.StatusOK, e.SUCCESS, totalData)
+				return
+			}
+			if sqlnamestr == "getMenuByRole" {
+				var list []interface{}
+				data := make(map[string]interface{})
+				for _, item := range queryData.(map[string]interface{})["lists"].([]map[string]interface{}) {
+					fmt.Println(item["menu_id"])
+					list = append(list, item["menu_id"])
+				}
+				data["menu_id"] = list
+				queryData.(map[string]interface{})["lists"] = data
+				appG.Response(http.StatusOK, e.SUCCESS, queryData)
+				return
+			} else if sqlnamestr == "getRoleByUser" {
+				var list []interface{}
+				data := make(map[string]interface{})
+				for _, item := range queryData.(map[string]interface{})["lists"].([]map[string]interface{}) {
+					fmt.Println(item["role_id"])
+					list = append(list, item["role_id"])
+				}
+				data["role_id"] = list
+				queryData.(map[string]interface{})["lists"] = data
+				appG.Response(http.StatusOK, e.SUCCESS, queryData)
+				return
+			} else if sqlnamestr == "updateEQStartStop" {
+				tx, err := restful.Dbs.Beginx()
+				defer func() {
+					switch {
+					case err != nil:
+						fmt.Println("__error:", err)
+						if tx != nil {
+							tx.Rollback()
+						}
+					default:
+						if tx != nil {
+							err = tx.Commit()
+						}
+					}
+				}()
+
+				parammaps := fsion.Get("parammaps")
+				username, _ := c.Get("jwt_username")
+				queryData, _ := getDataBySqlT("select maintenance from equipment where id = ? ", 0, 0, "", []interface{}{parammaps.Get("id").ValueStr()})
+				for _, value := range queryData.(map[string]interface{})["list"].([]map[string]interface{}) {
+					for _, maintenance := range strings.Split(value["maintenance"].(string), ",") {
+						if parammaps.Get("SSPstatue").ValueStr() == "启用" {
+							_, err := tx.Exec(` INSERT INTO wxworkmsg(DATE,userid,msg,formcode,TYPE,note)values(now(),
+?,concat("设备启停通知:\n设备资产编号:",(select eqCode from equipment where id = ? ),"\n用途:",(select purpose from equipment where id = ? ),"\n由报修人",(select empname from emp where empcode = ? limit 1),"启用\n时间:",now()),(select eqCode from equipment where id = ? ),1,null)`,
+								maintenance, parammaps.Get("id").ValueStr(), parammaps.Get("id").ValueStr(), username, parammaps.Get("id").ValueStr())
+							fmt.Println(err)
+						} else {
+							_, err := tx.Exec(` INSERT INTO wxworkmsg(DATE,userid,msg,formcode,TYPE,note)values(now(),
+?,concat("设备启停通知:\n设备资产编号:",(select eqCode from equipment where id = ? ),"\n用途:",(select purpose from equipment where id = ? ),"\n由报修人",(select empname from emp where empcode = ? limit 1 ),"停机\n时间:",now()),(select eqCode from equipment where id = ? ),1,null)`,
+								maintenance, parammaps.Get("id").ValueStr(), parammaps.Get("id").ValueStr(), username, parammaps.Get("id").ValueStr())
+							fmt.Println(err)
+						}
+					}
+				}
+			}
+			if err != nil {
+				logging.Error("GetDataByName  err: ", err)
+				msg := geterrmsg(err.Error())
+				appG.Response(http.StatusOK, e.ERROR, msg)
+			} else {
+				appG.Response(http.StatusOK, e.SUCCESS, queryData)
+			}
+		}
+
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, nil)
+	}
+	defer c.Request.Body.Close()
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags GetDataByName
+// @Accept json
+// @Produce  json
+// @Param  sqlname  body   string true "sqlname"
+// @Param  offset  body   int true "offset"
+// @Param  pagecount  body   int true "pagecount"
+// @Param  returntype  body   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/GetDataByName  [POST]
+func EasSync(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	typeIn := fsion.Get("typeIn").ValueDefaultInt(0)
+	billCode := fsion.Get("billCode").ValueStr()
+	logging.Error("EasSync  date: ", typeIn, billCode)
+	//typeInstr := fsion.Get("typeIn").ValueStr()
+	//println(typeInstr,typeIn)
+	// 用于判断备件干什么的和eas同步
+	err := util.EASBillSync(typeIn, billCode, "1")
+	if err != nil {
+		logging.Error("EasSync  err: ", err)
+		appG.Response(http.StatusOK, e.ERROR, err.Error())
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, "成功")
+	}
+}
+func GetDataByNameOPEN(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	sqlnamestr = sqlnamestr + "OPEN"
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	returntype := fsion.Get("returntype").ValueDefaultStr("map")
+
+	sql, p := restful.GetSqlByNameDBT(sqlnamestr, nil)
+	//fmt.Println("sql========\n",sqlnamestr,sql)
+	if sql != "" {
+		s_params := make([]interface{}, 0)
+		if fsion.HasKey("parammaps") {
+			parammaps := fsion.Get("parammaps")
+			if sqlnamestr != "getNoMesList" && sqlnamestr != "getNoMesCount" {
+				logging.Info("GetDataByName", c.Keys, c.Request.RemoteAddr, sqlnamestr, parammaps.ValueStr())
+			}
+
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+						if tempv, exists := c.Get("jwt_username"); exists {
+							s_params = append(s_params, tempv.(string))
+						} else {
+							s_params = append(s_params, "")
+						}
+					} else {
+						s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+					}
+				}
+			}
+
+		} else if fsion.HasKey("params") {
+			params := fsion.Get("params").Array()
+			logging.Info("GetDataByName", c.Keys, c.Request.RemoteAddr, sqlnamestr, params)
+			for _, v_params := range params {
+				s_params = append(s_params, v_params.ValueStr())
+			}
+		}
+		if returntype == "xlsx" {
+			var xlsxfile *xlsx.File
+			xlsxfile, _ = restful.QueryByXlsx(sql, s_params)
+			//c.File("c:/dd.xlsx")
+			c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+			c.Header("Content-Disposition", "attachment; filename="+"Workbook.xlsx")
+			c.Header("Content-Transfer-Encoding", "binary")
+			_ = xlsxfile.Write(c.Writer)
+
+		} else {
+			// queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params, tx)
+			queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params)
+
+			if err != nil {
+				logging.Error("GetDataByName  err: ", err)
+				msg := geterrmsg(err.Error())
+				appG.Response(http.StatusOK, e.ERROR, msg)
+			} else {
+				appG.Response(http.StatusOK, e.SUCCESS, queryData)
+			}
+		}
+
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, nil)
+	}
+}
+func geterrmsg(errstr string) (msgstr string) {
+	var hzRegexp = regexp.MustCompile("^[\u4e00-\u9fa5]$") // 判断是否为汉字
+	rs := []rune(errstr)
+	if len(rs) == 0 {
+		msgstr = errstr
+		return
+	}
+	if hzRegexp.MatchString(string(rs[0])) {
+		msgstr = errstr
+		return
+	}
+
+	if strings.Contains(errstr, "Duplicate entry") {
+		strs := strings.Split(errstr, ` key '`)
+		if len(strs) > 1 {
+			if len(strs[len(strs)-1]) > 1 {
+				errstr = "Duplicate entry :" + strs[len(strs)-1]
+			}
+		}
+	}
+
+	msg, err := restful.MapStrList("SELECT msg FROM err_msg where err = ? ", errstr)
+	if err != nil {
+		msgstr = errstr
+		return
+	}
+	if msg == nil || len(msg) == 0 {
+		var param []interface{}
+		param = append(param, errstr, errstr)
+		go func() {
+			tx, err := restful.Dbs.Beginx()
+			defer func() {
+				switch {
+				case err != nil:
+					logging.Error("tx.Begin 事务启动失败__error:", err)
+					if tx != nil {
+						tx.Rollback()
+					}
+				default:
+					if tx != nil {
+						err = tx.Commit()
+					}
+				}
+				if tx != nil {
+
+				}
+			}()
+			_, err = restful.ExecQueryT("insert into err_msg(err,msg) VALUES(?,?) ON DUPLICATE KEY UPDATE err=err", param, tx)
+			if err != nil {
+				logging.Error("insert into err_msg(err,msg) err", err)
+			}
+
+		}()
+		msgstr = errstr
+	} else {
+		msgstr = msg[0]["msg"]
+	}
+	return
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags GetDataByNameForm
+// @Accept json
+// @Produce  json
+// @Param  sqlname  body   json true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Param  s formData   json true "ss"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/GetDataByNameForm  [POST]
+func GetDataByNameForm(c *gin.Context) {
+	appG := app.Gin{C: c}
+	//sqlnamestr := c.PostForm("measureNumber")
+	//dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	//fsion := gofasion.NewFasion(string(dataByte))
+	//sqlnamestr := fsion.Get("name").ValueStr()
+	//offset := fsion.Get("offset").ValueInt()
+	//pagecount := fsion.Get("pagecount").ValueInt()
+	//returntype := fsion.Get("returntype").ValueStr()
+	//params := fsion.Get("params").Array()
+
+	c.Request.ParseForm()
+	params := c.Request.Form
+	offset := 0
+	pageSize_ := 0
+	returntype := params.Get("page")
+	if returntype == "" {
+		returntype = "0"
+	}
+	if tempv, exists := c.Get("jwt_username"); exists {
+		params.Set("JwtUserName", tempv.(string))
+	} else {
+		params.Set("JwtUserName", "")
+	}
+	sqlnamestr := params.Get("name")
+	logging.Info("GetDataByNameForm ", c.Keys, sqlnamestr)
+	s_params := make([]interface{}, 0)
+	if returntype == "1" {
+		pageNum, error := strconv.Atoi(params.Get("pageNum"))
+		if error != nil {
+			appG.ResponseEq(http.StatusOK, e.ERROR, 0, "页码不是整数")
+		}
+		pageSize, error := strconv.Atoi(params.Get("pageSize"))
+		if error != nil {
+			appG.ResponseEq(http.StatusOK, e.ERROR, 0, "每页行数不是整数")
+		}
+		pageSize_ = pageSize
+		offset = pageNum
+	}
+
+	sql, p := restful.GetSqlByNameDB(sqlnamestr)
+
+	paramslist := strings.Split(p, ",")
+	if len(paramslist) > 0 && p != "" {
+		for _, value := range paramslist {
+			s_params = append(s_params, params.Get(strings.Trim(value, " ")))
+		}
+	}
+
+	if sql != "" {
+		if returntype == "xlsx" {
+			var xlsxfile *xlsx.File
+			xlsxfile, _ = restful.QueryByXlsx(sql, s_params)
+			c.Header("Content-Type", "application/octet-stream")
+			c.Header("Content-Disposition", "attachment; filename="+sqlnamestr+".xlsx")
+			c.Header("Content-Transfer-Encoding", "binary")
+			_ = xlsxfile.Write(c.Writer)
+		} else {
+			queryData, err := getDataBySql(sql, offset, pageSize_, returntype, s_params)
+
+			if err != nil {
+				appG.ResponseEq(http.StatusOK, e.ERROR, 1, err.Error())
+			} else {
+				appG.ResponseEq(http.StatusOK, e.SUCCESS, 0, queryData)
+			}
+		}
+
+	} else {
+		appG.ResponseEq(http.StatusOK, e.SUCCESS, 0, "后台没有数据接口")
+	}
+}
+
+// @Summary   递归获取所有
+// @Tags menu
+// @Accept json
+// @Produce  json
+// @Param  Ton  query  string true "Ton"
+// @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Router /authdata/GetRoleMenus  [GET]
+func GetRecuDataByName(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	parentidname := fsion.Get("idname").ValueStr()
+	sql, p := restful.GetSqlByNameDB(sqlnamestr)
+	params := make(map[string]interface{})
+	s_params := make([]interface{}, 0)
+	if fsion.HasKey("params") {
+
+		for _, v_params := range fsion.Get("params").Array() {
+			s_params = append(s_params, v_params.ValueStr())
+		}
+		params["params"] = s_params
+
+	} else {
+		jparams := fsion.Get("parammaps")
+		paramslist := strings.Split(p, ",")
+		if len(paramslist) > 0 && p != "" {
+			for _, value := range paramslist {
+				if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+					if tempv, exists := c.Get("jwt_username"); exists {
+						params[value] = tempv.(string)
+					} else {
+						params[value] = ""
+					}
+				} else {
+					params[value] = jparams.Get(strings.Trim(value, " ")).ValueStr()
+				}
+			}
+
+		}
+	}
+	queryData, err := GetRecuData_BySql(sql, p, parentidname, params, fsion.HasKey("params"))
+	logging.Info("sqlname parammaps", c.Keys, c.Request.RemoteAddr, sqlnamestr, params)
+	if err != nil {
+		appG.Response(http.StatusOK, e.ERROR, err.Error())
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, queryData)
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags GetDataByNames
+// @Accept json
+// @Produce  json
+// @RequestBody  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/GetDataByNames  [POST]
+func GetDataByNames(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlParams := fsion.Array()
+	queryData := make(map[string]interface{})
+	for _, v := range sqlParams {
+		fsion2 := gofasion.NewFasion(v.Json())
+		logging.Info("GetDataByNames", c.Keys, fsion2.Get("name").ValueStr(), c.Request.RemoteAddr)
+		// p是sql表中的sql语句中的变量差数格式
+		sql, p := restful.GetSqlByNameDB(fsion2.Get("name").ValueStr())
+		if sql == "" {
+			errorm := make(map[string]interface{})
+			errorm["code"] = e.ERROR
+			errorm["message"] = "sql没找到"
+			queryData[fsion2.Get("name").ValueStr()] = errorm
+			continue
+		} else if sql != "" {
+			offset := fsion2.Get("offset").ValueInt()
+			pagecount := fsion2.Get("pagecount").ValueInt()
+			returntype := fsion2.Get("returntype").ValueStr()
+			// s_params 是用来存储sql中需要的参数
+			s_params := make([]interface{}, 0)
+			// 这边是判断是传过来的是参数格式如果是map格式的是需要在apisql表中查询params字段
+			if fsion2.HasKey("parammaps") {
+				parammaps := fsion2.Get("parammaps")
+				paramslist := strings.Split(p, ",")
+				if len(paramslist) > 0 && p != "" {
+					for _, value := range paramslist {
+						if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+							if tempv, exists := c.Get("jwt_username"); exists {
+								s_params = append(s_params, tempv.(string))
+							} else {
+								s_params = append(s_params, "")
+							}
+						} else {
+							s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+						}
+					}
+				}
+			} else if fsion2.HasKey("params") {
+				params := fsion2.Get("params").Array()
+				for _, v_params := range params {
+					s_params = append(s_params, v_params.ValueStr())
+				}
+			}
+
+			queryData1, err := getDataBySql(sql, offset, pagecount, returntype, s_params)
+
+			if err != nil {
+				errorm := make(map[string]interface{})
+				errorm["code"] = e.ERROR
+				errorm["message"] = err.Error()
+				queryData[fsion2.Get("name").ValueStr()] = errorm
+				logging.Error("GetDataByNames  err: ", err)
+				continue
+			} else {
+				queryData[fsion2.Get("name").ValueStr()] = queryData1
+			}
+		}
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, queryData)
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags PostDataByNameForm
+// @Accept json
+// @Produce  json
+// @Param  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误朱红彬彬"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/PostDataByNameForm  [POST]
+func PostDataByNameForm(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	c.Request.ParseForm()
+	params := c.Request.Form
+	sqlnamestr := params.Get("name")
+	logging.Info("PostDataByNameForm ", c.Keys, sqlnamestr)
+
+	s_params := make([]interface{}, 0)
+
+	sql, p := restful.GetSqlByNameDB(sqlnamestr)
+	paramslist := strings.Split(p, ",")
+
+	if len(paramslist) > 0 {
+		for _, value := range paramslist {
+			s_params = append(s_params, params.Get(strings.Trim(value, " ")))
+		}
+	}
+
+	if sql != "" {
+		queryData, err := execDataBySql(sql, s_params)
+
+		if err != nil {
+			appG.ResponseEq(http.StatusOK, e.ERROR, 1, err.Error())
+		} else {
+			appG.ResponseEq(http.StatusOK, e.SUCCESS, 0, queryData)
+		}
+	} else {
+		appG.ResponseEq(http.StatusOK, e.SUCCESS, 0, "后台没有数据接口")
+	}
+}
+func GetReportform(c *gin.Context) {
+
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	parammaps := fsion.Get("parammaps")
+	logging.Info("GetReportform ", c.Keys, sqlnamestr, parammaps)
+	queryData, _ := praseReportform(sqlnamestr, parammaps)
+
+	appG.Response(http.StatusOK, e.SUCCESS, queryData)
+}
+func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion) (queryData map[string]interface{}, err error) {
+	switch sqlnamestr {
+	case "getpSumNow", "getpSumNowWater", "getpSumNowElec", "getpSumNowDiesel":
+		queryData, err = getpSumNow(sqlnamestr, parammaps)
+	case "getPastureSumMonth", "getPastureSumMonthWater", "getPastureSumMonthElec", "getPastureSumMonthDiesel":
+		queryData, err = getPastureSumMonth(sqlnamestr, parammaps)
+	case "getPastureSumDayWater", "getPastureSumDayElec", "getPastureSumDayDiesel":
+		queryData, err = getPastureSumDay(sqlnamestr, parammaps)
+	case "getPastureSumDay":
+		queryData, err = getPastureSumDay1(sqlnamestr, parammaps)
+	case "geteqclassSumMonth", "geteqclassSumMonthWater", "geteqclassSumMonthElec", "geteqclassSumMonthDiesel":
+		queryData, err = geteqclassSumMonth(sqlnamestr, parammaps)
+	case "geteCowWaterList", "geteCowElecList", "geteCowDieselList", "geteCowMaintainList", "geteCowAllList":
+		queryData, err = geteCow(sqlnamestr, parammaps)
+	case "geteCowWaterMonthList", "geteCowElecMonthList", "geteCowDieselMonthList", "geteCowMaintainMonthList", "geteCowAllMonthList":
+		queryData, err = geteCowMonth(sqlnamestr, parammaps)
+	case "getEqRunSurveyListPasture":
+		queryData, err = getEqRunSurveyListPasture(sqlnamestr, parammaps)
+	case "geteqclassFeeSum", "geteqclassFeeSumPasture":
+		queryData, err = geteqclassFeeSum(sqlnamestr, parammaps)
+	case "getEqRunSurveyListDay":
+		queryData, err = getEqRunSurveyListDay(sqlnamestr, parammaps)
+	case "getReportEqCostYear":
+		queryData, err = geteqCostYear(sqlnamestr, parammaps)
+	case "getReportEqCostMonth":
+		queryData, err = geteqCostMonth(sqlnamestr, parammaps)
+	case "homepagePastureInfor":
+		queryData, err = homepagePastureInfor(sqlnamestr, parammaps)
+	case "homepageEqstatus":
+		queryData, err = homepageEqstatus(sqlnamestr, parammaps)
+	case "homepageEqRunstatueListPasture", "homepageEqRunstatueListEqclass":
+		queryData, err = homepageEqRunstatue(sqlnamestr, parammaps)
+	case "homepageFeeWX", "homepageFeeWater", "homepageFeeElec", "homepageFeeDiesel":
+		queryData, err = homepageFee(sqlnamestr, parammaps)
+	default:
+		queryData, err = nil, nil
+	}
+	return
+}
+func homepageFee(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pastureName := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+	pSumNow, err := restful.MapStrList(sqlNow, pastureName, pastureName, pastureName, pastureName, pastureName, pastureName, pastureName, pastureName, pastureName, pastureName)
+	if err != nil {
+		log.Default().Printf("homepageFee queryx: %v", err)
+	}
+	typeStr := parammaps.Get(strings.Trim("type", " ")).ValueStr()
+	list1s := make([]string, 1)
+	list2s := make([]string, 1)
+	list3s := make([]string, 1)
+	list4s := make([]string, 1)
+	list5s := make([]string, 1)
+	list6s := make([]string, 1)
+	list7s := make([]string, 1)
+	list8s := make([]string, 1)
+	list1s[0] = typeStr
+
+	for _, value := range pSumNow {
+		list2s[0] = value["monthBudget"]
+		list3s[0] = value["sumPrice"]
+		list4s[0] = value["monthBudgetL"]
+		list5s[0] = value["sumPriceL"]
+		list6s[0] = value["monthBudget"]
+		list7s[0] = value["sumPrice"]
+		list8s[0] = value["cowS"]
+	}
+	queryData["data1"] = list1s
+	queryData["data2"] = list2s
+	queryData["data3"] = list3s
+	queryData["data4"] = list4s
+	queryData["data5"] = list5s
+	queryData["data6"] = list6s
+	queryData["data7"] = list7s
+	queryData["data8"] = list8s
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func homepageEqRunstatue(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pastureName := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+	typeStr := parammaps.Get(strings.Trim("type", " ")).ValueStr()
+	pSumNow, _ := restful.MapStrList(sqlNow, pastureName)
+
+	list1s := make([]string, 0)
+	list2s := make([]string, 0)
+	list3s := make([]string, 1)
+	list3s[0] = typeStr
+
+	for _, value := range pSumNow {
+		list1s = append(list1s, value["name"])
+		list2s = append(list2s, value["rate"])
+	}
+	queryData["data1"] = list1s
+	queryData["data2"] = list2s
+	queryData["data3"] = list3s
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func homepageEqstatus(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pastureName := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+	pSumNow, _ := restful.MapStrList(sqlNow, pastureName, pastureName)
+
+	list1s := make([]string, 0)
+	list2s := make([]string, 0)
+
+	for _, value := range pSumNow {
+		list1s = append(list1s, value["status"])
+		list2s = append(list2s, value["cou"])
+	}
+	queryData["data1"] = list1s
+	queryData["data2"] = list2s
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func homepagePastureInfor(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow)
+
+	lolalists := make([]map[string]interface{}, 0)
+	pasturelists := make([]map[string]interface{}, 0)
+
+	lolalist := make(map[string]interface{}, 1)
+
+	for _, value := range pSumNow {
+		lola := make([]string, 0)
+		pasturelist := make(map[string]interface{}, 1)
+		lola = append(lola, value["longitude"])
+		lola = append(lola, value["latitude"])
+		lolalist[value["name"]] = lola
+		pasturelist["name"] = value["name"]
+		pasturelist["value"] = value["name"]
+		pasturelists = append(pasturelists, pasturelist)
+	}
+	lolalists = append(lolalists, lolalist)
+	queryData["data1"] = lolalists
+	queryData["data2"] = pasturelists
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func geteqCostMonth(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
+	eqId := parammaps.Get(strings.Trim("eqId", " ")).ValueStr()
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow, receiveTime, eqId, receiveTime, receiveTime, eqId, receiveTime, receiveTime)
+
+	chartData := make(map[string]interface{})
+	months := []string{}
+	upkeepCost := []string{}
+	repireCost := []string{}
+	//lastTotal,nowTotal := 0,0
+	a := true
+	month := ""
+	for i := 1; i <= 12; i++ {
+		if i < 10 {
+			month = receiveTime + "-0" + strconv.Itoa(i)
+		} else {
+			month = receiveTime + "-" + strconv.Itoa(i)
+		}
+		months = append(months, month)
+		for _, va := range pSumNow {
+			if va["yearR"][5:] == month[5:] {
+				upkeepCost = append(upkeepCost, va["Ucost"])
+				repireCost = append(repireCost, va["Rcost"])
+				a = false
+			}
+		}
+
+		if a {
+			upkeepCost = append(upkeepCost, "0")
+			repireCost = append(repireCost, "0")
+		}
+		a = true
+	}
+	chartData["months"] = months
+	chartData["upkeepCost"] = upkeepCost
+	chartData["repireCost"] = repireCost
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+
+}
+func geteqCostYear(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+
+	//receiveTime :=parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
+	eqId := parammaps.Get(strings.Trim("eqId", " ")).ValueStr()
+
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow, eqId, eqId, eqId)
+	//restful.M
+	chartData := make(map[string]interface{})
+	year := []string{}
+	upkeepCost := []string{}
+	repireCost := []string{}
+
+	for _, va := range pSumNow {
+		year = append(year, va["yearR"])
+		upkeepCost = append(upkeepCost, va["Ucost"])
+		repireCost = append(repireCost, va["Rcost"])
+	}
+
+	chartData["year"] = year
+	chartData["upkeepCost"] = upkeepCost
+	chartData["repireCost"] = repireCost
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func geteCowMonth(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	receiveTime := parammaps.Get(strings.Trim("year", " ")).ValueStr()
+	pastureNames := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+	var pSumNow, pSumLast []map[string]string
+	if sqlnamestr == "geteCowAllMonthList" {
+		sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+		pSumNow, _ = restful.MapStrList(sqlNow, receiveTime, receiveTime, receiveTime, receiveTime, receiveTime, receiveTime, pastureNames)
+		tempTime, _ := strconv.Atoi(receiveTime)
+		receiveTimetemp := strconv.Itoa(tempTime - 1)
+		pSumLast, _ = restful.MapStrList(sqlNow, receiveTimetemp, receiveTimetemp, receiveTimetemp, receiveTimetemp, receiveTimetemp, receiveTimetemp, pastureNames)
+	} else {
+		sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+		pSumNow, _ = restful.MapStrList(sqlNow, receiveTime, receiveTime, receiveTime, pastureNames)
+		tempTime, _ := strconv.Atoi(receiveTime)
+		receiveTimetemp := strconv.Itoa(tempTime - 1)
+		pSumLast, _ = restful.MapStrList(sqlNow, receiveTimetemp, receiveTimetemp, receiveTimetemp, pastureNames)
+	}
+
+	chartData := make(map[string]interface{})
+	months := []string{}
+	lastYear := []string{}
+	nowYear := []string{}
+	budgetYear := []string{}
+	//lastTotal,nowTotal := 0,0
+	a, b := true, true
+	month := ""
+
+	for i := 1; i <= 12; i++ {
+		if i < 10 {
+			month = receiveTime + "-0" + strconv.Itoa(i)
+		} else {
+			month = receiveTime + "-" + strconv.Itoa(i)
+		}
+		months = append(months, month)
+		for _, va := range pSumNow {
+			if va["month"][5:] == month[5:] {
+				nowYear = append(nowYear, va["psum"])
+				budgetYear = append(budgetYear, va["lsum"])
+				a = false
+			}
+		}
+		for _, va := range pSumLast {
+			if va["month"][5:] == month[5:] {
+				lastYear = append(lastYear, va["psum"])
+				b = false
+			}
+		}
+		if a {
+			nowYear = append(nowYear, "0")
+			budgetYear = append(budgetYear, "0")
+		}
+		if b {
+			lastYear = append(lastYear, "0")
+		}
+		a = true
+		b = true
+	}
+	chartData["months"] = months
+	chartData["lastYear"] = lastYear
+	chartData["nowYear"] = nowYear
+	chartData["budgetYear"] = budgetYear
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+
+}
+func getEqRunSurveyListDay(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	receiveTime := parammaps.Get(strings.Trim("praseTime", " ")).ValueStr()
+	pastureNames := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow, pastureNames, receiveTime)
+	if pSumNow == nil {
+		return nil, nil
+	}
+	typeName := make([]map[string]interface{}, 4)
+	ma := make(map[string]interface{})
+	ma1 := make(map[string]interface{})
+	ma2 := make(map[string]interface{})
+	ma3 := make(map[string]interface{})
+	ma["name"] = "在用"
+	ma["value"] = pSumNow[0]["eqUse"]
+	typeName[0] = ma
+	ma1["name"] = "闲置"
+	ma1["value"] = pSumNow[0]["eqXZ"]
+	typeName[1] = ma1
+	ma2["name"] = "报废"
+	ma2["value"] = pSumNow[0]["eqBF"]
+	typeName[2] = ma2
+	ma3["name"] = "封存"
+	ma3["value"] = pSumNow[0]["eqFC"]
+	typeName[3] = ma3
+
+	queryData["psm"] = typeName
+	queryData["code"] = 0
+	queryData["total"] = pSumNow[0]["eqSum"]
+	queryData["message"] = "ok"
+	return queryData, nil
+
+}
+func getEqRunSurveyListPasture(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+
+	receiveTime := parammaps.Get(strings.Trim("praseTime", " ")).ValueStr()
+	pastureNames, _ := restful.MapStrList("SELECT `name` FROM pasture order by sort")
+
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow, receiveTime)
+	chartData := make(map[string]interface{})
+	pasture := []string{}
+	eqUse := []string{}
+	eqXZ := []string{}
+	eqBF := []string{}
+	eqFC := []string{}
+
+	//lastTotal,nowTotal := 0,0
+	a := true
+	for _, value := range pastureNames {
+		pasture = append(pasture, value["name"])
+		for _, va := range pSumNow {
+			if va["pastureName"] == value["name"] {
+				eqUset, _ := strconv.Atoi(va["eqUse"])
+				eqSumt, _ := strconv.Atoi(va["eqSum"])
+				eqXZt, _ := strconv.Atoi(va["eqXZ"])
+				eqBFt, _ := strconv.Atoi(va["eqBF"])
+				eqFCt, _ := strconv.Atoi(va["eqFC"])
+				eqUsetem := float64(eqUset) / float64(eqSumt) * 100
+				eqXZtem := float64(eqXZt) / float64(eqSumt) * 100
+				eqBFtem := float64(eqBFt) / float64(eqSumt) * 100
+				eqFCtem := float64(eqFCt) / float64(eqSumt) * 100
+				eqUse = append(eqUse, strconv.FormatFloat(eqUsetem, 'f', 2, 64))
+				//eqSum = append(eqSum, va["eqSum"])
+				eqXZ = append(eqXZ, strconv.FormatFloat(eqXZtem, 'f', 2, 64))
+				eqBF = append(eqBF, strconv.FormatFloat(eqBFtem, 'f', 2, 64))
+				eqFC = append(eqFC, strconv.FormatFloat(eqFCtem, 'f', 2, 64))
+				a = false
+			}
+		}
+
+		if a {
+			eqUse = append(eqUse, "0")
+			//eqSum = append(eqSum, "0")
+			eqXZ = append(eqXZ, "0")
+			eqBF = append(eqBF, "0")
+			eqFC = append(eqFC, "0")
+		}
+
+		a = true
+	}
+
+	chartData["pastureName"] = pasture
+	chartData["eqUseRate"] = eqUse
+	//chartData["eqSum"] = eqSum
+	chartData["eqXZRate"] = eqXZ
+	chartData["eqBFRate"] = eqBF
+	chartData["eqFCRate"] = eqFC
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func geteqclassFeeSum(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+
+	year := parammaps.Get(strings.Trim("year", " ")).ValueStr()
+	month := parammaps.Get(strings.Trim("month", " ")).ValueStr()
+	eqClassName := parammaps.Get(strings.Trim("eqClassName", " ")).ValueStr()
+	PastureName := parammaps.Get("PastureName").ValueStr()
+	DepartmentName := parammaps.Get("DepartmentName").ValueStr()
+
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+
+	pSumNow, err := restful.MapStrList(sqlNow, year, month, eqClassName, eqClassName, PastureName, PastureName, DepartmentName, DepartmentName)
+	if len(pSumNow) == 0 {
+		log.Default().Printf("geteqclassFeeSum  result is empty")
+	}
+	fmt.Println(err)
+	chartData := make(map[string]interface{})
+	eqUse := []string{}
+	eqXZ := []string{}
+
+	for _, va := range pSumNow {
+		eqUse = append(eqUse, va["psum"])
+		eqXZ = append(eqXZ, va["typeName"])
+
+	}
+
+	chartData["data1"] = eqUse
+	chartData["data2"] = eqXZ
+
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func geteqclassSumMonth(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
+	pastureNames := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+	deptName := parammaps.Get(strings.Trim("deptName", " ")).ValueStr()
+
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow, pastureNames, receiveTime, deptName)
+	if len(pSumNow) == 0 {
+		log.Default().Printf("geteqclassSumMonth  result is empty")
+	}
+	chartData := make(map[string]interface{})
+	typeName := []string{}
+	eqCost := []string{}
+	for _, va := range pSumNow {
+		typeName = append(typeName, va["typeName"])
+		eqCost = append(eqCost, va["psum"])
+	}
+	chartData["typeName"] = typeName
+	chartData["eqCost"] = eqCost
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+
+}
+func getPastureSumDay(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
+	pastureNames := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow, pastureNames, receiveTime)
+	if len(pSumNow) == 0 {
+		log.Default().Printf("getPastureSumDay  result is empty")
+	}
+	tempTime, _ := strconv.Atoi(receiveTime[:4])
+	receiveTimetemp := strconv.Itoa(tempTime-1) + receiveTime[4:]
+	pSumLast, _ := restful.MapStrList(sqlNow, pastureNames, receiveTimetemp)
+	chartData := make(map[string]interface{})
+	months := []string{}
+	lastYear := []string{}
+	nowYear := []string{}
+	//lastTotal,nowTotal := 0,0
+	a, b := true, true
+	month := ""
+	dayCount := GetMonthCount(receiveTime)
+	for i := 1; i <= dayCount; i++ {
+		if i < 10 {
+			month = receiveTime + "-0" + strconv.Itoa(i)
+		} else {
+			month = receiveTime + "-" + strconv.Itoa(i)
+		}
+		months = append(months, strconv.Itoa(i))
+		for _, va := range pSumNow {
+			if va["month"][8:] == month[8:] {
+				nowYear = append(nowYear, va["psum"])
+				a = false
+			}
+		}
+		for _, va := range pSumLast {
+			if va["month"][8:] == month[8:] {
+				lastYear = append(lastYear, va["psum"])
+				b = false
+			}
+		}
+		if a {
+			if month[:] > time.Now().Format("2006-01-02") {
+				nowYear = append(nowYear, "")
+			} else {
+				nowYear = append(nowYear, "0")
+			}
+
+		}
+		if b {
+			lastYear = append(lastYear, "0")
+		}
+		a = true
+		b = true
+	}
+	chartData["day"] = months
+
+	chartData["lastYear"] = lastYear
+	chartData["nowYear"] = nowYear
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+
+}
+
+func getPastureSumDay1(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
+	pastureNames := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+	departmentName := parammaps.Get(strings.Trim("departmentName", " ")).ValueStr()
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	pSumNow, _ := restful.MapStrList(sqlNow, pastureNames, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
+	if len(pSumNow) == 0 {
+		log.Default().Printf("getPastureSumDay1query is empty")
+	}
+	tempTime, _ := strconv.Atoi(receiveTime[:4])
+	receiveTimetemp := strconv.Itoa(tempTime-1) + receiveTime[4:]
+	pSumLast, _ := restful.MapStrList(sqlNow, pastureNames, receiveTimetemp, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
+	if len(pSumLast) == 0 {
+		log.Default().Printf("getPastureSumDay1 query is empty")
+	}
+	chartData := make(map[string]interface{})
+	months := []string{}
+	lastYear := []string{}
+	nowYear := []string{}
+	a, b := true, true
+	month := ""
+	for i := 1; i <= 12; i++ {
+		if i < 10 {
+			month = receiveTime[:4] + "-0" + strconv.Itoa(i)
+		} else {
+			month = receiveTime[:4] + "-" + strconv.Itoa(i)
+		}
+		months = append(months, month)
+		for _, va := range pSumNow {
+			if va["month"][5:7] == month[5:] {
+				nowYear = append(nowYear, va["psum"])
+				a = false
+			}
+		}
+		for _, va := range pSumLast {
+			if va["month"][5:7] == month[5:] {
+				lastYear = append(lastYear, va["psum"])
+				b = false
+			}
+		}
+		if a {
+			if month[:] > time.Now().Format("2006-01") {
+				nowYear = append(nowYear, "")
+			} else {
+				nowYear = append(nowYear, "0")
+			}
+
+		}
+		if b {
+			lastYear = append(lastYear, "0")
+		}
+		a = true
+		b = true
+	}
+	chartData["months"] = months
+	chartData["lastYear"] = lastYear
+	chartData["nowYear"] = nowYear
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+
+}
+
+func GetMonthCount(receiveTime string) (days int) {
+	year, _ := strconv.Atoi(receiveTime[:4])
+	month, _ := strconv.Atoi(receiveTime[5:])
+	if month != 2 {
+		if month == 4 || month == 6 || month == 9 || month == 11 {
+			days = 30
+		} else {
+			days = 31
+		}
+	} else {
+		if ((year%4) == 0 && (year%100) != 0) || (year%400) == 0 {
+			days = 29
+		} else {
+			days = 28
+		}
+	}
+	return
+}
+func getPastureSumMonth(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
+	pastureNames := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
+	departmentName := parammaps.Get(strings.Trim("departmentName", " ")).ValueStr()
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	var pSumNow []map[string]string
+	if sqlnamestr == "getPastureSumMonth" {
+		pSumNow, _ = restful.MapStrList(sqlNow, pastureNames, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
+	} else {
+		pSumNow, _ = restful.MapStrList(sqlNow, pastureNames, receiveTime)
+	}
+	tempTime, _ := strconv.Atoi(receiveTime)
+	receiveTimetemp := strconv.Itoa(tempTime - 1)
+	var pSumLast []map[string]string
+	if sqlnamestr == "getPastureSumMonth" {
+		pSumLast, _ = restful.MapStrList(sqlNow, pastureNames, receiveTimetemp, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
+	} else {
+		pSumLast, _ = restful.MapStrList(sqlNow, pastureNames, receiveTimetemp)
+	}
+
+	chartData := make(map[string]interface{})
+	months := []string{}
+	lastYear := []string{}
+	nowYear := []string{}
+	//lastTotal,nowTotal := 0,0
+	a, b := true, true
+	month := ""
+	for i := 1; i <= 12; i++ {
+		if i < 10 {
+			month = receiveTime + "-0" + strconv.Itoa(i)
+		} else {
+			month = receiveTime + "-" + strconv.Itoa(i)
+		}
+		months = append(months, month)
+		for _, va := range pSumNow {
+			if va["month"][5:] == month[5:] {
+				nowYear = append(nowYear, va["psum"])
+				a = false
+			}
+		}
+		for _, va := range pSumLast {
+			if va["month"][5:] == month[5:] {
+				lastYear = append(lastYear, va["psum"])
+				b = false
+			}
+		}
+		if a {
+			if month[:] > time.Now().Format("2006-01") {
+				nowYear = append(nowYear, "")
+			} else {
+				nowYear = append(nowYear, "0")
+			}
+
+		}
+		if b {
+			lastYear = append(lastYear, "0")
+		}
+		a = true
+		b = true
+	}
+	chartData["months"] = months
+	chartData["lastYear"] = lastYear
+	chartData["nowYear"] = nowYear
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+
+}
+func geteCow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+
+	receiveTime := parammaps.Get(strings.Trim("year", " ")).ValueStr()
+	pastureNames, _ := restful.MapStrList("SELECT `name` FROM pasture where `name` <> '现代牧业' order by sort")
+	var pSumNow, pSumLast []map[string]string
+	rTime := ""
+	if sqlnamestr == "geteCowAllList" {
+		sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+		if receiveTime == time.Now().Format("2006") {
+			rTime = time.Now().Format("2006-01-02")
+		} else {
+			rTime = receiveTime + "-12-31"
+		}
+		pSumNow, _ = restful.MapStrList(sqlNow, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime)
+		if receiveTime == time.Now().Format("2006") {
+			rTime = time.Now().AddDate(-1, 0, 0).Format("2006-01-02")
+		} else {
+			rTime = receiveTime + "-12-31"
+		}
+		receiveTimei, _ := strconv.Atoi(receiveTime)
+		receiveTime = strconv.Itoa(receiveTimei - 1)
+		pSumLast, _ = restful.MapStrList(sqlNow, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime)
+	} else {
+		sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+		if receiveTime == time.Now().Format("2006") {
+			rTime = time.Now().Format("2006-01-02")
+		} else {
+			rTime = receiveTime + "-12-31"
+		}
+		pSumNow, _ = restful.MapStrList(sqlNow, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime)
+		if receiveTime == time.Now().Format("2006") {
+			rTime = time.Now().AddDate(-1, 0, 0).Format("2006-01-02")
+		} else {
+			rTime = receiveTime + "-12-31"
+		}
+		receiveTimei, _ := strconv.Atoi(receiveTime)
+		receiveTime = strconv.Itoa(receiveTimei - 1)
+		pSumLast, _ = restful.MapStrList(sqlNow, receiveTime, rTime, receiveTime, rTime, receiveTime, rTime)
+	}
+	chartData := make(map[string]interface{})
+	pasture := []string{}
+	lastYear := []string{}
+	nowYear := []string{}
+	budgetYear := []string{}
+
+	//lastTotal,nowTotal := 0,0
+
+	//var pastureList []string
+	for _, va := range pSumNow {
+		b := true
+		nowYear = append(nowYear, va["psum"])
+		budgetYear = append(budgetYear, va["lsum"])
+		fmt.Println(va["psum"])
+		for _, va1 := range pSumLast {
+			if va1["name"] == va["name"] {
+				lastYear = append(lastYear, va1["psum"])
+				b = false
+			}
+		}
+		if b {
+			lastYear = append(lastYear, "0.0000")
+		}
+		pasture = append(pasture, va["name"])
+		//pastureList = append(pastureList, va["name"])
+	}
+
+	for _, value := range pastureNames {
+		a, b, exist := true, true, false
+		for _, pasturename := range pasture {
+			if value["name"] == pasturename {
+				exist = true
+				break
+			}
+		}
+
+		if !exist {
+			//for _, va := range pSumNow {
+			//	if va["name"] == value["name"] {
+			//		nowYear = append(nowYear, va["psum"])
+			//		budgetYear = append(budgetYear, va["lsum"])
+			//		a = false
+			//	}
+			//}
+			for _, va := range pSumLast {
+				if va["name"] == value["name"] {
+					lastYear = append(lastYear, va["psum"])
+					b = false
+				}
+			}
+			if a {
+				nowYear = append(nowYear, "0.0000")
+				budgetYear = append(budgetYear, "0.0000")
+			}
+			if b {
+				lastYear = append(lastYear, "0.0000")
+			}
+			pasture = append(pasture, value["name"])
+		}
+
+		//
+
+		//a = true
+		//b = true
+	}
+
+	chartData["pasture"] = pasture
+	chartData["lastYear"] = lastYear
+	chartData["nowYear"] = nowYear
+	chartData["budgetYear"] = budgetYear
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+
+func getpSumNow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
+	queryData := make(map[string]interface{})
+
+	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
+	departmentName := parammaps.Get(strings.Trim("departmentName", " ")).ValueStr()
+	pastureNames, _ := restful.MapStrList("SELECT `name` FROM pasture where `name` <> '现代牧业' order by sort")
+	rTime := ""
+	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
+	var pSumNow []map[string]string
+	if sqlnamestr == "getpSumNow" {
+		pSumNow, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
+	} else {
+		pSumNow, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime)
+	}
+	//pSumNow, _ := restful.MapStrList(sqlNow, rTime, rTime, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName)
+	receiveTimei, _ := strconv.Atoi(receiveTime)
+	if receiveTime == time.Now().Format("2006") {
+		rTime = time.Now().AddDate(-1, 0, 0).Format("2006-01-02")
+	} else {
+		rTime = receiveTime + "-12-31"
+	}
+	receiveTime = strconv.Itoa(receiveTimei - 1)
+	var pSumLast []map[string]string
+	if sqlnamestr == "getpSumNow" {
+		pSumLast, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName)
+	} else {
+		pSumLast, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime)
+	}
+	//pSumLast, _ = restful.MapStrList(sqlNow, rTime, rTime, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName)
+	chartData := make(map[string]interface{})
+	pasture := []string{}
+	lastYear := []string{}
+	nowYear := []string{}
+
+	//lastTotal,nowTotal := 0,0
+	a, b := true, true
+	for _, value := range pastureNames {
+		pasture = append(pasture, value["name"])
+		for _, va := range pSumNow {
+			if va["name"] == value["name"] {
+				nowYear = append(nowYear, va["psum"])
+				a = false
+			}
+		}
+		for _, va := range pSumLast {
+			if va["name"] == value["name"] {
+				lastYear = append(lastYear, va["psum"])
+				b = false
+			}
+		}
+		if a {
+			nowYear = append(nowYear, "0")
+		}
+		if b {
+			lastYear = append(lastYear, "0")
+		}
+		a = true
+		b = true
+	}
+
+	chartData["pasture"] = pasture
+	chartData["lastYear"] = lastYear
+	chartData["nowYear"] = nowYear
+	queryData["chart_data"] = chartData
+	queryData["code"] = 0
+	queryData["message"] = "ok"
+	return queryData, nil
+}
+func GetUpkeepPlan(c *gin.Context) {
+
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	returntype := fsion.Get("returntype").ValueDefaultStr("map")
+	month := fsion.Get("month").ValueDefaultStr("map")
+	logging.Info("GetUpkeepPlan ", c.Keys, sqlnamestr, month)
+
+	sql, p := restful.GetSqlByNameDBT(sqlnamestr, nil)
+	if sql != "" {
+		s_params := make([]interface{}, 0)
+		if fsion.HasKey("parammaps") {
+			parammaps := fsion.Get("parammaps")
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+						if tempv, exists := c.Get("jwt_username"); exists {
+							s_params = append(s_params, tempv.(string))
+						} else {
+							s_params = append(s_params, "")
+						}
+					} else {
+						s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+					}
+				}
+			}
+
+		} else if fsion.HasKey("params") {
+			params := fsion.Get("params").Array()
+			for _, v_params := range params {
+				s_params = append(s_params, v_params.ValueStr())
+			}
+		}
+		if returntype == "xlsx" {
+			var xlsxfile *xlsx.File
+			xlsxfile, _ = restful.QueryByXlsx(sql, s_params)
+			//c.File("c:/dd.xlsx")
+			c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+			c.Header("Content-Disposition", "attachment; filename="+"Workbook.xlsx")
+			c.Header("Content-Transfer-Encoding", "binary")
+			_ = xlsxfile.Write(c.Writer)
+
+		} else {
+			// queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params, tx)
+			queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params)
+
+			if err != nil {
+				appG.Response(http.StatusOK, e.ERROR, err.Error())
+			} else {
+				for index, value := range queryData.(map[string]interface{})["list"].([]map[string]interface{}) {
+					if v, ok := value["id"]; ok {
+						//month = "2020-03"
+						seviceplans, _ := restful.MapStrList("SELECT seviceplan.* FROM seviceplan WHERE seviceplan.eqId = ? AND (seviceplan.month=? OR (SELECT COUNT(*) FROM bigupkeep WHERE seviceplanId = seviceplan.`id` AND plantime BETWEEN CONCAT(?,'-01') AND CONCAT(?,'-31'))>0) ", v, month, month, month) //获取保养计划
+						if seviceplans != nil {
+							for _, va := range seviceplans { //根据保养计划获取保养单
+								//day,_ :=strconv.Atoi(va["day"])
+								bigupkeeps, _ := restful.MapStrList("SELECT * FROM bigupkeep where seviceplanId = ? and plantime between concat(?,'-01') and concat(?,'-31') ", va["id"], month, month) //获取保养计划中的保养单
+								//buk := make(map[string]map[string]string)
+								for _, bu := range bigupkeeps { //日期为key ,保养单为value 存到map中
+									jstr := ""
+									if bu["plantime"][8:9] == "0" {
+										jstr = "m" + bu["plantime"][9:]
+									} else {
+										jstr = "m" + bu["plantime"][8:]
+									}
+
+									if bu["flowCompeleted"] < "2" && bu["plantime"] < time.Now().Add(-24*time.Hour).Format("2006-01-02") { //如果保养状态是0并且小于当前日期 则状态已延期2
+										queryData.(map[string]interface{})["list"].([]map[string]interface{})[index][jstr] = va["upkeepName"] + "#" + va["id"] + "#2" + "#" + bu["id"] + "#" + bu["pushbackId"]
+									} else {
+										if bu["flowCompeleted"] >= "2" {
+											queryData.(map[string]interface{})["list"].([]map[string]interface{})[index][jstr] = va["upkeepName"] + "#" + va["id"] + "#1" + "#" + bu["id"] + "#" + bu["pushbackId"]
+										} else {
+											queryData.(map[string]interface{})["list"].([]map[string]interface{})[index][jstr] = va["upkeepName"] + "#" + va["id"] + "#0" + "#" + bu["id"] + "#" + bu["pushbackId"]
+										}
+									}
+									queryData.(map[string]interface{})["list"].([]map[string]interface{})[index]["month"] = va["month"] // 导出报表时,报表中需要显示月份
+								}
+
+							}
+
+						}
+					}
+				}
+				appG.Response(http.StatusOK, e.SUCCESS, queryData)
+
+			}
+		}
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, nil)
+	}
+}
+func GetAccount(c *gin.Context) {
+
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	returntype := fsion.Get("returntype").ValueDefaultStr("map")
+
+	sql, p := restful.GetSqlByNameDBT(sqlnamestr, nil)
+	//fmt.Println("sql========\n",sqlnamestr,sql)
+	if sql != "" {
+		s_params := make([]interface{}, 0)
+		if fsion.HasKey("parammaps") {
+			parammaps := fsion.Get("parammaps")
+			if sqlnamestr != "getNoMesList" && sqlnamestr != "getNoMesCount" {
+				logging.Info("GetDataByName", c.Keys, c.Request.RemoteAddr, sqlnamestr, parammaps.ValueStr())
+			}
+
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+						if tempv, exists := c.Get("jwt_username"); exists {
+							s_params = append(s_params, tempv.(string))
+						} else {
+							s_params = append(s_params, "")
+						}
+					} else {
+						s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+					}
+				}
+				fmt.Println("params parse end")
+			}
+
+		} else if fsion.HasKey("params") {
+			params := fsion.Get("params").Array()
+			logging.Info("GetDataByName", c.Keys, c.Request.RemoteAddr, sqlnamestr, params)
+			for _, v_params := range params {
+				s_params = append(s_params, v_params.ValueStr())
+			}
+		}
+		if returntype == "xlsx" {
+			var xlsxfile *xlsx.File
+			xlsxfile, _ = restful.QueryByXlsx(sql, s_params)
+			//c.File("c:/dd.xlsx")
+			c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+			c.Header("Content-Disposition", "attachment; filename="+"Workbook.xlsx")
+			c.Header("Content-Transfer-Encoding", "binary")
+			_ = xlsxfile.Write(c.Writer)
+
+		} else {
+			// queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params, tx)
+			queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params)
+
+			if err != nil {
+				logging.Error("GetDataByName  err: ", err)
+				msg := geterrmsg(err.Error())
+				appG.Response(http.StatusOK, e.ERROR, msg)
+				//appG.Response(http.StatusOK, e.ERROR, err.Error())
+			} else {
+				appG.Response(http.StatusOK, e.SUCCESS, queryData)
+			}
+		}
+
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, nil)
+	}
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags PostDataByName
+// @Accept json
+// @Produce  json
+// @Param  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/PostDataByName  [POST]
+func PostDataByName(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	parammaps := fsion.Get("parammaps")
+	if sqlnamestr == "partsCharge" && parammaps.Get("statue").ValueInt() == 1 {
+		//fmt.Println("jinlaile")
+		defer func() {
+			go util.EASBillSync(5, fsion.Get("parammaps").Get("id").ValueStr(), fsion.Get("parammaps").Get("statue").ValueStr())
+		}()
+		//go CheckEASWebServiceParts(fsion.Get("parammaps").Get("statue").ValueStr(),fsion.Get("parammaps").Get("id").ValueStr())
+	}
+
+	s_params := make([]interface{}, 0)
+	tx, err := restful.Dbs.Beginx()
+
+	defer func() {
+		switch {
+		case err != nil:
+			fmt.Println("__error:", err)
+			if tx != nil {
+				tx.Rollback()
+			}
+		default:
+			if tx != nil {
+				err = tx.Commit()
+			}
+		}
+
+	}()
+	sql, p := restful.GetSqlByNameDBT(sqlnamestr, tx)
+	if sql != "" {
+		if fsion.HasKey("parammaps") {
+			parammaps := fsion.Get("parammaps")
+			logging.Info("PostDataByName ", c.Keys, c.Request.RemoteAddr, sqlnamestr, parammaps.ValueStr())
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+						if tempv, exists := c.Get("jwt_username"); exists {
+							s_params = append(s_params, tempv.(string))
+						} else {
+							s_params = append(s_params, "")
+						}
+					} else {
+						s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+					}
+				}
+			}
+		} else if fsion.HasKey("params") {
+			params := fsion.Get("params").Array()
+			logging.Info("PostDataByName ", c.Keys, c.Request.RemoteAddr, sqlnamestr, params)
+			for _, v_params := range params {
+				s_params = append(s_params, v_params.ValueStr())
+			}
+		}
+		queryData, err := execDataBySqlT(sql, s_params, tx)
+		if err != nil {
+			logging.Error("PostDataByName  err: ", err)
+			//appG.Response(http.StatusOK, e.ERROR, err.Error())
+			msg := geterrmsg(err.Error())
+			appG.Response(http.StatusOK, e.ERROR, msg)
+		} else {
+
+			if sqlnamestr == "updateEQStartStop" {
+				parammaps := fsion.Get("parammaps")
+				username, _ := c.Get("jwt_username")
+				queryData, _ := getDataBySqlT("select maintenance from equipment where id = ? ", 0, 0, "", []interface{}{parammaps.Get("id").ValueStr()})
+				for _, value := range queryData.(map[string]interface{})["list"].([]map[string]interface{}) {
+					for _, maintenance := range strings.Split(value["maintenance"].(string), ",") {
+						if parammaps.Get("SSPstatue").ValueStr() == "启用" {
+							_, err := tx.Exec(` INSERT INTO wxworkmsg(DATE,userid,msg,formcode,TYPE,note)values(now(),
+?,concat("设备启停通知:\n设备资产编号:",(select eqCode from equipment where id = ? ),"\n用途:",(select purpose from equipment where id = ? ),"\n由报修人",(select empname from emp where empcode = ? limit 1),"启用\n时间:",now()),(select eqCode from equipment where id = ? ),1,null)`,
+								maintenance, parammaps.Get("id").ValueStr(), parammaps.Get("id").ValueStr(), username, parammaps.Get("id").ValueStr())
+							fmt.Println(err)
+						} else {
+							_, err := tx.Exec(` INSERT INTO wxworkmsg(DATE,userid,msg,formcode,TYPE,note)values(now(),
+?,concat("设备启停通知:\n设备资产编号:",(select eqCode from equipment where id = ? ),"\n用途:",(select purpose from equipment where id = ? ),"\n由报修人",(select empname from emp where empcode = ? limit 1 ),"停机\n时间:",now()),(select eqCode from equipment where id = ? ),1,null)`,
+								maintenance, parammaps.Get("id").ValueStr(), parammaps.Get("id").ValueStr(), username, parammaps.Get("id").ValueStr())
+							fmt.Println(err)
+						}
+					}
+				}
+			} else if restful.GetUserVendor(c.MustGet("jwt_username").(string)) == 1 && (sqlnamestr == "updateBigbuydetailStatu" || sqlnamestr == "shutDownBigrefunddetail") {
+				err = service.NextProcurement(sqlnamestr, parammaps.Get("id").ValueStr(), tx)
+				if err != nil {
+					appG.Response(http.StatusOK, e.ERROR, err.Error())
+					return
+				}
+			}
+
+			appG.Response(http.StatusOK, e.SUCCESS, queryData)
+		}
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, nil)
+	}
+}
+func PostThirdPartyData(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	tempval_ := make(map[string]interface{})
+	tempval := make([]map[string]interface{}, 0)
+	err := json.Unmarshal(dataByte, &tempval_)
+	logging.Info("PostThirdPartyData ", c.Keys, c.Request.RemoteAddr, tempval_["name"])
+	//logging.Info("PostThirdPartyData ", c.Keys, c.Request.RemoteAddr, tempval_["name"],tempval_)
+	if err != nil {
+		logging.Error("PostThirdPartyData Unmarshal error:", err)
+	} else {
+		if v, ok := tempval_["list"].([]interface{}); ok {
+			for _, Tvalue := range v {
+				if v1, ok := Tvalue.(map[string]interface{}); ok {
+					tempval = append(tempval, v1)
+				}
+			}
+		}
+		tx, err := restful.Dbs.Beginx()
+
+		if err != nil {
+			logging.Error("tx.Begin 事务启动失败__error:", err)
+		}
+		defer func() {
+			switch {
+			case err != nil:
+				fmt.Println("__error:", err)
+				if tx != nil {
+					tx.Rollback()
+				}
+			default:
+				if tx != nil {
+					err = tx.Commit()
+				}
+			}
+			if tx != nil {
+
+			}
+		}()
+
+		if err == nil {
+			sqlname, ok := tempval_["name"]
+			if ok {
+
+			}
+			sql, p := restful.GetSqlByNameDBT(sqlname.(string), tx)
+			if sql == "" {
+				appG.Response(http.StatusOK, e.ERROR, "调用接口不存在")
+			}
+			//s_params := make([]interface{}, 0)
+			paramslist := strings.Split(p, ",")
+			resname := ""
+
+			for _, paramvalue := range tempval {
+				s_params := make([]interface{}, 0)
+				if len(paramslist) > 0 && p != "" {
+					for _, value := range paramslist {
+						s_params = append(s_params, paramvalue[value])
+						//fmt.Println(value,paramvalue[value])
+
+					}
+				}
+				var res []map[string]string
+				res, err = restful.MapStrList("select id from measure where meterNumber = ? and meterType = '电表' and isdel = 0", paramvalue["meterNumber"])
+				if len(res) == 0 || err != nil {
+					switch paramvalue["meterNumber"].(type) {
+					case string:
+						resname = paramvalue["meterNumber"].(string)
+					}
+					err = errors.New("电表不存在")
+					break
+				}
+
+				_, err = execDataBySqlT(sql, s_params, tx)
+				if err != nil {
+					switch paramvalue["meterNumber"].(type) {
+					case string:
+						resname = paramvalue["meterNumber"].(string)
+					}
+					break
+				}
+			}
+			if err == nil {
+				appG.Response(http.StatusOK, e.SUCCESS, "ok")
+			} else {
+				msg := geterrmsg(err.Error())
+				appG.Response(http.StatusOK, e.ERROR, msg+"  "+resname)
+				//appG.Response(http.StatusOK, e.ERROR, err.Error())
+			}
+		}
+	}
+	if err != nil {
+		msg := geterrmsg(err.Error())
+		appG.Response(http.StatusOK, e.ERROR, msg)
+		//appG.Response(http.StatusOK, e.ERROR, err.Error())
+	}
+}
+func PostDataByNameOPEN(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	sqlnamestr = sqlnamestr + "OPEN"
+	s_params := make([]interface{}, 0)
+	tx, err := restful.Dbs.Beginx()
+
+	defer func() {
+		switch {
+		case err != nil:
+			fmt.Println("__error:", err)
+			if tx != nil {
+				tx.Rollback()
+			}
+		default:
+			if tx != nil {
+				err = tx.Commit()
+			}
+		}
+
+	}()
+	sql, p := restful.GetSqlByNameDBT(sqlnamestr, tx)
+	if sql != "" {
+		if fsion.HasKey("parammaps") {
+			parammaps := fsion.Get("parammaps")
+			logging.Info("PostDataByName ", c.Keys, c.Request.RemoteAddr, sqlnamestr, parammaps.ValueStr())
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+						if tempv, exists := c.Get("jwt_username"); exists {
+							s_params = append(s_params, tempv.(string))
+						} else {
+							s_params = append(s_params, "")
+						}
+					} else {
+						s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+					}
+				}
+			}
+		} else if fsion.HasKey("params") {
+			params := fsion.Get("params").Array()
+			logging.Info("PostDataByName ", c.Keys, c.Request.RemoteAddr, sqlnamestr, params)
+			for _, v_params := range params {
+				s_params = append(s_params, v_params.ValueStr())
+			}
+		}
+		queryData, err := execDataBySqlT(sql, s_params, tx)
+		if err != nil {
+			logging.Error("PostDataByName  err: ", err)
+			//appG.Response(http.StatusOK, e.ERROR, err.Error())
+			msg := geterrmsg(err.Error())
+			appG.Response(http.StatusOK, e.ERROR, msg)
+		} else {
+			appG.Response(http.StatusOK, e.SUCCESS, queryData)
+		}
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, nil)
+	}
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags ExecDataByConfig
+// @Accept json
+// @Produce  json
+// @Param  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/PostDataByName  [POST]
+//
+func ExecDataByConfig(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	tempval_ := make(map[string]interface{})
+	tempCommon := make(map[string]interface{})
+	tempval := make([]map[string]interface{}, 0)
+	err := json.Unmarshal(dataByte, &tempval_)
+	logging.Info("ExecDataByConfig ", c.Keys, c.Request.RemoteAddr, tempval_["common"], tempval_["data"])
+	if err != nil {
+		fmt.Println("error:", err)
+	} else {
+		if v, ok := tempval_["common"].(map[string]interface{}); ok {
+			tempCommon = v
+		}
+
+		if v, ok := tempval_["data"].([]interface{}); ok {
+			for _, Tvalue := range v {
+				if v1, ok := Tvalue.(map[string]interface{}); ok {
+					tempval = append(tempval, v1)
+				}
+			}
+		}
+		tx, err := restful.Dbs.Beginx()
+
+		if err != nil {
+			logging.Error("tx.Begin 事务启动失败__error:", err)
+		}
+		defer func(tx *sqlx.Tx) {
+			if err != nil {
+				fmt.Println("__error:", err)
+				if tx != nil {
+					err := tx.Rollback()
+					if err != nil {
+						fmt.Println(err)
+					}
+				}
+			} else {
+				if tx != nil {
+					err = tx.Commit()
+				}
+			}
+		}(tx)
+		//}
+
+		if err == nil {
+			if tempv, exists := c.Get("jwt_username"); exists {
+				tempCommon["jwt_username"] = tempv.(string)
+			}
+
+			for _, paramvalue := range tempval {
+				if _, ok := paramvalue["resultname"]; !ok {
+					paramvalue["resultname"] = paramvalue["name"]
+				}
+
+				if paramvalue["name"] == "insertBigPartrefund" {
+					if _, ok := paramvalue["parammaps"].(map[string]interface{})["buyeCode"]; ok {
+						tx.Exec(` update bigrefunddetail set statu = 2 where  buyeCode = ? `, paramvalue["parammaps"].(map[string]interface{})["buyeCode"])
+					}
+				}
+				_, err = ExecDataParam(paramvalue, tempCommon, tempval, nil, nil, tx)
+				if err != nil {
+					logging.Error("ExecDataParam error:", err)
+					break
+				}
+			}
+			if err == nil {
+				vendor := restful.GetUserVendor(c.MustGet("jwt_username").(string))
+				err = NextService(tempval, tx, vendor)
+				if err != nil {
+					appG.Response(http.StatusOK, e.ERROR, err.Error())
+					return
+				}
+
+				if tempCommon["returnmap"] != nil && tempCommon["returnmap"] != "" {
+					appG.Response(http.StatusOK, e.SUCCESS, tempval)
+				} else {
+					appG.Response(http.StatusOK, e.SUCCESS, "成功执行!")
+				}
+
+			} else {
+				msg := geterrmsg(err.Error())
+				appG.Response(http.StatusOK, e.ERROR, msg)
+			}
+		}
+	}
+
+	if err != nil {
+		msg := geterrmsg(err.Error())
+		appG.Response(http.StatusOK, e.ERROR, msg)
+		//appG.Response(http.StatusOK, e.ERROR, err.Error())
+	}
+	// 开协程
+	defer func() {
+		if restful.GetUserVendor(c.MustGet("jwt_username").(string)) == 0 {
+			go BillType(tempval_)
+		}
+	}()
+}
+func BillType(tempval_ map[string]interface{}) {
+	var typein int
+	switch tempval_["data"].(type) {
+	case []interface{}:
+		if len(tempval_["data"].([]interface{})) > 0 {
+			name := tempval_["data"].([]interface{})[0].(map[string]interface{})["name"]
+			switch name {
+			case "insertBigPartlaid":
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["laidCode"]
+				laidType := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["laidType"])
+
+				if laidType != "2" {
+					typein = 1
+				} else {
+					typein = 6
+				}
+				_ = util.EASBillSync(typein, billcode, "")
+			case "insertBigPartUse":
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["useForm"]
+				usetypev := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["useType"])
+				if usetypev != "4" {
+					typein = 2
+				} else {
+					typein = 7
+				}
+				_ = util.EASBillSync(typein, billcode, "")
+			case "insertBigPartquit":
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["useForm"]
+				_ = util.EASBillSync(3, billcode, "")
+			case "PartRefundCharge1":
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["id"]
+				statue := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["statue"])
+				if statue == "5" {
+					_ = util.EASBillSync(4, billcode, "")
+				}
+			}
+		}
+	}
+}
+func interfacetostring(val interface{}) string {
+	switch val.(type) {
+	case string:
+		ss := val.(string)
+		return ss
+	case int:
+		ss := val.(int)
+		return strconv.Itoa(ss)
+	case int64:
+		ss := val.(int64)
+		return strconv.FormatInt(ss, 10)
+	case float64:
+		ss := val.(float64)
+		return strconv.FormatFloat(ss, 'E', -1, 32)
+	}
+	return ""
+}
+func interfacetostringv2(val interface{}) string {
+	switch val.(type) {
+	case string:
+		ss := val.(string)
+		return ss
+	case int:
+		ss := val.(int)
+		return strconv.Itoa(ss)
+	case int64:
+		ss := val.(int64)
+		return strconv.FormatInt(ss, 10)
+	case float64:
+		ss := int(val.(float64))
+		return strconv.Itoa(ss)
+	}
+	return ""
+}
+func getParamValue(parammaps map[string]interface{}, value string, ParamMap []map[string]interface{}) string {
+	if valuestring, ok := parammaps[strings.Trim(value, " ")].(string); ok {
+
+		tempstrb := strings.IndexAny(valuestring, "@")
+		tempstre := strings.IndexAny(valuestring, ".")
+		if tempstrb > -1 && tempstre > -1 {
+			for _, ParamMapList := range ParamMap {
+				if v, ok := ParamMapList["resultname"]; ok {
+					if v == valuestring[tempstrb+1:tempstre] {
+						if v1, ok := ParamMapList["resultmaps"]; ok {
+							if newA, ok := v1.([]map[string]interface{}); ok {
+								return interfacetostring(newA[0][valuestring[tempstre+1:]])
+							} else if newA, ok := v1.(map[string]interface{}); ok {
+								return interfacetostring(newA[valuestring[tempstre+1:]])
+							}
+
+						}
+					}
+				}
+			}
+		} else {
+			return valuestring
+		}
+	} else if valuestring, ok := parammaps[strings.Trim(value, " ")].(float64); ok {
+		return strconv.FormatInt(int64(valuestring), 10)
+	}
+	return ""
+}
+func getParamValue_(parammaps map[string]interface{}, value string, ParamMap map[string]interface{}) string {
+	if valuestring, ok := parammaps[strings.Trim(value, " ")].(string); ok {
+		tempstrb := strings.IndexAny(valuestring, "@")
+		tempstre := strings.IndexAny(valuestring, ".")
+		if tempstrb > -1 && tempstre > -1 {
+			if v, ok := ParamMap[valuestring[tempstre+1:]]; ok {
+				if s, ok := v.(string); ok {
+					return s
+				} else if s, ok := v.(float64); ok {
+					return strconv.FormatInt(int64(s), 10)
+				}
+			}
+		}
+	}
+
+	return ""
+}
+func ExecDataParam(fasion map[string]interface{}, CommonParamMap map[string]interface{}, ParamMap []map[string]interface{}, ParentParamMap map[string]interface{}, sameParamMap []map[string]interface{}, tx *sqlx.Tx) ([]map[string]interface{}, error) {
+	sqlname := fasion["name"].(string)
+	sqltype := "" //v  校验/s1 查询/sm 查询/e  执行
+	defer func() {
+		if sqlname == "batchPartsSH" {
+			id := ""
+			switch ParentParamMap["id"].(type) {
+			case float64:
+				id = strconv.Itoa(int(ParentParamMap["id"].(float64)))
+			case string:
+				id = ParentParamMap["id"].(string)
+			case int:
+				id = strconv.Itoa(ParentParamMap["id"].(int))
+			}
+			go util.EASBillSync(5, id, "1")
+			//go CheckEASWebServiceParts("1",id)
+		}
+	}()
+	if v, ok := fasion["type"]; ok {
+		sqltype = v.(string)
+	}
+	sql := ""
+	p := ""
+	s_params := make([]interface{}, 0)
+	if sqltype != "" {
+		sql, p = restful.GetSqlByName(sqlname, nil)
+		//sqlApi, _ := model.GetApisqlByName(sqlname)
+		if v, ok := fasion["parammaps"].(map[string]interface{}); ok {
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					ss := ""
+
+					if ss == "" && CommonParamMap != nil {
+						if valuestring, ok := v[strings.Trim(value, " ")].(string); ok {
+							ss = valuestring
+							tempstrb := strings.IndexAny(valuestring, "@")
+							tempstre := strings.IndexAny(valuestring, ".")
+							if (tempstre > tempstrb) && (strings.ToLower(valuestring[tempstrb+1:tempstre]) == "common") {
+								if CommonParamMap[valuestring[tempstre+1:]] != nil {
+									ss = CommonParamMap[valuestring[tempstre+1:]].(string)
+								}
+							} else {
+								ss = ""
+							}
+						}
+
+					}
+					if ss == "" && ParentParamMap != nil {
+						ss = getParamValue_(v, value, ParentParamMap)
+					}
+
+					if ss == "" && sameParamMap != nil {
+						ss = getParamValue(v, value, sameParamMap)
+					}
+
+					if ss == "" && ParamMap != nil {
+						ss = getParamValue(v, value, ParamMap)
+					}
+					s_params = append(s_params, ss)
+				}
+			}
+
+		}
+	}
+	fmt.Println("=========")
+	if sql == "" {
+		sqltype = ""
+	}
+	if sqltype == "s1" {
+		tempValParam, err := restful.QueryByMap(sql, 0, 1, s_params)
+		if v, ok := tempValParam.(map[string]interface{}); ok {
+			fasion["resultmaps"] = v["list"].([]map[string]interface{})
+		}
+		if err != nil {
+			return nil, err
+		}
+		err = ExitsChildrenParam(fasion, tempValParam, ParamMap, CommonParamMap, tx)
+		if err != nil {
+			return nil, err
+		}
+		return tempValParam.(map[string]interface{})["list"].([]map[string]interface{}), err
+	} else if sqltype == "sm" {
+		tempValParam, err := restful.QueryByMap(sql, 0, 0, s_params)
+		if v, ok := tempValParam.(map[string]interface{}); ok {
+			fasion["resultmaps"] = v["list"].([]map[string]interface{})
+		} else {
+			fmt.Println("sm", tempValParam)
+		}
+
+		if err != nil {
+			return nil, err
+		}
+		err = ExitsChildrenParam(fasion, tempValParam, ParamMap, CommonParamMap, tx)
+		if err != nil {
+			return nil, err
+		}
+		return tempValParam.(map[string]interface{})["list"].([]map[string]interface{}), err
+
+	} else if sqltype == "v" {
+		tempValParam, err := restful.QueryByMap(sql, 0, 1, s_params)
+		if v, ok := tempValParam.(map[string]interface{}); ok {
+			fasion["resultmaps"] = v["list"].([]map[string]interface{})
+		} else {
+			fmt.Println("v", tempValParam)
+		}
+		if err != nil {
+			return nil, err
+		}
+		if tempValParam.(map[string]interface{})["list"].([]map[string]interface{})[0]["vmsg"] != "" {
+			return nil, errors.New(tempValParam.(map[string]interface{})["list"].([]map[string]interface{})[0]["vmsg"].(string))
+		}
+	} else if sqltype == "e" {
+		tempVal_arrary := make([]map[string]interface{}, 0)
+		tempVal_map := make(map[string]interface{})
+		tempValParam, err := restful.ExecQueryT(sql, s_params, tx)
+		if err == nil {
+			fasion["resultmaps"] = tempValParam.(map[string]interface{})
+			tempVal_map["result"] = tempValParam.(map[string]interface{})["result"]
+			tempVal_map["LastInsertId"] = tempValParam.(map[string]interface{})["LastInsertId"]
+			tempVal_arrary = append(tempVal_arrary, tempVal_map)
+			return tempVal_arrary, err
+		}
+		return nil, err
+	} else {
+		if tempValParam, ok := fasion["resultmaps"].(map[string]interface{}); ok {
+			err := ExitsChildrenParam(fasion, tempValParam, ParamMap, CommonParamMap, tx)
+			if err != nil {
+				return nil, err
+			}
+			return nil, err
+		}
+	}
+	return nil, nil
+}
+func ExitsChildrenParam(fasion map[string]interface{}, tempValParam interface{}, ParamMap []map[string]interface{}, commonParam map[string]interface{}, tx *sqlx.Tx) error {
+	var err error
+	subarray, ok := fasion["children"]
+
+	if ok {
+		for _, v := range tempValParam.(map[string]interface{})["list"].([]interface{}) { //遍历父集有多少行数据
+			tempVal_arrary := make([]map[string]interface{}, 0)
+			for _, subarrayvalue := range subarray.([]interface{}) { //遍历所有执行命令
+				tempVal_ := make(map[string]interface{})
+				if _, ok := subarrayvalue.(map[string]interface{})["resultname"]; !ok {
+					tempVal_["resultname"] = subarrayvalue.(map[string]interface{})["name"]
+				} else {
+					tempVal_["resultname"] = subarrayvalue.(map[string]interface{})["resultname"]
+				}
+				tempVal_["resultmaps"], err = ExecDataParam(subarrayvalue.(map[string]interface{}), commonParam, ParamMap, v.(map[string]interface{}), tempVal_arrary, tx) //递归调用执行
+
+				if err != nil {
+					return err
+				}
+				tempVal_arrary = append(tempVal_arrary, tempVal_)
+			}
+			v.(map[string]interface{})["children"] = tempVal_arrary
+		}
+	}
+	return nil
+}
+
+// @Summary   删除图片
+// @Tags RemovePicByName
+// @Accept json
+// @Produce  json
+// @Param  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/PostDataByName  [POST]
+func RemovePicByName(c *gin.Context) {
+	logging.Info("RemovePicByName ", c.Keys)
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlnamestr := fsion.Get("name").ValueStr()
+	picname := fsion.Get("picname").ValueStr()
+	sql, _ := restful.GetSqlByNameDB(sqlnamestr)
+	params := fsion.Get("params").Array()
+	s_params := make([]interface{}, 0)
+	for _, v_params := range params {
+		s_params = append(s_params, v_params.ValueStr())
+	}
+	if sql != "" {
+		queryData, err := execDataBySql(sql, s_params)
+
+		if picname != "" {
+			// Destination
+			distPath := path.Join(setting.CurrentPath, setting.AppSetting.ImageSavePath, picname)
+
+			err := os.Remove(distPath) //删除文件test.txt
+			if err != nil {
+				//如果删除失败则输出 file remove Error!
+				fmt.Println("file remove Error!")
+				//输出错误详细信息
+				fmt.Printf("%s", err)
+			} else {
+				//如果删除成功则输出 file remove OK!
+				fmt.Print("file remove OK!")
+			}
+			distPath = path.Join(setting.CurrentPath, setting.AppSetting.ThumbnailSavePath, picname)
+
+			err = os.Remove(distPath) //删除文件test.txt
+			if err != nil {
+				//如果删除失败则输出 file remove Error!
+				fmt.Println("file remove Error!")
+				//输出错误详细信息
+				fmt.Printf("%s", err)
+			} else {
+				//如果删除成功则输出 file remove OK!
+				fmt.Print("file remove OK!")
+			}
+		}
+
+		if err != nil {
+			appG.Response(http.StatusOK, e.ERROR, err.Error())
+		} else {
+			appG.Response(http.StatusOK, e.SUCCESS, queryData)
+		}
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, nil)
+	}
+}
+
+// @Summary   删除文件
+// @Tags RemoveFileByName
+// @Accept json
+// @Produce  json
+// @Param  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/PostDataByName  [POST]
+func RemoveFileByName(c *gin.Context) {
+	appG := app.Gin{C: c}
+	id := c.Param("id")
+	logging.Info("DownloadFile ", c.Keys, id)
+	eqdoc, err := restful.MapStrList("SELECT * FROM eq_doc where id = ? ", id)
+	if eqdoc == nil {
+		appG.Response(http.StatusOK, e.ERROR, err.Error())
+		return
+	}
+	distPath := path.Join(setting.CurrentPath, setting.AppSetting.FileSavePath, eqdoc[0]["docpath"], eqdoc[0]["newdocname"])
+
+	err = os.Remove(distPath) //删除文件test.txt
+	if err != nil {
+		//如果删除失败则输出 file remove Error!
+		fmt.Println("file remove Error!")
+		//输出错误详细信息
+		fmt.Printf("%s", err)
+		appG.Response(http.StatusOK, e.ERROR, err.Error())
+		return
+	}
+	fmt.Print("file remove OK!")
+	_, err = restful.MapStrList("delete FROM eq_doc where id = ? ", id)
+	if err != nil {
+		log.Default().Printf("RemoveFileByName:%v", err)
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, "OK")
+
+	//dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	//fsion := gofasion.NewFasion(string(dataByte))
+	//sqlnamestr := fsion.Get("name").ValueStr()
+	//filename := fsion.Get("filename").ValueStr()
+	//sql, _ := restful.GetSqlByNameDB(sqlnamestr)
+	//params := fsion.Get("params").Array()
+	//s_params := make([]interface{}, 0)
+	//for _, v_params := range params {
+	//	s_params = append(s_params, v_params.ValueStr())
+	//}
+	//if sql != "" {
+	//	queryData, err := execDataBySql(sql, s_params)
+	//
+	//	if filename != "" {
+	//		// Destination
+	//		distPath := path.Join(setting.CurrentPath, setting.AppSetting.FileSavePath, filename)
+	//
+	//		err := os.Remove(distPath) //删除文件test.txt
+	//		if err != nil {
+	//			//如果删除失败则输出 file remove Error!
+	//			fmt.Println("file remove Error!")
+	//			//输出错误详细信息
+	//			fmt.Printf("%s", err)
+	//		} else {
+	//			//如果删除成功则输出 file remove OK!
+	//			fmt.Print("file remove OK!")
+	//		}
+	//	}
+
+	//	if err != nil {
+	//		appG.Response(http.StatusOK, e.ERROR, err.Error())
+	//	} else {
+	//		appG.Response(http.StatusOK, e.SUCCESS, "OK")
+	//	}
+	//} else {
+	//	appG.Response(http.StatusOK, e.SUCCESS, nil)
+	//}
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags PostDataByName
+// @Accept json
+// @Produce  json
+// @Param  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/PostDataByName  [POST]
+func UpdateDataRelation(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	tablename := fsion.Get("name").ValueStr()
+	dataname := fsion.Get("dataname").ValueStr()
+	datavalue := fsion.Get("datavalue").ValueStr()
+	valuename := fsion.Get("valuename").ValueStr()
+	logging.Info("UpdateDataRelation ", c.Keys, c.Request.RemoteAddr, tablename, dataname, datavalue, valuename)
+	values := fsion.Get("values").Array()
+	tx, err := restful.Dbs.Beginx()
+
+	defer func() {
+		switch {
+		case err != nil:
+			fmt.Println("__error:", err)
+			if tx != nil {
+				tx.Rollback()
+			}
+		default:
+			if tx != nil {
+				err = tx.Commit()
+			}
+		}
+
+	}()
+	insertSqlstr := "insert into " + tablename + "( " + dataname + "," + valuename + ") select DISTINCT  ?, ? from DUAL " +
+		" where NOT EXISTS (select " + valuename + " from " + tablename + " where " + valuename + " = ? and " + dataname + " = ?)"
+
+	d_params := make([]interface{}, 4)
+	d_params[0] = datavalue
+	s_params := ""
+
+	for _, v_values := range values {
+		d_params[1] = v_values.ValueStr()
+		if s_params == "" {
+			s_params = v_values.ValueStr()
+		} else {
+			s_params = s_params + "," + v_values.ValueStr()
+		}
+		d_params[2] = d_params[1]
+		d_params[3] = d_params[0]
+		_, err := execDataBySqlT(insertSqlstr, d_params, tx)
+		if err != nil {
+			appG.Response(http.StatusOK, e.ERROR, err.Error())
+			break
+		}
+	}
+
+	if s_params != "" {
+
+		deleteSqlstr := "delete from " + tablename + " " +
+			"           where " + dataname + " = " + datavalue + " and " + valuename + " not in (" + s_params + ")"
+		queryData, err := execDataBySqlT(deleteSqlstr, nil, tx)
+		if err != nil {
+			appG.Response(http.StatusOK, e.ERROR, err.Error())
+		} else if err == nil {
+			appG.Response(http.StatusOK, e.SUCCESS, queryData)
+		}
+	} else {
+		deleteSqlstr := "delete from " + tablename + " " +
+			"           where " + dataname + " = " + datavalue
+		queryData, err := execDataBySqlT(deleteSqlstr, nil, tx)
+		if err != nil {
+			appG.Response(http.StatusOK, e.ERROR, err.Error())
+		} else if err == nil {
+			appG.Response(http.StatusOK, e.SUCCESS, queryData)
+		}
+	}
+}
+
+// @Summary   根据APISQL表中SQL执行得到数据集
+// @Tags PostDatasByName
+// @Accept json
+// @Produce  json
+// @Param  sqlname  query   string true "sqlname"
+// @Param  offset  query   int true "offset"
+// @Param  pagecount  query   int true "pagecount"
+// @Param  returntype  query   string true "returntype"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/PostDatasByName  [POST]
+func PostDataByNames(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	sqlParams := fsion.Get("array").Array()
+	queryData := make(map[string]interface{})
+	for _, v := range sqlParams {
+		fsion2 := gofasion.NewFasion(v.Json())
+		logging.Info("PostDataByNames ", c.Keys, fsion2.Get("name").ValueStr())
+		sql, p := restful.GetSqlByNameDB(fsion2.Get("name").ValueStr())
+		if sql == "" {
+			errorm := make(map[string]interface{})
+			errorm["code"] = e.ERROR
+			errorm["message"] = "sql没有找到"
+			errorm["param"] = ""
+			queryData[fsion2.Get("name").ValueStr()] = errorm
+			continue
+		} else if sql != "" {
+			s_params := make([]interface{}, 0)
+			if fsion2.HasKey("parammaps") {
+				parammaps := fsion2.Get("parammaps")
+
+				paramslist := strings.Split(p, ",")
+				if len(paramslist) > 0 && p != "" {
+					for _, value := range paramslist {
+						if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+							if tempv, exists := c.Get("jwt_username"); exists {
+								s_params = append(s_params, tempv.(string))
+							} else {
+								s_params = append(s_params, "")
+							}
+						} else {
+							s_params = append(s_params, parammaps.Get(strings.Trim(value, " ")).ValueStr())
+						}
+					}
+				}
+			} else if fsion2.HasKey("params") {
+				params := fsion2.Get("params").Array()
+				for _, v_params := range params {
+					s_params = append(s_params, v_params.ValueStr())
+				}
+			}
+			_, err := execDataBySql(sql, s_params)
+
+			if err != nil {
+				logging.Error("PostDataByName  err: ", err)
+				errorm := make(map[string]interface{})
+				errorm["code"] = e.ERROR
+				errorm["message"] = err.Error()
+				errorm["msg"] = "fail"
+				errorm["param"] = s_params
+				queryData[fsion2.Get("name").ValueStr()] = errorm
+				continue
+			} else {
+				errorm := make(map[string]interface{})
+				errorm["code"] = e.SUCCESS
+				errorm["message"] = "success"
+				errorm["msg"] = "ok"
+				queryData[fsion2.Get("name").ValueStr()] = errorm
+				continue
+			}
+		} else {
+			errorm := make(map[string]interface{})
+			errorm["code"] = e.ERROR
+			errorm["message"] = "NO SQL"
+			errorm["param"] = ""
+			queryData[fsion2.Get("name").ValueStr()] = errorm
+		}
+	}
+	//appG.Response(http.StatusOK, e.SUCCESS, msg)
+	appG.Response(http.StatusOK, e.SUCCESS, queryData)
+}
+func getDataBySql(sqlstr string, offset, pagecount int, returntype string, params []interface{}) (interface{}, error) {
+	if offset > 0 {
+		offset = offset - 1
+	}
+
+	if returntype == "list" {
+		queryData, err := restful.QueryByList(sqlstr, offset, pagecount, params)
+		return queryData, err
+	} else if returntype == "listlist" {
+		queryData, err := restful.QueryByListList(sqlstr, offset, pagecount, params)
+		return queryData, err
+	} else {
+		queryData, err := restful.QueryByMap(sqlstr, offset, pagecount, params)
+		return queryData, err
+	}
+}
+
+// func getDataBySqlT(sqlstr string, offset, pagecount int, returntype string, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
+func getDataBySqlT(sqlstr string, offset, pagecount int, returntype string, params []interface{}) (interface{}, error) {
+	if offset > 0 {
+		offset = offset - 1
+	}
+
+	if returntype == "list" {
+		// queryData, err := restful.QueryByListT(sqlstr, offset, pagecount, params, tx)
+		queryData, err := restful.QueryByListT(sqlstr, offset, pagecount, params)
+		return queryData, err
+	} else if returntype == "listlist" {
+		// queryData, err := restful.QueryByListListT(sqlstr, offset, pagecount, params, tx)
+		queryData, err := restful.QueryByListListT(sqlstr, offset, pagecount, params)
+		return queryData, err
+	} else {
+		// queryData, err := restful.QueryByMapT(sqlstr, offset, pagecount, params, tx)
+		queryData, err := restful.QueryByMapT(sqlstr, offset, pagecount, params)
+		return queryData, err
+	}
+}
+func GetRecuData_BySql(sql string, Params string, idname string, thisParams map[string]interface{}, isList bool) (interface{}, error) {
+	paramslist := strings.Split(Params, ",")
+	s_params := make([]interface{}, 0)
+	if isList {
+		for _, v_params := range thisParams["params"].([]interface{}) {
+			s_params = append(s_params, v_params)
+		}
+	} else {
+		paramslist := strings.Split(Params, ",")
+		if len(paramslist) > 0 && Params != "" {
+			for _, value := range paramslist {
+				s_params = append(s_params, thisParams[strings.Trim(value, " ")])
+			}
+		}
+	}
+	queryData, err := restful.QueryByMapMenu(sql, 0, 0, s_params)
+	for _, queryData_ := range queryData {
+		if v, ok := queryData_["haschildren"]; (ok && v.(int64) > 0) || !ok {
+			if isList {
+				//fmt.Println(idname, "--------------             -queryData_[idname]", queryData_)
+				if queryData_[idname] != nil {
+					thisParams["params"].([]interface{})[len(thisParams["params"].([]interface{}))-1] = queryData_[idname].(interface{})
+				}
+
+			} else {
+				if queryData_[idname] != nil {
+					thisParams[idname] = queryData_[idname].(interface{})
+				}
+				if len(paramslist) > 0 && Params != "" {
+					s_params = make([]interface{}, 0)
+					for _, value := range paramslist {
+						s_params = append(s_params, thisParams[strings.Trim(value, " ")])
+					}
+				}
+			}
+			queryData_["children"], _ = GetRecuData_BySql(sql, Params, idname, thisParams, isList)
+		} else {
+
+		}
+	}
+	return queryData, err
+}
+func execDataBySql(sqlstr string, params []interface{}) (interface{}, error) {
+	queryData, err := restful.ExecQuery(sqlstr, params)
+	return queryData, err
+}
+func execDataBySqlT(sqlstr string, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
+	queryData, err := restful.ExecQueryT(sqlstr, params, tx)
+	return queryData, err
+}
+func ExecDataBySql(sqlstr string, params []interface{}) (interface{}, error) {
+	queryData, err := restful.ExecQuery(sqlstr, params)
+	return queryData, err
+}
+
+// @Summary   导入excel文件到数据库,excel第一行作为参数
+// @Tags ImportExcel
+// @Accept json
+// @Produce  json
+// @Param  file  query   string true "文件名"
+// @Param  name  header   string  true "执行sql的名字"
+// @Success 200 {string} json  "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /data/ImportExcel  [POST]
+// @param 备件编号,备件名称,规格型号,计量单位,品牌,计划量,单价,备注,jwt_username
+// func ImportExcel(c *gin.Context) {
+// 	log.Default().Println("Importing Excel================================")
+// 	appG := app.Gin{C: c}
+// 	file, _, err := c.Request.FormFile("file")
+// 	if err != nil {
+// 		logrus.Errorf("request.FormFile: %v", err)
+// 		appG.Response(http.StatusOK, e.ERROR, err)
+// 		return
+// 	}
+// 	xlsx1, err := excelize.OpenReader(file)
+// 	if err != nil {
+// 		logrus.Errorf("excelize.OpenReader: %v", err)
+// 		appG.Response(http.StatusOK, e.ERROR, err)
+// 		return
+// 	}
+// 	c.Request.ParseForm()
+// 	params := c.Request.Form
+// 	sheetname := params.Get("sheetname")
+// 	rows := xlsx1.GetRows(sheetname)
+// 	importParams := params.Get("importParams")
+// 	paramslist := strings.Split(importParams, ",")
+// 	sqlnamestr := params.Get("name")
+// 	sql, _ := restful.GetSqlByNameDB(sqlnamestr)
+// 	inputdata := ""
+// 	ok := 0
+// 	error := 0
+// 	queryData := make([]interface{}, 0)
+// 	data := make(map[string]interface{})
+// 	if len(rows) > 10000 {
+// 		rows = rows[:10000]
+// 	}
+// 	if len(rows) <= 1 {
+// 		logrus.Errorln("表格为空")
+// 		appG.Response(http.StatusOK, e.ERROR, errors.New("表格为空"))
+// 		return
+// 	}
+// 	if len(rows[0]) < len(paramslist) {
+// 		logrus.Errorln("表格缺少数据列")
+// 		appG.Response(http.StatusOK, e.ERROR, errors.New("表格缺少数据列"))
+// 		return
+// 	}
+// 	for i, v := range paramslist {
+// 		if strings.Trim(rows[0][i], " ") != v {
+// 			logrus.Errorln("表格数据列顺序不符合标准,或标题名称错误")
+// 			appG.Response(http.StatusOK, e.ERROR, errors.New("表格数据列顺序不符合标准,或标题名称错误"))
+// 			return
+// 		}
+// 	}
+// 	for _, row := range rows[1:] {
+// 		s_params := make([]interface{}, 0)
+// 		outentry := make(map[string]interface{})
+// 		for i := range row {
+// 			row[i] = strings.TrimSpace(row[i])
+// 			s_params = append(s_params, row[i])
+// 		}
+// 		uname := ""
+// 		if tempv, b := c.Get("jwt_username"); b {
+// 			uname = tempv.(string)
+// 		}
+// 		s_params = append(s_params, uname)
+// 		outentry["input"] = inputdata
+// 		log.Default().Printf("params=%v", s_params...)
+// 		returnmsg, err := getDataBySql(sql, 0, 0, "4", s_params)
+
+// 		returnmsgmap, _ := returnmsg.(map[string]interface{})
+// 		returnmsgmap1, _ := returnmsgmap["list"].([]map[string]interface{})
+// 		if err != nil {
+// 			outentry["error_msg"] = err.Error()
+// 			error++
+// 			queryData = append(queryData, outentry)
+// 		} else if (len(returnmsgmap1) > 0) && (returnmsgmap1[0]["msg"] == "success") {
+// 			ok++
+// 		} else {
+// 			msg := geterrmsg(returnmsgmap1[0]["msg"].(string))
+// 			outentry["error_msg"] = msg
+// 			error++
+// 			queryData = append(queryData, outentry)
+// 		}
+// 	}
+// 	data["result"] = queryData
+// 	data["success"] = ok
+// 	data["err_count"] = error
+// 	appG.Response(http.StatusOK, e.SUCCESS, data)
+// }
+func ImportExcel(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	inputdata := ""
+	if err := c.Request.ParseForm(); err != nil {
+		log.Default().Printf("request.parseform:%v", err)
+		appG.Response(http.StatusOK, e.ERROR, err)
+		return
+	}
+	params := c.Request.Form
+	// file, _, err := c.Request.FormFile("file")
+	fileHeader, err := c.FormFile("file")
+	file, err := fileHeader.Open()
+	if err != nil {
+		log.Default().Printf("multipart.FileHeader.open:%v", err)
+		appG.Response(http.StatusOK, e.ERROR, err)
+		return
+	}
+	if err != nil {
+		log.Default().Printf("request.FormFile: %v", err)
+		appG.Response(http.StatusOK, e.ERROR, err)
+		return
+	}
+	sqlnamestr := params.Get("name")
+	sheetname := params.Get("sheetname")
+	importParams := params.Get("importParams")
+	sql, _ := restful.GetSqlByNameDB(sqlnamestr)
+	// 备件编号,备件名称,规格型号,计量单位,品牌,计划量,单价,备注,jwt_username
+	paramslist := strings.Split(importParams, ",")
+	if sqlnamestr != "importGasoline" && sqlnamestr != "importCoal" && sqlnamestr != "importBiomass" && sqlnamestr != "importEnergy" {
+		paramslist = append(paramslist, "jwt_username")
+	}
+	queryData := make([]interface{}, 0)
+
+	xlsx1, err := excelize.OpenReader(file)
+
+	if err != nil {
+		log.Default().Printf("excelize.OpenReader:%v", err)
+		return
+	}
+	ok := 0
+	error := 0
+
+	rows := xlsx1.GetRows(sheetname)
+	if len(rows) > 10000 {
+		rows = rows[:10000]
+	}
+	for i, row := range rows {
+		if i > 0 {
+			if len(paramslist) > 0 {
+				s_params := make([]interface{}, 0)
+				entry := make(map[string]interface{})
+				outentry := make(map[string]interface{})
+				inputdata = ""
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
+						if tempv, exists := c.Get("jwt_username"); exists {
+							s_params = append(s_params, tempv.(string))
+						} else {
+							s_params = append(s_params, "")
+						}
+					} else {
+						for j, colCell := range rows[0] {
+							if strings.Trim(value, " ") == colCell {
+								for k, colCell1 := range row {
+									if j == k {
+										outentry[colCell] = colCell1
+										entry[colCell] = colCell1
+										//inputdata = inputdata + colCell + ":" + colCell1 + ";"
+									}
+								}
+							}
+						}
+						s_params = append(s_params, entry[strings.Trim(value, " ")])
+					}
+				}
+				outentry["input"] = inputdata
+				returnmsg, err := getDataBySql(sql, 0, 0, "4", s_params)
+
+				returnmsgmap, _ := returnmsg.(map[string]interface{})
+				returnmsgmap1, _ := returnmsgmap["list"].([]map[string]interface{})
+				log.Default().Printf("return:%v", returnmsgmap)
+				if err != nil {
+					outentry["error_msg"] = err.Error()
+					error++
+					queryData = append(queryData, outentry)
+				} else if (len(returnmsgmap1) > 0) && (returnmsgmap1[0]["msg"] == "success") {
+					ok++
+				} else {
+					error++
+					msg := ""
+					if len(returnmsgmap1) > 0 && returnmsgmap1[0]["msg"] != nil {
+						msg = geterrmsg(returnmsgmap1[0]["msg"].(string))
+					}
+					outentry["error_msg"] = msg
+					queryData = append(queryData, outentry)
+				}
+			}
+		}
+	}
+	data := make(map[string]interface{})
+	data["result"] = queryData
+	data["success"] = ok
+	data["err_count"] = error
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}
+func DownloadMailReport(context *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(context.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	//filename := context.Param("filename")
+	sqlnamestr := fsion.Get("name").ValueStr()
+	pastureId := fsion.Get("pastureId").ValueStr()
+	pastureName := fsion.Get("pastureName").ValueStr()
+	date := fsion.Get("date").ValueStr()
+	logging.Info("DownloadMailReport ", context.Keys, sqlnamestr, pastureName)
+	filepath := ""
+
+	if sqlnamestr == "DownloadMailReportJY" {
+		filepath, _ = util.DownloadDataJT(date)
+	} else if sqlnamestr == "DownloadMailReportMC" {
+		filepath, _ = util.DownloadDataMC(pastureName, date, pastureId)
+	} else if sqlnamestr == "sssss" { // 平时用来拉数据的
+		util.Sssss()
+	} else if sqlnamestr == "DownloadEquipment" { // 设备指标导出方法
+		parammaps := fsion.Get("parammaps").ValueStr()
+		filepath, _ = util.DownloadEquipment(parammaps)
+
+	}
+
+	if filepath == "" {
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	originFilePath := filepath
+	//println("originFilePath==========",originFilePath)
+	if fs.PathExists(originFilePath) == false {
+		// if the path not found
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	http.ServeFile(context.Writer, context.Request, originFilePath)
+
+}
+
+// 资产标准管理判断牧场是否有选择的该部门
+func PastureDepartment(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+
+	paramMap := fsion.Get("param")
+	ids := paramMap.Get("ids").ValueStr()
+	deptName := paramMap.Get("deptName").ValueStr()
+	idList := strings.Split(ids, ",")
+	checkDeptList := make([]map[string]interface{}, 0)
+	for _, v := range idList {
+		aa, _ := strconv.Atoi(v)
+		data, err := restful.MapStrList("select * from department where pastureId=? and name=? and enable=1 and isDel=0 and isPasture=0", aa, deptName)
+		if err != nil {
+			fmt.Println(err)
+		} else {
+			list := make(map[string]interface{}, 1)
+			if len(data) == 0 {
+				list["id"] = v
+				list["enable"] = 0
+			} else {
+				list["id"] = v
+				list["enable"] = 1
+			}
+			checkDeptList = append(checkDeptList, list)
+		}
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, checkDeptList)
+}
+
+//{ 'label': '汶上', 'property': 'm1' }
+// 资产标准管理
+func Equipment(c *gin.Context) {
+
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	deptName := fsion.Get("deptName").ValueStr()
+	eqClassId := fsion.Get("eqClassId").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	dataList := make([]interface{}, 0)
+	pastureData, err := restful.MapStrList("select p.`name`,p.id from pasture p group by p.`name`")
+	str := "select eqS.id,eqS.deapartmentName deptName, eqS.`use`,eqclass.`typeName`,p.`name`,p.id pastureId ,eqS.eqClassId " +
+		" from equipment_standard eqS" +
+		" left join pasture p on p.id= eqS.pastureId" +
+		" left join eqclass  on eqclass.id=eqS.eqClassId " +
+		" where (eqS.deapartmentName = :deptName or :deptName ='') and " +
+		" (eqS.eqClassId = :eqClassId or :eqClassId ='') " +
+		" group by deptName,eqClassId " +
+		" ORDER BY eqS.id DESC"
+	offset = offset - 1
+	if pagecount > 0 && offset > 0 {
+		offset = offset * pagecount
+	}
+	paramMap_3_6 := map[string]interface{}{"deptName": deptName, "eqClassId": eqClassId}
+	str += fmt.Sprintf("limit %d  offset %d", pagecount, offset)
+	equipmentStandardData1, err := restful.MapStrList(str, paramMap_3_6)
+	//数据
+	equipmentStandardData2, err := restful.MapStrList("select eqS.deapartmentName deptName, eqS.id eqSId,eqS.equipmentNumber,p.`name`,p.id pastureId,eqS.eqClassId"+
+		" from equipment_standard eqS"+
+		" left join pasture p on p.id= eqS.pastureId "+
+		" left join eqclass eqc on eqc.id=eqS.eqClassId "+
+		"where (eqS.deapartmentName =? or ?='') and"+
+		" (eqS.eqClassId = ? or ?='') ", deptName, deptName, eqClassId, eqClassId)
+
+	sqlstr := str
+
+	params := make([]interface{}, 0)
+	for i := 0; i < 2; i++ {
+		param := make(map[string]interface{}, 0)
+		param["deptName"] = deptName
+		param["eqClassId"] = eqClassId
+		params = append(params, param)
+	}
+	label := make([]map[string]interface{}, 0)
+	if err != nil {
+		fmt.Println(err)
+	} else {
+		for i, v := range pastureData {
+			pasturelist := make(map[string]interface{}, 1)
+			pasturelist["label"] = v["name"]
+			pasturelist["id"] = v["id"]
+			pasturelist["property"] = "m" + strconv.Itoa(i+1)
+			label = append(label, pasturelist)
+		}
+		label2 := make([]map[string]interface{}, 0)
+		for _, s := range equipmentStandardData1 {
+			equipmentStandardList := make(map[string]interface{}, 1)
+			for i := 1; i <= len(label); i++ {
+				equipmentStandardList["m"+strconv.Itoa(i)] = ""
+			}
+			equipmentStandardList["deptName"] = s["deptName"]
+			equipmentStandardList["use"] = s["use"]
+			equipmentStandardList["typeName"] = s["typeName"]
+			equipmentStandardList["eqClassId"] = s["eqClassId"]
+			for _, z := range equipmentStandardData2 {
+				for e, x := range label {
+					if s["deptName"] == z["deptName"] && x["label"] == z["name"] && s["eqClassId"] == z["eqClassId"] {
+						equipmentStandardList["pastureId"+strconv.Itoa(e+1)] = x["id"]
+						equipmentStandardList[x["property"].(string)] = z["equipmentNumber"]
+					} else {
+						equipmentStandardList["pastureId"+strconv.Itoa(e+1)] = x["id"]
+					}
+				}
+			}
+			label2 = append(label2, equipmentStandardList)
+		}
+		if err != nil {
+			msg := geterrmsg(err.Error())
+			appG.Response(http.StatusOK, e.ERROR, msg)
+		} else {
+			dataList = append(dataList, label)
+			dataList = append(dataList, label2)
+			data := make(map[string]interface{})
+			recordcount := int64(0)
+			if pagecount > 1 {
+				sqlstr := fmt.Sprintf("SELECT COUNT(*) as count FROM (%s) a", sqlstr)
+				params := []interface{}{deptName, deptName, eqClassId, eqClassId}
+				err := restful.BasicList(sqlstr, params, &recordcount)
+				if err != nil {
+					log.Default().Printf("Equipment query error: %v", err)
+				}
+			}
+			if err != nil {
+				fmt.Println(err)
+			}
+			if recordcount == 0 {
+				recordcount = int64(len(equipmentStandardData1))
+			}
+
+			data["list"] = dataList
+			//data := make(map[string]interface{})
+			data["total"] = recordcount
+			data["code"] = 0
+			data["message"] = "ok"
+			if pagecount > 0 {
+				data["pages"] = math.Ceil(float64(recordcount) / float64(pagecount))
+				data["pageNum"] = math.Ceil(float64(offset+1) / float64(pagecount))
+			}
+			data["pageSize"] = pagecount
+			appG.Response(http.StatusOK, e.SUCCESS, data)
+		}
+	}
+}
+
+// 资产标准管理插入修改写在一起
+func UpdateAndInsert(c *gin.Context) {
+	appG := app.Gin{C: c}
+	data := make(map[string]interface{}, 0)
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	param := fsion.Get("param")
+	check := fsion.Get("check").ValueStr()
+	tx, err := restful.Dbs.Beginx()
+
+	deptName := param.Get("deptName").ValueStr()
+	eqCode := param.Get("eqCode").ValueStr()
+	eqClassId, err := strconv.Atoi(param.Get("eqClassId").ValueStr())
+	use := param.Get("use").ValueStr()
+	paramStr := fsion.Get("param").ValueStr()
+	paramMap := make(map[string]interface{}, 0)
+	err = json.Unmarshal([]byte(paramStr), &paramMap)
+	fmt.Println(len(paramMap))
+	fmt.Println(paramMap)
+	// 标准库存
+	name := fsion.Get("name").ValueStr()
+	partClassId, err := strconv.Atoi(param.Get("partClassId").ValueStr())
+	ff := 0
+	if check == "insert" {
+		querydata := make([]map[string]string, 0)
+		if name == "partStandard" {
+			ff = 2
+			querydata, err = restful.MapStrList(" select * from part_standard where partClassId2 =? ", partClassId)
+			if querydata != nil {
+				//data["msg"]="请不输入重复数据"
+				msg := geterrmsg("请不输入重复数据")
+				appG.Response(http.StatusOK, e.ERROR, msg)
+				return
+			}
+		} else {
+			ff = 4
+			querydata, err = restful.MapStrList(" select * from equipment_standard where eqClassId =? and deapartmentName = ?", eqClassId, deptName)
+			if querydata != nil {
+				//data["msg"]="请不输入重复数据"
+				msg := geterrmsg("请不输入重复数据")
+				appG.Response(http.StatusOK, e.ERROR, msg)
+				return
+			}
+		}
+
+		for i := 1; i <= (len(paramMap)-ff)/2; i++ {
+			pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
+			if err != nil {
+			}
+			if name == "partStandard" {
+				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
+					tx.Exec("call add_part_standard(?,?,?)", partClassId, pastureId, param.Get("m"+strconv.Itoa(i)))
+				}
+			} else {
+				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
+					tx.Exec("call add_equipment_standard(?,?,?,?,?,?)", deptName, use, eqClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr(), eqCode)
+				}
+			}
+
+		}
+		if err != nil {
+		}
+	}
+	if check == "update" {
+		if name == "partStandard" {
+			ff = 2
+			tx.Exec("delete from part_standard where partClassId2 =?", partClassId)
+			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
+				pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
+				if err != nil {
+				}
+				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
+					tx.Exec("call add_part_standard(?,?,?)", partClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr())
+				}
+			}
+		} else {
+			ff = 4
+			tx.Exec("delete from equipment_standard   where deapartmentName=? and eqClassId=?", deptName, eqClassId)
+			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
+				pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
+				if err != nil {
+				}
+				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
+					tx.Exec("call add_equipment_standard(?,?,?,?,?,?)", deptName, use, eqClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr(), eqCode)
+					//	" WHERE deapartmentName=? and pastureId = ? and eqClassId=?", use, param.Get("m"+strconv.Itoa(i)).ValueStr(), deptName, pastureId,eqClassId).Execute()
+				}
+			}
+		}
+		if err != nil {
+			data["msg"] = "error"
+			data["error"] = err.Error()
+			appG.Response(http.StatusOK, e.SUCCESS, data)
+		}
+	}
+	if check == "delete" {
+		if name == "partStandard" {
+			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
+				pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
+				if err != nil {
+				}
+				tx.Exec("delete from part_standard   where  pastureId=? and partClassId2=?", pastureId, partClassId)
+			}
+		} else {
+			ff = 4
+			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
+				pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
+				if err != nil {
+				}
+				tx.Exec("delete from equipment_standard   where deapartmentName=? and pastureId=? and eqClassId=?", deptName, pastureId, eqClassId)
+			}
+		}
+	}
+
+	data["msg"] = "ok"
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+	defer func() {
+		switch {
+		case err != nil:
+			logging.Error("tx.Begin 事务启动失败__error:", err)
+			if tx != nil {
+				tx.Rollback()
+			}
+		default:
+			if tx != nil {
+				err = tx.Commit()
+			}
+		}
+
+	}()
+}
+
+func StandardPart(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	partClassId := fsion.Get("partClassId").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	pastureData, err := restful.MapStrList("select p.`name`,p.id from pasture p group by p.`name`")
+
+	//s_params := make([]interface{}, 0)
+	offset = offset - 1
+	if pagecount > 0 && offset > 0 {
+		offset = offset * pagecount
+	}
+	dataList := make([]interface{}, 0)
+	label := make([]map[string]interface{}, 0)
+	str := "select p_c.partName,p.`name`,p_s.pastureId,p_s.partClassId2 from part_standard p_s left join part_class p_c on p_c.id= p_s.partClassId2 " +
+		" left join pasture p on p.id = p_s.pastureId where p_s.partClassId2 = ? or ?='' " +
+		" GROUP BY p_s.partClassId2  ORDER BY p_s.id DESC"
+	str1 := "select  p_s.standardMoney,p_s.partClassId2,p_s.pastureId,p.`name` from part_standard p_s left join pasture p on p.id=p_s.pastureId  where p_s.partClassId2 = ? or ?=''"
+	str += fmt.Sprintf(" limit %d  offset %d", pagecount, offset)
+	partStandardData1, err := restful.MapStrList(str, partClassId, partClassId)
+	//数据
+	partStandardData2, err := restful.MapStrList(str1, partClassId, partClassId)
+
+	if err != nil {
+		fmt.Println(err)
+	} else {
+		for i, v := range pastureData {
+			pasturelist := make(map[string]interface{}, 1)
+			pasturelist["label"] = v["name"]
+			pasturelist["id"] = v["id"]
+			pasturelist["property"] = "m" + strconv.Itoa(i+1)
+			label = append(label, pasturelist)
+		}
+		label2 := make([]map[string]interface{}, 0)
+		//equipmentStandardList := make(map[string]interface{}, 1)
+		for _, s := range partStandardData1 {
+			partStandardList := make(map[string]interface{}, 1)
+			for i := 1; i <= len(label); i++ {
+				partStandardList["m"+strconv.Itoa(i)] = ""
+			}
+			partStandardList["partClassId"] = s["partClassId2"]
+			partStandardList["partName"] = s["partName"]
+			for _, z := range partStandardData2 {
+				for e, x := range label {
+					if x["label"] == z["name"] && s["partClassId2"] == z["partClassId2"] {
+						partStandardList["pastureId"+strconv.Itoa(e+1)] = x["id"]
+						//equipmentStandardList["eqSId"+strconv.Itoa(e+1)] = z["eqSId"]
+						partStandardList[x["property"].(string)] = z["standardMoney"]
+					} else {
+						partStandardList["pastureId"+strconv.Itoa(e+1)] = x["id"]
+					}
+				}
+			}
+			label2 = append(label2, partStandardList)
+		}
+		if err != nil {
+			//logging.Error("GetDataByName  err: ", err)
+			msg := geterrmsg(err.Error())
+			appG.Response(http.StatusOK, e.ERROR, msg)
+		} else {
+			dataList = append(dataList, label)
+			dataList = append(dataList, label2)
+			fmt.Println(label2)
+			data := make(map[string]interface{})
+			recordcount := int64(0)
+			if pagecount > 1 {
+				sqlstr := fmt.Sprintf("SELECT COUNT(*) as count FROM (%s) a", str)
+				params := []interface{}{partClassId, partClassId}
+				restful.BasicList(sqlstr, params, &recordcount)
+				if err != nil {
+					fmt.Println("s1", err)
+				}
+			}
+			if err != nil {
+				fmt.Println(err)
+			}
+			if recordcount == 0 {
+				recordcount = int64(len(partStandardData1))
+			}
+
+			data["list"] = dataList
+			//data := make(map[string]interface{})
+			data["total"] = recordcount
+			data["code"] = 0
+			data["message"] = "ok"
+			if pagecount > 0 {
+				data["pages"] = math.Ceil(float64(recordcount) / float64(pagecount))
+				data["pageNum"] = math.Ceil(float64(offset+1) / float64(pagecount))
+			}
+			data["pageSize"] = pagecount
+
+			//pageNum: 1  pageSize: 10  pages: 202  total: 2019
+			//data["pageNum"]=queryData
+			//data["pageNum"]=queryData["pageNum"]
+			appG.Response(http.StatusOK, e.SUCCESS, data)
+		}
+	}
+}
+
+func GetMtbfTable(c *gin.Context) {
+	appG := app.Gin{C: c}
+	//dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	//fsion := gofasion.NewFasion(string(dataByte))
+	data := make(map[string]interface{})
+	data["name"] = "epans"
+	data["userId"] = "99"
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}

+ 553 - 0
apiserver/routers/api/upload.go

@@ -0,0 +1,553 @@
+package api
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"fmt"
+	"image"
+	"image/gif"
+	"image/jpeg"
+	"image/png"
+	"io"
+	"log"
+	"mime/multipart"
+	"net/http"
+	"os"
+	"path"
+	"strconv"
+	"strings"
+
+	"github.com/pkg/errors"
+
+	fs "github.com/axetroy/go-fs"
+	"github.com/gin-gonic/gin"
+	"github.com/nfnt/resize"
+	"kpt.xdmy/apiserver/routers/restful"
+	"kpt.xdmy/pkg/app"
+	"kpt.xdmy/pkg/e"
+	"kpt.xdmy/pkg/logging"
+	"kpt.xdmy/pkg/setting"
+)
+
+// 支持的图片后缀名
+var supportImageExtNames = []string{".jpg", ".jpeg", ".png", ".ico", ".svg", ".bmp", ".gif"}
+
+/**
+check a file is a image or not
+*/
+func isImage(extName string) bool {
+	for i := 0; i < len(supportImageExtNames); i++ {
+		if supportImageExtNames[i] == extName {
+			return true
+		}
+	}
+	return false
+}
+
+/**
+Handler the parse error
+*/
+func parseFormFail(context *gin.Context) {
+	context.JSON(http.StatusBadRequest, gin.H{
+		"message": "Can not parse form",
+	})
+}
+
+/**
+Upload file handler
+*/
+func UploadFile(context *gin.Context) {
+	appG := app.Gin{C: context}
+	dictId := context.Param("id")
+	dictName := context.Param("name")
+	logging.Info("UploadFile ", context.Keys, dictId, dictName)
+	var (
+		isSupportFile bool
+		maxUploadSize = setting.AppSetting.FileMaxSize   // 最大上传大小
+		allowTypes    = setting.AppSetting.FileAllowType // 可上传的文件类型
+		distPath      string                             // 最终的输出目录
+		err           error
+		file          *multipart.FileHeader
+		src           multipart.File
+		dist          *os.File
+	)
+	// Source
+	if file, err = context.FormFile("file"); err != nil {
+		parseFormFail(context)
+		return
+	}
+	sqlname := context.GetHeader("optname")
+	extname := path.Ext(file.Filename)
+	if len(allowTypes) != 0 {
+		for i := 0; i < len(allowTypes); i++ {
+			if allowTypes[i] == extname {
+				isSupportFile = true
+				break
+			}
+		}
+
+		if isSupportFile == false {
+			context.JSON(http.StatusBadRequest, gin.H{
+				"message": "不支持的文件类型: " + extname,
+			})
+			return
+		}
+	}
+
+	if file.Size > int64(maxUploadSize) {
+		context.JSON(http.StatusBadRequest, gin.H{
+			"message": "上传文件太大, 最大限制为" + strconv.Itoa(int(maxUploadSize)/1048576) + "(M): ",
+		})
+		return
+	}
+
+	if src, err = file.Open(); err != nil {
+		// open the file fail...
+	}
+	defer src.Close()
+
+	hash := md5.New()
+
+	io.Copy(hash, src)
+
+	md5string := hex.EncodeToString(hash.Sum([]byte("")))
+
+	fileName := md5string + extname
+	// Destination
+
+	filePath := setting.CurrentPath + setting.AppSetting.FileSavePath + dictName + "/"
+	err = PathCheck(filePath) //检查路径并创建
+	if err != nil {
+		fmt.Println("PathCheck err", err)
+	}
+	distPath = path.Join(filePath, fileName)
+	if dist, err = os.Create(distPath); err != nil {
+		fmt.Println("Create err", err)
+	}
+	defer dist.Close()
+	//distPath = setting.CurrentPath + setting.AppSetting.FileSavePath +"/"+ fileName
+
+	if dist, err = os.Create(distPath); err != nil {
+		// create dist file fail...
+	}
+	defer dist.Close()
+
+	// FIXME: open 2 times
+	if src, err = file.Open(); err != nil {
+		//
+	}
+
+	// Copy
+	io.Copy(dist, src)
+	var execresult interface{}
+
+	params := context.Request.Form
+
+	if sqlname != "" {
+		sql, p := restful.GetSqlByNameDB(sqlname) //todo insertcustomdoc
+		if sql != "" {
+			s_params := make([]interface{}, 0)
+			paramslist := strings.Split(p, ",")
+
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					fmt.Println("s_params value", s_params, value)
+					if strings.ToLower(strings.Trim(value, " ")) == "username" { //picpath, picname, username, newpicname
+						tempv := params.Get("jwt_username")
+						s_params = append(s_params, tempv)
+					} else if strings.ToLower(strings.Trim(value, " ")) == "docname" {
+						s_params = append(s_params, file.Filename)
+					} else if strings.ToLower(strings.Trim(value, " ")) == "newdocname" {
+						s_params = append(s_params, fileName)
+					} else if strings.ToLower(strings.Trim(value, " ")) == "docpath" {
+						s_params = append(s_params, dictName) //
+					} else if strings.ToLower(strings.Trim(value, " ")) == "dictid" {
+						s_params = append(s_params, dictId) //
+						fmt.Println("s_params", s_params, dictId)
+					} else if strings.ToLower(strings.Trim(value, " ")) == "filesize" {
+						s_params = append(s_params, file.Size) //
+					} else {
+						s_params = append(s_params, params.Get(strings.Trim(value, " ")))
+					}
+				}
+			}
+			execresult, err = execDataBySql(sql, s_params)
+			if err != nil {
+				fmt.Println("execDataBySql err", err)
+				appG.Response(http.StatusOK, e.ERROR, err.Error())
+			}
+		}
+	}
+	context.JSON(http.StatusOK, gin.H{
+		"hash":       md5string,
+		"filename":   fileName,
+		"origin":     file.Filename,
+		"size":       file.Size,
+		"execresult": execresult,
+	})
+
+}
+
+/**
+Upload image handler
+*/
+func UploaderImage(context *gin.Context) {
+	logging.Info("UploaderImage ", context.Keys)
+	var (
+		maxUploadSize = setting.AppSetting.ImageMaxSize // 最大上传大小
+		distPath      string                            // 最终的输出目录
+		err           error
+		file          *multipart.FileHeader
+		src           multipart.File
+		dist          *os.File
+	)
+	// Source
+	if file, err = context.FormFile("file"); err != nil {
+		parseFormFail(context)
+		return
+	}
+
+	sqlname := context.GetHeader("optname")
+
+	extname := strings.ToLower(path.Ext(file.Filename))
+
+	if isImage(extname) == false {
+		context.JSON(http.StatusBadRequest, gin.H{
+			"message": "不支持的上传文件类型: " + extname,
+		})
+		return
+	}
+	if file.Size > int64(maxUploadSize) {
+		context.JSON(http.StatusBadRequest, gin.H{
+			"message": "上传文件太大, 最大文件大小限制为(byte): " + strconv.Itoa(int(maxUploadSize)),
+		})
+		return
+	}
+
+	if src, err = file.Open(); err != nil {
+
+	}
+	defer src.Close()
+
+	hash := md5.New()
+
+	io.Copy(hash, src)
+
+	md5string := hex.EncodeToString(hash.Sum([]byte("")))
+
+	fileName := md5string + extname
+
+	picPath := setting.CurrentPath + setting.AppSetting.ImageSavePath + sqlname + "/"
+	err = PathCheck(picPath) //检查路径并创建
+	if err != nil {
+		fmt.Println("PathCheck err", err)
+	}
+	distPath = path.Join(picPath, fileName)
+	if dist, err = os.Create(distPath); err != nil {
+		fmt.Println("Create err", err)
+	}
+	defer dist.Close()
+
+	// FIXME: open 2 times
+	if src, err = file.Open(); err != nil {
+		//
+	}
+	defer src.Close()
+
+	// Copy
+	io.Copy(dist, src)
+
+	// 压缩缩略图
+	// 不管成功与否,都会进行下一步的返回
+	if _, err := thumbnailify(distPath, sqlname); err != nil {
+		logging.Error("thumbnailify_err", err)
+		picThumbnailPath := setting.CurrentPath + setting.AppSetting.ThumbnailSavePath + sqlname + "/"
+		println(picThumbnailPath)
+		err = PathCheck(picThumbnailPath) //检查路径并创建
+		distThumbnailPath := path.Join(picThumbnailPath, fileName)
+		println(distThumbnailPath)
+		distThumbnail, err := os.Create(distThumbnailPath)
+		if err != nil {
+			fmt.Println("CreateThumbnail err", err)
+		}
+		srcThumbnail, err := file.Open()
+		if err != nil {
+			//
+		}
+		io.Copy(distThumbnail, srcThumbnail)
+		distThumbnail.Close()
+		src.Close()
+	}
+	var execresult interface{}
+
+	params := context.Request.Form
+
+	if sqlname != "" {
+		sql, p := restful.GetSqlByNameDB(sqlname)
+		if sql != "" {
+			s_params := make([]interface{}, 0)
+			paramslist := strings.Split(p, ",")
+			if len(paramslist) > 0 && p != "" {
+				for _, value := range paramslist {
+					if strings.ToLower(strings.Trim(value, " ")) == "username" { //picpath, picname, username, newpicname
+						tempv := params.Get("jwt_username")
+						s_params = append(s_params, tempv)
+					} else if strings.ToLower(strings.Trim(value, " ")) == "picname" {
+						s_params = append(s_params, file.Filename)
+					} else if strings.ToLower(strings.Trim(value, " ")) == "newpicname" {
+						s_params = append(s_params, fileName)
+					} else if strings.ToLower(strings.Trim(value, " ")) == "picpath" {
+						s_params = append(s_params, sqlname) //全路径加文件名
+					} else {
+						s_params = append(s_params, params.Get(strings.Trim(value, " ")))
+					}
+				}
+			}
+			execresult, err = execDataBySql(sql, s_params)
+			if err != nil {
+				fmt.Println("execDataBySql err", err)
+			}
+		}
+	}
+	context.JSON(http.StatusOK, gin.H{
+		"hash":       md5string,
+		"filename":   fileName,
+		"origin":     file.Filename,
+		"size":       file.Size,
+		"execresult": execresult,
+	})
+}
+
+/**
+Get file raw
+*/
+func GetFileRaw(context *gin.Context) {
+	filename := context.Param("filename")
+	logging.Info("GetFileRaw ", context.Keys, filename)
+
+	filePath := path.Join(setting.CurrentPath, setting.AppSetting.FileSavePath, filename)
+	if isExistFile := fs.PathExists(filePath); isExistFile == false {
+		// if the path not found
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	http.ServeFile(context.Writer, context.Request, filePath)
+}
+
+/**
+Download a file
+*/
+func DownloadFile(context *gin.Context) {
+	filename := context.Param("filename")
+	logging.Info("DownloadFile ", context.Keys, filename)
+	sqlstr := fmt.Sprintf("SELECT docpath ,newdocname FROM eq_doc where id = %s ", filename)
+	var docpath, newdocname string
+	err := restful.BasicList(sqlstr, nil, &docpath, &newdocname)
+	if err != nil {
+		log.Default().Printf("DownloadFile queryx:%v", err)
+	}
+	originFilePath := path.Join(setting.CurrentPath, setting.AppSetting.FileSavePath, docpath, newdocname)
+	if fs.PathExists(originFilePath) == false {
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	http.ServeFile(context.Writer, context.Request, originFilePath)
+
+}
+
+/**
+Get Origin image
+*/
+func GetOriginImage(context *gin.Context) {
+	//appG := app.Gin{C: context}
+	filename := context.Param("filename")
+	logging.Info("GetOriginImage ", context.Keys, filename)
+	sqlstr := fmt.Sprintf("SELECT picpath,newpicname FROM eq_pic where id = %s ", filename)
+	var picpath, newpicname string
+	err := restful.BasicList(sqlstr, nil, &picpath, &newpicname)
+
+	if err != nil {
+		log.Default().Printf("GetOriginImage queryx eq_pic: %v", err)
+	}
+	if picpath == "" && newpicname == "" {
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	originImagePath := path.Join(setting.CurrentPath, setting.AppSetting.ImageSavePath, picpath, newpicname)
+	if fs.PathExists(originImagePath) == false {
+		// if the path not found
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	http.ServeFile(context.Writer, context.Request, originImagePath)
+	//appG.Response(http.StatusOK, e.SUCCESS, eqpic[0]["picname"])
+}
+
+/**
+Get thumbnail image
+*/
+func GetThumbnailImage(context *gin.Context) {
+	filename := context.Param("filename")
+	logging.Info("GetThumbnailImage ", context.Keys, filename)
+	sqlstr := fmt.Sprintf("SELECT picpath,newpicname FROM eq_pic where id = %s ", filename)
+	var picpath, newpicname string
+	err := restful.BasicList(sqlstr, nil, &picpath, &newpicname)
+	if err != nil {
+		log.Default().Printf("GetOriginImage queryx eq_pic: %v", err)
+	}
+	if newpicname == "" {
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	thumbnailImagePath := path.Join(setting.CurrentPath, setting.AppSetting.ThumbnailSavePath, picpath, newpicname)
+	originImagePath := path.Join(setting.CurrentPath, setting.AppSetting.ImageSavePath, filename)
+
+	if fs.PathExists(thumbnailImagePath) == false {
+		// if thumbnail image not exist, try to get origin image
+		if fs.PathExists(originImagePath) == true {
+			http.ServeFile(context.Writer, context.Request, originImagePath)
+			return
+		}
+		// if the path not found
+		http.NotFound(context.Writer, context.Request)
+		return
+	}
+	http.ServeFile(context.Writer, context.Request, thumbnailImagePath)
+}
+
+/**
+Generate thumbnail
+*/
+func thumbnailify(imagePath, subdirectory string) (outputPath string, err error) {
+	var (
+		file *os.File
+		img  image.Image
+	)
+	Filename := strings.ToLower(path.Base(imagePath))
+	extname := strings.ToLower(path.Ext(imagePath))
+	outputPath = setting.CurrentPath + setting.AppSetting.ThumbnailSavePath + subdirectory + "/" + Filename
+	err = PathCheck(setting.CurrentPath + setting.AppSetting.ThumbnailSavePath + subdirectory)
+	if err != nil {
+		fmt.Println("thumbnailify PathCheck err", err)
+	}
+	// 读取文件
+	if file, err = os.Open(imagePath); err != nil {
+		return
+	}
+
+	defer file.Close()
+
+	// decode jpeg into image.Image
+	switch extname {
+	case ".jpg", ".jpeg":
+		img, err = jpeg.Decode(file)
+		break
+	case ".png":
+		img, err = png.Decode(file)
+		break
+	case ".gif":
+		img, err = gif.Decode(file)
+		break
+	default:
+		err = errors.New("Unsupport file type" + extname)
+		return
+	}
+
+	if img == nil {
+		err = errors.New("Generate thumbnail fail...")
+		return
+	}
+
+	m := resize.Thumbnail(uint(setting.AppSetting.ThumbnailMaxWidth), uint(setting.AppSetting.ThumbnailMaxHeight), img, resize.Lanczos3)
+
+	out, err := os.Create(outputPath)
+	if err != nil {
+		return
+	}
+	defer out.Close()
+
+	// write new image to file
+
+	//decode jpeg/png/gif into image.Image
+	switch extname {
+	case ".jpg", ".jpeg":
+		jpeg.Encode(out, m, nil)
+		break
+	case ".png":
+		png.Encode(out, m)
+		break
+	case ".gif":
+		gif.Encode(out, m, nil)
+		break
+	default:
+		err = errors.New("Unsupport file type" + extname)
+		return
+	}
+
+	return
+}
+
+func UploadFiles(c *gin.Context) {
+	logging.Info("UploadFiles ", c.Keys)
+	appG := app.Gin{C: c}
+	err := c.Request.ParseMultipartForm(200000)
+	if err != nil {
+		appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)
+		return
+	}
+	// 获取表单
+	form := c.Request.MultipartForm
+	// 获取参数upload后面的多个文件名,存放到数组files里面,
+	files := form.File["upload"]
+	// 遍历数组,每取出一个file就拷贝一次
+	for i := range files {
+		file, err := files[i].Open()
+		defer file.Close()
+		if err != nil {
+			appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)
+			return
+		}
+
+		fileName := files[i].Filename
+		fmt.Println(fileName)
+
+		out, err := os.Create(fileName)
+		defer out.Close()
+		if err != nil {
+			appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)
+			return
+		}
+
+		_, err = io.Copy(out, file)
+		if err != nil {
+			appG.Response(http.StatusOK, e.ERROR_IMPORT_FAIL, err)
+			return
+		}
+
+		appG.Response(http.StatusOK, e.SUCCESS, "upload successful \n")
+	}
+}
+func PathCheck(path string) (err error) {
+	b, err := PathExists(path)
+	if err != nil {
+		fmt.Println("exist err", err)
+	}
+	if !b {
+		fmt.Println(path, "  目录不存在,重新创建")
+		err = os.Mkdir(path, 0777)
+		if err != nil {
+			fmt.Println("Mkdir err", err)
+		}
+	}
+	return
+}
+func PathExists(path string) (bool, error) {
+	_, err := os.Stat(path)
+	if err == nil {
+		return true, nil
+	}
+	if os.IsNotExist(err) {
+		return false, nil
+	}
+	return false, err
+}

+ 118 - 0
apiserver/routers/api/user.go

@@ -0,0 +1,118 @@
+package api
+
+import (
+	"net/http"
+
+	"github.com/astaxie/beego/validation"
+	"github.com/gin-gonic/gin"
+	"kpt.xdmy/apiserver/routers/restful"
+	"kpt.xdmy/apiserver/service/user_service"
+	"kpt.xdmy/pkg/app"
+	"kpt.xdmy/pkg/e"
+	"kpt.xdmy/pkg/util"
+)
+
+type auth struct {
+	Id         int    `json:"id"`
+	Username   string `json:"username"`
+	Password   string `json:"password"`
+	CaptchaKey string `json:"CaptchaKey"`
+	Role       int    `json:"role_id"`
+}
+
+// @Summary   获取登录token 信息
+// @Tags auth
+// @Accept json
+// @Produce  json
+// @Param username formData string true  "admin"
+// @Param password formData string true  "123456"
+// @Success 200 {string} json "{ "code": 200e, "data": { "token": "xxx" }, "msg": "ok" }"
+// @Failure 400 {string} json "{"code":400,  "data":null,"msg":"请求参数错误"}"
+// @Failure 404 {string} json "{ "code": 404, "data":null,"msg":"请求参数错误"}"
+// @Router /auth  [POST]
+func Auth(c *gin.Context) {
+	appG := app.Gin{C: c}
+	var reqInfo auth
+	err := c.BindJSON(&reqInfo)
+	//c.Request.ParseForm()
+	//reqInfo.Username = c.PostForm("username")
+	//reqInfo.Password = c.PostForm("pwd")
+
+	valid := validation.Validation{}
+	valid.MaxSize(reqInfo.Username, 100, "username").Message("最长为100字符")
+	valid.MaxSize(reqInfo.Password, 100, "password").Message("最长为100字符")
+
+	if valid.HasErrors() {
+		app.MarkErrors(valid.Errors)
+		appG.Response(http.StatusInternalServerError, e.ERROR_ADD_FAIL, valid.Errors)
+		return
+	}
+
+	authService := user_service.User{Username: reqInfo.Username, Password: reqInfo.Password}
+	isExist, err := authService.Check()
+
+	if err != nil {
+		appG.Response(http.StatusInternalServerError, e.ERROR_AUTH_CHECK_TOKEN_FAIL, err)
+		return
+	}
+
+	if !isExist {
+		//appG.Response(http.StatusUnauthorized, e.ERROR_AUTH, nil)
+		appG.Response(http.StatusOK, e.ERROR_AUTH, "用户名或密码错误")
+		return
+	}
+
+	token, err := util.GenerateToken(reqInfo.Username, reqInfo.Password)
+	if err != nil {
+		appG.Response(http.StatusInternalServerError, e.ERROR_AUTH_TOKEN, err)
+		return
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, map[string]string{
+		"token": token,
+	})
+}
+
+// @Summary   获取单个用户信息
+// @Tags  users
+// @Accept json
+// @Produce  json
+// @Param  id  body  int true "id"
+// @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Router /authdata/userinfo  [GET]
+func UserLogout(c *gin.Context) {
+	appG := app.Gin{C: c}
+	data := make(map[string]interface{})
+	data["name"] = ""
+	data["avatar"] = ""
+	data["introduction"] = ""
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}
+
+// @Summary   获取单个用户信息
+// @Tags  users
+// @Accept json
+// @Produce  json
+// @Param  id  path  int true "iddd"
+// @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// @Router /authdata/userinfo  [GET]
+func GetUserinfo(c *gin.Context) {
+	appG := app.Gin{C: c}
+	data := restful.GetUserInfo(c.MustGet("jwt_username").(string))
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}
+
+func GetOpenID(c *gin.Context) {
+	code := c.Param("code")
+	appG := app.Gin{C: c}
+	openid, err := util.SendWxAuthAPI(code)
+	if err != nil {
+		appG.Response(http.StatusOK, e.SUCCESS, map[string]string{
+			"err": "openid 获取失败 :" + err.Error(),
+		})
+		return
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, map[string]string{
+		"openid": openid,
+	})
+}

+ 223 - 0
apiserver/routers/api/v1/menu.go

@@ -0,0 +1,223 @@
+package v1
+
+// "kpt.xdmy/service/menu_service"
+
+// // @Summary   获取单个菜单
+// // @Tags menu
+// // @Accept json
+// // @Produce  json
+// // @Param  id  path  string true "id"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/menus/:id  [GET]
+// func GetMenu(c *gin.Context) {
+// 	appG := app.Gin{C: c}
+// 	id := com.StrTo(c.Param("id")).MustInt()
+// 	valid := validation.Validation{}
+// 	valid.Min(id, 1, "id").Message("ID必须大于0")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+// 		return
+// 	}
+
+// 	menuService := menu_service.Menu{ID: id}
+// 	exists, err := menuService.ExistByID()
+
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_NOT_EXIST, nil)
+// 		return
+// 	}
+// 	if !exists {
+// 		appG.Response(http.StatusOK, e.ERROR_NOT_EXIST, nil)
+// 		return
+// 	}
+
+// 	article, err := menuService.Get()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_NOT_EXIST, nil)
+// 		return
+// 	}
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, article)
+// }
+
+// // @Summary   获取所有菜单
+// // @Tags menu
+// // @Accept json
+// // @Produce  json
+// // @Param  Ton  query  string true "Ton"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/menus  [GET]
+// func GetMenus(c *gin.Context) {
+// 	appG := app.Gin{C: c}
+// 	valid := validation.Validation{}
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+// 		return
+// 	}
+
+// 	menuService := menu_service.Menu{
+// 		PageNum:  util.GetPage(c),
+// 		PageSize: setting.AppSetting.PageSize,
+// 	}
+
+// 	total, err := menuService.Count()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_COUNT_FAIL, nil)
+// 		return
+// 	}
+
+// 	articles, err := menuService.GetAll()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_GET_S_FAIL, nil)
+// 		return
+// 	}
+
+// 	data := make(map[string]interface{})
+// 	data["lists"] = articles
+// 	data["total"] = total
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, data)
+// }
+
+// // @Summary   增加菜单
+// // @Tags menu
+// // @Accept json
+// // @Produce  json
+// // @Param  name  query  string true "name"
+// // @Param  path  query  string true "path"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/menus  [POST]
+// func AddMenu(c *gin.Context) {
+// 	var (
+// 		appG = app.Gin{C: c}
+// 	)
+// 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+// 	fsion := gofasion.NewFasion(string(dataByte))
+// 	name := fsion.Get("name").ValueStr()
+// 	path := fsion.Get("path").ValueStr()
+// 	method := fsion.Get("method").ValueStr()
+
+// 	valid := validation.Validation{}
+// 	valid.MaxSize(name, 100, "name").Message("最长为100字符")
+// 	valid.MaxSize(path, 100, "path").Message("最长为100字符")
+// 	valid.MaxSize(method, 100, "method").Message("最长为100字符")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_ADD_FAIL, nil)
+// 		return
+// 	}
+
+// 	menuService := menu_service.Menu{
+// 		Name:   name,
+// 		Path:   path,
+// 		Method: method,
+// 	}
+// 	if err := menuService.Add(); err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_ADD_FAIL, nil)
+// 		return
+// 	}
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, nil)
+
+// }
+
+// // @Summary   更新菜单
+// // @Tags menu
+// // @Accept json
+// // @Produce  json
+// // @Param  id  path  string true "id"
+// // @Param  name  query  string true "name"
+// // @Param  path  query  string true "path"
+// // @Param  method  query  string true "method"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/menus/:id  [PUT]
+// func EditMenu(c *gin.Context) {
+// 	var (
+// 		appG = app.Gin{C: c}
+// 	)
+
+// 	id := com.StrTo(c.Param("id")).MustInt()
+// 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+// 	fsion := gofasion.NewFasion(string(dataByte))
+// 	name := fsion.Get("name").ValueStr()
+// 	path := fsion.Get("path").ValueStr()
+// 	method := fsion.Get("method").ValueStr()
+
+// 	valid := validation.Validation{}
+// 	valid.MaxSize(name, 100, "name").Message("最长为100字符")
+// 	valid.MaxSize(path, 100, "path").Message("最长为100字符")
+// 	valid.MaxSize(method, 100, "method").Message("最长为100字符")
+// 	valid.Min(id, 1, "id").Message("ID必须大于0")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_ADD_FAIL, nil)
+// 		return
+// 	}
+// 	menuService := menu_service.Menu{
+// 		Name:   name,
+// 		Path:   path,
+// 		Method: method,
+// 	}
+// 	exists, err := menuService.ExistByID()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+// 	if !exists {
+// 		appG.Response(http.StatusOK, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+
+// 	err = menuService.Edit()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_EDIT_FAIL, nil)
+// 		return
+// 	}
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, nil)
+// }
+
+// // @Summary   删除菜单
+// // @Tags menu
+// // @Accept json
+// // @Produce  json
+// // @Param  id  path  string true "id"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/menus/:id  [DELETE]
+// func DeleteMenu(c *gin.Context) {
+// 	appG := app.Gin{C: c}
+// 	valid := validation.Validation{}
+// 	id := com.StrTo(c.Param("id")).MustInt()
+// 	valid.Min(id, 1, "id").Message("ID必须大于0")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusOK, e.INVALID_PARAMS, nil)
+// 		return
+// 	}
+
+// 	menuService := menu_service.Menu{ID: id}
+// 	exists, err := menuService.ExistByID()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+// 	if !exists {
+// 		appG.Response(http.StatusOK, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+
+// 	err = menuService.Delete()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_DELETE_FAIL, nil)
+// 		return
+// 	}
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, nil)
+// }

+ 228 - 0
apiserver/routers/api/v1/role.go

@@ -0,0 +1,228 @@
+package v1
+
+// // @Summary   获取单个角色
+// // @Tags role
+// // @Accept json
+// // @Produce  json
+// // @Param  id  path  string true "id"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/roles/:id  [GET]
+// func GetRole(c *gin.Context) {
+// 	appG := app.Gin{C: c}
+// 	id := com.StrTo(c.Param("id")).MustInt()
+// 	valid := validation.Validation{}
+// 	valid.Min(id, 1, "id").Message("ID必须大于0")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+// 		return
+// 	}
+
+// 	RoleService := Role_service.Role{ID: id}
+// 	exists, err := RoleService.ExistByID()
+
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_NOT_EXIST, nil)
+// 		return
+// 	}
+// 	if !exists {
+// 		appG.Response(http.StatusOK, e.ERROR_NOT_EXIST, nil)
+// 		return
+// 	}
+
+// 	article, err := RoleService.Get()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_NOT_EXIST, nil)
+// 		return
+// 	}
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, article)
+// }
+
+// // @Summary   获取所有角色
+// // @Tags role
+// // @Accept json
+// // @Produce  json
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/roles  [GET]
+// func GetRoles(c *gin.Context) {
+// 	appG := app.Gin{C: c}
+// 	name := c.Query("name")
+// 	valid := validation.Validation{}
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+// 		return
+// 	}
+
+// 	RoleService := Role_service.Role{
+// 		Name:     name,
+// 		PageNum:  util.GetPage(c),
+// 		PageSize: setting.AppSetting.PageSize,
+// 	}
+
+// 	total, err := RoleService.Count()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_COUNT_FAIL, nil)
+// 		return
+// 	}
+
+// 	articles, err := RoleService.GetAll()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_GET_S_FAIL, nil)
+// 		return
+// 	}
+
+// 	data := make(map[string]interface{})
+// 	data["lists"] = articles
+// 	data["total"] = total
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, data)
+// }
+
+// // @Summary   增加角色
+// // @Tags role
+// // @Accept json
+// // @Produce  json
+// // @Param  name  query  string true "name"
+// // @Param  menu_id  query  string true "menu_id"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/roles  [POST]
+// func AddRole(c *gin.Context) {
+// 	var (
+// 		appG = app.Gin{C: c}
+// 	)
+// 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+// 	fsion := gofasion.NewFasion(string(dataByte))
+// 	name := fsion.Get("username").ValueStr()
+// 	menuId := com.StrTo(fsion.Get("menu_id").ValueInt()).MustInt()
+
+// 	valid := validation.Validation{}
+// 	valid.MaxSize(name, 100, "path").Message("名称最长为100字符")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_ADD_FAIL, nil)
+// 		return
+// 	}
+
+// 	RoleService := Role_service.Role{
+// 		Name: name,
+// 		Menu: menuId,
+// 	}
+
+// 	if id, err := RoleService.Add(); err != nil {
+
+// 		err = inject.Obj.Common.RoleAPI.LoadPolicy(id)
+// 		if err != nil {
+// 			appG.Response(http.StatusInternalServerError, e.ERROR_EDIT_FAIL, nil)
+// 			return
+// 		}
+// 		appG.Response(http.StatusOK, e.SUCCESS, nil)
+// 	} else {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_ADD_FAIL, nil)
+// 		return
+// 	}
+
+// }
+
+// // @Summary   更新角色
+// // @Tags role
+// // @Accept json
+// // @Produce  json
+// // @Param  id  path  string true "id"
+// // @Param  name  query  string true "name"
+// // @Param  menu_id  query  string true "menu_id"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/roles/:id  [PUT]
+// func EditRole(c *gin.Context) {
+// 	var (
+// 		appG = app.Gin{C: c}
+// 	)
+// 	id := com.StrTo(c.Param("id")).MustInt()
+// 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+// 	fsion := gofasion.NewFasion(string(dataByte))
+// 	name := fsion.Get("username").ValueStr()
+// 	menuId := com.StrTo(fsion.Get("menu_id").ValueInt()).MustInt()
+
+// 	valid := validation.Validation{}
+// 	valid.MaxSize(name, 100, "path").Message("名称最长为100字符")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_ADD_FAIL, nil)
+// 		return
+// 	}
+// 	RoleService := Role_service.Role{
+// 		ID:   id,
+// 		Name: name,
+// 		Menu: menuId,
+// 	}
+// 	exists, err := RoleService.ExistByID()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+// 	if !exists {
+// 		appG.Response(http.StatusOK, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+
+// 	err = RoleService.Edit()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_EDIT_FAIL, nil)
+// 		return
+// 	}
+
+// 	err = inject.Obj.Common.RoleAPI.LoadPolicy(id)
+
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_EDIT_FAIL, nil)
+// 		return
+// 	}
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, nil)
+// }
+
+// // @Summary   删除角色
+// // @Tags role
+// // @Accept json
+// // @Produce  json
+// // @Param  id  path  string true "id"
+// // @Success 200 {string} json "{ "code": 200, "data": {}, "msg": "ok" }"
+// // @Router /authdata/roles/:id  [DELETE]
+// func DeleteRole(c *gin.Context) {
+// 	appG := app.Gin{C: c}
+// 	valid := validation.Validation{}
+// 	id := com.StrTo(c.Param("id")).MustInt()
+// 	valid.Min(id, 1, "id").Message("ID必须大于0")
+
+// 	if valid.HasErrors() {
+// 		app.MarkErrors(valid.Errors)
+// 		appG.Response(http.StatusOK, e.INVALID_PARAMS, nil)
+// 		return
+// 	}
+
+// 	RoleService := Role_service.Role{ID: id}
+// 	exists, err := RoleService.ExistByID()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+// 	if !exists {
+// 		appG.Response(http.StatusOK, e.ERROR_EXIST_FAIL, nil)
+// 		return
+// 	}
+// 	role, err := RoleService.Get()
+// 	err = RoleService.Delete()
+// 	if err != nil {
+// 		appG.Response(http.StatusInternalServerError, e.ERROR_DELETE_FAIL, nil)
+// 		return
+// 	}
+
+// 	inject.Obj.Enforcer.DeleteUser(role.Name)
+
+// 	appG.Response(http.StatusOK, e.SUCCESS, nil)
+// }

+ 131 - 0
apiserver/routers/mcs.go

@@ -0,0 +1,131 @@
+package routers
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/liyue201/goqr"
+	"github.com/nfnt/resize"
+	"image"
+	"io/ioutil"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+)
+
+func McsControl(c *gin.Context) {
+	mpd := new(model.McsPostDataReq)
+	if !Bind(c, mpd) {
+		return
+	}
+	resp, err := svc.McsPostHttp(mpd)
+	eJSON(c, resp, err)
+}
+
+func McsAccounts(c *gin.Context) {
+	sa := []model.McsAccount{
+		{
+			DeviceId: "apptest2",
+			UserID:   "PC",
+			Password: "mcs8",
+		},
+	}
+	resp := &http.Response{
+		Code: 200,
+		Data: sa,
+	}
+	eJSON(c, resp, nil)
+}
+
+//QuickResponse
+func QuickResponse(c *gin.Context) {
+	file, err := c.FormFile("file")
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err, "msg": "文件读取错误!"})
+		return
+	}
+
+	f, err := file.Open()
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err, "msg": "文件打开错误!"})
+		return
+	}
+
+	fmt.Println(file.Filename, file.Size)
+
+	img, _, _ := image.Decode(f)
+
+	resizeImg := resize.Resize(260, 260, img, resize.Lanczos2)
+	fmt.Println(file.Filename, file.Size)
+
+	qrCodes, err := goqr.Recognize(resizeImg)
+	if err != nil {
+		fmt.Printf("Recognize failed: %v\n", err)
+		return
+	}
+	if len(qrCodes) <= 0 {
+		fmt.Printf("识别失败")
+		return
+	}
+	fmt.Println(string(qrCodes[0].Payload))
+	c.JSON(200, map[string]interface{}{"code": 200, "data": string(qrCodes[0].Payload), "msg": "ok"})
+}
+
+func Test(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fmt.Println(string(dataByte))
+
+	c.JSON(200, map[string]interface{}{"code": 200, "data": string(dataByte), "msg": "ok"})
+}
+
+type DingdingT struct {
+	MsgSignature string `json:"msg_signature"`
+	TimeStamp    string `json:"timeStamp"`
+	Nonce        string `json:"nonce"`
+	Encrypt      string `json:"encrypt"`
+}
+
+//func Dingding(c *gin.Context) {
+//	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+//	fmt.Println(string(dataByte))
+//	fsion := gofasion.NewFasion(string(dataByte))
+//
+//	resp := new(DingdingT)
+//	resp.Encrypt = fsion.Get("encrypt").ValueStr()
+//	resp.Nonce = c.Query("nonce")
+//	resp.TimeStamp = c.Query("timestamp")
+//	resp.MsgSignature = c.Query("signature")
+//
+//	//dingding.
+//	//c.JSON(200, []byte("success"))
+//	//body, err := c.GetRawData()
+//	//if err != nil {
+//	//	panic(err)
+//	//}
+//	//
+//	//// 调用 CallbackParse 函数解析回调事件
+//	//event, err := dingding.CallbackParse(body, "token", "aes_key")
+//	//if err != nil {
+//	//	panic(err)
+//	//}
+//	//
+//	//// 根据事件类型执行相应的业务逻辑
+//	//switch event.Type {
+//	//case "user_add_org":
+//	//	// 处理用户加入企业事件
+//	//	// ...
+//	//case "bpms_task_change":
+//	//	// 处理审批任务变更事件
+//	//	// ...
+//	//default:
+//	//	// 其他类型事件,忽略
+//	//}
+//	//:= dingding.NewCrypto()
+//	// 返回成功响应
+//	//dingding.Crypto{
+//	//	Token: setting.ServerSetting.DingTalkToken,
+//	//	EncodingAESKey:setting.ServerSetting.DingTalkEncodingAESKey,
+//	//	SuiteKey:""
+//	//}
+//	d, _ := json.Marshal(resp)
+//	c.String(200, string(d))
+//	//c.JSON(200, resp)
+//}

+ 15 - 0
apiserver/routers/part.go

@@ -0,0 +1,15 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"kpt.xdmy/apiserver/service"
+)
+
+func EasBatch(c *gin.Context) {
+	n, e := service.PartBatch()
+	if n == 0 {
+		c.JSON(500, e.Error())
+	} else {
+		c.JSON(200, n)
+	}
+}

+ 159 - 0
apiserver/routers/report.go

@@ -0,0 +1,159 @@
+package routers
+
+import (
+	"fmt"
+	"github.com/Anderson-Lu/gofasion/gofasion"
+	"github.com/gin-gonic/gin"
+	"io/ioutil"
+	"kpt.xdmy/apiserver/service"
+	"time"
+)
+
+func MaintainList(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	pastureName := fsion.Get("pastureName").ValueStr()
+	eqClassId := fsion.Get("eqClassId").ValueStr()
+	start := fsion.Get("startTime").ValueStr()
+	end := fsion.Get("endTime").ValueStr()
+	level := fsion.Get("level").ValueStr()
+	eqName := fsion.Get("eqName").ValueStr()
+
+	offset := fsion.Get("offset").ValueInt()
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(99999999)
+
+	startTime, err := time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s 00:00:00", start), time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+
+	endTime, err := time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s 23:59:59", end), time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+
+	if level == "1" {
+		total, resp, err := service.MaintainListPid(pastureName, eqClassId, startTime, endTime, offset, pagecount)
+		if err != nil {
+			c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+			return
+		}
+		c.JSON(200, map[string]interface{}{"code": 200, "data": resp, "msg": "ok", "total": total, "pageNum": offset, "pageSize": pagecount})
+	} else if level == "2" {
+		total, resp, err := service.MaintainList(pastureName, eqClassId, startTime, endTime, offset, pagecount)
+		if err != nil {
+			c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail", "total": total, "pageNum": offset, "pageSize": pagecount})
+			return
+		}
+		c.JSON(200, map[string]interface{}{"code": 200, "data": resp, "msg": "ok", "total": total, "pageNum": offset, "pageSize": pagecount})
+	} else {
+		total, resp, err := service.MaintainListEquipment(pastureName, eqClassId, startTime, endTime, offset, pagecount, eqName)
+		if err != nil {
+			c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+			return
+		}
+		c.JSON(200, map[string]interface{}{"code": 200, "data": resp, "msg": "ok", "total": total, "pageNum": offset, "pageSize": pagecount})
+	}
+}
+
+func MaintainListPid(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	pastureName := fsion.Get("pastureName").ValueStr()
+	eqClassId := fsion.Get("eqClassId").ValueStr()
+	start := fsion.Get("startTime").ValueStr()
+	end := fsion.Get("endTime").ValueStr()
+	startTime, err := time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s 00:00:00", start), time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+
+	endTime, err := time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s 23:59:59", end), time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+
+	_, resp, err := service.MaintainListPid(pastureName, eqClassId, startTime, endTime, 0, 0)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": resp, "msg": "ok"})
+}
+
+func MaintainListEquipment(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	pastureName := fsion.Get("pastureName").ValueStr()
+	eqClassId := fsion.Get("eqClassId").ValueStr()
+	start := fsion.Get("startTime").ValueStr()
+	end := fsion.Get("endTime").ValueStr()
+	startTime, err := time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s 00:00:00", start), time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+
+	endTime, err := time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s 23:59:59", end), time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+	total, resp, err := service.MaintainListEquipment(pastureName, eqClassId, startTime, endTime, 0, 0, "")
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": resp, "msg": "ok", "total": total})
+}
+
+func GetOversee(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	pastureName := fsion.Get("pastureId").ValueStr()
+	eqClassId := fsion.Get("eqClassId").ValueStr()
+	empname := fsion.Get("empname").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+
+	resp, err := service.GetOversee(pastureName, eqClassId, empname, offset, pagecount)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": resp, "msg": "ok"})
+}
+
+func StartStopRecord(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	pastureId := fsion.Get("pastureId").ValueStr()
+	eqName := fsion.Get("eqName").ValueStr()
+	start := fsion.Get("startTime").ValueStr()
+	end := fsion.Get("endTime").ValueStr()
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+
+	startTime, err := time.ParseInLocation("2006-01-02", start, time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": "请选择日期", "msg": "fail"})
+		return
+	}
+
+	endTime, err := time.ParseInLocation("2006-01-02", end, time.Local)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": "请选择日期", "msg": "fail"})
+		return
+	}
+
+	resp, err := service.StartStopRecord(pastureId, eqName, startTime, endTime, offset, pagecount)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": err.Error(), "msg": "fail"})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": resp, "msg": "ok"})
+}

BIN
apiserver/routers/restful/.DS_Store


+ 1369 - 0
apiserver/routers/restful/sql_utils.go

@@ -0,0 +1,1369 @@
+package restful
+
+import (
+	"database/sql"
+	"fmt"
+	"log"
+	"math"
+	"reflect"
+	"strconv"
+	"strings"
+	"time"
+	"unsafe"
+
+	"github.com/pkg/errors"
+
+	_ "github.com/go-sql-driver/mysql"
+	"github.com/jmoiron/sqlx"
+	"github.com/patrickmn/go-cache"
+	"github.com/tealeg/xlsx"
+	"github.com/xormplus/xorm/schemas"
+	"kpt.xdmy/pkg/setting"
+)
+
+var (
+	Dbs          *sqlx.DB
+	Apisql_cache *cache.Cache
+)
+
+// SQLInit 初始化数据库操作句柄,这里要提供:
+// driverName string: 数据库类型,例如mysql、sqlite等,参考github.com/go-sql-driver/mysql官方介绍
+// dataSourceName string: 数据库地址,参考github.com/go-sql-driver/mysql官方介绍
+// MaxOpenConns int: 最大缓存连接数,这个数值包含了MaxIdleConns
+// MaxIdleConns int:预备的最大空闲连接数
+func SQLInit(driverName, dataSourceName string, maxOpenConns, maxIdleConns int, showlog bool) error {
+
+	if Dbs == nil {
+		var err error
+		if Dbs, err = sqlx.Open(driverName, dataSourceName); err != nil {
+			return err
+		}
+		Dbs.SetMaxOpenConns(maxOpenConns)
+		Dbs.SetMaxIdleConns(maxIdleConns)
+		Dbs.SetConnMaxLifetime(300 * time.Second)
+	}
+	if Apisql_cache == nil {
+		Apisql_cache = cache.New(600*time.Second, 10*time.Second)
+	}
+	// SetCacheSql()
+	return nil
+}
+
+func SetCacheSql() {
+	rows, err := Dbs.Queryx("SELECT sqlname, CONCAT(sqlstr,'|',IFNULL(params,'')) AS sqlstr FROM apisql WHERE ENABLE>0 ")
+	if err != nil {
+		return
+	}
+	valuesMap, err := Rows2Strings(rows)
+
+	if err == nil && len(valuesMap) > 0 {
+		for _, v := range valuesMap {
+			Apisql_cache.Set(v["sqlname"], v["sqlstr"], cache.DefaultExpiration)
+		}
+	}
+}
+func sqlCheckParam(param string) error {
+
+	if strings.Contains(param, ";") {
+		return errors.New("can not have ;")
+	}
+
+	return nil
+}
+
+func GetSqlByName(name string, tx *sqlx.Tx) (string, string) {
+	sqls := ""
+	param := ""
+	if sql, ok := Apisql_cache.Get(name); ok {
+		tempstrb := strings.IndexAny(sql.(string), "|")
+		sqls = sql.(string)[0:tempstrb]
+		param = sql.(string)[tempstrb+1:]
+	} else {
+		valuesMap, err := MapStr("SELECT sqlstr, params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name)
+		if err != nil {
+			return err.Error(), "err"
+		}
+		if len(valuesMap) > 0 {
+			sqls = valuesMap["sqlstr"]
+			param = valuesMap["params"]
+			// Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
+		}
+	}
+	if setting.DatabaseSetting.ShowGetSqllog {
+
+		fmt.Println("==============")
+		fmt.Println("apisql:" + sqls)
+		fmt.Println("--------------")
+		fmt.Println("param:" + param)
+		fmt.Println("==============")
+	}
+	return sqls, param
+}
+func GetSqlByNameDB(name string) (string, string) {
+
+	var sqls, param string
+	if sql, ok := Apisql_cache.Get(name); ok {
+		tempstrb := strings.IndexAny(sql.(string), "|")
+		sqls = sql.(string)[0:tempstrb]
+		param = sql.(string)[tempstrb+1:]
+	} else {
+		rows, err := Dbs.Queryx("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name)
+		if err != nil {
+			return err.Error(), "err"
+		}
+		defer rows.Close()
+		valuesMap, err := Rows2Strings(rows)
+		if err == nil && len(valuesMap) > 0 {
+			sqls = valuesMap[0]["sqlstr"]
+			param = valuesMap[0]["params"]
+			// Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
+		}
+	}
+
+	if setting.DatabaseSetting.ShowGetSqllog {
+
+		fmt.Println("==============")
+		fmt.Println("apisql:" + sqls)
+		fmt.Println("--------------")
+		fmt.Println("param:" + param)
+		fmt.Println("==============")
+	}
+	return sqls, param
+}
+
+func GetSqlByNameDBT(name string, tx *sqlx.Tx) (string, string) {
+	var sqls, param string
+	if sql, ok := Apisql_cache.Get(name); ok {
+		tempstrb := strings.IndexAny(sql.(string), "|")
+		sqls = sql.(string)[0:tempstrb]
+		param = sql.(string)[tempstrb+1:]
+	} else {
+
+		rows, err := Dbs.Queryx("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name)
+		if err != nil {
+			log.Default().Printf("GetSqlByNameDBT :%v", err)
+			return "", ""
+		}
+		defer rows.Close()
+		if rows.Next() {
+			rows.Scan(&sqls, &param)
+		}
+		if sqls != "" {
+			// Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
+		}
+	}
+	if setting.DatabaseSetting.ShowGetSqllog {
+
+		fmt.Println("==============")
+		fmt.Println("apisql:" + sqls)
+		fmt.Println("--------------")
+		fmt.Println("param:" + param)
+		fmt.Println("==============")
+	}
+	return sqls, param
+}
+
+// sqlGetValues 根据结构体中指向实际数据的指针获取出数据,并存储到另一张表中返回
+func sqlGetValues(pvs []interface{}, columnsType []*sql.ColumnType, columnsLen int) map[string]interface{} {
+
+	result := make(map[string]interface{}, columnsLen)
+
+	for a := 0; a < columnsLen; a++ {
+		switch s := pvs[a].(type) {
+		case *int8:
+			result[columnsType[a].Name()] = *s
+		case *int16:
+			result[columnsType[a].Name()] = *s
+		case *int32:
+			result[columnsType[a].Name()] = *s
+		case *int64:
+			result[columnsType[a].Name()] = *s
+		case *float32:
+			result[columnsType[a].Name()] = *s
+		case *float64:
+			result[columnsType[a].Name()] = *s
+		case *string:
+			result[columnsType[a].Name()] = *s
+		case *sql.NullInt64:
+			result[columnsType[a].Name()] = *s
+		case *sql.NullString:
+			result[columnsType[a].Name()] = *s
+		}
+	}
+	return result
+}
+
+// 这里返回的是原始数组的基础上加上了字段名标识
+func sqlQuery(columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) ([]map[string]interface{}, error) {
+
+	jsondata := make([]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		jsondata[k1] = sqlGetValues(v1, columnsType, columnsLen)
+	}
+
+	return jsondata, nil
+}
+
+func sqlQueryByTinyIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int8]map[string]interface{}, error) {
+
+	jsondata := make(map[int8]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		for a := 0; a < columnsLen; a++ {
+			if columnsType[a].Name() == columnName {
+				if value, ok := v1[a].(*int8); ok {
+					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
+				}
+				break
+			}
+		}
+	}
+
+	return jsondata, nil
+}
+
+func sqlQueryBySmallIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int16]map[string]interface{}, error) {
+
+	jsondata := make(map[int16]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		for a := 0; a < columnsLen; a++ {
+			if columnsType[a].Name() == columnName {
+				if value, ok := v1[a].(*int16); ok {
+					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
+				}
+				break
+			}
+		}
+	}
+
+	return jsondata, nil
+}
+
+func sqlQueryByIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int32]map[string]interface{}, error) {
+
+	jsondata := make(map[int32]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		for a := 0; a < columnsLen; a++ {
+			if columnsType[a].Name() == columnName {
+				if value, ok := v1[a].(*int32); ok {
+					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
+				}
+				break
+			}
+		}
+	}
+
+	return jsondata, nil
+}
+
+func sqlQueryByBigIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int64]map[string]interface{}, error) {
+
+	jsondata := make(map[int64]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		for a := 0; a < columnsLen; a++ {
+			if columnsType[a].Name() == columnName {
+				if value, ok := v1[a].(*int64); ok {
+					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
+				}
+				break
+			}
+		}
+	}
+
+	return jsondata, nil
+}
+
+func sqlQueryByFloatIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float32]map[string]interface{}, error) {
+
+	jsondata := make(map[float32]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		for a := 0; a < columnsLen; a++ {
+			if columnsType[a].Name() == columnName {
+				if value, ok := v1[a].(*float32); ok {
+					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
+				}
+				break
+			}
+		}
+	}
+
+	return jsondata, nil
+}
+
+func sqlQueryByDoubleMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float64]map[string]interface{}, error) {
+
+	jsondata := make(map[float64]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		for a := 0; a < columnsLen; a++ {
+			if columnsType[a].Name() == columnName {
+				if value, ok := v1[a].(*float64); ok {
+					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
+				}
+				break
+			}
+		}
+	}
+
+	return jsondata, nil
+}
+
+func sqlQueryByStringMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[string]map[string]interface{}, error) {
+
+	jsondata := make(map[string]map[string]interface{}, queryCount)
+	for k1, v1 := range queryData {
+		if k1 >= queryCount {
+			break
+		}
+
+		for a := 0; a < columnsLen; a++ {
+			if columnsType[a].Name() == columnName {
+				if value, ok := v1[a].(*string); ok {
+					jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
+				}
+				break
+			}
+		}
+	}
+
+	return jsondata, nil
+}
+
+func sqlGetColumnType(columnsType []*sql.ColumnType, columnsLen int, valueName string) string {
+
+	for a := 0; a < columnsLen; a++ {
+		if columnsType[a].Name() == valueName {
+			return columnsType[a].DatabaseTypeName()
+		}
+	}
+
+	return ""
+}
+
+func round(num float64) int {
+	return int(num + math.Copysign(0.5, num))
+}
+
+func toFixed(num float64, precision int) float64 {
+	output := math.Pow(10, float64(precision))
+	return float64(round(num*output)) / output
+}
+
+// QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
+// columnName string: 作为索引的字段名称
+// sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
+// where string: 过滤条件,就是where后面跟着的部分
+// order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
+// offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
+// count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
+func QueryByMap(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+	recordcount := int64(0)
+
+	if count > 1 {
+		sqlstr = fmt.Sprintf("SELECT COUNT(*) as count FROM (%s) a", sqlstr)
+		err := BasicList(sqlstr, params, &recordcount)
+		if err != nil {
+			fmt.Println("s1", err)
+			return nil, err
+		}
+	}
+	queryData := make([]map[string]interface{}, 1)
+	var err error
+	if count == 0 {
+		rows, err := Dbs.Queryx(sqlstr, params...)
+		if err != nil {
+			return err.Error(), err
+		}
+		queryData, err = rows2mapObjects(rows)
+	} else {
+		if count > 0 && offset > 0 {
+			offset = offset * count
+		}
+		rows, err := Dbs.Queryx(fmt.Sprintf(sqlstr+" limit %d , %d", offset, count), params...)
+		if err != nil {
+			return err.Error(), err
+		}
+		queryData, err = rows2mapObjects(rows)
+	}
+
+	if err != nil {
+		return nil, err
+	}
+	if recordcount == 0 {
+		recordcount = int64(len(queryData))
+	}
+
+	data := make(map[string]interface{})
+	data["list"] = queryData
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if count > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(count))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
+	}
+	data["pageSize"] = count
+	return data, nil
+}
+
+// func 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
+	}
+	recordcount := int64(0)
+
+	if count > 1 {
+		sql := "SELECT COUNT(*) as count FROM (" + sqlstr + ") a"
+		err := BasicList(sql, params, &recordcount)
+		if err != nil {
+			fmt.Println("s1", err)
+			return nil, err
+		}
+	}
+	queryData := make([]map[string]interface{}, 1)
+	// queryData := make([]map[string]string, 1)
+	var err error
+	if count == 0 {
+		// queryData, err = MapStrList(sqlstr, params...)
+		queryData, err = MapInterList(sqlstr, params...)
+	} else {
+		// if count > 0 && offset > 0 {
+		// 	offset = offset * count
+		// }
+		sqllist := sqlstr + fmt.Sprintf("  limit %d  offset %d", count, offset*count)
+		// queryData, err = MapStrList(sqllist, params...)
+		queryData, err = MapInterList(sqllist, params...)
+	}
+	if err != nil {
+		fmt.Println(sqlstr)
+		return nil, err
+	}
+	if recordcount == 0 {
+		recordcount = int64(len(queryData))
+	}
+
+	data := make(map[string]interface{})
+	data["list"] = queryData
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if count > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(count))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
+		data["pageNum2"] = float64(offset + 1)
+	}
+	data["pageSize"] = count
+	return data, nil
+}
+
+// QueryByXlsx 将查询到的数据,按照指定字段的值做为索引构建map并返回
+// sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
+// params string: 过滤条件,就是where后面跟着的部分
+
+func QueryByXlsx(sqlstr string, params []interface{}) (*xlsx.File, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return nil, err
+	}
+
+	rows, err := Dbs.Queryx(sqlstr, params...)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	columnsType, _ := rows.ColumnTypes()
+	columnsLen := len(columnsType)
+	columns, _ := rows.Columns()
+	values := make([]interface{}, columnsLen)
+	valuePtrs := make([]interface{}, columnsLen)
+
+	var sheet *xlsx.Sheet
+	var row *xlsx.Row
+	var cell *xlsx.Cell
+
+	file := xlsx.NewFile()
+	sheet, err = file.AddSheet("Sheet1")
+
+	if err != nil {
+		fmt.Printf(err.Error())
+	}
+	row = sheet.AddRow()
+	for _, columnname := range columns {
+		cell = row.AddCell()
+		cell.Value = columnname
+	}
+	for rows.Next() {
+		for a := 0; a < columnsLen; a++ {
+			valuePtrs[a] = &values[a]
+		}
+		rows.Scan(valuePtrs...)
+		row = sheet.AddRow()
+		for i := range columns {
+			var v interface{}
+			val := values[i]
+			b, ok := val.([]byte)
+			cell = row.AddCell()
+			if ok {
+				v1 := string(b)
+				switch columnsType[i].DatabaseTypeName() {
+				case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
+					{
+						v, _ = strconv.ParseInt(v1, 10, 32)
+						cell.Value = fmt.Sprintf("%v", v)
+					}
+				case "FLOAT", "DOUBLE", "DECIMAL":
+					{
+						cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
+						v2, _ := strconv.ParseFloat(v1, 32)
+						v = toFixed(v2, cindex)
+						cell.Value = fmt.Sprintf("%v", v)
+					}
+				case "BOOL":
+					{
+						v, _ = strconv.ParseBool(v1)
+						cell.Value = fmt.Sprintf("%v", v)
+					}
+				default:
+					{
+						v = v1
+						cell.Value = fmt.Sprintf("%v", v)
+					}
+				}
+
+			} else {
+				v = val
+				cell.Value = fmt.Sprintf("%v", v)
+			}
+			if cell.Value == "<nil>" {
+				cell.Value = ""
+			}
+		}
+	}
+
+	return file, nil
+}
+
+// QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
+// columnName string: 作为索引的字段名称
+// sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
+// where string: 过滤条件,就是where后面跟着的部分
+// order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
+// offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
+// count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
+
+func QueryByMapMenu(sqlstr string, offset, count int, params []interface{}) ([]map[string]interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return nil, err
+	}
+
+	if offset < 0 {
+		offset = 0
+	}
+	if count <= 0 {
+		count = 0
+	}
+	if count > 0 {
+		sqlstr += " limit " + strconv.Itoa(offset) + "," + strconv.Itoa(count)
+	}
+
+	rows, err := Dbs.Query(sqlstr, params...)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	columnsType, _ := rows.ColumnTypes()
+	columnsLen := len(columnsType)
+	columns, _ := rows.Columns()
+	queryData := make([]map[string]interface{}, 0)
+	values := make([]interface{}, columnsLen)
+	valuePtrs := make([]interface{}, columnsLen)
+
+	for rows.Next() {
+		for a := 0; a < columnsLen; a++ {
+			valuePtrs[a] = &values[a]
+		}
+		rows.Scan(valuePtrs...)
+		entry := make(map[string]interface{})
+		for i, col := range columns {
+			entry[col] = getValue(values[i], columnsType[i].DatabaseTypeName())
+		}
+		queryData = append(queryData, entry)
+	}
+
+	data := queryData
+	return data, nil
+}
+
+func QueryByList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+	if count == 0 {
+		count = 1000
+	}
+	recordcount := int64(0)
+	if count > 1 {
+		trow, err := Dbs.Queryx("SELECT COUNT(1) as count FROM ("+sqlstr+") a", params...)
+		if err != nil {
+			return nil, err
+		}
+		tt, err := rows2mapObjects(trow)
+		if err != nil {
+			return nil, err
+		}
+		recordcount = tt[0]["count"].(int64)
+	}
+	queryData := make([]map[string]interface{}, 1)
+	var err error
+	if count == 0 {
+		tqueryData, err := Dbs.Queryx(sqlstr, params...)
+		if err != nil {
+			return nil, err
+		}
+		queryData, err = rows2mapObjects(tqueryData)
+	} else {
+		// if count > 0 && offset > 0 {
+		// 	offset = offset * count
+		// }
+		sqlstr += fmt.Sprintf(" limit %d offset %d", count, offset*count)
+		tqueryData, err := Dbs.Queryx(sqlstr, params...)
+		if err != nil {
+			return nil, err
+		}
+		queryData, err = rows2mapObjects(tqueryData)
+	}
+	if err != nil {
+		return nil, err
+	}
+	columnsname := make([]string, 0)
+	listdata := make(map[string][]interface{})
+	if len(queryData) > 0 {
+		for i := range queryData {
+			if i == 0 {
+				for i := range queryData[0] {
+					columnsname = append(columnsname, i)
+				}
+			}
+
+			for _, v := range columnsname {
+				listdata[v] = append(listdata[v], queryData[i][v])
+			}
+
+		}
+		recordcount = int64(len(queryData))
+	}
+
+	data := make(map[string]interface{})
+	data["list"] = listdata
+	//data["columnsname"] = columnsname
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if count > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(count))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
+	}
+	data["pageSize"] = count
+	return data, nil
+}
+
+func QueryByListList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+	if count == 0 {
+		count = 1000
+	}
+	recordcount := int64(0)
+	if count > 1 {
+		trow, err := Dbs.Queryx("SELECT COUNT(1) as count FROM ("+sqlstr+") a", params...)
+		if err != nil {
+			return nil, err
+		}
+		tt, err := rows2mapObjects(trow)
+		if err != nil {
+			return nil, err
+		}
+		recordcount = tt[0]["count"].(int64)
+	}
+
+	queryData := make([]map[string]interface{}, 1)
+	var err error
+	if count == 0 {
+		tqueryData, err := Dbs.Queryx(sqlstr, params...)
+		if err != nil {
+			return nil, err
+		}
+		queryData, err = rows2mapObjects(tqueryData)
+	} else {
+		if count > 0 && offset > 0 {
+			offset = offset * count
+		}
+		tqueryData, err := Dbs.Queryx(fmt.Sprintf(sqlstr+" limit %d , %d", offset, count), params...)
+		if err != nil {
+			return nil, err
+		}
+		queryData, err = rows2mapObjects(tqueryData)
+	}
+
+	if err != nil {
+		return nil, err
+	}
+	columnsname := make([]string, 0)
+	listdata := make([]interface{}, 0)
+	if len(queryData) > 0 {
+		for i := range queryData {
+			if i == 0 {
+				for i := range queryData[0] {
+					columnsname = append(columnsname, i)
+				}
+			}
+			listdatarow := make([]interface{}, 0)
+
+			for _, v := range columnsname {
+				listdatarow = append(listdatarow, queryData[i][v])
+			}
+			listdata = append(listdata, listdatarow)
+		}
+		recordcount = int64(len(queryData))
+	}
+	data := make(map[string]interface{})
+	data["list"] = listdata
+	data["columnsname"] = columnsname
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if count > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(count))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
+	}
+	data["pageSize"] = count
+	return data, nil
+}
+
+// func QueryByListT(sqlstr string, offset, count int, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
+func QueryByListT(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+	if count == 0 {
+		count = 1000
+	}
+	recordcount := int64(0)
+	if count > 1 {
+		tt, err := Dbs.Queryx("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...)
+		if err != nil {
+			return nil, err
+		}
+		tt.Next()
+		tt.Scan(&recordcount)
+	}
+	var err error
+	var sqllist string
+	if count > 0 {
+		sqllist = sqlstr + fmt.Sprintf(" limit %d offset %d", count, offset*count)
+	}
+	listdata, err := MapInterList(sqllist, params...)
+	if err != nil {
+		log.Default().Printf("QueryByListT MapInterList : %v", err)
+	}
+
+	data := make(map[string]interface{})
+	data["lists"] = listdata
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if count > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(count))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
+	}
+	data["pageSize"] = count
+	return data, nil
+}
+
+// func QueryByListListT(sqlstr string, offset, count int, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
+func QueryByListListT(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+	if count == 0 {
+		count = 1000
+	}
+	recordcount := int64(0)
+	if count > 1 {
+		sqlstr = fmt.Sprintf("SELECT COUNT(*) as count FROM (%s) a", sqlstr)
+		err := BasicList(sqlstr, params, &recordcount)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	queryData := make([]map[string]string, 1)
+	var err error
+	if count == 0 {
+		queryData, err = MapStrList(sqlstr, params...)
+	} else {
+		// if count > 0 && offset > 0 {
+		// 	offset = offset * count
+		// }
+		sqllist := sqlstr + fmt.Sprintf(" limit %d offset %d", count, offset*count)
+		queryData, err = MapStrList(sqllist, params...)
+	}
+
+	if err != nil {
+		return nil, err
+	}
+	columnsname := make([]string, 0)
+	listdata := make([]interface{}, 0)
+	if len(queryData) > 0 {
+		for i := range queryData {
+			if i == 0 {
+				for i := range queryData[0] {
+					columnsname = append(columnsname, i)
+				}
+			}
+			listdatarow := make([]interface{}, 0)
+
+			for _, v := range columnsname {
+				listdatarow = append(listdatarow, queryData[i][v])
+			}
+			listdata = append(listdata, listdatarow)
+		}
+		recordcount = int64(len(queryData))
+	}
+	data := make(map[string]interface{})
+	data["list"] = listdata
+	data["columnsname"] = columnsname
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if count > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(count))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
+	}
+	data["pageSize"] = count
+	return data, nil
+}
+
+func ExecQuery(sqlstr string, params []interface{}) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+
+	rows, err := Dbs.Exec(sqlstr, params...)
+	if err != nil {
+		return nil, err
+	}
+	data := make(map[string]interface{})
+	LastInsertId, _ := rows.LastInsertId()
+	idPointer := (*int)(unsafe.Pointer(&LastInsertId))
+	idd16 := *idPointer
+	RowsAffected, _ := rows.RowsAffected()
+	_idPointer := (*int)(unsafe.Pointer(&RowsAffected))
+	_idd16 := *_idPointer
+	data["result"] = rows
+	data["LastInsertId"] = idd16
+
+	data["RowsAffected"] = _idd16
+	return data, nil
+}
+
+func ExecQueryT(sqlstr string, params []interface{}, tx *sqlx.Tx) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+
+	rows, err := tx.Exec(sqlstr, params...)
+	if err != nil {
+		fmt.Println("exe", err)
+		return nil, err
+	}
+	fmt.Println(sqlstr)
+	LastInsertId, _ := rows.LastInsertId()
+	idPointer := (*int)(unsafe.Pointer(&LastInsertId))
+	idd16 := *idPointer
+	data := make(map[string]interface{})
+
+	RowsAffected, _ := rows.RowsAffected()
+	_idPointer := (*int)(unsafe.Pointer(&RowsAffected))
+	_idd16 := *_idPointer
+	data["LastInsertId"] = idd16
+	data["RowsAffected"] = _idd16
+	data["result"] = rows
+	return data, nil
+}
+
+func ExecQuerys(sqlstr string, params []interface{}) (interface{}, error) {
+	if err := sqlCheckParam(sqlstr); err != nil {
+		return 0, err
+	}
+	var res sql.Result
+	var e error
+	res, e = Dbs.Exec(sqlstr, params...)
+	if e != nil {
+		return nil, e
+	}
+	fmt.Printf("%#v\n", res)
+	data := make(map[string]interface{})
+	data["result"] = nil
+	return data, nil
+}
+
+func getValue(value interface{}, CT string) interface{} {
+	var v interface{}
+	val := value
+	b, ok := val.([]byte)
+	if ok {
+		v1 := string(b)
+		switch CT {
+		case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
+			{
+				v, _ = strconv.ParseInt(v1, 10, 32)
+			}
+		case "FLOAT", "DOUBLE", "DECIMAL":
+			{
+				cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
+				v2, _ := strconv.ParseFloat(v1, 32)
+				v = toFixed(v2, cindex)
+			}
+		case "BOOL":
+			{
+				v, _ = strconv.ParseBool(v1)
+			}
+		default:
+			{
+				v = v1
+			}
+		}
+	} else {
+		v = val
+	}
+	return v
+}
+func reflect2object(rawValue *reflect.Value) (value interface{}, err error) {
+	aa := reflect.TypeOf((*rawValue).Interface())
+	vv := reflect.ValueOf((*rawValue).Interface())
+	switch aa.Kind() {
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		value = vv.Int()
+	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+		value = vv.Uint()
+	case reflect.Float32, reflect.Float64:
+		value = vv.Float()
+	case reflect.String:
+		value = vv.String()
+	case reflect.Array, reflect.Slice:
+		switch aa.Elem().Kind() {
+		case reflect.Uint8:
+			data := rawValue.Interface().([]byte)
+			value = string(data)
+		default:
+			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+		}
+	// time type
+	case reflect.Struct:
+		if aa.ConvertibleTo(schemas.TimeType) {
+			value = vv.Convert(schemas.TimeType).Interface().(time.Time)
+		} else {
+			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+		}
+	case reflect.Bool:
+		value = vv.Bool()
+	case reflect.Complex128, reflect.Complex64:
+		value = vv.Complex()
+	/* TODO: unsupported types below
+	   case reflect.Map:
+	   case reflect.Ptr:
+	   case reflect.Uintptr:
+	   case reflect.UnsafePointer:
+	   case reflect.Chan, reflect.Func, reflect.Interface:
+	*/
+	default:
+		err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+	}
+	return
+}
+func value2Object(rawValue *reflect.Value) (data interface{}, err error) {
+	data, err = reflect2object(rawValue)
+	if err != nil {
+		return
+	}
+	return
+}
+
+func rows2mapObjects(rows *sqlx.Rows) (resultsSlice []map[string]interface{}, err error) {
+	fields, err := rows.Columns()
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	for rows.Next() {
+		result, err := rows2mapObject(rows, fields)
+		if err != nil {
+			return nil, err
+		}
+		resultsSlice = append(resultsSlice, result)
+	}
+
+	return resultsSlice, nil
+}
+
+func rows2mapObject(rows *sqlx.Rows, fields []string) (resultsMap map[string]interface{}, err error) {
+	result := make(map[string]interface{})
+	scanResultContainers := make([]interface{}, len(fields))
+	for i := 0; i < len(fields); i++ {
+		var scanResultContainer interface{}
+		scanResultContainers[i] = &scanResultContainer
+	}
+	if err := rows.Scan(scanResultContainers...); err != nil {
+		return nil, err
+	}
+
+	for ii, key := range fields {
+		rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
+		//if row is null then ignore
+		if rawValue.Interface() == nil {
+			continue
+		}
+
+		if data, err := value2Object(&rawValue); err == nil {
+			result[key] = data
+		} else {
+			return nil, err // !nashtsai! REVIEW, should return err or just error log?
+		}
+
+	}
+	return result, nil
+}
+
+func row2mapStr(rows *sqlx.Rows, fields []string) (resultsMap map[string]string, err error) {
+	result := make(map[string]string)
+	scanResultContainers := make([]interface{}, len(fields))
+	for i := 0; i < len(fields); i++ {
+		var scanResultContainer interface{}
+		scanResultContainers[i] = &scanResultContainer
+	}
+	if err := rows.Scan(scanResultContainers...); err != nil {
+		return nil, err
+	}
+
+	for ii, key := range fields {
+		rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
+		// if row is null then as empty string
+		if rawValue.Interface() == nil {
+			result[key] = ""
+			continue
+		}
+
+		if data, err := value2String(&rawValue); err == nil {
+			result[key] = data
+		} else {
+			return nil, err
+		}
+	}
+	return result, nil
+}
+
+func Rows2Strings(rows *sqlx.Rows) (resultsSlice []map[string]string, err error) {
+	fields, err := rows.Columns()
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	for rows.Next() {
+		result, err := row2mapStr(rows, fields)
+		if err != nil {
+			return nil, err
+		}
+		resultsSlice = append(resultsSlice, result)
+	}
+
+	return resultsSlice, nil
+}
+func value2String(rawValue *reflect.Value) (str string, err error) {
+	aa := reflect.TypeOf((*rawValue).Interface())
+	vv := reflect.ValueOf((*rawValue).Interface())
+	switch aa.Kind() {
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		str = strconv.FormatInt(vv.Int(), 10)
+	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+		str = strconv.FormatUint(vv.Uint(), 10)
+	case reflect.Float32, reflect.Float64:
+		str = strconv.FormatFloat(vv.Float(), 'f', -1, 64)
+	case reflect.String:
+		str = vv.String()
+	case reflect.Array, reflect.Slice:
+		switch aa.Elem().Kind() {
+		case reflect.Uint8:
+			data := rawValue.Interface().([]byte)
+			str = string(data)
+			if str == "\x00" {
+				str = "0"
+			}
+		default:
+			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+		}
+	// time type
+	case reflect.Struct:
+		if aa.ConvertibleTo(schemas.TimeType) {
+			str = vv.Convert(schemas.TimeType).Interface().(time.Time).Format(time.RFC3339Nano)
+		} else {
+			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+		}
+	case reflect.Bool:
+		str = strconv.FormatBool(vv.Bool())
+	case reflect.Complex128, reflect.Complex64:
+		str = fmt.Sprintf("%v", vv.Complex())
+	/* TODO: unsupported types below
+	   case reflect.Map:
+	   case reflect.Ptr:
+	   case reflect.Uintptr:
+	   case reflect.UnsafePointer:
+	   case reflect.Chan, reflect.Func, reflect.Interface:
+	*/
+	default:
+		err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+	}
+	return
+}
+
+func MapStrList(sql string, param ...interface{}) ([]map[string]string, error) {
+	ress := make([]map[string]string, 0, 0)
+	rows, err := Dbs.Queryx(sql, param...)
+	if err != nil {
+		log.Default().Printf("MapStrList Queryx: %v", err)
+		return ress, err
+	}
+	col, err := rows.Columns()
+	if err != nil {
+		log.Default().Printf("BigpartUse clolumns: %v", err)
+		return ress, err
+	}
+	for rows.Next() {
+		m := make(map[string]string)
+		rs, err := rows.SliceScan()
+		if err != nil {
+			log.Default().Printf("BigpartUse SliceScan: %v", err)
+			return ress, err
+		}
+		for i, r := range rs {
+			switch r.(type) {
+			case []uint8:
+				m[col[i]] = string(r.([]uint8))
+			case int64:
+				m[col[i]] = strconv.FormatInt(r.(int64), 10)
+			case float64:
+				m[col[i]] = fmt.Sprintf("%v", r)
+			}
+
+		}
+		ress = append(ress, m)
+	}
+	defer func() {
+		if err := rows.Close(); err != nil {
+			log.Default().Printf("sqlx row  close:%v", err)
+		}
+	}()
+	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...)
+// 	if err != nil {
+// 		log.Default().Printf("MapInterList Queryx: %v", err)
+// 		return ress, err
+// 	}
+// 	col, err := rows.Columns()
+// 	if err != nil {
+// 		log.Default().Printf("BigpartUse clolumns: %v", err)
+// 		return ress, err
+// 	}
+// 	for rows.Next() {
+// 		m := make(map[string]interface{})
+// 		rs, err := rows.SliceScan()
+// 		if err != nil {
+// 			log.Default().Printf("BigpartUse SliceScan: %v", err)
+// 			return ress, err
+// 		}
+// 		for i, r := range rs {
+// 			switch r.(type) {
+// 			case []uint8:
+// 				m[col[i]] = string(r.([]uint8))
+// 			case int64:
+// 				m[col[i]] = r.(int64)
+// 			}
+// 		}
+// 		ress = append(ress, m)
+// 	}
+// 	defer func() {
+// 		if err := rows.Close(); err != nil {
+// 			log.Default().Printf("sqlx row  close:%v", err)
+// 		}
+// 	}()
+// 	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...)
+	if err != nil {
+		log.Default().Printf("MapInterList Queryx: %v", err)
+		return ress, err
+	}
+	col, err := rows.Columns()
+	if err != nil {
+		log.Default().Printf("BigpartUse clolumns: %v", err)
+		return ress, err
+	}
+	for rows.Next() {
+		m := make(map[string]interface{})
+		rs, err := rows.SliceScan()
+		if err != nil {
+			log.Default().Printf("BigpartUse SliceScan: %v", err)
+			return ress, err
+		}
+		for i, r := range rs {
+			switch r.(type) {
+			case []uint8:
+				m[col[i]] = string(r.([]uint8))
+			case int64:
+				m[col[i]] = r.(int64)
+			case float64:
+				m[col[i]] = r.(float64)
+			}
+		}
+		ress = append(ress, m)
+	}
+	defer func() {
+		if err := rows.Close(); err != nil {
+			log.Default().Printf("sqlx row  close:%v", err)
+		}
+	}()
+	return ress, nil
+}
+
+func BasicList(sql string, params []interface{}, res ...interface{}) error {
+	// fmt.Printf("%s\n", sql)
+	if params == nil {
+		params = make([]interface{}, 0)
+	}
+	// var count int
+	tt, err := Dbs.Queryx(sql, params...)
+
+	if err != nil {
+		fmt.Println("s1", err)
+		return err
+	}
+	if tt.Next() {
+		tt.Scan(res...)
+		// tt.Scan(&count)
+	}
+	defer func() {
+		if err := tt.Close(); err != nil {
+			log.Default().Printf("sqlx row  close:%v", err)
+		}
+	}()
+	return nil
+}
+
+func MapStr(sql string, param ...interface{}) (map[string]string, error) {
+	m := make(map[string]string)
+	rows, err := Dbs.Queryx(sql, param...)
+	if err != nil {
+		log.Default().Printf("MapStr Queryx: %v", err)
+		return m, err
+	}
+	col, err := rows.Columns()
+	if err != nil {
+		log.Default().Printf("BigpartUse clolumns: %v", err)
+		return m, err
+	}
+	if rows.Next() {
+
+		rs, err := rows.SliceScan()
+		if err != nil {
+			log.Default().Printf("BigpartUse SliceScan: %v", err)
+			return m, err
+		}
+		for i, r := range rs {
+			switch r.(type) {
+			case []uint8:
+				m[col[i]] = string(r.([]uint8))
+			case int64:
+				m[col[i]] = strconv.FormatInt(r.(int64), 10)
+			}
+		}
+	}
+	defer func() {
+		if err := rows.Close(); err != nil {
+			log.Default().Printf("sqlx row  close:%v", err)
+		}
+	}()
+	return m, nil
+}
+
+func MapStrListTx(tx *sqlx.Tx, sql string, param ...interface{}) ([]map[string]string, error) {
+	ress := make([]map[string]string, 0, 0)
+	rows, err := tx.Queryx(sql, param...)
+	if err != nil {
+		log.Default().Printf("MapStrListTx Queryx: %v", err)
+		return ress, err
+	}
+	col, err := rows.Columns()
+	if err != nil {
+		log.Default().Printf("BigpartUse clolumns: %v", err)
+		return ress, err
+	}
+	for rows.Next() {
+		m := make(map[string]string)
+		rs, err := rows.SliceScan()
+		if err != nil {
+			log.Default().Printf("BigpartUse SliceScan: %v", err)
+			return ress, err
+		}
+		for i, r := range rs {
+			switch r.(type) {
+			case []uint8:
+				m[col[i]] = string(r.([]uint8))
+			case int64:
+				m[col[i]] = strconv.FormatInt(r.(int64), 10)
+			}
+		}
+		ress = append(ress, m)
+	}
+	defer func() {
+		if err := rows.Close(); err != nil {
+			log.Default().Printf("sqlx row  close:%v", err)
+		}
+	}()
+	return ress, nil
+}

+ 91 - 0
apiserver/routers/restful/test.go

@@ -0,0 +1,91 @@
+package restful
+
+import (
+	"fmt"
+
+	log "github.com/sirupsen/logrus"
+	// "kpt.xdmy/apiserver/dao"
+)
+
+func Sqlx() {
+	// st := time.Now()
+	// rows, e := Dbs.Queryx("SELECT id,partcode FROM parts limit 3000")
+	// rows, e := Dbs.Queryx("SELECT * FROM parts limit 3000")
+	// rows, e := Dbs.Queryx("SELECT * FROM parts limit 3000")
+	// dao.D.DB.Raw("SELECT id,partcode FROM parts limit 1000")
+	// s.d.DB.Raw()
+	// log.Printf("%d", time.Now().Sub(st).Milliseconds())
+	// sql, e := Dbs.Beginx()
+	// if e != nil {
+	// 	log.Error(e)
+	// }
+	// _, e = sql.Exec("update pasture  set name =33 where name  ='22'")
+	// if e != nil {
+	// 	log.Error(e)
+	// }
+	// sql.Commit()
+	// var name string
+	var sqls, param string
+	tx, e := Dbs.Beginx()
+	if e != nil {
+		log.Error(e)
+	}
+	rows, e := tx.Queryx("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", "getBigPartTransferList")
+	// rows, e := Dbs.Queryx("select id from parts where createTime is not null   limit 10 ")
+	// rows, e := Dbs.NamedQuery("select name  from  pasture  where  name=:name", map[string]interface{}{"name": "33"})
+	if e != nil {
+		fmt.Print(e)
+	}
+	if rows.Next() {
+		rows.Scan(&sqls, &param)
+	}
+	// tx.Commit()
+	fmt.Println(sqls, param)
+	// for rows.Next() {
+	// 	var value string
+	// 	rs, err := rows.SliceScan()
+	// 	if err != nil {
+	// 		fmt.Printf("BigpartUse SliceScan: %v", err)
+	// 	}
+	// 	for _, r := range rs {
+
+	// 		switch r.(type) {
+	// 		case []uint8:
+	// 			value = string(r.([]uint8))
+	// 		case int64:
+	// 			value = strconv.FormatInt(r.(int64), 10)
+	// 		case time.Time:
+	// 			value = r.(time.Time).Format("2006-01-02 15:04:05")
+	// 		}
+	// 		fmt.Println(value)
+	// 	}
+	// }
+
+	// rows.Scan(&name)
+	// fmt.Printf("name = %s  \n", name)
+	// var ids int
+	// var partcode string
+	// p := make(map[string]interface{})
+	// in := make([]string, 0)
+
+	// rows.Next()
+	// rows.Scan(&ids, &partcode)
+
+	// fmt.Printf("id: %d, code: %s\n", ids, partcode)
+
+	// rows.Next()
+	// rows.MapScan(p)
+	// fmt.Printf("map: %s\n", p)
+
+	// rows.Next()
+	// rows.Scan(&in)
+	// fmt.Printf("interface: %s\n", in)
+
+	// rows.Next()
+	// sl, e := rows.SliceScan()
+	// if e != nil {
+	// 	fmt.Println(e)
+	// }
+	// fmt.Printf("slice: %s\n", sl)
+	defer rows.Close()
+}

+ 98 - 0
apiserver/routers/restful/user.go

@@ -0,0 +1,98 @@
+package restful
+
+import (
+	"fmt"
+	"github.com/astaxie/beego/logs"
+)
+
+type User struct {
+	Id         int    `xorm:"not null pk autoincr INT(10)"`
+	Username   string `xorm:"default '''' comment('账号') VARCHAR(50)"`
+	Password   string `xorm:"default '''' comment('密码') VARCHAR(50)"`
+	Empid      int    `xorm:"default -1 INT(11)"`
+	Sort       int    `xorm:"default 0 INT(11)"`
+	Enable     int    `xorm:"default 1 TINYINT(4)"`
+	CreatedOn  int    `xorm:"default NULL comment('创建时间') INT(11)"`
+	ModifiedOn int    `xorm:"default NULL comment('更新时间') INT(11)"`
+	DeletedOn  int    `xorm:"default 0 comment('删除时间戳') INT(11)"`
+}
+
+/*
+type UserRole struct {
+	Id        int `xorm:"not null pk autoincr INT(10)"`
+	UserId    int `xorm:"default NULL comment('用户ID') INT(11)"`
+	RoleId    int `xorm:"default NULL comment('角色ID') INT(11)"`
+	DeletedOn int `xorm:"default 0 comment('删除时间戳') INT(11)"`
+}
+
+type Role struct {
+	Id         int    `xorm:"not null pk autoincr INT(10)"`
+	Name       string `xorm:"default '''' comment('名字') VARCHAR(50)"`
+	Sort       int    `xorm:"default 0 INT(11)"`
+	Enable     int    `xorm:"default 1 TINYINT(4)"`
+	CreatedOn  int    `xorm:"default NULL comment('创建时间') INT(11)"`
+	ModifiedOn int    `xorm:"default NULL comment('更新时间') INT(11)"`
+	DeletedOn  int    `xorm:"default 0 comment('删除时间戳') INT(11)"`
+}
+*/
+func CheckUser(username, password string) (bool, error) {
+	tqueryData, err := Dbs.Queryx("SELECT * FROM  `user` WHERE `username` = ? and password = ? and `enable` >0 ", username, password)
+	if err != nil {
+		logs.Error(err)
+		return false, err
+	}
+	valuesMap, err := rows2mapObjects(tqueryData)
+	if err != nil || len(valuesMap) == 0 {
+		logs.Error(err)
+		return false, err
+	}
+	//if len(valuesMap) > 0 {
+	//return true, nil
+	//}
+	return true, nil
+}
+func GetUserInfo(username string) map[string]interface{} {
+	valuesMap := make([]map[string]interface{}, 1)
+	valuesMap2 := make([]map[string]interface{}, 1)
+
+	tqueryData, err := Dbs.Queryx("SELECT * FROM  `user` WHERE `username` = ? and `enable` >0 ", username)
+	if err != nil {
+		fmt.Println(err)
+		return nil
+	}
+	valuesMap, err = rows2mapObjects(tqueryData)
+
+	if err != nil {
+		return nil
+	}
+	if len(valuesMap) > 0 {
+		tqueryData2, err := Dbs.Queryx("SELECT r.`name`,r.`id` FROM `user` u JOIN `user_role` ur ON u.`id`=ur.`user_id` JOIN `role` r ON r.id=ur.`role_id` WHERE r.`enable`>0 AND u.username=?", username)
+		if err == nil {
+			valuesMap2, err = rows2mapObjects(tqueryData2)
+			if err == nil {
+				valuesMap[0]["role"] = valuesMap2
+			}
+		}
+		return valuesMap[0]
+	}
+	return nil
+}
+
+func GetUserVendor(username string) int64 {
+	tqueryData, err := Dbs.Queryx(`SELECT
+ifnull(pa.vendor,0) vendor
+FROM
+	emp e
+	INNER JOIN USER u ON e.id = u.empid
+	INNER JOIN department d ON e.deptid = d.id
+	INNER join pasture pa on pa.id = d.pastureid
+WHERE
+	u.username = ?`, username)
+	if err == nil {
+		valuesMap, err := rows2mapObjects(tqueryData)
+		if err == nil {
+			return valuesMap[0]["vendor"].(int64)
+		}
+	}
+	return -1
+}

+ 236 - 0
apiserver/routers/router.go

@@ -0,0 +1,236 @@
+package routers
+
+import (
+	"fmt"
+
+	"github.com/gin-gonic/gin"
+	"kpt.xdmy/middleware/comm"
+	"kpt.xdmy/middleware/jwt"
+
+	//	"kpt.xdmy/middleware/permission"
+	"net/http"
+	"strings"
+
+	swaggerFiles "github.com/swaggo/files"
+	ginSwagger "github.com/swaggo/gin-swagger"
+
+	// "github.com/swaggo/gin-swagger/swaggerFiles"
+
+	"kpt.xdmy/apiserver/routers/api"
+	"kpt.xdmy/pkg/setting"
+)
+
+func InitRouter() *gin.Engine {
+
+	r := gin.New()
+
+	r.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
+		// 你的自定义格式
+		return fmt.Sprintf("   %+v \n",
+			param.Keys,
+		)
+	}))
+	r.Use(gin.Logger()) // 日志
+	// r.Use(gzip.Gzip(gzip.DefaultCompression))
+	r.Use(Cors()) // 跨域请求rolemenus
+	r.Use(gin.Recovery())
+	gin.SetMode(setting.ServerSetting.RunMode)
+	r.MaxMultipartMemory = 1
+
+	r.Static("/static", setting.CurrentPath+"/dist/static")               // 添加资源路径
+	r.Static("/datas", setting.CurrentPath+"/dist/datas")                 // 添加资源路径
+	r.StaticFile("/", setting.CurrentPath+"/dist/index.html")             //前端接口
+	r.StaticFile("/favicon.ico", setting.CurrentPath+"/dist/favicon.ico") //前端接口
+	r.StaticFile("/myMap.json", setting.CurrentPath+"/data/myMap.json")   //前端接口
+	r.Static("/file", setting.CurrentPath+"/uploads/file")
+	r.Static("/uploads", setting.CurrentPath+"/uploads")
+	r.POST("/auth", api.Auth) // 获取登录token
+
+	r.POST("/authdata/test", Exec)
+	r.POST("/authdata/department", DepartmentExec)
+	r.POST("/authdata/provider", ProviderExec)
+	r.POST("/authdata/equipmentExecAdd", EquipmentExecAdd)
+	r.POST("/authdata/contractExec", ContractExec)
+
+	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // API 注释
+
+	if setting.CommSetting.PortName != "" {
+		r.GET("/comm/:id/:x/:y/", comm.ProcessHttp)
+		r.GET("/cps/:id/:limit", comm.ProcessHttpCPS)
+		r.POST("/comm/:id/:x/:y/", comm.ProcessHttp)
+		r.POST("/cps/:id/:limit", comm.ProcessHttpCPS)
+	}
+	r.POST("/quickResponse", QuickResponse)
+
+	r.POST("/test", Test)
+	//r.POST("/dingding", Dingding)
+
+	eqm := r.Group("/manage/api")
+	eqm.POST("/login", api.Auth)
+
+	apiV1 := r.Group("/authdata")
+
+	apiV1.Use(jwt.JWT()) // token 验证
+
+	{
+
+		//查询报表管理,启停记录
+		apiV1.POST("/startStopRecord", StartStopRecord)
+		//查看督办信息
+		apiV1.POST("/oversee", GetOversee)
+
+		apiV1.POST("/maintain/pasture", MaintainListPid)
+		apiV1.POST("/maintain", MaintainList)
+		apiV1.POST("/maintain/equipment", MaintainListEquipment)
+
+		apiV1.POST("/equipment", EquipmentExec)
+		//srm手动推送
+		apiV1.POST("srm/order/send", ManaulSrmOrderJob)
+		//sap手动推送
+		apiV1.POST("sap/order/send", ManaulSapOrder)
+
+		//手动入库
+		apiV1.POST("sap/laidproof/send", LaidProof)
+		//手动出库
+		apiV1.POST("sap/useproof/send", UseProof)
+		//手动退货
+		apiV1.POST("sap/refundproof/send", RefundProof)
+		//手动退库
+		apiV1.POST("sap/quitproof/send", QuitProof)
+
+		//sap手动调拨
+		apiV1.POST("sap/transfer/send", ManualTransfer)
+
+		apiV1.POST("part/eas/batch", EasBatch)
+		apiV1.POST("/sap/proof/off/list", ProofOffList)
+		apiV1.POST("/sap/proof/off", ProofOff)
+		apiV1.POST("/sap/proof/detail", ProofList)
+		apiV1.GET("/mcs/accounts", McsAccounts)
+		apiV1.POST("/mcs/record", McsControl)
+		apiV1.POST("/rolemenus", api.GetRecuDataByName)
+		apiV1.GET("/userinfo", api.GetUserinfo)
+		apiV1.POST("/logout", api.UserLogout)
+		apiV1.POST("/GetRecuDataByName", api.GetRecuDataByName) ////
+		apiV1.POST("/GetDataByName", api.GetDataByName)
+		apiV1.POST("/GetDataByNames", api.GetDataByNames)
+		apiV1.POST("/PostDataByName", api.PostDataByName)
+		apiV1.POST("/PostThirdPartyData", api.PostThirdPartyData)
+		apiV1.POST("/PostDataByNames", api.PostDataByNames)
+		apiV1.POST("/UpdateDataRelation", api.UpdateDataRelation) //log.error
+		apiV1.POST("/GetDataByNameForm", api.GetDataByNameForm)
+		apiV1.POST("/PostDataByNameForm", api.PostDataByNameForm)
+		apiV1.POST("/GetUpkeepPlan", api.GetUpkeepPlan)
+		apiV1.POST("/GetReportform", api.GetReportform)
+		apiV1.POST("/GetAccount", api.GetAccount)
+		apiV1.POST("/ExecDataByConfig", api.ExecDataByConfig)
+		apiV1.POST("/ImportExcel", api.ImportExcel)
+		apiV1.POST("/upload/:id/:name", api.UploadFile)
+		apiV1.POST("/uploads", api.UploadFiles)
+		apiV1.POST("/uploaderimage", api.UploaderImage)
+		apiV1.POST("/removeimage", api.RemovePicByName)
+		apiV1.GET("/getthumbnailimage/:filename", api.GetThumbnailImage)
+		apiV1.POST("/getoriginimage/:filename", api.GetOriginImage)
+		apiV1.GET("/getfileraw/:filename", api.GetFileRaw)
+		apiV1.GET("/downloadfile/:filename", api.DownloadFile)
+		apiV1.POST("/downloadmailreport", api.DownloadMailReport)
+		apiV1.POST("/removefile/:id", api.RemoveFileByName)
+
+		apiV1.POST("/testdata", api.TestData)
+		apiV1.POST("/Testpartitions", api.Testpartitions)
+		// eas 对接
+		apiV1.POST("/EasSync", api.EasSync)
+	}
+	if setting.ServerSetting.NoAuth > 0 {
+
+		apiV2 := r.Group("/data") // restful  接口 tablename 是 表名字
+		{
+			apiV2.POST("sap/transfer/send", ManualTransfer)
+			apiV2.POST("/getdata", api.GetData)
+
+			apiV2.POST("/GetDataByName", api.GetDataByName)
+			apiV2.POST("/GetDataByNames", api.GetDataByNames)
+			apiV2.POST("/PostDataByName", api.PostDataByName)
+			apiV2.POST("/PostDataByNames", api.PostDataByNames)
+
+			apiV2.POST("/ExecDataByConfig", api.ExecDataByConfig)
+
+			apiV2.POST("/GetDataByNameForm", api.GetDataByNameForm)
+			apiV2.POST("/PostDataByNameForm", api.PostDataByNameForm)
+
+			apiV2.POST("/ImportExcel", api.ImportExcel)
+			//调用资产标准管理
+			apiV2.POST("/Equipment", api.Equipment)
+			apiV2.POST("/PastureDepartment", api.PastureDepartment)
+			//插入和修改标准管理
+			apiV2.POST("/updateAndInster", api.UpdateAndInsert)
+			// 标准库存管理
+			apiV2.POST("/StandardPart", api.StandardPart)
+			apiV2.POST("/upload", api.UploadFile)
+			apiV2.POST("/uploads", api.UploadFiles)
+			apiV2.POST("/uploaderimage", api.UploaderImage)
+			apiV2.POST("/removeimage", api.RemovePicByName)
+			apiV2.GET("/getthumbnailimage/:filename", api.GetThumbnailImage)
+			apiV2.GET("/getoriginimage/:filename", api.GetOriginImage)
+			apiV2.GET("/getfileraw/:filename", api.GetFileRaw)
+			apiV2.GET("/downloadfile/:filename", api.DownloadFile)
+			apiV2.POST("/removefile", api.RemoveFileByName)
+
+			apiV2.POST("/testdata", api.TestData)
+
+			//apiV2.POST("/DingShi",api.DingShi)
+			//apiV2.POST("/Ceshi",api.Ceshi)
+		}
+	}
+	r.POST("/getopenid/:code", api.GetOpenID)
+	apiV3 := r.Group("/thi") // restful  接口 tablename 是 表名字
+	{
+		apiV3.POST("/GetDataByName", api.GetDataByName)
+		apiV3.POST("/PostDataByName", api.PostDataByName)
+	}
+
+	apiV4 := r.Group("/openapi")
+	//apiV4.Use(jwt.JWT())
+	{
+		apiV4.POST("/GetDataByName", api.GetDataByNameOPEN)
+		apiV4.POST("/PostDataByName", api.PostDataByNameOPEN)
+	}
+
+	return r
+}
+
+// 跨域
+func Cors() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		method := c.Request.Method               //请求方法
+		origin := c.Request.Header.Get("Origin") //请求头部
+		var headerKeys []string                  // 声明请求头keys
+		for k := range c.Request.Header {
+			headerKeys = append(headerKeys, k)
+		}
+		headerStr := strings.Join(headerKeys, ", ")
+		if headerStr != "" {
+			headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
+		} else {
+			headerStr = "access-control-allow-origin, access-control-allow-headers"
+		}
+		if origin != "" {
+			c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
+			c.Header("Access-Control-Allow-Origin", "*")                                        // 这是允许访问所有域
+			c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") //服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求
+			//  header的类型
+			c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, id,  Token, name, optname, thumbnail, session, X_Requested_With, Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
+			//              允许跨域设置                                                                                                      可以返回其他子段
+			c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma, FooBar") // 跨域关键设置 让浏览器可以解析
+			c.Header("Access-Control-Max-Age", "172800")                                                                                                                                                                  // 缓存请求信息 单位为秒
+			c.Header("Access-Control-Allow-Credentials", "false")                                                                                                                                                         //  跨域请求是否需要带cookie信息 默认设置为true
+			c.Set("content-type", "application/json")                                                                                                                                                                     // 设置返回格式是json
+		}
+
+		//放行所有OPTIONS方法
+		if method == "OPTIONS" {
+			c.JSON(http.StatusOK, "Options Request!")
+		}
+		// 处理请求
+		c.Next() //  处理请求
+	}
+}

+ 308 - 0
apiserver/routers/sap.go

@@ -0,0 +1,308 @@
+package routers
+
+import (
+	"github.com/360EntSecGroup-Skylar/excelize"
+	"github.com/Anderson-Lu/gofasion/gofasion"
+	"github.com/gin-gonic/gin"
+	"github.com/pkg/errors"
+	"io/ioutil"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"kpt.xdmy/apiserver/routers/restful"
+	"kpt.xdmy/apiserver/service"
+	"kpt.xdmy/pkg/logging"
+)
+
+func ProofList(c *gin.Context) {
+	p := new(model.ProofReq)
+	//if !Bind(c, p) {
+	//	return
+	//}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	p.OrderNumber = fsion.Get("OrderNumber").ValueStr()
+	p.NumberType = fsion.Get("NumberType").ValueInt()
+	rp := service.ProofList(p)
+	c.JSON(200, &rp)
+}
+
+func ProofOff(c *gin.Context) {
+	p := new(model.ProofReq)
+	if !Bind(c, p) {
+		return
+	}
+	rp := svc.ProofOff(p)
+	c.JSON(200, &rp)
+}
+
+func ProofOffList(c *gin.Context) {
+	p := new(model.ProofReq)
+	if !Bind(c, p) {
+		return
+	}
+	rp := service.ProofList(p)
+	c.JSON(rp.Code, &rp)
+}
+
+func ManualTransfer(c *gin.Context) {
+	list := make([]*http.ManaulReq, 0)
+	//p := new(http.ManaulReq)
+	c.Bind(&list)
+	tx, err := restful.Dbs.Beginx()
+	defer func() {
+		switch {
+		case err != nil:
+			logging.Error("tx.Begin 事务启动失败__error:", err)
+			if tx != nil {
+				tx.Rollback()
+			}
+		default:
+			if tx != nil {
+				err = tx.Commit()
+			}
+		}
+
+	}()
+	for _, item := range list {
+
+		err := service.ManualTransfer(item.Id, tx)
+		if err == nil {
+			c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 0}, "msg": "ok"})
+			return
+		} else {
+			c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": "fail"})
+			return
+		}
+	}
+
+}
+
+func ManaulSapOrder(c *gin.Context) {
+	////dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	////fsion := gofasion.NewFasion(string(dataByte))
+	////for _, code := range fsion.Array() {
+	//if e := service.ManaulSapOrderJob(""); e != nil {
+	//	c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": "fail"})
+	//	return
+	//}
+	////}
+
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	for _, code := range fsion.Array() {
+		if e := service.ManaulSapOrderJob(code.Get("buyeCode").ValueStr()); e != nil {
+			c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": "fail"})
+			return
+		}
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 0}, "msg": "ok"})
+}
+
+func ManaulSrmOrderJob(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	//parammaps := fsion.Get("list").Array()
+	for _, code := range fsion.Array() {
+		service.ManaulSrmOrderJob(code.Get("buyeCode").ValueStr())
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 0}, "msg": "ok"})
+}
+
+//手动入库
+func LaidProof(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	//parammaps := fsion.Get("list").Array()
+	var err []error
+	tx, err1 := restful.Dbs.Beginx()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+	for _, parammap := range fsion.Array() {
+		p := new(http.ProofPartReq)
+		p.LaidCode = parammap.Get("laidCode").ValueStr()
+		p.StorageTime = parammap.Get("creatTime").ValueStr()
+		err1 := svc.LaidProof(p, tx)
+		err = append(err, err1)
+	}
+	err1 = tx.Commit()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 0}, "msg": "ok"})
+}
+
+//手动出库
+func UseProof(c *gin.Context) {
+	//p := new(http.ProofPartReq)
+	//c.Bind(&p)
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	//parammaps := fsion.Get("list").Array()
+	tx, err1 := restful.Dbs.Beginx()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+	for _, parammap := range fsion.Array() {
+		p := new(http.ProofPartReq)
+		p.UseForm = parammap.Get("useForm").ValueStr()
+		p.ReceiveTime = parammap.Get("creatTime").ValueStr()
+		svc.UseProof(p, tx)
+	}
+	err1 = tx.Commit()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 0}, "msg": "ok"})
+}
+
+//手动退货
+func RefundProof(c *gin.Context) {
+	//p := make([]*http.ProofPartReq, 0)
+	//c.Bind(&p)
+	//for _, item := range p {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	//parammaps := fsion.Get("list").Array()
+	tx, err1 := restful.Dbs.Beginx()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+	for _, parammap := range fsion.Array() {
+		p := new(http.ProofPartReq)
+		p.ID = parammap.Get("id").ValueInt()
+		svc.RefundProof(p, tx)
+	}
+	err1 = tx.Commit()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 0}, "msg": "ok"})
+}
+
+//手动退库
+func QuitProof(c *gin.Context) {
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	//parammaps := fsion.Get("list").Array()
+	tx, err1 := restful.Dbs.Beginx()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+
+	for _, parammap := range fsion.Array() {
+		p := new(http.ProofPartReq)
+		p.UseForm = parammap.Get("useForm").ValueStr()
+		p.QuitDate = parammap.Get("quitDate").ValueStr()
+		svc.QuitProof(p, tx)
+	}
+	err1 = tx.Commit()
+	if err1 != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": err1})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 200}, "msg": "ok"})
+}
+
+func Exec(c *gin.Context) {
+	file, err := c.FormFile("file")
+	if err != nil {
+		err = errors.Wrap(err, "AddManagement-error")
+		return
+	}
+
+	f, _ := file.Open()
+	xlsx1, err := excelize.OpenReader(f)
+	rows := xlsx1.GetRows("人员花名册")
+
+	service.Exec(rows)
+}
+
+func DepartmentExec(c *gin.Context) {
+	file, err := c.FormFile("file")
+	if err != nil {
+		err = errors.Wrap(err, "AddManagement-error")
+		return
+	}
+
+	f, _ := file.Open()
+	xlsx1, err := excelize.OpenReader(f)
+	rows := xlsx1.GetRows("Sheet1")
+
+	service.DepartmentExec(rows)
+}
+
+func ProviderExec(c *gin.Context) {
+	file, err := c.FormFile("file")
+	if err != nil {
+		err = errors.Wrap(err, "AddManagement-error")
+		return
+	}
+
+	f, _ := file.Open()
+	xlsx1, err := excelize.OpenReader(f)
+	rows := xlsx1.GetRows("Sheet1")
+
+	service.ProviderExec(rows)
+}
+
+func EquipmentExec(c *gin.Context) {
+	file, err := c.FormFile("file")
+	if err != nil {
+		err = errors.Wrap(err, "AddManagement-error")
+		return
+	}
+
+	f, _ := file.Open()
+	xlsx1, err := excelize.OpenReader(f)
+	rows := xlsx1.GetRows("设备基础信息")
+
+	err = service.EquipmentExec(rows)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": "fail"})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 200}, "msg": "ok"})
+}
+
+func EquipmentExecAdd(c *gin.Context) {
+	file, err := c.FormFile("file")
+	if err != nil {
+		err = errors.Wrap(err, "AddManagement-error")
+		return
+	}
+
+	f, _ := file.Open()
+	xlsx1, err := excelize.OpenReader(f)
+	rows := xlsx1.GetRows("财务资产汇总")
+
+	err = service.EquipmentExecAdd(rows)
+	if err != nil {
+		c.JSON(500, map[string]interface{}{"code": 500, "data": map[string]interface{}{"code": 0}, "msg": "fail"})
+		return
+	}
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 200}, "msg": "ok"})
+}
+
+func ContractExec(c *gin.Context) {
+	file, err := c.FormFile("file")
+	if err != nil {
+		err = errors.Wrap(err, "AddManagement-error")
+		return
+	}
+
+	f, _ := file.Open()
+	xlsx1, err := excelize.OpenReader(f)
+	rows := xlsx1.GetRows("三位小数清单")
+
+	service.ContractExec(rows)
+
+	c.JSON(200, map[string]interface{}{"code": 200, "data": map[string]interface{}{"code": 200}, "msg": "ok"})
+}

+ 47 - 0
apiserver/routers/server.go

@@ -0,0 +1,47 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"kpt.xdmy/apiserver/service"
+)
+
+var (
+	svc *service.Service
+)
+
+func Init(s *service.Service) {
+	svc = s
+}
+func eJSON(c *gin.Context, rp *http.Response, e error) {
+	if rp == nil {
+		rp = &http.Response{}
+	}
+	if e != nil {
+		rp.Message = e.Error()
+		rp.Success = false
+		if rp.Code == 0 {
+			rp.Code = 400
+		}
+	}
+	if e == nil {
+		rp.Success = true
+		rp.Code = 200
+	}
+	c.JSON(rp.Code, &rp)
+	return
+}
+
+func Bind(c *gin.Context, req model.Request) bool {
+	if err := c.ShouldBind(req); err != nil {
+		rp := &http.Response{
+			Code:    500,
+			Message: err.Error(),
+		}
+		eJSON(c, rp, nil)
+		return false
+	}
+	return true
+}

BIN
apiserver/service/.DS_Store


+ 104 - 0
apiserver/service/apisql_service/apisql_service.go

@@ -0,0 +1,104 @@
+package apisql_service
+
+// type Apisql struct {
+// 	ID         int
+// 	Sqlstr     string
+// 	Sqlname    string
+// 	Returetype string
+// 	Method     string
+// 	CreatedBy  string
+// 	ModifiedBy string
+
+// 	PageNum  int
+// 	PageSize int
+// }
+
+// func (a *Apisql) Add() (id int, err error) {
+// 	data := map[string]interface{}{
+// 		"Sqlstr":     a.Sqlstr,
+// 		"Sqlname":    a.Sqlname,
+// 		"Returetype": a.Returetype,
+// 		"Method":     a.Method,
+// 	}
+// 	Sqlname, _ := model.CheckSqlname(a.Sqlname)
+
+// 	if Sqlname {
+// 		return 0, errors.New("名字重复,请更改!")
+// 	}
+
+// 	if id, err := model.AddApisql(data); err == nil {
+// 		return id, err
+// 	} else {
+// 		return 0, err
+// 	}
+// }
+
+// func (a *Apisql) Edit() error {
+// 	data := map[string]interface{}{
+// 		"Sqlstr":     a.Sqlstr,
+// 		"Sqlname":    a.Sqlname,
+// 		"Returetype": a.Returetype,
+// 		"Method":     a.Method,
+// 	}
+
+// 	Sqlname, _ := model.CheckSqlname(a.Sqlname)
+
+// 	if Sqlname {
+// 		return errors.New("名字重复,请更改!")
+// 	}
+// 	err := model.EditApisql(a.ID, data)
+// 	if err != nil {
+// 		return err
+// 	}
+
+// 	return nil
+// }
+
+// func (a *Apisql) GetByName() (*model.Apisql, error) {
+// 	apisql, err := model.GetApisqlByName(a.Sqlname)
+// 	if err != nil {
+// 		return nil, err
+// 	}
+// 	return apisql, nil
+// }
+
+// func (a *Apisql) GetAll() ([]*model.Apisql, error) {
+// 	if a.Sqlname != "" {
+// 		maps := make(map[string]interface{})
+// 		maps["deleted_on"] = 0
+// 		maps["sqlname"] = a.Sqlname
+// 		apisql, err := model.GetApisqls(a.PageNum, a.PageSize, maps)
+// 		if err != nil {
+// 			return nil, err
+// 		}
+// 		return apisql, nil
+// 	} else {
+// 		apisql, err := model.GetApisqls(a.PageNum, a.PageSize, a.getMaps())
+// 		if err != nil {
+// 			return nil, err
+// 		}
+// 		return apisql, nil
+// 	}
+// }
+
+// func (a *Apisql) Delete() error {
+// 	err := model.DeleteApisqlByName(a.Sqlname)
+// 	if err != nil {
+// 		return err
+// 	}
+// 	return nil
+// }
+
+// func (a *Apisql) ExistByID() (bool, error) {
+// 	return model.ExistApisqlByID(a.ID)
+// }
+
+// func (a *Apisql) Count() (int, error) {
+// 	return model.GetApisqlTotal(a.getMaps())
+// }
+
+// func (a *Apisql) getMaps() map[string]interface{} {
+// 	maps := make(map[string]interface{})
+// 	maps["deleted_on"] = 0
+// 	return maps
+// }

+ 244 - 0
apiserver/service/asset.go

@@ -0,0 +1,244 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"kpt.xdmy/apiserver/config"
+	"strconv"
+	"time"
+
+	"github.com/k0kubun/pp/v3"
+	"github.com/pkg/errors"
+
+	_ "github.com/go-sql-driver/mysql"
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+)
+
+//var assetChan chan error
+
+// sap 设备资产数据拉取
+// 定时拉取,参数 为空;手动拉取可以传入参数
+// 参数:时间,设备编码
+func (s *Service) SapAsset(t time.Time, code string, companyCode string) {
+	//assetChan = make(chan error, 10)
+	r := new(http.AssetReq)
+	rp := new(http.AssetResp)
+	var e error
+
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "FI004"
+	//r.Dest.Url = "http://192.168.61.117/SAPP0/EAM/FI004/QueryAsset"
+	r.Dest.Url = fmt.Sprintf("%s/EAM/FI004/QueryAsset", config.Conf.Http.Routing)
+	if t.IsZero() {
+		t = time.Now()
+	}
+	r.Data.BudatB = t.Format("20060102")
+	r.Data.BudatE = t.Format("20060102")
+	r.Data.EqType = []http.ANLKL{}
+	//r.Data.BudatB = "20221101"
+	//r.Data.BudatE = "20221125"
+	r.Data.CompanyCode = []http.Company{
+		{Code: companyCode},
+	}
+	if code != "" {
+		r.Data.Codes = []http.TANLN1{{Code: code}}
+	}
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e = s.SyncSap(r, rp, rbyte); e == nil {
+		if rp.Dest.Status == "S" {
+			log.Infof("sap  asset  success sum=%d", len(rp.Data.Master))
+		} else {
+			log.Infof("sap asset fail", rp.Dest.MessText)
+			pp.Print(r)
+		}
+	} else {
+		log.Error(e)
+	}
+	var update error
+	var count int
+	for _, v := range rp.Data.Master {
+		if v.BuyValue == "" || v.BuyValue == "0" {
+			continue
+		}
+		update = nil
+		//v.CompanyCode = companyCode
+		updateEQ(&v)
+		//update = <-assetChan
+		//if update != nil {
+		//	log.Error(update)
+		//	count++
+		//	l := model.SapDetailLog{Name: "asset", Code: fmt.Sprintf("%s-%s", v.AssetCode, v.SonCode), ErrorText: update.Error()}
+		//	if e := s.d.DB.Create(&l); e != nil {
+		//		log.Errorf("add sapdetail log: %v", e)
+		//	}
+		//}
+	}
+	if e != nil {
+		log.Error(e)
+	} else if update != nil {
+		e = errors.Errorf("asset update fail sum:%d", count)
+	} else {
+		log.Infof("asset update success sum:%d", len(rp.Data.Master)-count)
+	}
+	s.AddSapLog(r, e)
+	return
+}
+
+// 更新设备资产数据
+func updateEQ(p *http.Asset) {
+	eq := new(Equipment)
+	pa := new(model.Pasture)
+	//pv := new(model.Provider)
+
+	if p.CompanyCode == "1002" || p.CompanyCode == "1042" || p.CompanyCode == "3003" || p.CompanyCode == "1036" {
+		if e := s.d.DB.Where(" company_code = ?", p.CompanyCode).Where(" lrzx = ?", p.ProfitCenter).First(pa).Error; e != nil {
+			//assetChan <- errors.Wrapf(e, "pasture companycode:%s", p.CompanyCode)
+		}
+	} else {
+		if e := s.d.DB.First(pa, model.Pasture{CompanyCode: p.CompanyCode}).Error; e != nil {
+			//assetChan <- errors.Wrapf(e, "pasture companycode:%s", p.CompanyCode)
+		}
+	}
+
+	//if e := s.d.DB.Table("provider").Where("providerNumber = ? ",p.Supplier).First(pv, model.Provider{ProviderNumber: }).Error; e != nil {
+	//	//assetChan <- errors.Wrapf(e, "Provider ProviderNumber:%s", p.Supplier)
+	//}
+	if len(p.Udate) == 8 {
+		p.Udate = p.Udate[:4] + "-" + p.Udate[4:6] + "-" + p.Udate[6:]
+	}
+	if len(p.Utime) == 6 {
+		p.Utime = p.Utime[:2] + ":" + p.Utime[2:4] + ":" + p.Utime[4:]
+	}
+	if p.Utime != "" {
+		p.Udate = p.Udate + " " + p.Utime
+	}
+	if t, e := time.Parse("2006-01-02 15:04:05", p.Udate); e != nil {
+		//assetChan <- errors.Errorf("util ParseDateAndTime  : %s, %s", p.Udate)
+	} else {
+		eq.ModifyTime = t
+	}
+
+	eq.FinanceCode = fmt.Sprintf("%s-%s-%s", p.CompanyCode, p.AssetCode, p.SonCode)
+	oldeq := new(model.Equipment)
+	s.d.DB.Where("financeCode = ? ", eq.FinanceCode).First(&oldeq)
+
+	if oldeq.EqName == "" {
+		eq.EqName = p.Name
+		eq.Specification = p.Model
+		//eq.ProId = p.ID
+		eq.Unit = p.Unit
+		eq.EqClassName = p.Type
+		eq.CostCenter = p.CostCenter
+		eq.ProfitCenter = p.ProfitCenter
+		eq.SapCode = p.AssetCode
+		eq.SonCode = p.SonCode
+		eq.Enable = 1
+		eq.CompanyCode = p.CompanyCode
+		eq.Depreciation = p.DepreciationYear
+		eq.SHStatus = 1
+		eq.Status = 17
+		eq.PurchaseDate = p.BuyDate
+		eq.EntranceDate = p.BuyDate
+	}
+	eq.Yuanzhi = p.BuyValue
+	eq.Quantity = p.Quantity
+	eq.PastureId = pa.ID
+	eq.Salvage = p.Salvage
+	//eq.EntranceDate = p.BuyDate
+
+	dep := new(model.Department)
+	s.d.DB.Where("costCenter_code = ? ", p.CostCenter).First(&dep)
+	if dep.ID > 0 {
+		eq.DepartmentId = strconv.Itoa(dep.ID)
+		eq.DepartmentName = dep.Name
+	}
+
+	if p.TransferFlag == "X" {
+		eq.Statue = 19
+	}
+
+	if p.BuyValue == "" || p.BuyValue == "0" || p.BuyValue == "0.00 " {
+		return
+	}
+	fmt.Println(eq)
+	if oldeq.Id == 0 {
+		if e := s.d.DB.Where(model.Equipment{FinanceCode: eq.FinanceCode}).Assign(eq).FirstOrCreate(&eq).Error; e != nil {
+			//assetChan <- errors.Wrapf(e, "equipment update : %s, %s,%s,%s", p.AssetCode, p.SonCode, p.Name, p.CompanyCode)
+		} else {
+			log.Infof("equipment update sucess :%s, %s,%s,%s", p.AssetCode, p.SonCode, p.Name, p.CompanyCode)
+			//assetChan <- nil
+		}
+	} else {
+		s.d.DB.Where(model.Equipment{FinanceCode: eq.FinanceCode}).Updates(&eq)
+	}
+}
+
+type Equipment struct {
+	PastureId   int    `gorm:"column:pastureId" json:"pastureId"`
+	PastureName string `gorm:"column:pastureName" json:"pastureName"`
+	EqName      string `gorm:"column:eqName" json:"eqName"`
+	//AssetCode        interface{} `gorm:"column:assetCode" json:"assetCode"`
+	EqClassName    string `gorm:"column:eqClassName" json:"eqClassName"`
+	Specification  string `gorm:"column:specification" json:"specification"`
+	DepartmentId   string `gorm:"column:departmentId" json:"departmentId"`
+	DepartmentName string `gorm:"column:departmentName" json:"departmentName"`
+	EntranceDate   string `gorm:"column:entranceDate" json:"entranceDate"`
+	Purpose        string `gorm:"column:purpose" json:"purpose"`
+	Yuanzhi        string `gorm:"column:yuanzhi" json:"yuanzhi"`
+	Id             int    `gorm:"column:id" json:"id"`
+	//EqCode           interface{} `gorm:"column:eqCode" json:"eqCode"`
+	EqClassId        int       `gorm:"column:eqClassId" json:"eqClassId"`
+	FinanceCode      string    `gorm:"column:financeCode" json:"financeCode"`
+	ProName          string    `gorm:"column:proName" json:"proName"`
+	ProId            int       `gorm:"column:proId" json:"proId"`
+	BrandId          string    `gorm:"column:brandId" json:"brandId"`
+	Brand            string    `gorm:"column:brand" json:"brand"`
+	PurchaseDate     string    `gorm:"column:purchaseDate" json:"purchaseDate"`
+	Subtractvalue    string    `gorm:"column:subtractvalue" json:"subtractvalue"`
+	Salvage          string    `gorm:"column:salvage" json:"salvage"`
+	Upkeepgrade      string    `gorm:"column:upkeepgrade" json:"upkeepgrade"`
+	YearMaintainCost string    `gorm:"column:yearMaintainCost" json:"yearMaintainCost"`
+	YearUpkeepCost   string    `gorm:"column:yearUpkeepCost" json:"yearUpkeepCost"`
+	Status           int       `gorm:"column:status" json:"status"`
+	EmployeName      string    `gorm:"column:employeName" json:"employeName"`
+	EmployeeId       string    `gorm:"column:employeeId" json:"employeeId"`
+	InputDatetime    string    `gorm:"column:inputDatetime" json:"inputDatetime"`
+	LeaveDate        time.Time `gorm:"column:leaveDate" json:"leaveDate"`
+	InputUser        string    `gorm:"column:inputUser" json:"inputUser"`
+	EnabledTime      time.Time `gorm:"column:enabledTime" json:"enabledTime"`
+	BlockTime        time.Time `gorm:"column:blockTime" json:"blockTime"`
+	ChangeStatue     string    `gorm:"column:changeStatue" json:"changeStatue"`
+	EnabledPerson    int       `gorm:"column:enabledPerson" json:"enabledPerson"`
+	BlockPerson      int       `gorm:"column:blockPerson" json:"blockPerson"`
+	SttId            int       `gorm:"column:sttId" json:"sttId"`
+	BaseHours        string    `gorm:"column:baseHours" json:"baseHours"`
+	ApplicatId       int       `gorm:"column:applicatId" json:"applicatId"`
+	ApplicatDate     time.Time `gorm:"column:applicatDate" json:"applicatDate"`
+	WorkflowId       int       `gorm:"column:workflowId" json:"workflowId"`
+	FlowCompeleted   int       `gorm:"column:flowCompeleted" json:"flowCompeleted"`
+	Enable           int       `gorm:"column:enable" json:"enable"`
+	ChangeTime       time.Time `gorm:"column:changeTime" json:"changeTime"`
+	SSTstatue        string    `gorm:"column:SSTstatue" json:"SSTstatue"`
+	SHStatus         int       `gorm:"column:SHStatus" json:"SHStatus"`
+	ChargeId         int       `gorm:"column:chargeId" json:"chargeId"`
+	ChargeDate       time.Time `gorm:"column:chargeDate" json:"chargeDate"`
+	WorkflowNote     string    `gorm:"column:workflowNote" json:"workflowNote"`
+	Picpath          string    `gorm:"column:picpath" json:"picpath"`
+	Depreciation     string    `gorm:"column:depreciation" json:"depreciation"`
+	Statue           int       `gorm:"column:statue" json:"statue"`
+	ModifyTime       time.Time `gorm:"column:modifyTime" json:"modifyTime"`
+	CompanyCode      string    `gorm:"column:companyCode" json:"companyCode"`
+
+	CreatedAt    time.Time `gorm:"column:created_at" json:"created_at"`
+	UpdatedAt    time.Time `gorm:"column:updated_at" json:"updated_at"`
+	Quantity     string    `gorm:"column:quantity" json:"quantity"`
+	CostCenter   string    `gorm:"column:costCenter" json:"costCenter"`
+	Unit         string    `gorm:"column:unit" json:"unit"`
+	ProfitCenter string    `gorm:"column:profitCenter" json:"profitCenter"`
+	SonCode      string    `gorm:"column:sonCode" json:"sonCode"`
+
+	SapCode string `gorm:"column:sapCode" json:"sapCode"`
+}

+ 448 - 0
apiserver/service/charge_off.go

@@ -0,0 +1,448 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	_ "github.com/go-sql-driver/mysql"
+	"github.com/k0kubun/pp/v3"
+	log "github.com/sirupsen/logrus"
+	"gorm.io/gorm"
+	"kpt.xdmy/apiserver/config"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"kpt.xdmy/pkg/util"
+)
+
+// 凭证冲销
+func (s *Service) ProofOff(p *model.ProofReq) (hrp *http.Response) {
+	r := new(http.ChargeOffReq)
+	rp := new(http.SapResp)
+	hrp = new(http.Response)
+	hrp.Code = 200
+	hrp.Msg = "fail"
+
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "MM015"
+	//r.Dest.Url = "https://app.modernfarming.cn:7443/sap/Common/MM015/CancelMblnr"
+	//r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM015/CancelMblnr"
+	r.Dest.Url = fmt.Sprintf("%s/Common/MM015/CancelMblnr", config.Conf.Http.Routing)
+
+	r.Data.ProofCode = p.ProofCode
+	r.Data.ProofYear = p.ProofYear
+	r.Data.ChargeDate = p.ChargeDate
+	r.Data.OrderNumber = p.OrderNumber
+	r.Data.HasTicket = util.ZeroStr(p.HasTicket == 1, "X")
+	log.Infof("proofcode: %s", r.Data.ProofCode)
+	sl := r.Data.RowsNumber
+	for i := range p.RowsNumber {
+		sl = append(sl, http.ChargeOffDetail{RowNumber: p.RowsNumber[i]})
+	}
+
+	tx := s.d.DB.Begin()
+	err := UpdateProof(p, tx)
+	if err != nil {
+		hrp.Message += fmt.Sprintf("%s . bigid = %d ,rows=%v", err.Error(), p.OrderNumberId, p.RowsNumber)
+		tx.Rollback()
+	}
+
+	r.Data.RowsNumber = sl
+	rbyte, _ := json.Marshal(r)
+	//rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	e := s.SyncSap(r, rp, rbyte)
+	pp.Print(r)
+	if e == nil {
+		if rp.Data.Status == "S" {
+			hrp.Message = fmt.Sprintf("sap物料冲销成功:%d %s %s", p.NumberType, rp.Data.ProofNumber, rp.Data.EqNumber)
+			log.Info(hrp.Message)
+		} else {
+			hrp.Message = fmt.Sprintf("sap凭证冲销失败:%s", rp.Dest.MessText)
+			log.Infoln(hrp.Message, r, p)
+			tx.Rollback()
+			return
+		}
+	} else {
+		hrp.Message = fmt.Sprintf("sap冲销接口报错:error:%s", e)
+		log.Infoln(hrp.Message, r, p)
+		tx.Rollback()
+		return
+	}
+
+	tx.Commit()
+	hrp.Msg = "ok"
+	return
+}
+
+//凭证冲销后状态更新
+func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
+	var tname string
+	switch p.NumberType {
+	case 1: // 入库
+		tname = "partlaid"
+	case 2: // 退货
+		tname = "partrefund"
+	case 3: // 出库
+		tname = "partuse"
+	case 4: // 退库
+		tname = "partquit"
+	}
+
+	if p.NumberType != 2 && p.NumberType != 1 {
+		//for _, item := range p.ProofPart {
+		if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).Update("dflag", 1).Error; e != nil {
+			log.Errorln(e, p.OrderNumberId, p.RowsNumber)
+			tx.Rollback()
+			return e
+		}
+		//}
+
+		if e := tx.Exec(fmt.Sprintf(` update big%s set sterilisation = 1  where id = ? `, tname), p.OrderNumberId).Error; e != nil {
+			log.Errorln(e, p.OrderNumberId, p.RowsNumber)
+		}
+	} else {
+		if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).
+			Update("dflag", 1).Update("hasTicket", p.HasTicket).Error; e != nil {
+			log.Errorln(e, p.OrderNumberId, p.RowsNumber)
+		}
+		if e := tx.Exec(fmt.Sprintf(` update big%s set sterilisation = 1  where id = ? `, tname), p.OrderNumberId).Error; e != nil {
+			log.Errorln(e, p.OrderNumberId, p.RowsNumber)
+		}
+	}
+
+	if p.NumberType == 1 {
+		partlaidList := make([]*model.PartLaid, 0)
+		err := tx.Raw(`select * from partlaid where bigid = ? `, p.OrderNumberId).Find(&partlaidList).Error
+		if err != nil {
+			log.Error(err)
+			return err
+		}
+		for _, part := range partlaidList {
+			err := tx.Exec(` update part_repertory pr set pr.reportery = pr.reportery - ?
+                       where pr.partCode = ? and pr.contractId = ?  and 
+                             (select pastureid  from warehouse where id = pr.locationId  and status = 1 limit 1 )  =  (select pastureid from bigpartlaid where id = ? )  `,
+				part.StorageAmount, part.PartCode, part.ContractID, p.OrderNumberId).Error
+			if err != nil {
+				log.Error(err)
+				return err
+			}
+		}
+	} else if p.NumberType == 3 {
+		partUseList := make([]*model.PartUse, 0)
+		err := tx.Raw(`select * from partuse where bigid = ? `, p.OrderNumberId).Find(&partUseList).Error
+		if err != nil {
+			log.Error(err)
+			return err
+		}
+
+		for _, part := range partUseList {
+			err := tx.Exec(` update part_repertory pr set pr.reportery = pr.reportery + ?
+                       where pr.partCode = ? and pr.contractId = ? 
+                         and (select pastureid  from warehouse where id = pr.locationId  and status = 1  limit 1 ) =  (select pastureid from bigpartuse where id = ? ) `,
+				part.CheckoutNumber, part.PartCode, part.ContractID, p.OrderNumberId).Error
+			if err != nil {
+				log.Error(err)
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+// 查询 单据 对应备件明细
+func ProofList(p *model.ProofReq) (hrp *http.Response) {
+	switch p.NumberType {
+	case 1: // 入库
+		return s.laidProofList(p)
+	case 2: // 退货
+		return s.returnProofList(p)
+	case 3: // 出库
+		return s.useProofList(p)
+	case 4: // 退库
+		return s.quitProofList(p)
+	}
+	return
+}
+
+// 入库冲销
+func (s *Service) laidProofList(p *model.ProofReq) (hrp *http.Response) {
+	bp := new(model.BigPartLaid)
+	proofs := make([]model.ProofPart, 0)
+	var e error
+	hrp = new(http.Response)
+	hrp.Code = 200
+	hrp.Msg = "fail"
+	if e = s.d.DB.First(bp, model.BigPartLaid{LaidCode: p.OrderNumber}).Error; e != nil {
+		hrp.Message = fmt.Sprintf("%s ,error=%v,", p.OrderNumber, e)
+		return
+	}
+	p.OrderNumberId = bp.ID
+	p.ProofCode = bp.ProofCode
+	p.ChargeDate = bp.CreatDate.Format("2006-01-02")
+	p.ProofYear = bp.CreatDate.Format("2006")
+
+	parts := make([]model.PartLaid, 0)
+	if e = s.d.DB.Raw(` select * from partlaid where  bigid = ? order by rowNumber,id desc `, bp.ID).Order("rowNumber,id desc ").
+		Find(&parts).Error; e != nil || len(parts) == 0 {
+		hrp.Message = fmt.Sprintf("入库单明细查询报错或结果为空:bigid=%v error=%v,", bp.ID, e)
+		hrp.Msg = "fail"
+		return
+	}
+	for i, v := range parts {
+		mp := new(model.ProofPart)
+		br := new(model.Brand)
+		w := new(model.Warehouse)
+		pv := new(model.Provider)
+		if e := s.d.DB.First(&pv, model.Provider{ID: v.ProviderID}).Error; e != nil {
+			log.Errorln(v.ProviderID, e)
+			//continue
+		}
+		if e := s.d.DB.First(&br, model.Brand{ID: v.BrandID}).Error; e != nil {
+			log.Errorln(e, v.BrandID)
+			//continue
+		}
+		if e := s.d.DB.First(&w, model.Warehouse{ID: v.LocationID}).Error; e != nil {
+			log.Errorln(v.LocationID, e)
+			//continue
+		}
+		if v.RowNumber > 0 {
+			mp.RowNumber = v.RowNumber
+		} else {
+			mp.RowNumber = len(parts) - i
+		}
+
+		mp.PartCode = v.PartCode
+		mp.PartName = v.PartName
+		mp.Specification = v.Specification
+		mp.ChangeCount = v.StorageAmount
+		mp.UnitPrice = v.Price
+		mp.TotalPrice = v.SumPrice
+		mp.PartBrand = br.BrandName
+		mp.Supplier = pv.SapCode
+		mp.Warehouse = w.SapCode
+		if v.Dflag == 0 {
+			proofs = append(proofs, *mp)
+		}
+	}
+	p.ProofPart = proofs
+	hrp.Msg = "ok"
+	hrp.Data = p
+	hrp.Message = fmt.Sprintf("success  :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
+	return
+}
+
+// 退货冲销
+func (s *Service) returnProofList(p *model.ProofReq) (hrp *http.Response) {
+	hrp = new(http.Response)
+	bp := new(model.BigPartRefund)
+	proofs := make([]model.ProofPart, 0)
+	hrp.Code = 200
+	var e error
+
+	if e = s.d.DB.First(bp, model.BigPartRefund{UseForm: p.OrderNumber}).Error; e != nil {
+		hrp.Message = fmt.Sprintf("bigpartrefund : %d,%s", p.NumberType, p.OrderNumber)
+		hrp.Msg = "fail"
+		return
+	}
+	p.OrderNumberId = bp.ID
+	p.ProofCode = bp.ProofCode
+	p.ChargeDate = bp.CreateTime.Format("2006-01-02")
+	p.ProofYear = bp.CreateTime.Format("2006")
+
+	funds := []model.PartRefund{}
+	if e = s.d.DB.Order("rowNumber,id desc ").Find(&funds, model.PartRefund{BigID: bp.ID}).Error; e != nil || len(funds) == 0 {
+		hrp.Message = fmt.Sprintf("PartRefund  query error  . bigid=%v error=%v,", bp.ID, e)
+		hrp.Msg = "fail"
+		return
+	}
+	for i, v := range funds {
+		mp := new(model.ProofPart)
+		pv := new(model.Provider)
+		if e := s.d.DB.First(&pv, model.Provider{ID: bp.ProviderID}).Error; e != nil {
+			log.Errorln(bp.ProviderID, e)
+			continue
+		}
+		if v.RowNumber > 0 {
+			mp.RowNumber = v.RowNumber
+		} else {
+			mp.RowNumber = len(funds) - i
+		}
+		mp.Supplier = pv.SapCode
+		mp.PartBrand = v.Brand
+		mp.Warehouse = "1004"
+		mp.PartCode = v.PartCode
+		mp.PartName = v.PartName
+		mp.Specification = v.Specification
+		mp.ChangeCount = v.RefundNumber
+		mp.UnitPrice = v.Price
+		mp.TotalPrice = v.SumPrice
+		proofs = append(proofs, *mp)
+	}
+	p.ProofPart = proofs
+
+	hrp.Msg = "ok"
+	hrp.Data = p
+	hrp.Message = fmt.Sprintf("success  :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
+	return
+}
+
+// 出库冲销
+func (s *Service) useProofList(p *model.ProofReq) (hrp *http.Response) {
+	hrp = new(http.Response)
+	bp := new(model.BigPartUse)
+	proofs := make([]model.ProofPart, 0)
+
+	hrp.Code = 200
+	hrp.Msg = "fail"
+	var e error
+
+	if e = s.d.DB.First(bp, model.BigPartUse{UseForm: p.OrderNumber}).Error; e != nil {
+		log.Error(e)
+		hrp.Message = fmt.Sprintf("bigpartuse useform=%s", p.OrderNumber)
+		return
+	}
+
+	p.OrderNumberId = bp.ID
+	p.ProofCode = bp.ProofCode
+	p.ChargeDate = bp.ReceiveTime.Format("2006-01-02")
+	p.ProofYear = bp.ReceiveTime.Format("2006")
+	uses := make([]model.PartUse, 0)
+	if e = s.d.DB.Order("rowNumber,id desc ").Find(&uses, model.PartUse{BigID: bp.ID}).Error; e != nil || len(uses) == 0 {
+		log.Error(e)
+		hrp.Message = fmt.Sprintf("PartUse bigid = %v ", bp.ID)
+		return
+	}
+	for i, v := range uses {
+		mp := new(model.ProofPart)
+		br := new(model.Brand)
+		w := new(model.Warehouse)
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		pv := new(model.Provider)
+		pa := new(model.PartRepertory)
+		if v.ContractID > 0 {
+			if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+				log.Error(e)
+				hrp.Message = fmt.Sprintf("contract id =%d", v.ContractID)
+				//return
+			}
+			if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+				log.Error(e)
+				hrp.Message = fmt.Sprintf("bigcontract id =%d", v.BigID)
+				//return
+			}
+			if e := s.d.DB.First(&pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
+				log.Errorln(bc.ProviderID, e)
+				//continue
+			}
+		} else {
+			if e := s.d.DB.First(pa, model.PartRepertory{ContractID: v.ContractID, PartCode: v.PartCode, LocationID: v.LocationID}).Error; e != nil {
+				log.Error(e)
+				hrp.Message = fmt.Sprintf("bigcontract id =%d", v.BigID)
+				//return
+			}
+			if e := s.d.DB.First(&pv, model.Provider{ID: pa.ProviderID}).Error; e != nil {
+				log.Errorln(pa.ProviderID, e)
+				//continue
+			}
+		}
+
+		if e := s.d.DB.First(&br, model.Brand{ID: v.BrandID}).Error; e != nil {
+			log.Error(e)
+			hrp.Message = fmt.Sprintf("brand id =%d", v.BrandID)
+			return
+		}
+		if e := s.d.DB.First(&w, model.Warehouse{ID: v.LocationID}).Error; e != nil {
+			log.Errorln(v.LocationID, e)
+			return
+		}
+
+		mp.PartBrand = br.BrandName
+		mp.Warehouse = w.SapCode
+		mp.Supplier = pv.SapCode
+		if v.RowNumber > 0 {
+			mp.RowNumber = v.RowNumber
+		} else {
+			mp.RowNumber = len(uses) - i
+		}
+		mp.PartCode = v.PartCode
+		mp.PartName = v.PartName
+		mp.Specification = v.Specification
+		mp.ChangeCount = v.CheckoutNumber
+		mp.UnitPrice = v.Price
+		mp.TotalPrice = v.SumPrice
+		proofs = append(proofs, *mp)
+	}
+	p.ProofPart = proofs
+	hrp.Msg = "ok"
+	hrp.Data = p
+	hrp.Message = fmt.Sprintf("success  :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
+	return
+}
+
+// 退库冲销
+func (s *Service) quitProofList(p *model.ProofReq) (hrp *http.Response) {
+	hrp = new(http.Response)
+	bp := new(model.BigPartquit)
+	proofs := make([]model.ProofPart, 0)
+	hrp.Code = 200
+	var e error
+
+	if e = s.d.DB.First(bp, model.BigPartquit{UseForm: p.OrderNumber}).Error; e != nil {
+		log.Error(e)
+		hrp.Message = fmt.Sprintf("bigpartquit %d,%s", p.NumberType, p.OrderNumber)
+		hrp.Msg = "fail"
+		return
+	}
+	p.OrderNumberId = bp.ID
+	p.ProofCode = bp.ProofCode
+	p.ChargeDate = bp.QuitDate.Format("2006-01-02")
+	p.ProofYear = bp.QuitDate.Format("2006")
+	parts := make([]model.Partquit, 0)
+	if e = s.d.DB.Order("rowNumber,id desc ").Find(&parts, model.Partquit{BigID: bp.ID}).Error; e != nil || len(parts) == 0 {
+		hrp.Message = fmt.Sprintf("partquit  bigid = %d ", bp.ID)
+		hrp.Msg = "fail"
+		return
+	}
+	for i, v := range parts {
+		mp := new(model.ProofPart)
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		pv := new(model.Provider)
+		if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+			log.Error(e)
+			hrp.Message = fmt.Sprintf("contract id =%d", v.ContractID)
+			return
+		}
+		if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+			log.Error(e)
+			hrp.Message = fmt.Sprintf("bigcontract id =%d", v.BigID)
+			return
+		}
+		if e := s.d.DB.First(&pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
+			log.Errorln(bc.ProviderID, e)
+			continue
+		}
+
+		mp.Supplier = pv.SapCode
+		mp.PartBrand = v.Brand
+		mp.Warehouse = "1004"
+		if v.RowNumber > 0 {
+			mp.RowNumber = v.RowNumber
+		} else {
+			mp.RowNumber = len(parts) - i
+		}
+		mp.PartCode = v.PartCode
+		mp.PartName = v.PartName
+		mp.Specification = v.Specification
+		mp.ChangeCount = v.QuitNumber
+		mp.UnitPrice = v.Price
+		mp.TotalPrice = v.SumPrice
+		proofs = append(proofs, *mp)
+	}
+	p.ProofPart = proofs
+
+	hrp.Msg = "ok"
+	hrp.Data = p
+	hrp.Message = fmt.Sprintf("success  :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
+	return
+}

+ 42 - 0
apiserver/service/eas.go

@@ -0,0 +1,42 @@
+package service
+
+import (
+	"fmt"
+	"strconv"
+
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/pkg/util"
+)
+
+func Eas() {
+	sid, err := util.EASWebServiceLogin("http://192.168.61.23:6888")
+	if err != nil {
+		panic(err)
+	}
+	fmt.Println(sid)
+}
+func (s *Service) EasBatch() {
+
+	// log.Infof("%v", setting.ServerSetting)
+
+	nch = make(chan error, 10)
+	p := make([]model.Parts, 0, 0)
+	if e := s.d.DB.Where("msg <>''").Find(&p, &model.Parts{Statue: 1, Issync: 0}).Error; e != nil {
+		panic(e)
+	}
+	for _, v := range p {
+		if v.Unit == "" {
+			continue
+		}
+		go GoEas(strconv.Itoa(v.ID))
+		if e := <-nch; e != nil {
+			log.Errorf("EasBatch() :%v", e)
+		}
+	}
+
+}
+func GoEas(id string) {
+	e := util.EASBillSync(5, id, "1")
+	nch <- e
+}

+ 2 - 0
apiserver/service/equipment.go

@@ -0,0 +1,2 @@
+package service
+

+ 87 - 0
apiserver/service/job.go

@@ -0,0 +1,87 @@
+package service
+
+import (
+	"fmt"
+	"github.com/robfig/cron"
+	"kpt.xdmy/apiserver/model"
+	"time"
+)
+
+var s *Service
+
+func SapJobInit() {
+
+	duetimecst, _ := time.ParseInLocation("15:04:05", "00:01:00", time.Local)
+	duetimecst1, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
+	spec := fmt.Sprintf("@every %v", duetimecst.Sub(duetimecst1))
+	c := cron.New()
+	c.AddFunc(spec, func() {
+		AutoSapOrderJob()
+		AutoSrmOrderJob()
+		AutoSapReturnOrderJob()
+		AutoSrmReturnOrderJob()
+	})
+	c.Start()
+
+	//var t time.Time
+	//t = time.Now()
+	//var code string
+	//pastureList := make([]*model.Pasture, 0)
+	//err := s.d.DB.Table("pasture").Where("id = 1381 ").Find(&pastureList)
+	//fmt.Println(err)
+	//i := -60
+	//for {
+	//	fmt.Println(i, t.AddDate(0, 0, i))
+	//	for _, pasture := range pastureList {
+	//		//s.SapSupplier(t, pasture.CompanyCode, pasture.ID)
+	//		s.SapAsset(t.AddDate(0, 0, i), code, pasture.CompanyCode)
+	//	}
+	//
+	//	if t.AddDate(0, 0, i).Format("2006-01-02") == "2023-04-13" {
+	//		break
+	//	}
+	//	i++
+	//}
+
+	c1 := cron.New()
+	c1.AddFunc("0 50 23 * * ?", func() {
+		fmt.Println(time.Now())
+		var t time.Time
+		t = time.Now()
+		var code string
+		pastureList := make([]*model.Pasture, 0)
+		err := s.d.DB.Table("pasture").Find(&pastureList)
+		fmt.Println(err)
+		for _, pasture := range pastureList {
+			s.SapSupplier(t, pasture.CompanyCode, pasture.ID)
+			s.SapAsset(t, code, pasture.CompanyCode)
+		}
+		s.SapMaterial(t, code)
+		s.d.DB.Exec(`call createEqstatus()`)
+	})
+
+	//保养计划
+	duetimecst, _ = time.ParseInLocation("15:04:05", "01:00:00", time.Local)
+	duetimecst1, _ = time.ParseInLocation("15:04:05", "00:00:00", time.Local)
+	spec1 := fmt.Sprintf("@every %v", duetimecst.Sub(duetimecst1))
+	c1.AddFunc(spec1, func() {
+		s.d.DB.Exec(`call createRUcode()`)
+	})
+
+	duetimecst, _ = time.ParseInLocation("15:04:05", "00:05:00", time.Local)
+	duetimecst1, _ = time.ParseInLocation("15:04:05", "00:00:00", time.Local)
+	spec2 := fmt.Sprintf("@every %v", duetimecst.Sub(duetimecst1))
+	c1.AddFunc(spec2, func() {
+		s.d.DB.Exec(`call wxmsg()`)
+	})
+	c1.Start()
+}
+
+func jobMaterial() {
+	t := time.Now()
+	var code string
+	s.SapMaterial(t, code)
+}
+func jobTransfer() {
+	autoTransfer()
+}

+ 243 - 0
apiserver/service/loadData.go

@@ -0,0 +1,243 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"strconv"
+	"time"
+
+	"gorm.io/gorm"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/pkg/util"
+
+	log "github.com/sirupsen/logrus"
+	"github.com/xuri/excelize/v2"
+)
+
+func PartBatch() (count int, e error) {
+	nch = make(chan error, 10)
+	r, e := s.d.DB.Raw(`select id FROM parts WHERE issync = 0 and statue = 1 `).Rows()
+	defer r.Close()
+	if e != nil {
+		fmt.Print(e)
+		return 0, e
+	}
+	var id string
+	for r.Next() {
+		r.Scan(&id)
+		easBillSync(id)
+		if e = <-nch; e != nil {
+			fmt.Print(e)
+		} else {
+			count++
+		}
+	}
+	return count, nil
+}
+func easBillSync(id string) {
+	e := util.EASBillSync(5, id, "1")
+	nch <- e
+}
+
+var parchan chan *gorm.DB
+
+func (s *Service) PartUpdate() {
+	parchan = make(chan *gorm.DB, 10)
+	// f, e := excelize.OpenFile("/Users/desire/Documents/partcode.xlsx")
+	f, e := excelize.OpenFile("partcode.xlsx")
+	if e != nil {
+		log.Error("excle open  :%d", e)
+	}
+	defer func() {
+		// Close the spreadsheet.
+		if err := f.Close(); err != nil {
+			fmt.Println(err)
+		}
+	}()
+	sheet := []string{"Sheet1", "Sheet2"}
+	// var s []string
+	for _, name := range sheet {
+
+		rows, err := f.GetRows(name)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+		fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
+		value := ""
+		for i, row := range rows {
+			if i == 0 {
+				value += fmt.Sprintf("('%s', '%s','%s',%s)", row[0], row[1], row[2], row[3])
+			} else {
+				value += fmt.Sprintf(",('%s', '%s','%s',%s)", row[0], row[1], row[2], row[3])
+			}
+		}
+		iusql := fmt.Sprintf(`insert  into  parts (partcode ,new_partcode,unit,issave) values %s
+	on DUPLICATE KEY UPDATE  new_partcode=values(new_partcode) ,unit=values(unit),issave=values(issave) `, value)
+
+		if r := s.d.DB.Exec(iusql); r.Error != nil {
+			fmt.Printf("insert part_Data: %v\n", r.Error)
+			return
+		} else {
+			fmt.Printf("insert part_Data success!:%d\n", r.RowsAffected)
+		}
+		fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
+	}
+
+}
+
+func (s *Service) PartInsert() {
+	// f, e := excelize.OpenFile("/Users/desire/Downloads/part_insert.xlsx")
+	f, e := excelize.OpenFile("part_insert.xlsx")
+	if e != nil {
+		log.Error("excle open  :%d", e)
+	}
+	defer func() {
+		if err := f.Close(); err != nil {
+			fmt.Println(err)
+		}
+	}()
+	slist := f.GetSheetList()
+	log.Infof("%v", slist)
+	// sheet := "Sheet1"
+	rows, err := f.GetRows(slist[0])
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	value := ""
+	for i, row := range rows {
+		// if i > 3550 {
+		// 	continue
+		// }
+		if i == 0 {
+			value += fmt.Sprintf("('%s', '%s','%s','%s')", row[0], row[1], row[2], row[3])
+		} else {
+			value += fmt.Sprintf(",('%s', '%s','%s','%s')", row[0], row[1], row[2], row[3])
+		}
+	}
+	iusql := fmt.Sprintf(`insert  into  parts (partcode ,name,specification,unit) values %s
+	on DUPLICATE KEY UPDATE  partcode=values(partcode) ,name=values(name),specification=values(specification),
+	unit=values(unit)`, value)
+
+	if r := s.d.DB.Exec(iusql); r.Error != nil {
+		fmt.Printf("insert parts: %v\n", r.Error)
+		return
+	} else {
+		fmt.Printf("insert parts success!:%d\n", r.RowsAffected)
+	}
+
+}
+func (s *Service) RepertoryUpdate() {
+	f, e := excelize.OpenFile("repertory.xlsx")
+	// f, e := excelize.OpenFile("/Users/desire/Documents/repertory.xlsx")
+	if e != nil {
+		log.Errorf("excle open  :%d", e)
+	}
+	defer func() {
+		if err := f.Close(); err != nil {
+			fmt.Println(err)
+		}
+	}()
+	rows, e := f.GetRows("SheetJS")
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	sql := "call insertRepertory(?,?,?,?,?,?,?,?,?,?,?)"
+	var sum, count, suc int
+	for _, row := range rows[1:2] {
+		sum++
+		var e error
+		// var msg, msg2 string
+		// scan := new(sqlScan)
+		var res interface{}
+		var storage, price float64
+		if storage, e = strconv.ParseFloat(row[6], 64); e != nil {
+			log.Errorf("failed to parse storage:%s , e:%v", row[6], e)
+			continue
+		}
+		if price, e = strconv.ParseFloat(row[7], 64); e != nil {
+			log.Errorf("failed to parse price:%s , e:%v", row[7], e)
+			continue
+		}
+
+		if r := s.d.DB.Raw(sql, row[0], row[1], row[2], row[3], row[4], storage, price, row[7], row[8], row[9], "00611"); r.Error != nil {
+			log.Errorf("exec :%v", r.Error)
+		} else {
+			count++
+			// r.Row().Scan(&msg, &msg2)
+			r.Row().Scan(&res)
+			// r.Row().Scan(scan)
+			log.Infof("res:%s", res)
+			// if msg == "success" {
+			// 	suc++
+			// } else {
+			// 	log.Infoln(msg)
+			// }
+		}
+	}
+	log.Infoln(suc, count, sum)
+}
+
+type sqlScan struct {
+	msg        string
+	id         string
+	contractid string
+}
+
+func (s *Service) EqInsert() {
+
+	// f, e := excelize.OpenFile("/Users/desire/Downloads/eq.xlsx")
+	f, e := excelize.OpenFile("eq.xlsx")
+	if e != nil {
+		log.Error("excle open  :%d", e)
+	}
+	defer func() {
+		if err := f.Close(); err != nil {
+			fmt.Println(err)
+		}
+	}()
+	slist := f.GetSheetList()
+	rows, err := f.GetRows(slist[0])
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	names := []string{"pastureName", "eqClassName", "eqName", "eqCode", "specification",
+		"brand", "proName", "purpose", "status", "purchaseDate",
+		"entranceDate", "depreciation", "financeCode", "yuanzhi", "salvage",
+		"departmentName", "employeName", "inputUser"}
+	esl := []model.Equipment{}
+	for i, row := range rows {
+		if i < 2 {
+			continue
+		}
+		m := make(map[string]interface{})
+		eq := new(model.Equipment)
+		for j, v := range row {
+			m[names[j]] = v
+		}
+		// if status, e := strconv.ParseInt(m["status"].(string), 10, 32); e != nil {
+		// 	log.Error(e)
+		// } else {
+		// 	m["status"] = status
+		// }
+		if m["status"] == "正常" {
+			m["status"] = 17
+		}
+		if b, e := json.Marshal(m); e != nil {
+			log.Error(e)
+		} else {
+			if e := json.Unmarshal(b, eq); e != nil {
+				log.Error(e)
+			} else {
+				esl = append(esl, *eq)
+			}
+		}
+	}
+	log.Infof("len==%v", len(esl))
+	// s.d.DB.CreateInBatches(esl, 100)
+	r := s.d.DB.Create(&esl)
+	log.Infof("rows==%v", r.RowsAffected)
+}

+ 625 - 0
apiserver/service/material.go

@@ -0,0 +1,625 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"kpt.xdmy/apiserver/config"
+	"regexp"
+	"strconv"
+	"time"
+
+	"github.com/pkg/errors"
+	log "github.com/sirupsen/logrus"
+
+	_ "github.com/go-sql-driver/mysql"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	// "kpt.xdmy/pkg/log"
+)
+
+var partChan chan error
+
+// 定时从sap拉取物料(备件等)数据
+// 预留参数时间、备件编码,给手动调用接口
+func (s *Service) SapMaterial(t time.Time, code string) {
+	partChan = make(chan error, 10)
+	r := new(http.MaterialReq)
+	rp := new(http.MaterialResp)
+	var e error
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "MM002"
+	//r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM002/QueryMaterial/"
+	r.Dest.Url = fmt.Sprintf("%s/Common/MM002/QueryMaterial/", config.Conf.Http.Routing)
+
+	if t.IsZero() {
+		t = time.Now()
+	}
+	r.Data.BudatB = t.Format("20060102")
+	r.Data.BudatE = t.Format("20060102")
+	//r.Data.BudatB = "20221104"
+	//r.Data.BudatE = "20221028"
+
+	r.Data.Type = http.MTART{MTART: "XD08"}
+	// r.Data.Group = []http.MATKL{{MATKL: "14010101"}}
+	// r.Data.Group = []http.MATKL{{MATKL: "14"}}
+	if code != "" {
+		// r.Data.Codes = []http.MATNR{{Code: "14.01.06.02.000216"}}
+	}
+
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e = s.SyncSap(r, rp, rbyte); e == nil {
+		if rp.Dest.Status == "S" {
+			log.Infof("sap material success:len=%d", len(rp.Data.Master))
+		} else {
+			e = errors.Errorf("sap material fail", rp.Dest.MessText)
+		}
+	} else {
+		e = errors.Wrapf(e, "sap material error")
+	}
+	var update error
+	var count int
+	for _, v := range rp.Data.Master {
+		update = nil
+		s.UpdatePart(&v)
+		update = <-partChan
+		if update != nil {
+			log.Error(update)
+			count++
+			l := model.SapDetailLog{Name: "part", Code: v.Code, ErrorText: update.Error()}
+			if e := s.d.DB.Create(&l); e != nil {
+				log.Errorf("add sapdetail log: %v", e)
+			}
+		}
+	}
+	if e != nil {
+		log.Error(e)
+	} else if update != nil {
+		e = errors.Errorf("material update fail sum:%d", count)
+	} else {
+		log.Infof("material update success sum:%d", len(rp.Data.Master)-count)
+	}
+	s.AddSapLog(r, e)
+	return
+}
+
+// 物料数据更新
+func (s *Service) UpdatePart(p *http.MaterialDetail) {
+	part := new(model.Parts)
+
+	if len(p.ModifyTime) >= 8 {
+		p.ModifyTime = p.ModifyTime[:4] + "-" + p.ModifyTime[4:6] + "-" + p.ModifyTime[6:8]
+	} else {
+		partChan <- errors.New("ModifyTime is  invalid:" + p.ModifyTime)
+	}
+	if t, e := time.ParseInLocation("2006-01-02", p.ModifyTime, time.Local); e != nil {
+		partChan <- errors.Wrapf(e, "time:%s", p.ModifyTime)
+	} else {
+		part.ModifyTime = t
+	}
+	if p.Dflag == "" {
+		part.Enable = 1
+		part.Statue = 1
+	}
+	part.PartCode = p.Code
+	part.Note = p.Description
+	part.Category = p.Type
+	part.Unit = p.Unit
+	part.Name = p.Name
+	part.Specification = p.Model
+	if e := s.d.DB.Where(model.Parts{PartCode: p.Code}).Assign(*part).FirstOrCreate(part).Error; e != nil {
+		partChan <- errors.Wrapf(e, "code:%s", p.Code)
+	} else {
+		log.Infof("sap part update success:%s", p.Code)
+		partChan <- nil
+	}
+}
+
+func Exec(rows [][]string) {
+
+	for i, v := range rows {
+		fmt.Println(i)
+		if i == 0 {
+			continue
+		}
+		fmt.Println(v[1], v[2], v[10])
+		s.d.DB.Exec(` update emp set tel = ?  where empCode = ? `, v[10], v[1])
+	}
+
+	//precontractId := model.PartRepertory{}
+	//err := s.d.DB.Raw(`select precontractId  from  part_repertory where precontractId is not null order by precontractId  `).First(&precontractId).Error
+	//if err != nil {
+	//	log.Error(err)
+	//	//continue
+	//}
+	//contractId := model.PartRepertory{}
+	//err = s.d.DB.Raw(`select (contractId) contractId  from  part_repertory order by contractId  `).First(&contractId).Error
+	//if err != nil {
+	//	log.Error(err)
+	//	//continue
+	//}
+	//for i, v := range rows {
+	//	fmt.Println(i)
+	//	if i == 0 {
+	//		continue
+	//	}
+	//	/*
+	//	   		pasture := model.Pasture{}
+	//	   		err := s.d.DB.Where(&model.Pasture{Name: v[1]}).First(&pasture).Error
+	//	   		if err != nil {
+	//	   			fmt.Println(err)
+	//	   			return
+	//	   		}
+	//	   		now := time.Now().Format("2006-01-02")
+	//	   		contractId, partCode := v[13], v[4]
+	//	   		partLaid := model.PartLaid{}
+	//	   		err = s.d.DB.Raw(` select p.id from bigpartlaid bp  join partlaid p on p.bigid = bp.id
+	//	                where bp.pastureid = ? and p.contractId = ? and p.partCode = ?  and DATE_FORMAT(bp.creatDate,'%Y-%m-%d') = ?`, pasture.ID, contractId, partCode, now).First(&partLaid).Error
+	//	   		if err != nil {
+	//	   			fmt.Println(err)
+	//	   			//return
+	//	   		}
+	//	   		partuse := model.PartUse{}
+	//	   		err = s.d.DB.Raw(` select p.id from bigpartuse bp  join partuse p on p.bigid = bp.id
+	//	                where bp.pastureid = ? and p.contractId = ? and p.partCode = ?  and DATE_FORMAT(bp.creatDate,'%Y-%m-%d') = ?`, pasture.ID, contractId, partCode, now).First(&partuse).Error
+	//	   		if err != nil {
+	//	   			fmt.Println(err)
+	//	   			//return
+	//	   		}
+	//	   		if partuse.ID > 0 || partLaid.ID > 0 {
+	//	   			continue
+	//	   		}
+	//
+	//	   		err = s.d.DB.Exec(` update part_repertory ps  set reportery = ? where id = ? `, v[15], v[0]).Error
+	//	   		if err != nil {
+	//	   			fmt.Println(err)
+	//	   			return
+	//	   		}
+	//	*/
+	//
+	//	//if v[14] == "新增" {
+	//	//
+	//	//	//1983
+	//
+	//	//
+	//	//if v[1] == "M017" || v[1] == "N302" || i <= 47 {
+	//	//	continue
+	//	//}
+	//	id := v[0]
+	//	///*
+	//	if id == "" && v[11] == "无合同" && v[14] == "M017" {
+	//
+	//		parts := model.Parts{}
+	//		err := s.d.DB.Where(&model.Parts{PartCode: v[3]}).First(&parts).Error
+	//		if err != nil {
+	//			log.Error(err)
+	//			continue
+	//		}
+	//
+	//		pasture := model.Pasture{}
+	//		err = s.d.DB.Where(&model.Pasture{FactoryCode: "M005"}).First(&pasture).Error
+	//		if err != nil {
+	//			fmt.Println(err)
+	//			continue
+	//		}
+	//
+	//		w := model.Warehouse{}
+	//		err = s.d.DB.Where(&model.Warehouse{PastureID: pasture.ID, Status: 1}).First(&w).Error
+	//		if err != nil {
+	//			fmt.Println(err)
+	//			continue
+	//		}
+	//
+	//		reportery := v[16]
+	//		price := 1
+	//		//reportery := v[2]
+	//		providerid := "1975"
+	//		providerName := "北京京东"
+	//		contractId := fmt.Sprintf("-%d%s%d", pasture.ID, providerid, parts.ID)
+	//		//
+	//		////	PrecontractID, err := strconv.ParseInt(precontractId.PrecontractID, 10, 64)
+	//		err = s.d.DB.Exec(` insert into part_repertory(specification,pastureId,partId,partName,partCode,location,locationId,reportery,
+	//		                       contractId,brandId,unit,price,precontractId,providerNames,providerId)
+	//		values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,
+	//			parts.Specification, pasture.ID, parts.ID, parts.Name, parts.PartCode, w.WarehoseCode, w.ID, reportery, contractId, 0, parts.Unit,
+	//			price, contractId, providerName, providerid).Error
+	//	}
+	//	//*/
+	//	//if err != nil {
+	//	//	fmt.Println(err)
+	//	//	return
+	//	//}
+	//
+	//	//}
+	//	//else {
+	//	//reportery := v[16]
+	//	//id := v[0]
+	//	//if id != "" {
+	//	//	err := s.d.DB.Exec(` update part_repertory ps  set reportery = ?  where id =  ?`, reportery, id).Error
+	//	//	if err != nil {
+	//	//		fmt.Println(err)
+	//	//		return
+	//	//	}
+	//	//}
+	//	//} else {
+	//	//	err := s.d.DB.Exec(` delete from  part_repertory   where id =  ?`, id).Error
+	//	//	if err != nil {
+	//	//		fmt.Println(err)
+	//	//		return
+	//	//	}
+	//	//}
+	//	//}
+	//}
+
+}
+
+func DepartmentExec(rows [][]string) {
+	for i, v := range rows {
+		//fmt.Println(i, v)
+		if i == 0 {
+			continue
+		}
+		id := v[0]
+		name := v[1]
+		parentid := v[4]
+		costCenter_code := v[15]
+		costCenter_code2 := v[17]
+		fmt.Println(id, name, parentid, costCenter_code, costCenter_code2)
+		if id != "新增" {
+			fmt.Println(id, name, parentid, costCenter_code, costCenter_code2)
+			if costCenter_code2 != "" {
+				err := s.d.DB.Exec(` update department ps  set costCenter_code = ?  where id = ? `, costCenter_code2, id).Error
+				if err != nil {
+					fmt.Println(err)
+					return
+				}
+			}
+
+			if v[18] == "无此部门" || v[18] == "未上线牧场" || v[18] == "重复" {
+				err := s.d.DB.Exec(` delete from department where id = ?   `, id).Error
+				if err != nil {
+					fmt.Println(err)
+					return
+				}
+			}
+		} else {
+			fmt.Println(id, name, parentid, costCenter_code, costCenter_code2)
+			if costCenter_code2 != "" {
+				err := s.d.DB.Exec(` insert into department(name,pastureId,isPasture,costCenter_code) values(?,?,?,?) `, name, parentid, 0, costCenter_code2).Error
+				if err != nil {
+					fmt.Println(err)
+					return
+				}
+			}
+		}
+	}
+
+}
+
+func ProviderExec(rows [][]string) {
+	//for i, v := range rows {
+	//	if i == 0 {
+	//		continue
+	//	}
+	//	id := v[0]
+	//	//sapcode := v[4]
+	//	//providername := v[5]
+	//	status := v[6]
+	//
+	//	if status == "删除" || v[4] == "" {
+	//		err := s.d.DB.Exec(` delete from provider where id = ? `, id).Error
+	//		if err != nil {
+	//			fmt.Println(err)
+	//			return
+	//		}
+	//	}
+	//}
+
+	//for i, v := range rows {
+	//	if i == 0 {
+	//		continue
+	//	}
+	//	id := v[0]
+	//	sapcode := v[4]
+	//	providername := v[5]
+	//	status := v[6]
+	//
+	//	if status != "删除" {
+	//		err := s.d.DB.Exec(` update  provider set providerIntro = ? , sapcode = ?  where id = ? `, providername, sapcode, id).Error
+	//		if err != nil {
+	//			fmt.Println(err)
+	//			return
+	//		}
+	//	}
+	//}
+	//for _, v := range rows {
+	//if i == 0 {
+	//	continue
+	//}
+	//id := v[0]
+	//sapcode := v[4]
+	//providername := v[1]
+	//providerIntro := v[5]
+	//status := v[6]
+	//
+	//if status != "删除" {
+	//	err := s.d.DB.Exec(` update  provider set providerIntro = ? , sapcode = ?  where id = ? `, providername, sapcode, id).Error
+	//	if err != nil {
+	//		fmt.Println(err)
+	//		return
+	//	}
+	//}
+	//	err := s.d.DB.Exec(` insert into  provider(providerName,providerIntro,providerNumber,sapcode) values(?,?,?,?)`,
+	//		providername, providerIntro, sapcode, sapcode).Error
+	//	if err != nil {
+	//		fmt.Println(err)
+	//		return
+	//	}
+	//}
+
+}
+
+func EquipmentExec(rows [][]string) error {
+	errList := make([]map[string]interface{}, 0)
+	for i, v := range rows {
+		financeCode := v[13]
+		if financeCode == "" || i == 0 {
+			continue
+		}
+		data := make(map[string]interface{})
+		fmt.Println(i)
+		eqCode := v[4]
+		eqName := v[3]
+		specification := v[5]
+		//用途
+		purpose := v[8]
+		//purchaseDate, _ := ExcelIntDate(v[10])
+		//purchaseDate := v[10]
+		//entranceDate, _ := ExcelIntDate(v[11])
+		//entranceDate := v[11]
+		depreciation := v[12]
+		yuanzhi := v[14]
+		salvage := v[15]
+		subtractvalue := v[16]
+		upkeepgrade := v[17]
+		if upkeepgrade == "A" {
+			upkeepgrade = "113"
+		} else if upkeepgrade == "B" {
+			upkeepgrade = "114"
+		} else if upkeepgrade == "C" {
+			upkeepgrade = "115"
+		}
+
+		yearUpkeepCost := v[18]
+		yearMaintainCost := v[19]
+		baseHours := v[20]
+		employeName := v[22]
+		inputUser := v[23]
+		var leaveDate interface{}
+		if v[24] != "" {
+			leaveDate = v[24]
+			//leaveDate, _ = ExcelIntDate(v[24])
+		}
+		brand := v[6]
+		proName := v[7]
+
+		maintenance := v[27]
+		var onepushTime, twopushTime, threepushTime interface{}
+		if v[29] == "" {
+			onepushTime = nil
+		} else {
+			onepushTime = v[29]
+		}
+		if v[31] == "" {
+			twopushTime = nil
+		} else {
+			twopushTime = v[31]
+		}
+		if v[33] == "" {
+			threepushTime = nil
+		} else {
+			threepushTime = v[33]
+		}
+
+		levelone := v[28]
+		leveltwo := v[30]
+		levelthree := v[32]
+
+		brandInfo := model.Brand{}
+		if brand != "" {
+			err := s.d.DB.Where(&model.Brand{BrandName: brand}).First(&brandInfo).Error
+			if err != nil {
+				fmt.Println(err)
+				//return err
+			}
+		}
+
+		provider := model.Provider{}
+		if proName != "" {
+			err := s.d.DB.Where(&model.Provider{ProviderName: proName}).First(&provider).Error
+			if err != nil {
+				fmt.Println(err)
+				//return err
+			}
+		}
+
+		pasture := model.Pasture{}
+		err := s.d.DB.Where(&model.Pasture{Name: v[0]}).First(&pasture).Error
+		if err != nil {
+			data["pasture"] = v[0]
+			data["eqName"] = eqName
+			data["eqCode"] = eqCode
+			data["financeCode"] = financeCode
+			data["err"] = err.Error()
+			errList = append(errList, data)
+			fmt.Println(err)
+			return err
+		}
+
+		err = s.d.DB.Exec(` update equipment set  eqCode = if(? = '',null,?),specification = ?,purpose = ?	
+        ,depreciation=?,
+         yuanzhi=?, salvage =?,subtractvalue =?, upkeepgrade= ?,yearUpkeepCost=? ,yearMaintainCost=?,baseHours=?,employeName=(select empname from emp  where replace(empname,' ','') = ? and pastureId = ? and enable = 1 ),
+         employeeId = (select id from emp  where replace(empname,' ','') = ? and pastureId = ? and enable = 1 ),inputUser=?,leaveDate=? ,
+         brand = ?, brandId = ? ,proId= ?,proName= ? ,eqClassName = ?,eqClassId = (select id from eqclass where typeName = ?),eqName = ?,
+         	maintenance= (select GROUP_CONCAT(id) from emp where  FIND_IN_SET(replace(empname,' ',''),replace(?,' ',''))     and pastureId = ? and enable = 1  ),levelone=(select id from emp where  replace(empname,' ','') =  replace(?,' ','')    and pastureId = ? and enable = 1 ) ,
+		leveltwo = (select id from emp where  replace(empname,' ','') =  replace(?,' ','')   and pastureId = ? and enable = 1 ),levelthree=(select id from emp where replace(empname,' ','')  =  replace(?,' ','')    and pastureId = ? and enable = 1 )
+		,leveloneTime = ? ,leveltwoTime = ?,levelthreeTime= ?  where financeCode = ? `,
+			eqCode, eqCode, specification, purpose, depreciation, yuanzhi,
+			salvage, subtractvalue, upkeepgrade, yearUpkeepCost, yearMaintainCost, baseHours, employeName, pasture.ID, employeName, pasture.ID, inputUser, leaveDate,
+			brandInfo.BrandName, brandInfo.ID, provider.ID, provider.ProviderName, eqName, v[1], v[3], maintenance, pasture.ID, levelone, pasture.ID,
+			leveltwo, pasture.ID, levelthree, pasture.ID, onepushTime, twopushTime, threepushTime, financeCode).Error
+		if err != nil {
+			data["pasture"] = v[0]
+			data["eqName"] = eqName
+			data["eqCode"] = eqCode
+			data["financeCode"] = financeCode
+			data["err"] = err.Error()
+			errList = append(errList, data)
+			fmt.Println(err)
+			//return err
+			continue
+		}
+
+		eqclass := model.EqClass{}
+		err = s.d.DB.Table("eqclass").Where("typeName = ?", v[1]).First(&eqclass).Error
+		if err != nil {
+			data["pasture"] = v[0]
+			data["eqName"] = eqName
+			data["eqCode"] = eqCode
+			data["financeCode"] = financeCode
+			data["err"] = err.Error()
+			errList = append(errList, data)
+			fmt.Println(err)
+			//return err
+			continue
+		}
+		if eqclass.ID == 0 {
+			continue
+		}
+
+		if v[2] == "" {
+			err = s.d.DB.Exec(` update equipment set  assetCode = (select cerateEQNumber((select typeCode from eqclass where typeName = ?),?)) where financeCode = ?  `,
+				v[1], pasture.ID, financeCode).Error
+			if err != nil {
+				data["pasture"] = v[0]
+				data["eqName"] = eqName
+				data["eqCode"] = eqCode
+				data["financeCode"] = financeCode
+				data["err"] = err.Error()
+				errList = append(errList, data)
+				fmt.Println(err)
+				//return err
+			}
+		}
+	}
+	return nil
+}
+
+func ExcelIntDate(dateStr string) (dt time.Time, err error) {
+	var dateValue float64
+	matched, err := regexp.MatchString(`^\d+$`, dateStr)
+	if err != nil {
+		return
+	}
+
+	if !matched {
+		err = errors.New("not excel time")
+		return
+	}
+
+	dateValue, err = strconv.ParseFloat(dateStr, 64)
+	if err != nil {
+		return
+	}
+	epoch := time.Date(1899, 12, 30, 0, 0, 0, 0, time.UTC) // UTC 1899/12/30 00:00:00
+	dt = epoch.Add(time.Duration(dateValue) * 24 * time.Hour)
+	return
+}
+
+func EquipmentExecAdd(rows [][]string) error {
+
+	for i, v := range rows {
+		financeCode := fmt.Sprintf("%s-%s-%s", v[0], v[1], v[2])
+		fmt.Println(financeCode, v[11], i)
+		//financeCode := v[13]
+		if i == 0 || (v[0] != "1042" && v[0] != "1002") {
+			continue
+		}
+
+		err := s.d.DB.Exec(` update equipment set pastureid = (SELECT pastureid FROM department WHERE costCenter_code = ?  )   where financeCode = ? `, v[11], financeCode).Error
+		fmt.Println(err)
+		//var purchaseDate, entranceDate string
+		//if v[9] != "" {
+		//	date, _ := ExcelIntDate(v[9])
+		//	purchaseDate = date.Format("2006-01-02")
+		//}
+		//if v[10] != "" {
+		//	date, _ := ExcelIntDate(v[10])
+		//	entranceDate = date.Format("2006-01-02")
+		//}
+
+		//a1, _ := strconv.Atoi()
+		//a1, _ := strconv.ParseFloat(v[12][:3], 64)
+		//n := strings.Index(v[12][3:], "6")
+		//if n > 0 {
+		//	a1 += 0.5
+		//}
+
+	}
+	return nil
+}
+
+func ContractExec(rows [][]string) {
+
+	for i, v := range rows {
+
+		if i < 6 {
+			continue
+		}
+		partCode := v[1]
+		providerSapCode := v[3]
+		pastureCode := v[6]
+		price := v[8]
+		//fmt.Println(partCode, providerSapCode, pastureCode, price)
+
+		pasture := model.Pasture{}
+		err := s.d.DB.Where(model.Pasture{FactoryCode: pastureCode}).First(&pasture).Error
+		if err != nil {
+			fmt.Println(err)
+			//return
+			continue
+		}
+		//fmt.Println(pasture, err)
+
+		provider := model.Provider{}
+		err = s.d.DB.Where(model.Provider{SapCode: providerSapCode}).First(&provider).Error
+		if err != nil {
+			fmt.Println(err)
+			continue
+		}
+
+		contract := model.Contract{}
+		s.d.DB.Raw(`SELECT
+	c.id
+FROM
+	contract c
+	JOIN bigcontract bc ON bc.id = c.bigid 
+WHERE
+	c.partCode = ?
+	AND ? IN (
+	SELECT
+		pb.pasture_id 
+	FROM
+		bigcontract bct
+		JOIN pasture_bigcontract pb ON pb.bigcontract_id = bct.id 
+	WHERE
+		bct.contractCode LIKE concat( "%",  LEFT ( bc.contractCode, 12 ), "%" ) 
+	) 
+	AND bc.providerId = ? `, partCode, pasture.ID, provider.ID).First(&contract)
+		fmt.Println(pasture.Name, provider.ProviderName, price, pastureCode, i)
+
+		if contract.ID > 0 {
+			s.d.DB.Exec(" update contract set price = ? where id = ? ", price, contract.ID)
+		}
+	}
+}

+ 192 - 0
apiserver/service/mcs.go

@@ -0,0 +1,192 @@
+package service
+
+import (
+	"time"
+
+	"github.com/gin-gonic/gin"
+	"github.com/pkg/errors"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"kpt.xdmy/pkg/log"
+	"kpt.xdmy/pkg/util"
+)
+
+var McsChan = make(chan string, 0)
+
+// 开启或者结束设备录像
+func (s *Service) McsPostHttp(mpd *model.McsPostDataReq) (res *http.Response, err error) {
+	url := "http://8.130.17.8:7711/api/postData"
+	req, e := s.http.NewRequest("POST", url, mpd)
+	if e != nil {
+		return nil, e
+	}
+
+	var r struct {
+		Code    int    `json:"error"`
+		Message string `json:"message"`
+	}
+	e = s.http.Do(req, &r)
+	if e != nil {
+		return nil, e
+	}
+	//add respone
+	res = &http.Response{
+		Message: r.Message,
+		Code:    r.Code,
+		Success: false,
+	}
+	if res.Code == 200 {
+		if mpd.Method == "startRecord" {
+			mv := &model.McsVideo{
+				EmpId:        mpd.Data.PeopleNo,
+				UpkeepId:     mpd.Data.WorkNo,
+				DeviceId:     mpd.Data.DevID,
+				NewCreatedAt: time.Now(),
+				EndRecord:    2,
+			}
+			go s.UpdateOrAddVideo(mv)
+		}
+		if mpd.Method == "stopRecord" {
+			mv := &model.McsVideo{
+				EmpId:    mpd.Data.PeopleNo,
+				UpkeepId: mpd.Data.WorkNo,
+				DeviceId: mpd.Data.DevID,
+			}
+			mv2 := &model.McsVideo{
+				UpkeepId:  mpd.Data.WorkNo,
+				EndRecord: 1,
+			}
+			go s.UpdateOrAddVideo(mv2)
+			go s.McsGetFiles(mv)
+		}
+	}
+
+	return
+}
+
+// 查询保养单对应录像文件路径
+func (s *Service) McsGetFiles(mv *model.McsVideo) (err error) {
+	url := "https://www.51cow.cn:7715/api/GetRecordFileList"
+	st := time.Now().Local().AddDate(0, 0, -1).Format("2006-01-02")
+	et := time.Now().Local().AddDate(0, 0, 1).Format("2006-01-02")
+	sid := "7eea4610d4f1dcc572b7351f5a5fdef131571842484b03f05fa8e5a90486f227680272d2e47d7a98738b32473e0dffb348bd1b0273079c67d5ee3d90050d78c9"
+	mfr := &model.McsFilesRequest{
+		SessionId: sid,
+		Did:       mv.DeviceId,
+		Wno:       mv.UpkeepId,
+		St:        st,
+		Et:        et,
+		Ft:        "3",
+		Lt:        "-1",
+		Pagesize:  "10",
+	}
+	//query the video record file from s.d.DB
+	cont := &model.McsVideo{
+		UpkeepId: mv.UpkeepId,
+	}
+	mvs, e := s.QueryVideo(cont)
+	if e != nil {
+		return e
+	}
+	if len(mvs) == 0 {
+		return errors.New("no video start record")
+	}
+	ntime := mvs[0].NewCreatedAt
+	t := time.NewTicker(time.Second * 2)
+	defer t.Stop()
+	flag := false
+	for !flag {
+		select {
+		case <-t.C:
+			resp, e := s.http.NewRequest("GET", url+"?"+mfr.Encode(), nil)
+			if e != nil {
+				return e
+			}
+			mf := new(model.McsFilesResponse)
+			e = s.http.Do(resp, mf)
+			if e != nil {
+				return e
+			}
+			//get the last record file
+			f := LastMCsFile(mf)
+			if f == nil {
+				continue
+			}
+			// compare  the time
+			st, e := util.ParseDate(f.StartTime)
+			if e != nil {
+				log.Path("service McsGetFiles")
+				continue
+			}
+			if st.Sub(ntime) < 10*time.Second && st.Sub(ntime) >= 0 {
+				mv.CreatedAt = ntime
+				mv.Location = "https://www.51cow.cn:7715/files" + f.Path
+				e := s.UpdateOrAddVideo(mv)
+				if e != nil {
+					return e
+				}
+				flag = true
+				t.Stop()
+				<-McsChan
+			} else {
+				continue
+			}
+		}
+	}
+	return nil
+}
+
+// 获取最新的录像记录
+func LastMCsFile(mfr *model.McsFilesResponse) (pmf *model.McsFile) {
+	if len(mfr.Data) == 0 {
+		return
+	}
+	mf := mfr.Data[0]
+	for _, v := range mfr.Data {
+		if v.StartTime > mf.StartTime {
+			mf = v
+		}
+	}
+	return &mf
+}
+
+// 更新录像文件
+func (s *Service) UpdateOrAddVideo(m *model.McsVideo) (err error) {
+	//new  condition
+	cton := map[string]interface{}{
+		"upkeepId": m.UpkeepId,
+	}
+	rt := s.d.DB.Table("video").Where(cton).Updates(m)
+	if rt.Error != nil {
+		err = log.Error("UpdateOrAddVideo update ", rt.Error, m)
+		return
+	}
+	if rt.RowsAffected > 0 {
+		return
+	}
+	//add vedio
+	if err = s.d.DB.Table("video").Create(&m).Error; err != nil {
+		err = log.Error("UpdateOrAddVideo create ", err, m)
+	}
+	return
+}
+
+// 查询录像文件
+func (s *Service) QueryVideo(m *model.McsVideo) (res []model.McsVideo, err error) {
+	if err = s.d.DB.Table("video").Where(m).Find(&res).Error; err != nil {
+		err = log.Error("QueryVideo query ", err, m)
+	}
+	return
+}
+
+// 设备账号列表
+func (s *Service) mcsAccounts(c *gin.Context) {
+	ma := []model.McsAccount{
+		{
+			DeviceId: "apptest2",
+			UserID:   "PC",
+			Password: "mcs8",
+		},
+	}
+	c.JSON(200, ma)
+}

+ 912 - 0
apiserver/service/order.go

@@ -0,0 +1,912 @@
+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"
+
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"kpt.xdmy/pkg/util"
+)
+
+// 推送采购订单到sap(业务触发),已关闭
+func (s *Service) PurchaseOrder(p interface{}) {
+	r := new(model.BigBuyDetailReq)
+	if e := util.Unmarshal(p, r); e != nil {
+		log.Errorf("purchaseorder param :%v ", e)
+		log.Info(p)
+		return
+	}
+	if r.ID == "" && r.Code == "" {
+		log.Error("buy order request param is empty")
+		return
+	}
+	bdetails := []model.BigBuyDetail{}
+	bpp := new(model.Bigpartpurchase)
+
+	if r.ID != "" {
+		pid, err := strconv.ParseInt(r.ID, 10, 32)
+		if err != nil {
+			log.Errorf("parseInt  purchase id  :%v", err)
+		}
+		id := int(pid)
+		if e := s.d.DB.First(bpp, model.Bigpartpurchase{ID: id}).Error; e != nil {
+			log.Error("Bigpartpurchase query error", e)
+			return
+		}
+		if e := s.d.DB.Where(" ZeroCou >0 ").Find(&bdetails, model.BigBuyDetail{MatchCode: bpp.OrderNumber}).Error; e != nil || len(bdetails) == 0 {
+			log.Errorf("Bigbuydetail query :matchcode =%s,e=%v", r.Code, e)
+			return
+		}
+	} else if r.Code != "" {
+		if e := s.d.DB.Where(" ZeroCou >0 ").Find(&bdetails, model.BigBuyDetail{MatchCode: r.Code}).Error; e != nil || len(bdetails) == 0 {
+			log.Errorf("Bigbuydetail query :matchcode =%s,e=%v", r.Code, e)
+			return
+		}
+	}
+	for _, v := range bdetails {
+		SapOrder(&v, "")
+		SrmOrder(&v, "0")
+	}
+}
+
+// 定时(每分钟 一次)读取未同步的采购订单,同步到sap
+// 同步失败的采购订单,变更状态,改为手动同步
+// 状态(sapStatus):0,未同步;1,成功;2,失败
+func AutoSapOrderJob() {
+	orders := []model.BigBuyDetail{}
+	if e := s.d.DB.Raw(`select  b.* from bigbuydetail b join pasture p on b.pastureId = p.id  left join bigpartdeal bpd on bpd.matchCode = b.matchCode
+            where   buyerDate >'2022-11-02'  and  p.vendor = 1 and b.sapStatus =0 	and  (bpd.statue = 1 or b.matchCode like '%SG%' )`).Find(&orders, model.BigBuyDetail{}).Error; e != nil {
+		log.Errorf("AutoSapOrderJob  error: %v", e)
+		return
+	}
+	var buyeCodes []string
+	for _, v := range orders {
+		buyeCodes = append(buyeCodes, v.BuyeCode)
+	}
+	if len(buyeCodes) > 0 {
+		err := s.d.DB.Exec(` update bigbuydetail set sapStatus = 2 where buyeCode in (?)`, buyeCodes).Error
+		fmt.Println(err)
+	}
+
+	for _, v := range orders {
+		e, sapNumber := SapOrder(&v, "")
+		up := model.BigBuyDetail{SapNumber: sapNumber}
+		if e != nil {
+			up.SapStatus = 2
+			up.SapError = e.Error()
+		} else {
+			up.SapStatus = 1
+		}
+		if e := s.d.DB.Model(&v).Where("buyeCode =?", v.BuyeCode).Updates(up); e != nil {
+			log.Errorf("BigBuyDetail update error: %v", e)
+		}
+	}
+}
+
+// 手动同步采购订单到sap
+func ManaulSapOrderJob(buyeCode string) (err error) {
+
+	order := new(model.BigBuyDetail)
+	if e := s.d.DB.First(order, model.BigBuyDetail{BuyeCode: buyeCode}).Error; e != nil {
+		err = errors.Wrapf(e, "ManaulSapOrderJob BigBuyDetail query ")
+		return
+	}
+	e, sapNumber := SapOrder(order, "")
+	up := model.BigBuyDetail{SapNumber: sapNumber}
+	if e != nil {
+		up.SapStatus = 2
+		up.SapError = e.Error()
+		err = errors.Wrapf(e, "ManaulSapOrder sap ")
+	} else {
+		up.SapStatus = 1
+	}
+	if e := s.d.DB.Model(order).Where("buyeCode=?", buyeCode).Updates(up).Error; e != nil {
+		log.Errorf("BigBuyDetail update error: %v", e)
+	}
+	return
+}
+
+// 发送采购订单到sap
+func SapOrder(p *model.BigBuyDetail, dflag string) (error, string) {
+	r := new(http.SapOrderReq)
+	rp := new(http.OrderResp)
+	parts := []model.BuyDetail{}
+	pa := new(model.Pasture)
+	pv := new(model.Provider)
+	//pc := new(model.Bigpartpurchase)
+	//dp := new(model.Department)
+
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "MM007"
+	//r.Dest.Url = "http://192.168.61.117/SAPQ0/Common/MM007/PurchaseOrder"
+	//r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM007/PurchaseOrder"
+	r.Dest.Url = fmt.Sprintf("%s/Common/MM007/PurchaseOrder", config.Conf.Http.Routing)
+
+	if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
+		return errors.Wrapf(e, "provider query:id=%d", p.ProviderID), ""
+	}
+	if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
+		return errors.Wrapf(e, "pasture query:id=%d", p.PastureID), ""
+	}
+	if e := s.d.DB.Where("amount>0").Find(&parts, model.BuyDetail{BigID: p.ID}).Order("rowNumber").Error; e != nil || len(parts) == 0 {
+		return errors.Wrapf(e, "buydetail query:bigid=%d", p.ID), ""
+	}
+	//if len(parts) > 0 {
+	//	if e := s.d.DB.Where("name  = ? ", parts[0].DepartmentName).Where("pastureid  = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
+	//	}
+	//}
+
+	r.Data.IsCancle = ""
+	r.Data.PayCondition = ""
+	r.Data.SupplierCode = pv.SapCode
+	r.Data.OrderDate = p.BuyerDate.Format("20060102")
+	r.Data.CurrencyCode = "CNY"
+	r.Data.ProofType = "ZNB4"
+	r.Data.EqSysCode = p.BuyeCode
+	//if dp.CompanyCode == "" {
+	r.Data.CompanyCode = pa.CompanyCode
+	r.Data.Organization = pa.ParchaseOrganization
+	r.Data.Group = pa.PurchasingGroup
+	//} else {
+	//	r.Data.CompanyCode = dp.CompanyCode
+	//	r.Data.Organization = dp.ParchaseOrganization
+	//	r.Data.Group = dp.PurchasingGroup
+	//}
+
+	for i, v := range parts {
+		detail := http.SapOrderDetail{}
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		par := new(model.Parts)
+		if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+			//return errors.Wrapf(e, "contract  query :id=%d", v.ContractID), ""
+		}
+		if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+			//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+		}
+		if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
+			//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+		}
+		if v.RowNumber > 0 {
+			detail.RowNumber = strconv.Itoa(v.RowNumber)
+		} else {
+			detail.RowNumber = fmt.Sprintf("%d", (i+1)*10)
+		}
+
+		//if dp.CompanyCode == "" {
+		detail.Factory = pa.FactoryCode
+		//} else {
+		//	detail.Factory = dp.Factory
+		//}
+
+		detail.Quantity = fmt.Sprintf("%d", v.Amount)
+		detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
+		detail.TaxCode = "J0"
+		detail.Per = "1"
+
+		detail.Location = "1004"
+		detail.IsOwn = util.ZeroStr(bc.IsZeroStock == 1, "K")
+		detail.NetPrice = c.Price
+		if c.PartCode != "" {
+			detail.Unit = c.Unit
+			detail.MaterialCode = c.PartCode
+		} else {
+			if detail.NetPrice == 0 {
+				detail.NetPrice = v.Price
+			}
+			detail.Unit = par.Unit
+			detail.MaterialCode = v.PartCode
+		}
+		detail.Dflag = dflag
+		astr := strconv.FormatFloat(detail.NetPrice, 'f', -1, 64)
+		b := strings.Index(astr, ".")
+		if len(astr[b+1:]) > 2 && b > 0 {
+			num, _ := strconv.ParseFloat(astr[b+1:], 64)
+			if num > 0 {
+				detail.NetPrice = detail.NetPrice * 1000
+				detail.NetPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NetPrice), 64)
+				detail.Per = "1000"
+			}
+		}
+		r.Data.Detail = append(r.Data.Detail, detail)
+		if e := s.d.DB.Model(&model.BuyDetail{}).Where("id=?", v.ID).Update("rowNumber", detail.RowNumber).Error; e != nil {
+			log.Errorln(e, v.ID)
+		}
+	}
+
+	rbyte, _ := json.Marshal(r)
+	e := s.SyncSap(r, &rp, rbyte)
+	saplog := new(model.SapLog)
+	if e == nil && rp.Dest.Status == "S" {
+		s.d.DB.Create(saplog)
+		log.Infof("buy order success :eq=%s,sap=%s", rp.Data.EqNumber, rp.Data.SapNumber)
+		return nil, rp.Data.SapNumber
+	} else {
+		if param, e := json.Marshal(r); e != nil {
+			log.Errorf("sap order param marshal:%v", e)
+		} else {
+			saplog.Param = string(param)
+			saplog.Name = "sap-order"
+			s.d.DB.Create(saplog)
+		}
+		if e == nil {
+			return errors.Errorf("sap order :%s", rp.Data.MsgText), ""
+		} else {
+			return errors.Wrapf(e, "sap  order error:%v", e), ""
+		}
+	}
+	//*/
+	return nil, ""
+}
+
+func AutoSrmOrderJob() {
+	orders := []model.BigBuyDetail{}
+	if e := s.d.DB.Where("srmStatus=0 and buyerDate >= '2022-10-25' and sapStatus=1 and ifnull(sapNumber,0) > 0  ").Find(&orders, model.BigBuyDetail{SrmStatus: 0}).Error; e != nil {
+		log.Errorf("AutoSrmOrderJob  error: %v", e)
+		return
+	}
+
+	var buyeCodes []string
+	for _, v := range orders {
+		buyeCodes = append(buyeCodes, v.BuyeCode)
+	}
+	if len(buyeCodes) > 0 {
+		s.d.DB.Exec(` update bigbuydetail set srmStatus = 2 where buyeCode in (?)`, buyeCodes)
+	}
+
+	for _, v := range orders {
+		SrmOrder(&v, "0")
+	}
+}
+func ManaulSrmOrderJob(buyeCode string) {
+	orders := []model.BigBuyDetail{}
+	if e := s.d.DB.Where("buyeCode=?", buyeCode).Where("sapStatus=1").Find(&orders, model.BigBuyDetail{SrmStatus: 0}).Error; e != nil {
+		log.Errorf("ManaulSrmOrderJob error: %v", e)
+		return
+	}
+	for _, v := range orders {
+		SrmOrder(&v, "0")
+	}
+}
+func SrmOrder(p *model.BigBuyDetail, IsReturn string) {
+	r := new(http.SrmOrderReq)
+	rp := new(http.SrmResp)
+	parts := []model.BuyDetail{}
+	pa := new(model.Pasture)
+	pv := new(model.Provider)
+	//pc := new(model.Bigpartpurchase)
+	//dp := new(model.Department)
+
+	r.Dest.Url = "http://srm.vip.xiandaimuye.com/gateway/serviceApi/invoke/QZbycode/saveByEquipment"
+	if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
+		log.Error(e)
+		return
+	}
+
+	if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
+		log.Errorf("pasture query :id=%d,%v", p.PastureID, e)
+		return
+	}
+
+	if e := s.d.DB.Where("amount>0").Find(&parts, model.BuyDetail{BigID: p.ID}).Error; e != nil || len(parts) == 0 {
+		log.Errorf("buydetail query :bigid=%d,%v", p.ID, e)
+		return
+	}
+
+	//if e := s.d.DB.Where("matchCode  = ? ", p.MatchCode).Find(&pc, model.Bigpartpurchase{}).Error; e != nil {
+	//	return
+	//}
+
+	//if e := s.d.DB.Where("id  = ? ", pc.DepartmentID).Find(&dp, model.Department{}).Error; e != nil {
+	//	return
+	//}
+
+	//if len(parts) > 0 {
+	//	if e := s.d.DB.Where("name  = ? ", parts[0].DepartmentName).Where("pastureid  = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
+	//	}
+	//}
+
+	//r.Data.CompanyCode = pa.CompanyCode
+	r.Data.VendorErpCode = pv.SapCode
+	r.Data.PurchaseOrderDate = p.BuyerDate.Format("20060102")
+	r.Data.CurrencyCode = "CNY"
+	r.Data.PurchaseOrderType = "ZNB4"
+	r.Data.VendorName = pv.ProviderName
+	r.Data.DeliveryTypeCode = "1"
+	r.Data.IsReturn = "0"
+	r.Data.Remark = ""
+	r.Data.ErpPurchaseOrderNo = p.SapNumber
+	r.Data.SapCode = pv.SapCode
+	r.Data.PurchaseOrderNo = p.BuyeCode
+
+	//if dp.CompanyCode == "" {
+	r.Data.CompanyCode = pa.CompanyCode
+	r.Data.PurchasingOrgCode = pa.ParchaseOrganization
+	r.Data.PurchasingGroupCode = pa.PurchasingGroup
+	//} else {
+	//	r.Data.CompanyCode = dp.CompanyCode
+	//	r.Data.PurchasingOrgCode = dp.ParchaseOrganization
+	//	r.Data.PurchasingGroupCode = dp.PurchasingGroup
+	//}
+
+	for _, v := range parts {
+		detail := http.SrmOrderDetail{}
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		pr := new(model.PartRepertory)
+		par := new(model.Parts)
+		//part := new(model.Parts)
+
+		if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+			log.Errorf("order detail error:%v", e)
+			//return
+		}
+		if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+			log.Errorf("order detail error:%v", e)
+			//return
+		}
+		if len(c.PartCode) > 0 {
+			if e := s.d.DB.First(par, model.Parts{PartCode: c.PartCode}).Error; e != nil {
+				//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+			}
+		} else if len(v.PartCode) > 0 {
+			if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
+				//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+			}
+		}
+		if c.Brand != "" {
+			detail.Manufacturer = c.Brand
+		} else {
+			brand := new(model.Brand)
+			if e := s.d.DB.First(brand, model.Brand{ID: v.BrandID}).Error; e != nil {
+				//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+			}
+			detail.Manufacturer = brand.BrandName
+		}
+
+		price := c.Price
+		if price == 0 {
+			price = v.Price
+		}
+		if c.PartCode != "" {
+			detail.OrderUnitCode = c.Unit
+			detail.MaterialCode = c.PartCode
+			detail.MaterialName = c.PartName
+			detail.PricingUnitCode = c.Unit
+		} else {
+			detail.OrderUnitCode = par.Unit
+			detail.MaterialCode = par.PartCode
+			detail.MaterialName = par.Name
+			detail.PricingUnitCode = par.Unit
+		}
+		s.d.DB.First(pr, model.PartRepertory{ContractID: v.ContractID})
+		r.Data.TotalNonTaxAmount += price
+		r.Data.TotalTaxAmount += price
+		detail.RowNo = strconv.Itoa(v.RowNumber)
+		//detail.Manufacturer = pa.FactoryCode
+		//detail.Manufacturer =
+		//if dp.CompanyCode == "" {
+		detail.Manufacturer = pa.FactoryCode
+		detail.PlantCode = pa.FactoryCode
+		//} else {
+		//	detail.Manufacturer = dp.Factory
+		//	detail.PlantCode = dp.Factory
+		//}
+		detail.OrderQty = fmt.Sprintf("%d", v.Amount)
+		detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
+		detail.TaxRateCode = "J0"
+		detail.NonTaxPrice = price
+		detail.MaterialDesc = par.Specification
+		if len(c.PartCode) > 0 {
+			detail.MaterialGroupCode = strings.ReplaceAll(c.PartCode[:strings.LastIndex(c.PartCode, ".")], ".", "")
+		} else if len(v.PartCode) > 0 {
+			fmt.Println(v.PartCode)
+			detail.MaterialGroupCode = strings.ReplaceAll(v.PartCode[:strings.LastIndex(v.PartCode, ".")], ".", "")
+		}
+
+		detail.Tax = "0"
+		detail.ConfirmDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
+		//detail.PlantCode = pa.FactoryCode
+		//if dp.CompanyCode == "" {
+		//detail.PlantCode = pa.FactoryCode
+		//} else {
+		//	detail.PlantCode = dp.Factory
+		//}
+		detail.StockLocationCode = "1004"
+		detail.QualityCheck = "0"
+		detail.IsReturn = "0"
+		detail.OverDeliveryLimit = "0"
+		detail.ShortDeliveryLimit = "0"
+		detail.SourceNo = p.BuyeCode[4:]
+		detail.ContractCode = bc.ContractCode
+		detail.Remark = c.Remark
+		//r.Data.Detail = append(r.Data.Detail, detail)
+
+		if bc.IsZeroStock == 1 {
+			detail.PurchaseCategory = "2"
+		} else {
+			detail.PurchaseCategory = "0"
+		}
+		detail.IsFree = "0"
+		detail.PriceBase = "1"
+		astr := strconv.FormatFloat(detail.NonTaxPrice, 'f', -1, 64)
+		b := strings.Index(astr, ".")
+		if len(astr[b+1:]) > 2 && b > 0 {
+			num, _ := strconv.ParseFloat(astr[b+1:], 64)
+			if num > 0 {
+				detail.NonTaxPrice = detail.NonTaxPrice * 1000
+				detail.NonTaxPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NonTaxPrice), 64)
+				detail.PriceBase = "1000"
+			}
+		}
+		detail.TaxAmount = detail.NonTaxPrice
+		detail.TaxPrice = detail.NonTaxPrice
+		detail.NonTaxAmount = detail.NonTaxPrice
+		r.Data.Detail = append(r.Data.Detail, detail)
+		//if e := s.d.DB.Model(&model.BuyDetail{}).Where("id=?", v.ID).Update("rowNumber", i+1).Error; e != nil {
+		//	log.Errorln(e, v.ID)
+		//}
+	}
+
+	rbyte, _ := json.Marshal([]interface{}{r.Data})
+	fmt.Println(string(rbyte))
+	saplog := new(model.SapLog)
+	if e := s.SyncSrm(r, rp, rbyte); e != nil {
+		s.d.DB.Create(saplog)
+		log.Errorf("sap buy order error: %v", e)
+		p.SapStatus = 3
+	} else {
+		s.d.DB.Create(saplog)
+		if rp.Success {
+			// log.Infof("buy order success :eq=%s,sap=%s", rp.Data.EqNumber, rp.Data.SapNumber)
+			p.SapStatus = 1
+			p.SapNumber = rp.Code
+		} else {
+			log.Warnf("buy order fail :msg=%s,r=%v", rp.Code, r)
+			p.SapStatus = 2
+			// pp.Print(r)
+		}
+	}
+	if p.SapStatus == 1 {
+		if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigBuyDetail{SrmStatus: p.SapStatus, SrmNumber: p.SapNumber}).Error; e != nil {
+			log.Errorf("update big buy detail error: %v", e)
+		}
+	} else {
+		if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigBuyDetail{SrmStatus: p.SapStatus, SrmError: rp.Message}).Error; e != nil {
+			log.Errorf("update big buy detail error: %v", e)
+		}
+	}
+}
+
+// 定时(每分钟 一次)读取未同步的采购订单,同步到sap
+// 同步失败的采购订单,变更状态,改为手动同步
+// 状态(sapStatus):0,未同步;1,成功;2,失败
+func AutoSapReturnOrderJob() {
+	orders := []model.BigRefunddetail{}
+	if e := s.d.DB.Raw(`SELECT
+	b.* 
+FROM
+	bigrefunddetail b
+	JOIN pasture p ON b.pastureId = p.id
+WHERE
+	buyerDate > '2022-11-02' 
+	AND p.vendor = 1 
+	AND b.sapStatus = 0`).Find(&orders, model.BigRefunddetail{}).Error; e != nil {
+		log.Errorf("AutoSapOrderJob  error: %v", e)
+		return
+	}
+	var buyeCodes []string
+	for _, v := range orders {
+		buyeCodes = append(buyeCodes, v.BuyeCode)
+	}
+	if len(buyeCodes) > 0 {
+		err := s.d.DB.Exec(` update bigrefunddetail set sapStatus = 2 where buyeCode in (?)`, buyeCodes).Error
+		fmt.Println(err)
+	}
+
+	for _, v := range orders {
+		e, sapNumber := SapReturnOrder(&v, "")
+		up := model.BigRefunddetail{SapNumber: sapNumber}
+		if e != nil {
+			up.SapStatus = 2
+			up.SapError = e.Error()
+		} else {
+			up.SapStatus = 1
+		}
+		if e := s.d.DB.Model(&v).Where("buyeCode =?", v.BuyeCode).Updates(up); e != nil {
+			log.Errorf("BigBuyDetail update error: %v", e)
+		}
+	}
+}
+
+// 发送采购订单到sap
+func SapReturnOrder(p *model.BigRefunddetail, dflag string) (error, string) {
+	r := new(http.SapOrderReq)
+	rp := new(http.OrderResp)
+	parts := []model.Refunddetail{}
+	pa := new(model.Pasture)
+	pv := new(model.Provider)
+	//pc := new(model.Bigpartpurchase)
+	//dp := new(model.Department)
+
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "MM007"
+	//r.Dest.Url = "http://192.168.61.117/SAPQ0/Common/MM007/PurchaseOrder"
+	//r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM007/PurchaseOrder"
+	r.Dest.Url = fmt.Sprintf("%s/Common/MM007/PurchaseOrder", config.Conf.Http.Routing)
+	if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
+		return errors.Wrapf(e, "provider query:id=%d", p.ProviderID), ""
+	}
+	if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
+		return errors.Wrapf(e, "pasture query:id=%d", p.PastureID), ""
+	}
+	if e := s.d.DB.Where("amount>0").Find(&parts, model.Refunddetail{BigID: p.ID}).Order("rowNumber").Error; e != nil || len(parts) == 0 {
+		return errors.Wrapf(e, "buydetail query:bigid=%d", p.ID), ""
+	}
+	//if len(parts) > 0 {
+	//	if e := s.d.DB.Where("name  = ? ", parts[0].DepartmentName).Where("pastureid  = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
+	//	}
+	//}
+
+	//r.Data.IsCancle = ""
+	r.Data.PayCondition = ""
+	r.Data.SupplierCode = pv.SapCode
+	r.Data.OrderDate = p.BuyerDate.Format("20060102")
+	r.Data.CurrencyCode = "CNY"
+	r.Data.ProofType = "ZNB4"
+	r.Data.EqSysCode = p.BuyeCode
+	//if dp.CompanyCode == "" {
+	r.Data.CompanyCode = pa.CompanyCode
+	r.Data.Organization = pa.ParchaseOrganization
+	r.Data.Group = pa.PurchasingGroup
+	//} else {
+	//	r.Data.CompanyCode = dp.CompanyCode
+	//	r.Data.Organization = dp.ParchaseOrganization
+	//	r.Data.Group = dp.PurchasingGroup
+	//}
+	r.Data.IsCancle = "X"
+	for i, v := range parts {
+		detail := http.SapOrderDetail{}
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		par := new(model.Parts)
+		if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+			//return errors.Wrapf(e, "contract  query :id=%d", v.ContractID), ""
+		}
+		if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+			//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+		}
+		if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
+			//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+		}
+		if v.RowNumber > 0 {
+			detail.RowNumber = strconv.Itoa(v.RowNumber)
+		} else {
+			detail.RowNumber = fmt.Sprintf("%d", (i+1)*10)
+		}
+
+		//if dp.CompanyCode == "" {
+		detail.Factory = pa.FactoryCode
+		//} else {
+		//	detail.Factory = dp.Factory
+		//}
+
+		detail.Quantity = fmt.Sprintf("%d", v.Amount)
+		detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
+		detail.TaxCode = "J0"
+		detail.Per = "1"
+
+		detail.Location = "1004"
+		detail.IsOwn = util.ZeroStr(bc.IsZeroStock == 1, "K")
+		detail.NetPrice = c.Price
+		detail.Dflag = dflag
+		if c.PartCode != "" {
+			detail.Unit = c.Unit
+			detail.MaterialCode = c.PartCode
+		} else {
+			if detail.NetPrice == 0 {
+				detail.NetPrice = v.Price
+			}
+			detail.Unit = par.Unit
+			detail.MaterialCode = v.PartCode
+		}
+		astr := strconv.FormatFloat(detail.NetPrice, 'f', -1, 64)
+		b := strings.Index(astr, ".")
+		if len(astr[b+1:]) > 2 && b > 0 {
+			num, _ := strconv.ParseFloat(astr[b+1:], 64)
+			if num > 0 {
+				detail.NetPrice = detail.NetPrice * 1000
+				detail.NetPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NetPrice), 64)
+				detail.Per = "1000"
+			}
+		}
+		r.Data.Detail = append(r.Data.Detail, detail)
+		if e := s.d.DB.Model(&model.Refunddetail{}).Where("id=?", v.ID).Update("rowNumber", detail.RowNumber).Error; e != nil {
+			log.Errorln(e, v.ID)
+		}
+	}
+
+	rbyte, _ := json.Marshal(r)
+	e := s.SyncSap(r, &rp, rbyte)
+	saplog := new(model.SapLog)
+	if e == nil && rp.Dest.Status == "S" {
+		s.d.DB.Create(saplog)
+		log.Infof("buy order success :eq=%s,sap=%s", rp.Data.EqNumber, rp.Data.SapNumber)
+		return nil, rp.Data.SapNumber
+	} else {
+		if param, e := json.Marshal(r); e != nil {
+			log.Errorf("sap order param marshal:%v", e)
+		} else {
+			saplog.Param = string(param)
+			saplog.Name = "sap-order"
+			s.d.DB.Create(saplog)
+		}
+		if e == nil {
+			return errors.Errorf("sap order :%s", rp.Data.MsgText), ""
+		} else {
+			return errors.Wrapf(e, "sap  order error:%v", e), ""
+		}
+	}
+	//*/
+	return nil, ""
+}
+
+func AutoSrmReturnOrderJob() {
+	orders := []model.BigRefunddetail{}
+	if e := s.d.DB.Where("srmStatus=0 and buyerDate >= '2022-10-25' and sapStatus=1 and ifnull(sapNumber,0) > 0  ").Find(&orders, model.BigRefunddetail{SrmStatus: 0}).Error; e != nil {
+		log.Errorf("AutoSrmOrderJob  error: %v", e)
+		return
+	}
+
+	var buyeCodes []string
+	for _, v := range orders {
+		buyeCodes = append(buyeCodes, v.BuyeCode)
+	}
+	if len(buyeCodes) > 0 {
+		s.d.DB.Exec(` update bigrefunddetail set srmStatus = 2 where buyeCode in (?)`, buyeCodes)
+	}
+
+	for _, v := range orders {
+		SrmReturnOrder(&v, "1")
+	}
+}
+
+func SrmReturnOrder(p *model.BigRefunddetail, isReturn string) {
+	r := new(http.SrmOrderReq)
+	rp := new(http.SrmResp)
+	parts := []model.Refunddetail{}
+	pa := new(model.Pasture)
+	pv := new(model.Provider)
+	//pc := new(model.Bigpartpurchase)
+	//dp := new(model.Department)
+
+	r.Dest.Url = "http://srm.vip.xiandaimuye.com/gateway/serviceApi/invoke/QZbycode/saveByEquipment"
+	if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
+		log.Error(e)
+		return
+	}
+
+	if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
+		log.Errorf("pasture query :id=%d,%v", p.PastureID, e)
+		return
+	}
+
+	if e := s.d.DB.Where("amount>0").Find(&parts, model.Refunddetail{BigID: p.ID}).Error; e != nil || len(parts) == 0 {
+		log.Errorf("buydetail query :bigid=%d,%v", p.ID, e)
+		return
+	}
+
+	//if e := s.d.DB.Where("matchCode  = ? ", p.MatchCode).Find(&pc, model.Bigpartpurchase{}).Error; e != nil {
+	//	return
+	//}
+
+	//if e := s.d.DB.Where("id  = ? ", pc.DepartmentID).Find(&dp, model.Department{}).Error; e != nil {
+	//	return
+	//}
+
+	//if len(parts) > 0 {
+	//	if e := s.d.DB.Where("name  = ? ", parts[0].DepartmentName).Where("pastureid  = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
+	//	}
+	//}
+
+	//r.Data.CompanyCode = pa.CompanyCode
+	r.Data.VendorErpCode = pv.SapCode
+	r.Data.PurchaseOrderDate = p.BuyerDate.Format("20060102")
+	r.Data.CurrencyCode = "CNY"
+	r.Data.PurchaseOrderType = "ZNB4"
+	r.Data.VendorName = pv.ProviderName
+	r.Data.DeliveryTypeCode = "1"
+	r.Data.IsReturn = isReturn
+	r.Data.Remark = ""
+	r.Data.ErpPurchaseOrderNo = p.SapNumber
+	r.Data.SapCode = pv.SapCode
+	r.Data.PurchaseOrderNo = p.BuyeCode
+
+	//if dp.CompanyCode == "" {
+	r.Data.CompanyCode = pa.CompanyCode
+	r.Data.PurchasingOrgCode = pa.ParchaseOrganization
+	r.Data.PurchasingGroupCode = pa.PurchasingGroup
+	//} else {
+	//	r.Data.CompanyCode = dp.CompanyCode
+	//	r.Data.PurchasingOrgCode = dp.ParchaseOrganization
+	//	r.Data.PurchasingGroupCode = dp.PurchasingGroup
+	//}
+
+	for _, v := range parts {
+		detail := http.SrmOrderDetail{}
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		pr := new(model.PartRepertory)
+		par := new(model.Parts)
+		//part := new(model.Parts)
+
+		if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+			log.Errorf("order detail error:%v", e)
+			//return
+		}
+		if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+			log.Errorf("order detail error:%v", e)
+			//return
+		}
+		if len(c.PartCode) > 0 {
+			if e := s.d.DB.First(par, model.Parts{PartCode: c.PartCode}).Error; e != nil {
+				//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+			}
+		} else if len(v.PartCode) > 0 {
+			if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
+				//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+			}
+		}
+		if c.Brand != "" {
+			detail.Manufacturer = c.Brand
+		} else {
+			brand := new(model.Brand)
+			if e := s.d.DB.First(brand, model.Brand{ID: v.BrandID}).Error; e != nil {
+				//return errors.Wrapf(e, "bigcontract  query :id=%d", c.BigID), ""
+			}
+			detail.Manufacturer = brand.BrandName
+		}
+
+		price := c.Price
+		if price == 0 {
+			price = v.Price
+		}
+		if c.PartCode != "" {
+			detail.OrderUnitCode = c.Unit
+			detail.MaterialCode = c.PartCode
+			detail.MaterialName = c.PartName
+			detail.PricingUnitCode = c.Unit
+		} else {
+			detail.OrderUnitCode = par.Unit
+			detail.MaterialCode = par.PartCode
+			detail.MaterialName = par.Name
+			detail.PricingUnitCode = par.Unit
+		}
+		s.d.DB.First(pr, model.PartRepertory{ContractID: v.ContractID})
+		r.Data.TotalNonTaxAmount += price
+		r.Data.TotalTaxAmount += price
+		detail.RowNo = strconv.Itoa(v.RowNumber)
+		//detail.Manufacturer = pa.FactoryCode
+		//detail.Manufacturer =
+		//if dp.CompanyCode == "" {
+		detail.Manufacturer = pa.FactoryCode
+		detail.PlantCode = pa.FactoryCode
+		//} else {
+		//	detail.Manufacturer = dp.Factory
+		//	detail.PlantCode = dp.Factory
+		//}
+		detail.OrderQty = fmt.Sprintf("%d", v.Amount)
+		detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
+		detail.TaxRateCode = "J0"
+		detail.NonTaxPrice = price
+		detail.MaterialDesc = par.Specification
+		if len(c.PartCode) > 0 {
+			detail.MaterialGroupCode = strings.ReplaceAll(c.PartCode[:strings.LastIndex(c.PartCode, ".")], ".", "")
+		} else if len(v.PartCode) > 0 {
+			fmt.Println(v.PartCode)
+			detail.MaterialGroupCode = strings.ReplaceAll(v.PartCode[:strings.LastIndex(v.PartCode, ".")], ".", "")
+		}
+
+		detail.Tax = "0"
+		detail.ConfirmDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
+		//detail.PlantCode = pa.FactoryCode
+		//if dp.CompanyCode == "" {
+		//detail.PlantCode = pa.FactoryCode
+		//} else {
+		//	detail.PlantCode = dp.Factory
+		//}
+		detail.StockLocationCode = "1004"
+		detail.QualityCheck = "0"
+		detail.IsReturn = isReturn
+		detail.OverDeliveryLimit = "0"
+		detail.ShortDeliveryLimit = "0"
+		detail.SourceNo = p.BuyeCode[4:]
+		detail.ContractCode = bc.ContractCode
+		detail.Remark = c.Remark
+		//r.Data.Detail = append(r.Data.Detail, detail)
+
+		if bc.IsZeroStock == 1 {
+			detail.PurchaseCategory = "2"
+		} else {
+			detail.PurchaseCategory = "0"
+		}
+		detail.IsFree = "0"
+		detail.PriceBase = "1"
+		astr := strconv.FormatFloat(detail.NonTaxPrice, 'f', -1, 64)
+		b := strings.Index(astr, ".")
+		if len(astr[b+1:]) > 2 && b > 0 {
+			num, _ := strconv.ParseFloat(astr[b+1:], 64)
+			if num > 0 {
+				detail.NonTaxPrice = detail.NonTaxPrice * 1000
+				detail.NonTaxPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NonTaxPrice), 64)
+				detail.PriceBase = "1000"
+			}
+		}
+		detail.TaxAmount = detail.NonTaxPrice
+		detail.TaxPrice = detail.NonTaxPrice
+		detail.NonTaxAmount = detail.NonTaxPrice
+		r.Data.Detail = append(r.Data.Detail, detail)
+		//if e := s.d.DB.Model(&model.BuyDetail{}).Where("id=?", v.ID).Update("rowNumber", i+1).Error; e != nil {
+		//	log.Errorln(e, v.ID)
+		//}
+	}
+
+	rbyte, _ := json.Marshal([]interface{}{r.Data})
+	fmt.Println(string(rbyte))
+	saplog := new(model.SapLog)
+	saplog.Url = r.Dest.Url
+	saplog.Param = string(rbyte)
+	saplog.Name = "srm退货采购订单"
+	if e := s.SyncSrm(r, rp, rbyte); e != nil {
+		s.d.DB.Create(saplog)
+		log.Errorf("sap buy order error: %v", e)
+		p.SapStatus = 3
+	} else {
+		s.d.DB.Create(saplog)
+		if rp.Success {
+			// log.Infof("buy order success :eq=%s,sap=%s", rp.Data.EqNumber, rp.Data.SapNumber)
+			p.SapStatus = 1
+			p.SapNumber = rp.Code
+		} else {
+			log.Warnf("buy order fail :msg=%s,r=%v", rp.Code, r)
+			p.SapStatus = 2
+			// pp.Print(r)
+		}
+	}
+	if p.SapStatus == 1 {
+		if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigRefunddetail{SrmStatus: p.SapStatus, SrmNumber: p.SapNumber}).Error; e != nil {
+			log.Errorf("update big buy detail error: %v", e)
+		}
+	} else {
+		if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigRefunddetail{SrmStatus: p.SapStatus, SrmError: rp.Message}).Error; e != nil {
+			log.Errorf("update big buy detail error: %v", e)
+		}
+	}
+}
+
+func NextProcurement(sqlname, procurementId string, tx *sqlx.Tx) error {
+	if sqlname == "updateBigbuydetailStatu" {
+		p := new(model.BigBuyDetail)
+		s.d.DB.Where("id = ?", procurementId).First(&p)
+		SapOrder(p, "X")
+		//SrmOrder(p, "1")
+	} else if sqlname == "shutDownBigrefunddetail" {
+		p := new(model.BigRefunddetail)
+		s.d.DB.Where("id = ?", procurementId).First(&p)
+		SapReturnOrder(p, "X")
+		//SrmReturnOrder(p, "1")
+	}
+
+	return nil
+}

+ 939 - 0
apiserver/service/proof.go

@@ -0,0 +1,939 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/jmoiron/sqlx"
+	"github.com/pkg/errors"
+	"github.com/xormplus/xorm/schemas"
+	"kpt.xdmy/apiserver/config"
+	"reflect"
+	"strconv"
+	"strings"
+	"time"
+
+	_ "github.com/go-sql-driver/mysql"
+	"github.com/k0kubun/pp/v3"
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+	"kpt.xdmy/pkg/util"
+)
+
+// sap入库凭证接口,业务触发
+func (s *Service) LaidProof(p interface{}, tx *sqlx.Tx) error {
+	pr := new(http.ProofPartReq)
+	r := new(http.ProofReq)
+	rp := new(http.ProofResp)
+	parts := make([]*model.PartLaidStr, 0)
+	//buyDetail := []model.BuyDetail{}
+	//pc := new(model.Bigpartpurchase)
+	//dp := new(model.Department)
+
+	//prs := []model.BigPartLaid{}
+	if e := util.Unmarshal(p, pr); e != nil {
+		log.Error(e, p)
+		return errors.New("转码失败!!!")
+	}
+
+	bp := new(model.BigPartLaid)
+	bbd := new(model.BigBuyDetailStr)
+	pa := new(model.Pasture)
+	bigpartlaidByte, err := MapStr(tx, `select * from bigpartlaid  where laidCode = ? `, pr.LaidCode)
+	if err != nil {
+		log.Error(err)
+		return errors.New("无入库信息!!!")
+	}
+	if bigpartlaidByte != nil {
+		data := make(map[string]interface{})
+		err := json.Unmarshal(bigpartlaidByte, &data)
+		if err != nil {
+			log.Error(err)
+			return errors.New("入库信息转码出错!!!")
+		}
+		bp.ID, _ = strconv.Atoi(data["id"].(string))
+		bp.PurchaseID, _ = data["purchaseId"].(string)
+		bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
+		bp.ProofCode, _ = data["ProofCode"].(string)
+	}
+
+	if len(bp.ProofCode) > 1 {
+		return errors.New(fmt.Sprintf("errors"))
+	}
+
+	partlaidByte, err := GetDataList(tx, `select * from partlaid where bigid = ? `, []interface{}{bp.ID})
+	if err != nil {
+		log.Error(err)
+		return errors.New("无入库详情信息!!!")
+	}
+	if partlaidByte != nil {
+		err := json.Unmarshal(partlaidByte, &parts)
+		if err != nil {
+			log.Error(err)
+			return errors.New("入库信息转码出错!!!")
+		}
+	}
+
+	bigbuydetailByte, err := MapStr(tx, `select * from bigbuydetail  where buyeCode = ? `, bp.PurchaseID)
+	if err != nil {
+		log.Error(err)
+		return errors.New("无入库信息!!!")
+	}
+	if bigbuydetailByte != nil {
+		err := json.Unmarshal(bigbuydetailByte, &bbd)
+		if err != nil {
+			log.Error(err)
+			return errors.New("入库信息转码出错!!!")
+		}
+	}
+
+	if e := s.d.DB.Raw(` select * from pasture  where id = ? `, bp.PastureID).First(pa).Error; e != nil {
+		log.Error(e)
+		return errors.New("查询牧场详情出错!!!")
+	}
+
+	proofDest(r)
+	r.Dest.MESSIDOS = pr.LaidCode
+	r.Dest.BUSSDOCOS = pr.LaidCode
+	r.Data.EqNumber = pr.LaidCode
+	r.Data.CreateTime = time.Now().Format("20060102")
+	if t, e := util.ParseDate(pr.StorageTime[:10]); e != nil {
+		log.Errorf("parse time error:err=%v,param=%v", e, pr.StorageTime)
+	} else {
+		r.Data.PostDate = t.Format("20060102")
+	}
+	for i, v := range parts {
+		if v.StorageAmount == "0" {
+			continue
+		}
+		sdetail := http.ProofDetail{MoveType: "101"}
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		bd := new(model.BuyDetailStr)
+		pro := new(model.Provider)
+		//w := new(model.Warehouse)
+		contractID, _ := v.ContractID.(float64)
+		if e := s.d.DB.Raw(` select * from contract where id = ?`, contractID).First(c).Error; e != nil {
+			log.Errorf("contract query error:%v", e)
+			//return
+		}
+
+		if e := s.d.DB.Raw(`select * from bigcontract where id = ? `, c.BigID).First(bc).Error; e != nil {
+			log.Errorf("bigcontract query error:%v", e)
+			//return
+		}
+
+		//if e := s.d.DB.Where("id = ?", v.LocationID).First(w).Error; e != nil {
+		//	log.Error(e)
+		//	return errors.New("查询库位信息出错!!!")
+		//}
+		if e := s.d.DB.Raw(`select * from provider  where id = ? `, v.ProviderID).First(pro).Error; e != nil {
+			log.Error(e)
+			return errors.New("查询供应商信息出错!!!")
+		}
+
+		if contractID > 0 {
+			buydetailByte, err := MapStr(tx, `select * from buydetail  where bigid = ? and contractId = ?  `, bbd.ID, v.ContractID)
+			if err != nil {
+				log.Error(err)
+				//return errors.New("查询供应商信息出错!!!")
+			}
+			if buydetailByte != nil {
+				err := json.Unmarshal(buydetailByte, &bd)
+				if err != nil {
+					return errors.New("查询BuyDetail转码出错!!!")
+				}
+			}
+			sdetail.OrderRowNum = bd.RowNumber
+		} else {
+
+			buydetailByte, err := MapStr(tx, `select * from buydetail  where bigid = ? and partCode = ?  `, bbd.ID, v.PartCode)
+			if err != nil {
+				log.Error(err)
+				//return errors.New("查询供应商信息出错!!!")
+			}
+			if buydetailByte != nil {
+				err := json.Unmarshal(buydetailByte, &bd)
+				if err != nil {
+					return errors.New("查询BuyDetail转码出错!!!")
+				}
+			}
+
+			sdetail.OrderRowNum = bd.RowNumber
+		}
+
+		//rowNumber, _ :=
+		if v.RowNumber.(float64) > 0 {
+			sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
+		} else {
+			sdetail.RowNumber = fmt.Sprintf("%d", (i + 1))
+		}
+		sdetail.Quantity = fmt.Sprintf("%v", v.StorageAmount)
+		sdetail.Unit = v.Unit.(string)
+		sdetail.Code = v.PartCode.(string)
+		sdetail.SaveType = util.ZeroStr(bc.IsZeroStock == 1, "K")
+		//if dp.Factory == "" {
+		sdetail.Factory = pa.FactoryCode
+		//} else {
+		//	sdetail.Factory = dp.Factory
+		//}
+		sdetail.Location = "1004"
+		sdetail.OrderNumber = bbd.SapNumber
+		sdetail.Provider = pro.SapCode
+		r.Data.Detail = append(r.Data.Detail, sdetail)
+		//if e := s.d.DB.Model(&model.PartLaid{}).Where("id=?", v.ID).Update("rowNumber", sdetail.RowNumber).Error; e != nil {
+		//	log.Errorln(e, v.ID)
+		//}
+		_, err = tx.Exec(` update partlaid set rowNumber = ? where id = ? `, sdetail.RowNumber, v.ID)
+		if err != nil {
+			return err
+		}
+	}
+
+	///*
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e := s.SyncSap(r, rp, rbyte); e != nil {
+		log.Error(e)
+		fmt.Println(e)
+		return errors.New(fmt.Sprintf("传输sap errors:%s", r.MessText))
+	} else {
+		if rp.Dest.Status == "S" {
+			log.Printf("laid proof success:%s,%s", rp.Data.EqNumber, rp.Data.SapNumber)
+			tx.Exec(`  update bigpartlaid set  ProofCode = ?  where laidcode = ?  `, rp.Data.SapNumber, rp.Data.EqNumber)
+		} else {
+			log.Warnf("%s laid proof failed:causetext=%s", rp.Dest.MessText)
+			pp.Print(r)
+			fmt.Println(e)
+			return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
+		}
+	}
+	//*/
+	return nil
+}
+
+// 出库单推送sap,包括了报废出库
+func (s *Service) UseProof(p interface{}, tx *sqlx.Tx) error {
+	pr := new(http.ProofPartReq)
+	r := new(http.ProofReq)
+	rp := new(http.ProofResp)
+	parts := make([]*model.PartUseStr, 0)
+	bp := new(model.BigPartUse)
+	pa := new(model.Pasture)
+	dp := new(model.Department)
+
+	if e := util.Unmarshal(p, pr); e != nil {
+		log.Error(e)
+		return errors.New(fmt.Sprintf("数据转码 errors:%v", e))
+	}
+
+	bigpartUseByte, err := MapStr(tx, `select * from bigpartUse  where useForm = ? `, pr.UseForm)
+	if err != nil {
+		log.Error(err)
+		return errors.New(fmt.Sprintf("查询不到出库单 errors:%v", err))
+	}
+	if bigpartUseByte != nil {
+		data := make(map[string]interface{})
+		err := json.Unmarshal(bigpartUseByte, &data)
+		if err != nil {
+			log.Error(err)
+			return errors.New(fmt.Sprintf("查询出库单 errors:%v", err))
+		}
+		bp.ID, _ = strconv.Atoi(data["id"].(string))
+		bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
+		bp.ProofCode, _ = data["ProofCode"].(string)
+		bp.DepartmentID, _ = strconv.Atoi(data["departmentId"].(string))
+
+		if _, ok := data["oddCode"]; !ok {
+			return errors.New(fmt.Sprintf("查询出库单 OddCode 出错!!!"))
+		}
+		bp.OddCode = data["oddCode"].(string)
+		if bp.OddCode == "" {
+			return errors.New(fmt.Sprintf("查询出库单 OddCode 出错!!!"))
+		}
+	}
+
+	if len(bp.ProofCode) > 1 {
+		return errors.New("出库单已传输Sap!!!")
+	}
+
+	partusebyte, err := GetDataList(tx, ` select * from  partuse  where bigid = ?`, []interface{}{bp.ID})
+	if err != nil {
+		log.Error(err)
+		return errors.New("查询入库详情出错!!!")
+	}
+	if partusebyte != nil {
+		err := json.Unmarshal(partusebyte, &parts)
+		if err != nil {
+			log.Error(err)
+			return errors.New("查询入库详情出错!!!")
+		}
+	}
+
+	pp.Print(bp)
+	if e := s.d.DB.First(pa, model.Pasture{ID: bp.PastureID}).Error; e != nil {
+		log.Error(e)
+		return errors.New(fmt.Sprintf("查询牧场信息 errors:%v", e))
+	}
+	//if e := s.d.DB.First(dp, model.big{ID: bp.DepartmentID, PastureID: bp.PastureID}).Error; e != nil {
+	//	log.Error(e)
+	//	return errors.New("查询部门信息出错!!!")
+	//}
+	if e := s.d.DB.Raw(` select * from Department where id = (select  departmentId from   bigpartapply where applyCode = ? ) `, bp.OddCode).
+		First(dp).Error; e != nil {
+		log.Error(e)
+		return errors.New("查询部门信息出错!!!")
+	}
+
+	// pp.Println(bp, d)
+	proofDest(r)
+
+	//b, _ := json.Marshal(pr)
+	//restful.Dbs.DB.Exec(` insert into equipmentlingshi(text)values(?)`, string(b))
+	r.Dest.MESSIDOS = pr.UseForm
+	r.Dest.BUSSDOCOS = pr.UseForm
+	r.Data.EqNumber = pr.UseForm
+	r.Data.CreateTime = time.Now().Format("20060102")
+	if t, e := util.ParseDate(pr.ReceiveTime[:10]); e != nil {
+		log.Error(e, pr.ReceiveTime)
+	} else {
+		r.Data.PostDate = t.Format("20060102")
+	}
+	for i, v := range parts {
+		bc := new(model.BigContract)
+		c := new(model.Contract)
+		//w := new(model.Warehouse)
+		pv := new(model.Provider)
+		eq := new(model.Equipment)
+		storage := new(model.PartRepertory)
+		dict := new(model.Dictlist)
+
+		contractID, _ := strconv.Atoi(v.ContractID.(string))
+		if contractID < 0 {
+			if e := s.d.DB.First(storage, model.PartRepertory{ContractID: contractID}).Error; e != nil {
+				log.Errorln(e, v.ContractID)
+				return errors.New(fmt.Sprintf("查询库存信息出错 errors:%v", e))
+			}
+
+			if e := s.d.DB.First(pv, model.Provider{ID: storage.ProviderID}).Error; e != nil {
+				log.Errorln(e, storage.ProviderID)
+				return errors.New(fmt.Sprintf("查询供应商信息出错 errors:%v", e))
+			}
+		} else {
+
+			if e := s.d.DB.Where("id = ? ", v.ContractID).First(c).Error; e != nil {
+				log.Errorf("contract query error:%v", e)
+				return errors.New(fmt.Sprintf("查询合同信息 errors:%v", e))
+			}
+			if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+				log.Errorf("bigcontract query error:%v", e)
+				return errors.New(fmt.Sprintf("查询合同信息 errors:%v", e))
+			}
+			if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
+				log.Errorln(e, bc.ProviderID)
+				return errors.New(fmt.Sprintf("无供应商信息请检查合同%s对应的供应商", bc.ContractCode))
+			}
+
+		}
+
+		s.d.DB.First(dict, model.Dictlist{Pid: 21, Value: v.UseTypeV.(string)})
+
+		//if e := s.d.DB.First(w, model.Warehouse{ID: v.LocationID}).Error; e != nil {
+		//	log.Errorln(e, v.LocationID)
+		//	return errors.New(fmt.Sprintf("errors:%v", e))
+		//}
+		if e := s.d.DB.Where("eqCode = ?  and pastureid = ? ", v.EqCode, pr.PastureID).First(eq).Error; e != nil {
+			log.Errorln(e, v.EqID)
+			return errors.New(fmt.Sprintf("errors:%v", e))
+		}
+		sdetail := http.ProofDetail{}
+		sdetail.EXT01 = dict.Label
+		// 报废出库
+		if pr.UseType == 5 {
+			sdetail.MoveType = "Z19"
+			if contractID > 0 && bc.IsZeroStock != 0 {
+				log.Info("寄售不能报废=======")
+				return errors.New(fmt.Sprintf("寄售不能报废======= errors"))
+			}
+		}
+		// 领用出库、手动出库
+		//if pr.UseType == 0 || pr.UseType == 1 {
+		sdetail.MoveType = "201"
+		sdetail.CostCenter = dp.CostCenterCode
+		//if dp.Factory == "" {
+		sdetail.Factory = pa.FactoryCode
+		//} else {
+		//	sdetail.Factory = dp.Factory
+		//}
+		if sdetail.Factory == "M005" && strings.Contains(dp.Name, "二期") {
+			sdetail.Factory = "M017"
+		}
+		if v.RowNumber.(float64) > 0 {
+			sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
+		} else {
+			sdetail.RowNumber = fmt.Sprintf("%d", (i + 1))
+		}
+		sdetail.Quantity = fmt.Sprintf("%v", v.CheckoutNumber)
+		sdetail.Unit = v.Unit.(string)
+		sdetail.Code = v.PartCode.(string)
+		sdetail.AssetCode = eq.SapCode
+		sdetail.AssetSon = eq.SonCode
+		sdetail.Location = "1004"
+		if contractID > 0 && bc.IsZeroStock == 1 {
+			sdetail.SaveType = "K"
+		}
+
+		if sdetail.SaveType == "K" {
+			sdetail.Provider = pv.SapCode
+		}
+		r.Data.Detail = append(r.Data.Detail, sdetail)
+		//if e := s.d.DB.Model(&model.PartUse{}).Where("id=?", v.ID).Update("rowNumber", sdetail.RowNumber).Error; e != nil {
+		//	log.Errorln(e, v.ID)
+		//}
+		_, err = tx.Exec(` update partuse set rowNumber = ?  where id = ? `, sdetail.RowNumber, v.ID)
+		if err != nil {
+			return err
+		}
+	}
+	//}
+	///*
+	pp.Print(r)
+	log.Infof("bp.pastureId:%d,pa.name:%s,pa.companycode:%s", bp.PastureID, pa.Name, pa.CompanyCode)
+
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e := s.SyncSap(r, rp, rbyte); e != nil {
+		log.Errorf("laid proof error:%v", e)
+		return errors.New(fmt.Sprintf("errors:%s", r.MessText))
+	} else {
+		if rp.Dest.Status == "S" {
+			log.Printf("use proof  success:eqcode=%s,sapcode=%s", rp.Data.EqNumber, rp.Data.SapNumber)
+			//if e := s.d.DB.Model(&model.BigPartUse{}).Where("useform = ?", rp.Data.EqNumber).Update("ProofCode", rp.Data.SapNumber).Error; e != nil {
+			//	log.Errorln(e)
+			//}
+			tx.Exec(`  update bigpartuse set  ProofCode = ?  where useform = ?  `, rp.Data.SapNumber, rp.Data.EqNumber)
+		} else {
+			log.Warnf(" use proof :%s", rp.Dest.MessText)
+			return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
+		}
+	}
+	return nil
+}
+
+// 退库单推送sap
+func (s *Service) QuitProof(p interface{}, tx *sqlx.Tx) error {
+	pr := new(http.ProofPartReq)
+	r := new(http.ProofReq)
+	rp := new(http.ProofResp)
+	parts := make([]*model.PartquitStr, 0)
+	bp := new(model.BigPartquit)
+	pa := new(model.Pasture)
+	d := new(model.Department)
+
+	if e := util.Unmarshal(p, pr); e != nil {
+		log.Error(e)
+		return errors.New(fmt.Sprintf("errors:%v", e))
+	}
+
+	//defer func() {
+	//	if msg := recover(); msg != nil {
+	//		fmt.Println("panic信息:", msg, "---recover恢复---")
+	//	}
+	//}()
+	//if e := s.d.DB.First(bp, model.BigPartquit{UseForm: pr.UseForm}).Error; e != nil {
+	//	log.Error(e)
+	//	return errors.New(fmt.Sprintf("errors:%v", e))
+	//}
+	bigpartquitByte, err := MapStr(tx, `select * from bigpartquit  where useForm = ? `, pr.UseForm)
+	if err != nil {
+		log.Error(err)
+		return errors.New(fmt.Sprintf("无退库单信息 errors:%v", err))
+	}
+	if bigpartquitByte != nil {
+		data := make(map[string]interface{})
+		err := json.Unmarshal(bigpartquitByte, &data)
+		if err != nil {
+			log.Error(err)
+			return errors.New(fmt.Sprintf("无退库单信息 errors:%v", err))
+		}
+		bp.ID, _ = strconv.Atoi(data["id"].(string))
+		bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
+		bp.ProofCode, _ = data["ProofCode"].(string)
+		bp.DeptID, _ = strconv.Atoi(data["deptId"].(string))
+	}
+
+	if len(bp.ProofCode) > 1 {
+		return errors.New(fmt.Sprintf("errors"))
+	}
+	partquitByte, err := GetDataList(tx, `select * from partquit where bigid = ? `, []interface{}{bp.ID})
+	if err != nil {
+		log.Error(err)
+		return errors.New("无退货详情信息!!!")
+	}
+	if partquitByte != nil {
+		err := json.Unmarshal(partquitByte, &parts)
+		if err != nil {
+			log.Error(err)
+			return errors.New("退货详情信息转码出错!!!")
+		}
+	}
+
+	if e := s.d.DB.First(pa, model.Pasture{ID: bp.PastureID}).Error; e != nil {
+		log.Error(e)
+		return errors.New(fmt.Sprintf("无牧场信息 errors:%v", err))
+	}
+
+	if e := s.d.DB.First(d, model.Department{ID: bp.DeptID}).Error; e != nil {
+		log.Error(e)
+		return errors.New(fmt.Sprintf("无部门信息 errors:%v", err))
+	}
+
+	var useFormCount int64
+	if e := s.d.DB.Table("bigpartquit").Where(" useForm = ? ", pr.UseForm).Count(&useFormCount).Error; e != nil {
+		log.Error(e)
+	}
+	useForm := fmt.Sprintf("%stk%d", pr.UseForm, useFormCount+1)
+	proofDest(r)
+	r.Dest.MESSIDOS = useForm
+	r.Dest.BUSSDOCOS = useForm
+	r.Data.EqNumber = useForm
+	r.Data.CreateTime = time.Now().Format("20060102")
+	if t, e := util.ParseDate(pr.QuitDate); e != nil {
+		log.Error(e, pr.QuitDate)
+	} else {
+		r.Data.PostDate = t.Format("20060102")
+	}
+	for i, v := range parts {
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		pv := new(model.Provider)
+		// w := new(model.Warehouse)
+		//
+		/*
+			if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+				log.Errorf("contract query error:%v", e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+			if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+				log.Errorf("bigcontract query error:%v", e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+			if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
+				log.Errorln(e, bc.ProviderID)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+		*/
+		contractID, _ := strconv.Atoi(v.ContractID.(string))
+		if contractID > 0 {
+			if e := s.d.DB.First(c, model.Contract{ID: contractID}).Error; e != nil {
+				log.Errorf("contract query error:%v", e)
+				return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
+			}
+
+			if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+				log.Errorf("bigcontract query error:%v", e)
+				return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
+			}
+
+			if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
+				log.Errorln(e, bc.ProviderID)
+				return errors.New(fmt.Sprintf("供应商不存在 errors:%v", err))
+			}
+		} else {
+			if e := s.d.DB.Where("id = ?", v.ProviderID).First(pv).Error; e != nil {
+				log.Errorf("refund proof provider:id=%d,%v", bc.ProviderID, e)
+				return errors.New(fmt.Sprintf("供应商不存在 errors:%v", err))
+			}
+
+		}
+
+		sdetail := http.ProofDetail{MoveType: "202"}
+		if v.RowNumber.(float64) > 0 {
+			sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
+		} else {
+			sdetail.RowNumber = fmt.Sprintf("%d", i+1)
+		}
+		sdetail.Quantity = fmt.Sprintf("%v", v.QuitNumber)
+		sdetail.Unit = c.Unit
+		sdetail.Factory = pa.FactoryCode
+		sdetail.CostCenter = d.CostCenterCode
+		sdetail.Location = "1004"
+		sdetail.Provider = pv.SapCode
+		sdetail.SaveType = util.ZeroStr(bc.IsZeroStock == 1, "K")
+		r.Data.Detail = append(r.Data.Detail, sdetail)
+		_, err = tx.Exec(` update partquit  set rowNumber = ? where id = ?  `, sdetail.RowNumber, v.ID)
+		if err != nil {
+			log.Error(err)
+			return err
+		}
+	}
+
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e := s.SyncSap(r, rp, rbyte); e != nil {
+		log.Errorf("laid proof error:%v", e)
+		return errors.New(fmt.Sprintf("errors:%v", e))
+	} else {
+		if rp.Dest.Status == "S" {
+			log.Printf("quit proof  success:eqcode=%s,sapcode=%s", rp.Data.EqNumber, rp.Data.SapNumber)
+			//if e := s.d.DB.Model(&model.BigPartquit{}).Where("useform = ?", rp.Data.EqNumber).Update("ProofCode", rp.Data.SapNumber).Error; e != nil {
+			//	log.Errorln(e)
+			//	return err
+			//}
+			tx.Exec(`  update bigpartquit set  ProofCode = ?  where useform = ?  `, rp.Data.SapNumber, rp.Data.EqNumber)
+		} else {
+			log.Warnf("%s quit proof failed:causetext=%s", rp.Dest.MessText)
+			pp.Print(r)
+			return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
+		}
+	}
+
+	return nil
+}
+
+// 退货单推送sap
+func (s *Service) RefundProof(p interface{}, tx *sqlx.Tx) error {
+	pr := new(model.RefundParam)
+	r := new(http.ProofReq)
+	rp := new(http.ProofResp)
+	parts := make([]*model.PartRefundStr, 0)
+	bp := new(model.BigPartRefund)
+	pa := new(model.Pasture)
+
+	if e := util.Unmarshal(p, pr); e != nil {
+		log.Error(e)
+		log.Info("%v", pr)
+		return errors.New(fmt.Sprintf("errors:%v", e))
+	}
+	pid := pr.ID
+
+	bigpartrefundByte, err := MapStr(tx, `select * from bigpartrefund  where id = ? `, pid)
+	if err != nil {
+		log.Error(err)
+		return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
+	}
+	if bigpartrefundByte != nil {
+		data := make(map[string]interface{})
+		err := json.Unmarshal(bigpartrefundByte, &data)
+		if err != nil {
+			log.Error(err)
+			return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
+		}
+		bp.ID, _ = strconv.Atoi(data["id"].(string))
+		bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
+		bp.ProofCode, _ = data["ProofCode"].(string)
+		bp.UseForm = data["useForm"].(string)
+		bp.CreateTime, _ = data["createTime"].(time.Time)
+		t, err := time.Parse("2006-01-02T15:04:05", data["createTime"].(string)[:len("2006-01-02 15:04:05")])
+		if err != nil {
+			log.Error(err)
+			return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
+		}
+		fmt.Println(t)
+		bp.CreateTime = t
+		bp.ProviderID, _ = strconv.Atoi(data["providerId"].(string))
+		if _, ok := data["purchaseId"]; ok {
+			bp.PurchaseId = data["purchaseId"].(string)
+		}
+	}
+
+	if len(bp.ProofCode) > 1 {
+		return errors.New(fmt.Sprintf("errors"))
+	}
+	//if e := s.d.DB.Find(&parts, model.PartRefund{BigID: bp.ID}).Error; e != nil || len(parts) == 0 {
+	//	log.Error(e)
+	//	return errors.New("无退货详情信息!!!")
+	//}
+	partquitByte, err := GetDataList(tx, `select * from partrefund where bigid = ? `, []interface{}{bp.ID})
+	if err != nil {
+		log.Error(err)
+		return errors.New("无退货详情信息!!!")
+	}
+	if partquitByte != nil {
+		err := json.Unmarshal(partquitByte, &parts)
+		if err != nil {
+			log.Error(err)
+			return errors.New("退货详情信息转码出错!!!")
+		}
+	}
+
+	if e := s.d.DB.First(pa, model.Pasture{ID: bp.PastureID}).Error; e != nil {
+		log.Error(e)
+		return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
+	}
+
+	proofDest(r)
+	r.Dest.MESSIDOS = bp.UseForm
+	r.Dest.BUSSDOCOS = bp.UseForm
+	r.Data.EqNumber = bp.UseForm
+	r.Data.PostDate = bp.CreateTime.Format("20060102")
+	r.Data.CreateTime = time.Now().Format("20060102")
+
+	for i, v := range parts {
+
+		sdetail := http.ProofDetail{}
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+		//bd := new(model.BuyDetail)
+		//bbd := new(model.BigBuyDetail)
+		pv := new(model.Provider)
+		/*
+			if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
+				log.Errorf("contract query error:%v", e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+			if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+				log.Errorf("bigcontract query error:%v", e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+
+			if e := s.d.DB.Order("id desc").First(bd, model.BuyDetail{ContractID: v.ContractID}).Error; e != nil {
+				log.Error(e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+			if e := s.d.DB.First(bbd, model.BigBuyDetail{ID: bd.BigID}).Error; e != nil {
+				log.Errorf("refund proof bigbuydetail:id=%d,%v", bd.BigID, e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+			if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
+				log.Errorf("refund proof provider:id=%d,%v", bc.ProviderID, e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+		*/
+		contractID, _ := strconv.Atoi(v.ContractID.(string))
+		if contractID > 0 {
+			if e := s.d.DB.First(c, model.Contract{ID: contractID}).Error; e != nil {
+				log.Errorf("contract query error:%v", e)
+				return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
+			}
+			if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+				log.Errorf("bigcontract query error:%v", e)
+				return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
+			}
+			if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
+				log.Errorln(e, bc.ProviderID)
+				return errors.New(fmt.Sprintf("供应商不存在 errors:%v", err))
+			}
+			//return nil
+		} else {
+			if e := s.d.DB.First(pv, model.Provider{ID: bp.ProviderID}).Error; e != nil {
+				log.Errorf("refund proof provider:id=%d,%v", bc.ProviderID, e)
+				return errors.New(fmt.Sprintf("errors:%v", e))
+			}
+		}
+
+		refunddetail := new(model.BigRefunddetail)
+		s.d.DB.Raw(` select * from bigrefunddetail where buyeCode = ? `, bp.PurchaseId).First(&refunddetail)
+		if bc.IsZeroStock == 0 {
+			sdetail.MoveType = "161"
+		} else {
+			sdetail.MoveType = "502"
+		}
+		if v.RowNumber.(float64) > 0 {
+			sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
+		} else {
+			sdetail.RowNumber = fmt.Sprintf("%d", (i+1)*10)
+		}
+		sdetail.Quantity = fmt.Sprintf("%v", v.RefundNumber)
+		if v.PartCode == "" {
+			sdetail.Unit = c.Unit
+			sdetail.Code = c.PartCode
+		} else {
+			sdetail.Unit = v.Unit.(string)
+			sdetail.Code = v.PartCode.(string)
+		}
+
+		sdetail.SaveType = util.ZeroStr(bc.IsZeroStock == 1, "K")
+		sdetail.Factory = pa.FactoryCode
+		sdetail.Location = "1004"
+		sdetail.OrderNumber = refunddetail.SapNumber
+		sdetail.OrderRowNum = fmt.Sprintf("%s", sdetail.RowNumber)
+		sdetail.Provider = pv.SapCode
+
+		r.Data.Detail = append(r.Data.Detail, sdetail)
+		//if e := s.d.DB.Model(&model.PartRefund{}).Where("id=?", v.ID).Update("rowNumber", sdetail.RowNumber).Error; e != nil {
+		//	log.Errorln(e, v.ID)
+		//}
+
+		_, err = tx.Exec(` update partrefund  set rowNumber = ?  where id = ? `, sdetail.RowNumber, v.ID)
+		if err != nil {
+			log.Error(err)
+			return err
+		}
+	}
+
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e := s.SyncSap(r, rp, rbyte); e != nil {
+		log.Error(e)
+		return errors.New(fmt.Sprintf("errors:%v", e))
+	} else {
+		if rp.Dest.Status == "S" {
+			log.Printf("refund proof success:%s,%s", rp.Data.EqNumber, rp.Data.SapNumber)
+			//if e := s.d.DB.Model(&model.BigPartRefund{}).Where("useform = ?", rp.Data.EqNumber).Update("ProofCode", rp.Data.SapNumber).Error; e != nil {
+			//	log.Errorln(e)
+			//}
+			tx.Exec(`  update bigpartrefund set  ProofCode = ?  where useform = ?  `, rp.Data.SapNumber, rp.Data.EqNumber)
+		} else {
+			log.Warnf("return good fail: %s", rp.Dest.MessText)
+			return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
+		}
+	}
+	return nil
+}
+func proofDest(p *http.ProofReq) {
+	p.Dest.DestID = "EQMAN"
+	p.Dest.BussTp = "MM001"
+	//p.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM001/ModifyMblnr"
+	p.Dest.Url = fmt.Sprintf("%s/Common/MM001/ModifyMblnr", config.Conf.Http.Routing)
+	//p.Dest.Url = "http://192.168.61.117/SAPQ0/Common/MM001/ModifyMblnr"
+}
+
+func MapStr(tx *sqlx.Tx, sql string, param ...interface{}) ([]byte, error) {
+	m := make(map[string]interface{})
+	rows, err := tx.Queryx(sql, param...)
+	if err != nil {
+		return nil, err
+	}
+	col, err := rows.Columns()
+	if err != nil {
+		return nil, err
+	}
+	if rows.Next() {
+
+		rs, err := rows.SliceScan()
+		if err != nil {
+			return nil, err
+		}
+		for i, r := range rs {
+			m[col[i]] = r
+			switch r.(type) {
+			case []uint8:
+				m[col[i]] = string(r.([]uint8))
+			case int64:
+				m[col[i]] = strconv.FormatInt(r.(int64), 10)
+			}
+		}
+	}
+	defer func() {
+		rows.Close()
+	}()
+
+	b, err := json.Marshal(m)
+	if err != nil {
+		return nil, err
+	}
+	return b, nil
+}
+
+func GetDataList(tx *sqlx.Tx, sqlstr string, args []interface{}) ([]byte, error) {
+	row, err := tx.Queryx(sqlstr, args...)
+	if err != nil {
+		return nil, err
+	}
+	defer row.Close()
+	results, err := rows2mapObjects(row)
+	if err != nil {
+		return nil, err
+	}
+
+	b, err := json.Marshal(results)
+	return b, err
+}
+
+func rows2mapObjects(rows *sqlx.Rows) (resultsSlice []map[string]interface{}, err error) {
+	fields, err := rows.Columns()
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	for rows.Next() {
+		result, err := rows2mapObject(rows, fields)
+		if err != nil {
+			return nil, err
+		}
+		resultsSlice = append(resultsSlice, result)
+	}
+
+	return resultsSlice, nil
+}
+
+func rows2mapObject(rows *sqlx.Rows, fields []string) (resultsMap map[string]interface{}, err error) {
+	result := make(map[string]interface{})
+	scanResultContainers := make([]interface{}, len(fields))
+	for i := 0; i < len(fields); i++ {
+		var scanResultContainer interface{}
+		scanResultContainers[i] = &scanResultContainer
+	}
+	if err := rows.Scan(scanResultContainers...); err != nil {
+		return nil, err
+	}
+
+	for ii, key := range fields {
+		rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
+		//if row is null then ignore
+		if rawValue.Interface() == nil {
+			continue
+		}
+
+		if data, err := value2Object(&rawValue); err == nil {
+			result[key] = data
+		} else {
+			return nil, err // !nashtsai! REVIEW, should return err or just error log?
+		}
+
+	}
+	return result, nil
+}
+
+func value2Object(rawValue *reflect.Value) (data interface{}, err error) {
+	data, err = reflect2object(rawValue)
+	if err != nil {
+		return
+	}
+	return
+}
+
+func reflect2object(rawValue *reflect.Value) (value interface{}, err error) {
+	aa := reflect.TypeOf((*rawValue).Interface())
+	vv := reflect.ValueOf((*rawValue).Interface())
+	switch aa.Kind() {
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		value = vv.Int()
+	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+		value = vv.Uint()
+	case reflect.Float32, reflect.Float64:
+		value = vv.Float()
+	case reflect.String:
+		value = vv.String()
+	case reflect.Array, reflect.Slice:
+		switch aa.Elem().Kind() {
+		case reflect.Uint8:
+			data := rawValue.Interface().([]byte)
+			value = string(data)
+		default:
+			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+		}
+	// time type
+	case reflect.Struct:
+		if aa.ConvertibleTo(schemas.TimeType) {
+			value = vv.Convert(schemas.TimeType).Interface().(time.Time)
+		} else {
+			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+		}
+	case reflect.Bool:
+		value = vv.Bool()
+	case reflect.Complex128, reflect.Complex64:
+		value = vv.Complex()
+	/* TODO: unsupported types below
+	   case reflect.Map:
+	   case reflect.Ptr:
+	   case reflect.Uintptr:
+	   case reflect.UnsafePointer:
+	   case reflect.Chan, reflect.Func, reflect.Interface:
+	*/
+	default:
+		err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
+	}
+	return
+}

+ 15 - 0
apiserver/service/raise.go

@@ -0,0 +1,15 @@
+package service
+
+import (
+	"fmt"
+	"github.com/astaxie/beego/logs"
+)
+
+func syncRaise() {
+
+	err := s.d.DB.Exec("INSERT INTO feed_sum(\n\tpastureId,\n\tfeedDay,\n\tcowNum,\n\tsaleNum,\n   cowNumM\n)VALUES(\n?,?,?,?,?\n) " +
+		"ON DUPLICATE KEY UPDATE cowNum = ? ,saleNum = ?,cowNumM = ?").Error
+	if err != nil {
+		logs.Error(fmt.Sprintf("syncRaise-error: %s", err.Error()))
+	}
+}

+ 678 - 0
apiserver/service/report.go

@@ -0,0 +1,678 @@
+package service
+
+import (
+	"fmt"
+	"github.com/astaxie/beego/logs"
+	"github.com/pkg/errors"
+	"kpt.xdmy/apiserver/model"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//
+func MaintainList(pastureName, eqClassIdStr string, startTime, endTime time.Time, offset, pagecount int) (int, []map[string]interface{}, error) {
+
+	//eqClassIdList := []string{}
+
+	var total int64
+
+	eqList := make([]*model.EqClassAndPasture, 0)
+	//if eqClassIdStr == "" {
+	//eqList := make([]*model.EqClass, 0)
+	//s.d.DB.Raw()
+	s.d.DB.Raw("select e.id,p.id,e.typeName,p.name from eqclass e join  pasture p  where section = 3  "+
+		"and (p.name = ? or ? = '现代牧业' or  ?= '') and p.IsEnergy = 0  and p.name != '现代牧业'  and (e.id = ? or ?= '') limit ?,?",
+		pastureName, pastureName, pastureName, eqClassIdStr, eqClassIdStr, offset-1, pagecount).Find(&eqList)
+
+	s.d.DB.Raw("select count(1) from eqclass e join  pasture p  where section = 3  "+
+		"and (p.name = ? or ? = '现代牧业' or  ?= '') and p.IsEnergy = 0  and p.name != '现代牧业'  and (e.id = ? or ?= '') ",
+		pastureName, pastureName, pastureName, eqClassIdStr, eqClassIdStr).Count(&total)
+
+	//} else {
+	//	eqClassIdList = append(eqClassIdList, eqClassIdStr)
+	//	total = 1
+	//}
+
+	//pasture := new(model.Pasture)
+	//s.d.DB.Where("name = ?", pastureName).First(&pasture)
+
+	respMap := make([]map[string]interface{}, 0)
+
+	for _, eq := range eqList {
+		pastureMaintainList := make([]*model.Maintain, 0)
+		err := s.d.DB.Raw(` 	SELECT m.* FROM maintain m JOIN equipment e on e.id = m.eqId WHERE e.eqClassId = ? 
+ and m.stopTime is not null and (m.pastureid = (select id from pasture where name = ? and name != '现代牧业') or ? = '现代牧业' ) 
+  and m.stopTime between ? and ? 	and TIMESTAMPDIFF(hour, m.orderTime, m.stopTime) < 1000 order by requestTime,m.pastureid  `,
+			eq.EqClass.ID, eq.Pasture.Name, eq.Pasture.Name, startTime, endTime).Find(&pastureMaintainList).Error
+		if err != nil {
+			return 0, nil, errors.New(fmt.Sprintf("查看维修信息出错 error:%s", err.Error()))
+		}
+		maintainMap := make(map[string][]*model.Maintain)
+		pastureIDList := []string{}
+		for _, pasture := range pastureMaintainList {
+			pastureIDList = append(pastureIDList, pasture.PastureId)
+			maintainMap[pasture.PastureId] = append(maintainMap[pasture.PastureId], pasture)
+		}
+
+		eqClass := model.EqClass{}
+		err = s.d.DB.Where("id = ? ", eq.EqClass.ID).First(&eqClass).Error
+		if err != nil {
+			return 0, nil, errors.New("查询设备类别出错!!!")
+		}
+		pastureIDList = RemoveRepeatElement(pastureIDList)
+
+		for _, pastureId := range pastureIDList {
+			maintainList := maintainMap[pastureId]
+			count := float64(len(maintainList))
+			var t2, t3 float64
+			data := make(map[string]interface{}, 0)
+			mainMap := make(map[int64][]*model.Maintain, 0)
+			//将每个不同的资产分类放进map
+			eqIdList := []int64{}
+			for _, main := range maintainList {
+				eqIdList = append(eqIdList, main.EqId)
+				mainMap[main.EqId] = append(mainMap[main.EqId], main)
+			}
+
+			//var stopTime, orderTime, requestTime time.Time
+			eqIdList = uniqueArr(eqIdList)
+			for _, k := range eqIdList {
+				var stopTime, orderTime, requestTime time.Time
+				mainList := mainMap[k]
+				for i, main := range mainList {
+					if i == 0 {
+						//记录下维修结束时间方便下次计算t1
+						stopTime = main.StopTime
+						orderTime = main.OrderTime
+						requestTime = main.RequestTime
+						//每个资产第一次都根据筛选开始时间计算出t1
+						t2 += main.OrderTime.Sub(main.RequestTime).Hours()
+						t3 += main.StopTime.Sub(main.OrderTime).Hours()
+						//fmt.Println(main.StopTime, main.OrderTime, "111111")
+						//t1 += main.RequestTime.Sub(startTime).Minutes()
+					} else {
+						//t1 += main.RequestTime.Sub(stopTime).Minutes()
+						t2 += main.OrderTime.Sub(main.RequestTime).Hours()
+						t3 += main.StopTime.Sub(main.OrderTime).Hours()
+						//fmt.Println(main.StopTime, main.OrderTime, "22222222")
+						//记录下维修结束时间方便下次计算t1
+						stopTime = main.StopTime
+						orderTime = main.OrderTime
+						requestTime = main.RequestTime
+					}
+				}
+				if stopTime.Format("2006") == "0001" {
+					//如果还没有结束获取当前时间计算t1
+					if orderTime.Format("2006") == "0001" {
+						t2 += requestTime.Sub(time.Now()).Hours()
+					} else {
+						if time.Now().Unix() < endTime.Unix() {
+							t3 += time.Now().Sub(orderTime).Hours()
+						} else {
+							t3 += endTime.Sub(orderTime).Hours()
+						}
+					}
+				}
+			}
+
+			equipmentList := make([]*model.Equipment, 0)
+			err = s.d.DB.Where("id not in(?) ", eqIdList).
+				Where(" entranceDate < ?  and ( blockTime is null or blockTime = '' or blockTime > ? or blockTime = '0000-00-00 00:00:00'  ) "+
+					"and pastureid = ?  and eqClassId = ? ",
+					endTime, startTime, pastureId, eq.EqClass.ID).Find(&equipmentList).Error
+			if err != nil {
+				return 0, nil, errors.New(fmt.Sprintf("查询资产信息出错 error:%v", err))
+			}
+
+			day := ((endTime.Unix() - startTime.Unix()) / 60 / 60 / 24)
+
+			count1 := float64(len(mainMap))
+			allCount := (24 * (count1 + float64(len(equipmentList)))) * float64(day)
+			data["mtbf"] = FloatRound(allCount/count, 2)
+			data["mttr"] = FloatRound((t2+t3)/count, 2)
+			data["mttf"] = FloatRound((allCount-t2-t3)/count, 2)
+			data["count"] = count
+			data["eqClassId"] = eqClass.ID
+			pasture := model.Pasture{}
+			err := s.d.DB.Where("id = ? ", pastureId).First(&pasture).Error
+			if err != nil {
+				return 0, nil, errors.New("查询牧场信息出错!!!")
+			}
+			data["pastureId"] = pasture.ID
+			data["pastureName"] = pasture.Name
+			data["eqClassName"] = eqClass.TypeName
+			respMap = append(respMap, data)
+		}
+
+		exist := false
+		for _, p := range respMap {
+			if p["eqClassId"] != nil {
+				//str := strconv.Itoa(p["eqClassId"].(int))
+				if p["eqClassId"].(int) == eq.EqClass.ID && p["pastureId"].(int) == eq.Pasture.ID {
+					exist = true
+					break
+				}
+			}
+		}
+
+		if !exist {
+			data := make(map[string]interface{}, 0)
+			data["pastureName"] = pastureName
+			data["pastureId"] = eq.Pasture.ID
+			data["eqClassName"] = eqClass.TypeName
+			data["mtbf"] = 0
+			data["mttr"] = 0
+			data["mttf"] = 0
+			data["count"] = 0
+			data["eqClassId"] = eqClass.ID
+			respMap = append(respMap, data)
+		}
+		//}
+	}
+	return int(total), respMap, nil
+}
+
+func FloatRound(f float64, n int) float64 {
+	format := "%." + strconv.Itoa(n) + "f"
+	res, _ := strconv.ParseFloat(fmt.Sprintf(format, f), 64)
+	return res
+}
+
+func RemoveRepeatElement(list []string) []string {
+	// 创建一个临时map用来存储数组元素
+	temp := make(map[string]bool)
+	var list2 []string
+	index := 0
+	for _, v := range list {
+		// 遍历数组元素,判断此元素是否已经存在map中
+		_, ok := temp[v]
+		if !ok {
+			list2 = append(list2, v)
+			temp[v] = true
+		}
+		index++
+	}
+	return list2
+}
+
+func uniqueArr(arr []int64) []int64 {
+	newArr := make([]int64, 0)
+	tempArr := make(map[int64]bool, len(newArr))
+	for _, v := range arr {
+		if tempArr[v] == false {
+			tempArr[v] = true
+			newArr = append(newArr, v)
+		}
+	}
+	return newArr
+}
+
+func GetOversee(pastureId, eqClassId, empname string, offset, pagecount int) ([]map[string]interface{}, error) {
+	overseeList := make([]*model.Oversee, 0)
+	eq := s.d.DB.Where(" ( ? = '' or pastureid = ? )", pastureId, pastureId)
+	if eqClassId != "" {
+		eq.Where("eqClassId = ?", eqClassId)
+	}
+	if empname != "" {
+		eq.Where("maintenance like ?", "%"+empname+"%")
+	}
+	err := eq.Offset(offset).Limit(pagecount).Order("inputTime desc ").Find(&overseeList).Error
+	if err != nil {
+		logs.Error(err)
+		return nil, errors.New(fmt.Sprintf("查询督办数据出错 errors: %v", err))
+	}
+	userIds := []string{}
+	for _, oversee := range overseeList {
+		u := strings.Split(oversee.Maintenance, ",")
+		userIds = append(userIds, oversee.Levelone, oversee.Leveltwo, oversee.Levelthree, oversee.Entryperson)
+		userIds = append(userIds, u...)
+	}
+	userIds = RemoveRepeatElement(userIds)
+
+	userList := make([]*model.User, 0)
+	if len(userIds) > 0 {
+		err = s.d.DB.Raw(`	select u.id,u.username,u.empid,e.empname from  user u join emp  e  on e.empcode = u.username  where u.username in(?)`, userIds).Find(&userList).Error
+		if err != nil {
+			logs.Error(err)
+			return nil, errors.New(fmt.Sprintf("查询督办数据出错 errors: %v", err))
+		}
+	}
+
+	userMap := make(map[string]*model.User)
+	for _, user := range userList {
+		userMap[user.Username] = user
+	}
+
+	respOversee := make([]map[string]interface{}, 0)
+	for _, oversee := range overseeList {
+		arg := make(map[string]interface{})
+		arg["id"] = oversee.ID
+		arg["pastureName"] = oversee.PastureName
+		arg["pastureId"] = oversee.PastureId
+		arg["pushTime"] = oversee.PushTime
+		arg["inputTime"] = oversee.InputTime.Format("2006-01-02")
+		arg["departmentId"] = oversee.DepartmentId
+		arg["departmentName"] = oversee.DepartmentName
+		arg["eqClassName"] = oversee.EqClassName
+		arg["eqClassId"] = oversee.EqClassId
+		arg["entryperson"] = oversee.Entryperson
+		if _, ok := userMap[oversee.Entryperson]; ok {
+			arg["entrypersonName"] = userMap[oversee.Entryperson].EmpName
+			arg["entrypersonId"] = userMap[oversee.Entryperson].Username
+		}
+		arg["levelone"] = oversee.Levelone
+		if _, ok := userMap[oversee.Levelone]; ok {
+			arg["leveloneName"] = userMap[oversee.Levelone].EmpName
+			arg["leveloneId"] = userMap[oversee.Levelone].Username
+		}
+		arg["leveltwo"] = oversee.Leveltwo
+		if _, ok := userMap[oversee.Leveltwo]; ok {
+			arg["leveltwo"] = userMap[oversee.Leveltwo].EmpName
+			arg["leveltwoId"] = userMap[oversee.Leveltwo].Username
+		}
+		arg["levelthree"] = oversee.Levelthree
+		if _, ok := userMap[oversee.Levelthree]; ok {
+			arg["levelthree"] = userMap[oversee.Levelthree].EmpName
+			arg["levelthreeId"] = userMap[oversee.Levelthree].Username
+		}
+
+		maintenance := make([]map[string]interface{}, 0)
+		for _, u := range strings.Split(oversee.Maintenance, ",") {
+			main := make(map[string]interface{})
+			main["id"] = userMap[u].Username
+			main["empname"] = userMap[u].EmpName
+			maintenance = append(maintenance, main)
+		}
+		arg["maintenance"] = maintenance
+		respOversee = append(respOversee, arg)
+	}
+
+	return respOversee, nil
+}
+
+func StartStopRecord(pastureId, eqName string, startTime, endTime time.Time, offset, pagecount int) (map[string]interface{}, error) {
+	eqDb := s.d.DB.Where(" pastureid = ? or '' = ?  ", pastureId, pastureId)
+	if eqName != "" {
+		eqDb.Where("eqName = ? ", eqName)
+	}
+
+	eqList := make([]*model.Equipment, 0)
+	if offset > 0 || pagecount > 0 {
+		eqDb.Offset(offset).Limit(pagecount)
+	}
+	err := eqDb.Order("id").Find(&eqList).Error
+	if err != nil {
+		return nil, err
+	}
+
+	eqDb1 := s.d.DB.Table("equipment").Where(" pastureid = ? or '' = ?  ", pastureId, pastureId)
+	if eqName != "" {
+		eqDb1.Where("eqName = ? ", eqName)
+	}
+	var count int64
+	err = eqDb1.Count(&count).Error
+	if err != nil {
+		return nil, err
+	}
+
+	eqIDList := []int{}
+	for _, eq := range eqList {
+		eqIDList = append(eqIDList, eq.Id)
+	}
+
+	assetStt := make([]*model.AssetStt, 0)
+	err = s.d.DB.Raw(`select * from asset_stt ast  where ast.eqId in(?) 	and blockTime is not null  
+union all
+select t.* from (
+ select * from asset_stt ast  where ast.eqId in(?) 	and blockTime is null     order by enabledTime desc limit 999999999) t  group by t.eqid`, eqIDList, eqIDList).Find(&assetStt).Error
+	if err != nil {
+		return nil, err
+	}
+
+	dataList := make([]map[string]interface{}, 0)
+
+	pastureList := make([]*model.Pasture, 0)
+	err = s.d.DB.Where(" id = ? or ? = '' ", pastureId, pastureId).Order("id").Find(&pastureList).Error
+	if err != nil {
+		return nil, errors.New("查询牧场信息出错!!!")
+	}
+
+	for _, eq := range eqList {
+		arg := make(map[string]interface{})
+		arg["eqName"] = eq.EqName
+		var run float64
+		for _, asset := range assetStt {
+			if asset.EqId == int64(eq.Id) {
+				if asset.BlockTime.Format("2006") == "0001" {
+					if time.Now().Unix() > endTime.Unix() {
+						run += endTime.Sub(asset.EnabledTime).Minutes() / 60
+					} else {
+						run += time.Now().Sub(asset.EnabledTime).Minutes() / 60
+					}
+				} else {
+					run += asset.BlockTime.Sub(asset.EnabledTime).Minutes() / 60
+				}
+			}
+		}
+		t := endTime.Sub(startTime).Hours()
+		arg["eqCode"] = eq.EqCode
+		arg["run"] = FloatRound(run, 2)
+		arg["stop"] = FloatRound(t-run, 2)
+		for _, pasture := range pastureList {
+			if pasture.ID == eq.PastureId {
+				arg["pastureName"] = pasture.Name
+				break
+			}
+		}
+		arg["id"] = eq.Id
+		dataList = append(dataList, arg)
+	}
+
+	resp := make(map[string]interface{})
+	resp["total"] = count
+	resp["pageNum"] = offset
+	resp["pageSize"] = pagecount
+	resp["list"] = dataList
+	return resp, nil
+}
+
+func MaintainListPid(pastureName, eqClassId string, startTime, endTime time.Time, offset, pagecount int) (int, []map[string]interface{}, error) {
+	eqClassList1 := make([]*model.EqClass, 0)
+
+	start := (offset - 1) * pagecount
+	page := offset * pagecount
+	if eqClassId == "" {
+		err := s.d.DB.Where(" section = 2 ").Find(&eqClassList1).Error
+		if err != nil {
+			return 0, nil, errors.New(fmt.Sprintf("查看维修类型出错 error:%s", err.Error()))
+		}
+	} else {
+		n, _ := strconv.Atoi(eqClassId)
+		eqClassList1 = append(eqClassList1, &model.EqClass{ID: n})
+	}
+	pastureList := make([]*model.Pasture, 0)
+	err := s.d.DB.Select("id,name").Where(" name = ? or ? = '' or ?= '现代牧业' ", pastureName, pastureName, pastureName).Where("id != 18").Order("id").Find(&pastureList).Error
+	if err != nil {
+		return 0, nil, errors.New("查询牧场信息出错!!!")
+	}
+	respMap := make([]map[string]interface{}, 0)
+
+	pastureCount := len(pastureList)
+
+	n := 0
+	for i, eq1 := range eqClassList1 {
+		if len(respMap) >= pagecount {
+			continue
+		}
+		eqClassList := make([]*model.EqClass, 0)
+		err := s.d.DB.Where(" pid = ? ", eq1.ID).Find(&eqClassList).Error
+		if err != nil {
+			return 0, nil, errors.New(fmt.Sprintf("查看维修类型出错 error:%s", err.Error()))
+		}
+		n = n + pastureCount*(i+1)
+		if n >= (offset-1)*pagecount {
+			//if (start < (i+1)*pastureCount && start >= (i)*pastureCount) || (page >= (i)*pastureCount && page < (i+1)*pastureCount) {
+
+			eqClass := model.EqClass{}
+			err = s.d.DB.Where("id = ? ", eq1.ID).First(&eqClass).Error
+			if err != nil {
+				return 0, nil, errors.New("查询设备类别出错!!!")
+			}
+
+			eqClassMap := make(map[string]map[string]float64)
+			for _, pastureId := range pastureList {
+				eqClassMap[strconv.Itoa(pastureId.ID)] = make(map[string]float64)
+			}
+
+			for _, eq := range eqClassList {
+
+				pastureMaintainList := make([]*model.Maintain, 0)
+				err = s.d.DB.Raw(` 	SELECT m.eqId,m.pastureId,m.requestTime,m.orderTime,m.stopTime FROM maintain m JOIN equipment e on e.id = m.eqId WHERE e.eqClassid = ? 
+ and m.stopTime is not null and (m.pastureid = (select id from pasture where name = ? and name != '现代牧业') or ? = '现代牧业' or ?= '' ) 
+  and m.stopTime between ? and ? 	and TIMESTAMPDIFF(hour, m.orderTime, m.stopTime) < 1000 order by requestTime,m.pastureid  `,
+					eq.ID, pastureName, pastureName, pastureName, startTime, endTime).Find(&pastureMaintainList).Error
+				if err != nil {
+					return 0, nil, errors.New(fmt.Sprintf("查看维修信息出错 error:%s", err.Error()))
+				}
+				maintainMap := make(map[string][]*model.Maintain, 0)
+				pastureIDList := []string{}
+				for _, pasture := range pastureMaintainList {
+					pastureIDList = append(pastureIDList, pasture.PastureId)
+					maintainMap[pasture.PastureId] = append(maintainMap[pasture.PastureId], pasture)
+				}
+
+				pastureIDList = RemoveRepeatElement(pastureIDList)
+				for _, pastureId := range pastureIDList {
+					maintainList := maintainMap[pastureId]
+					count := float64(len(maintainList))
+					var t2, t3 float64
+					//data := make(map[string]interface{}, 0)
+					mainMap := make(map[int64][]*model.Maintain, 0)
+					//将每个不同的资产分类放进map
+					eqIdList := []int64{}
+					for _, main := range maintainList {
+						eqIdList = append(eqIdList, main.EqId)
+						mainMap[main.EqId] = append(mainMap[main.EqId], main)
+					}
+
+					//var stopTime, orderTime, requestTime time.Time
+					eqIdList = uniqueArr(eqIdList)
+					for _, k := range eqIdList {
+						var stopTime, orderTime, requestTime time.Time
+						mainList := mainMap[k]
+						for i, main := range mainList {
+							if i == 0 {
+								//记录下维修结束时间方便下次计算t1
+								stopTime = main.StopTime
+								orderTime = main.OrderTime
+								requestTime = main.RequestTime
+								//每个资产第一次都根据筛选开始时间计算出t1
+								t2 += main.OrderTime.Sub(main.RequestTime).Hours()
+								t3 += main.StopTime.Sub(main.OrderTime).Hours()
+								//fmt.Println(main.StopTime, main.OrderTime, "111111")
+								//t1 += main.RequestTime.Sub(startTime).Minutes()
+							} else {
+								//t1 += main.RequestTime.Sub(stopTime).Minutes()
+								t2 += main.OrderTime.Sub(main.RequestTime).Hours()
+								t3 += main.StopTime.Sub(main.OrderTime).Hours()
+								//fmt.Println(main.StopTime, main.OrderTime, "22222222")
+								//记录下维修结束时间方便下次计算t1
+								stopTime = main.StopTime
+								orderTime = main.OrderTime
+								requestTime = main.RequestTime
+							}
+						}
+						if stopTime.Format("2006") == "0001" {
+							//如果还没有结束获取当前时间计算t1
+							if orderTime.Format("2006") == "0001" {
+								t2 += requestTime.Sub(time.Now()).Hours()
+							} else {
+								if time.Now().Unix() < endTime.Unix() {
+									t3 += time.Now().Sub(orderTime).Hours()
+								} else {
+									t3 += endTime.Sub(orderTime).Hours()
+								}
+							}
+						}
+					}
+
+					equipmentList := make([]*model.Equipment, 0)
+					err = s.d.DB.Select("id").Where("id not in(?) ", eqIdList).
+						Where(" entranceDate < ?  and ( blockTime is null or blockTime = '' or blockTime > ? or blockTime = '0000-00-00 00:00:00'  ) "+
+							"and pastureid = ?  and eqClassId = ? ",
+							endTime, startTime, pastureId, eq.ID).Find(&equipmentList).Error
+					if err != nil {
+						return 0, nil, errors.New(fmt.Sprintf("查询资产信息出错 error:%v", err))
+					}
+
+					day := ((endTime.Unix() - startTime.Unix()) / 60 / 60 / 24)
+
+					count1 := float64(len(mainMap))
+					allCount := (24 * (count1 + float64(len(equipmentList)))) * float64(day)
+
+					eqClassMap[pastureId]["allCount"] += allCount
+					eqClassMap[pastureId]["count"] += count
+					eqClassMap[pastureId]["t2"] += t2
+					eqClassMap[pastureId]["t3"] += t3
+					//data["mtbf"] = FloatRound(allCount/count, 2)
+					//data["mttr"] = FloatRound((t2+t3)/count, 2)
+					//data["mttf"] = FloatRound((allCount-t2-t3)/count, 2)
+					//data["count"] = count
+					//pasture := model.Pasture{}
+					//err := s.d.DB.Where("id = ? ", pastureId).First(&pasture).Error
+					//if err != nil {
+					//	return nil, errors.New("查询牧场信息出错!!!")
+					//}
+					//data["pastureName"] = pasture.Name
+					//data["eqClassName"] = eqClass.TypeName
+					//respMap = append(respMap, data)
+				}
+			}
+			for n, item := range pastureList {
+				if len(respMap) >= pagecount {
+					break
+				} else if (i*pastureCount)+n < page && (i*pastureCount)+n >= start {
+					pastureId := strconv.Itoa(item.ID)
+					data := make(map[string]interface{})
+					data["pastureName"] = item.Name
+					data["pastureId"] = item.ID
+					data["eqClassName"] = eqClass.TypeName
+					data["eqId"] = eqClass.ID
+					if _, ok := eqClassMap[pastureId]["count"]; ok {
+						data["mtbf"] = FloatRound(eqClassMap[pastureId]["allCount"]/eqClassMap[pastureId]["count"], 2)
+						data["mttr"] = FloatRound((eqClassMap[pastureId]["t2"]+eqClassMap[pastureId]["t3"])/eqClassMap[pastureId]["count"], 2)
+						data["mttf"] = FloatRound((eqClassMap[pastureId]["allCount"]-eqClassMap[pastureId]["t2"]-eqClassMap[pastureId]["t3"])/eqClassMap[pastureId]["count"], 2)
+					}
+					data["count"] = eqClassMap[pastureId]["count"]
+					respMap = append(respMap, data)
+				}
+			}
+		}
+	}
+	return pastureCount * len(eqClassList1), respMap, nil
+}
+
+func MaintainListEquipment(pastureName, eqClassId string, startTime, endTime time.Time, offset, pageSize int, eqName string) (int64, []map[string]interface{}, error) {
+	pastureMaintainList := make([]*model.Maintain, 0)
+	err := s.d.DB.Raw(` 	SELECT m.* FROM maintain m JOIN equipment e on e.id = m.eqId WHERE e.eqClassId = ? 
+ and m.stopTime is not null and (m.pastureid = (select id from pasture where name = ? and name != '现代牧业') or ? = '现代牧业' ) 
+  and m.stopTime between ? and ? 	and TIMESTAMPDIFF(hour, m.orderTime, m.stopTime) < 1000 order by requestTime,m.pastureid  `,
+		eqClassId, pastureName, pastureName, startTime, endTime).Find(&pastureMaintainList).Error
+	if err != nil {
+		return 0, nil, errors.New(fmt.Sprintf("查看维修信息出错 error:%s", err.Error()))
+	}
+
+	maintainMap := make(map[string][]*model.Maintain)
+	eqid := []int64{}
+	for _, pasture := range pastureMaintainList {
+		eqid = append(eqid, pasture.EqId)
+		maintainMap[pasture.PastureId] = append(maintainMap[pasture.PastureId], pasture)
+	}
+
+	eqClass := model.EqClass{}
+	err = s.d.DB.Where("id = ? ", eqClassId).First(&eqClass).Error
+	if err != nil {
+		return 0, nil, errors.New("查询设备类别出错!!!")
+	}
+	//pastureIDList = RemoveRepeatElement(pastureIDList)
+	pastureList := make([]*model.Pasture, 0)
+	s.d.DB.Where("name = ?", pastureName).Find(&pastureList)
+
+	eqList := make([]*model.Equipment, 0)
+	err = s.d.DB.Where(" id in ? ", eqid).Where(" (pastureid = (select id from pasture where name = ? )  or ?='现代牧业') ", pastureName).Where(" ( eqName like concat('%',?,'%') or ?= '')", eqName, eqName).Offset(offset - 1).Limit(pageSize).Find(&eqList).Error
+	if err != nil {
+		return 0, nil, errors.New("查询设备出错!!!")
+	}
+
+	var total int64
+	s.d.DB.Table("equipment").Where(" id in ? ", eqid).Where(" (pastureid = (select id from pasture where name = ? )  )  or ?='现代牧业 ", pastureName).Where(" ( eqName like concat('%',?,'%') or ?= '')", eqName, eqName).Count(&total)
+
+	respMap := make([]map[string]interface{}, 0)
+	for _, p := range pastureList {
+		pastureId := strconv.Itoa(p.ID)
+		maintainList := maintainMap[pastureId]
+		//count := float64(len(maintainList))
+		var t2, t3 float64
+
+		mainMap := make(map[int64][]*model.Maintain, 0)
+		//将每个不同的资产分类放进map
+		//eqIdList := []int64{}
+		for _, main := range maintainList {
+			//eqIdList = append(eqIdList, main.EqId)
+			mainMap[main.EqId] = append(mainMap[main.EqId], main)
+		}
+
+		//var stopTime, orderTime, requestTime time.Time
+		//eqIdList = uniqueArr(eqIdList)
+		//for _, k := range eqIdList {
+
+		for _, eq := range eqList {
+			var stopTime, orderTime, requestTime time.Time
+			mainList := make([]*model.Maintain, 0)
+			if _, ok := mainMap[int64(eq.Id)]; ok {
+				mainList = mainMap[int64(eq.Id)]
+			}
+
+			for i, main := range mainList {
+				if i == 0 {
+					//记录下维修结束时间方便下次计算t1
+					stopTime = main.StopTime
+					orderTime = main.OrderTime
+					requestTime = main.RequestTime
+					//每个资产第一次都根据筛选开始时间计算出t1
+					t2 += main.OrderTime.Sub(main.RequestTime).Hours()
+					t3 += main.StopTime.Sub(main.OrderTime).Hours()
+					//fmt.Println(main.StopTime, main.OrderTime, "111111")
+					//t1 += main.RequestTime.Sub(startTime).Minutes()
+				} else {
+					//t1 += main.RequestTime.Sub(stopTime).Minutes()
+					t2 += main.OrderTime.Sub(main.RequestTime).Hours()
+					t3 += main.StopTime.Sub(main.OrderTime).Hours()
+					//fmt.Println(main.StopTime, main.OrderTime, "22222222")
+					//记录下维修结束时间方便下次计算t1
+					stopTime = main.StopTime
+					orderTime = main.OrderTime
+					requestTime = main.RequestTime
+				}
+			}
+			data := make(map[string]interface{}, 0)
+			if len(mainList) > 0 {
+
+				if stopTime.Format("2006") == "0001" {
+					//如果还没有结束获取当前时间计算t1
+					if orderTime.Format("2006") == "0001" {
+						t2 += requestTime.Sub(time.Now()).Hours()
+					} else {
+						if time.Now().Unix() < endTime.Unix() {
+							t3 += time.Now().Sub(orderTime).Hours()
+						} else {
+							t3 += endTime.Sub(orderTime).Hours()
+						}
+					}
+				}
+
+				day := ((endTime.Unix() - startTime.Unix()) / 60 / 60 / 24)
+
+				count1 := float64(len(mainList))
+				allCount := (24 * (count1 + 1)) * float64(day)
+				data["mtbf"] = FloatRound(allCount/count1, 2)
+				data["mttr"] = FloatRound((t2+t3)/count1, 2)
+				data["mttf"] = FloatRound((allCount-t2-t3)/count1, 2)
+				data["count"] = count1
+			} else {
+				data["mtbf"] = 0
+				data["mttr"] = 0
+				data["mttf"] = 0
+				data["count"] = 0
+			}
+			data["eqCode"] = eq.EqCode
+			data["eqName"] = eq.EqName
+			data["pastureId"] = pastureId
+			data["eqClassName"] = eqClass.TypeName
+			respMap = append(respMap, data)
+		}
+	}
+
+	return total, respMap, nil
+}

+ 168 - 0
apiserver/service/sap.go

@@ -0,0 +1,168 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"github.com/pkg/errors"
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+
+	"kpt.xdmy/pkg/util"
+)
+
+func (s *Service) AddSapLog(p http.SapDest, err error) {
+	b, e := util.Marshal(p)
+	if e != nil {
+		log.Error(e)
+		return
+	}
+	d := p.GetDest()
+	l := model.SapLog{
+		Url:       d.Url,
+		Name:      d.BussTp,
+		Status:    d.Status,
+		MsgText:   d.MessText,
+		Param:     string(b),
+		CreatedAt: time.Now(),
+	}
+	if err != nil {
+		l.Flag = 1
+	}
+	if e := s.d.DB.Create(&l).Error; e != nil {
+		log.Error(e)
+	} else {
+		log.Infof("create sap log:%s ", p.GetUrl())
+	}
+}
+
+func (s *Service) AddSapApiLog(req http.SapDest, resp interface{}, data interface{}, err error) {
+	r, e := util.Marshal(req)
+	if e != nil {
+		log.Error(e)
+		return
+	}
+	a, e := util.Marshal(resp)
+	if e != nil {
+		log.Error(e)
+		return
+	}
+	p, e := util.Marshal(data)
+	if e != nil {
+		log.Error(e)
+		return
+	}
+	q := req.GetDest()
+	respMap := make(map[string]interface{})
+	respbyte, _ := json.Marshal(resp)
+	respErr := json.Unmarshal(respbyte, &respMap)
+	if respErr != nil {
+		log.Error(respErr)
+		return
+	}
+	sp := respMap["DEST"].(map[string]interface{})
+	l := model.SapApiLog{
+		Url:       q.Url,
+		Name:      q.BussTp,
+		Request:   string(r),
+		Response:  string(a),
+		MsgText:   sp["MESS_TEXT"].(string),
+		Status:    sp["STATUS_OS"].(string),
+		Param:     string(p),
+		CreatedAt: time.Now(),
+	}
+	if err != nil {
+		l.Flag = 1
+	}
+	if e := s.d.DB.Create(&l).Error; e != nil {
+		log.Error(e)
+	} else {
+		log.Infof("create sap api log:%s ", q.GetUrl())
+	}
+}
+
+func (s *Service) AddSapTransferApiLog(req http.SapDest, resp *http.TransferResp, data interface{}, err error) {
+	r, e := util.Marshal(req)
+	if e != nil {
+		log.Error(e)
+		return
+	}
+	a, e := util.Marshal(resp)
+	if e != nil {
+		log.Error(e)
+		return
+	}
+	p, e := util.Marshal(data)
+	if e != nil {
+		log.Error(e)
+		return
+	}
+	q := req.GetDest()
+	sp := resp.Dest
+	l := model.SapApiLog{
+		Url:       q.Url,
+		Name:      q.BussTp,
+		Request:   string(r),
+		Response:  string(a),
+		MsgText:   sp.MessText,
+		Status:    sp.Status,
+		Param:     string(p),
+		CreatedAt: time.Now(),
+	}
+	if err != nil {
+		l.Flag = 1
+	}
+	//fmt.Println(time.Now())
+	if e := s.d.DB.Create(&l).Error; e != nil {
+		log.Error(e)
+	} else {
+		log.Infof("create sap api log:%s ", q.GetUrl())
+	}
+}
+
+func (s *Service) SyncSap(r http.SapDest, rp interface{}, data interface{}) (err error) {
+	fmt.Println(r, rp)
+	req, e := s.http.NewRequest("POST", r.GetUrl(), data)
+	if e != nil {
+		return errors.Wrapf(e, "SyncSap")
+	}
+	s.http.SetBasicAuth(req)
+
+	if err = s.http.Do(req, &rp); err != nil {
+		err = errors.Wrapf(err, "SyncSap")
+	}
+	s.AddSapApiLog(r, rp, data, err)
+	return
+}
+
+func (s *Service) SyncSapTransfer(r http.SapDest, rp interface{}, data interface{}) (err error) {
+	fmt.Println(r, rp)
+	req, e := s.http.NewRequest("POST", r.GetUrl(), data)
+	if e != nil {
+		return errors.Wrapf(e, "SyncSap")
+	}
+	s.http.SetBasicAuth(req)
+
+	if err = s.http.Do(req, &rp); err != nil {
+		err = errors.Wrapf(err, "SyncSap")
+	}
+
+	s.AddSapTransferApiLog(r, rp.(*http.TransferResp), data, e)
+
+	return
+}
+
+func (s *Service) SyncSrm(r http.SapDest, rp interface{}, data interface{}) (err error) {
+	req, e := s.http.NewRequest("POST", r.GetUrl(), data)
+	if e != nil {
+		return errors.Wrapf(e, "SyncSap")
+	}
+	s.http.SetSrmBasicAuth(req)
+
+	if err = s.http.Do(req, rp); err != nil {
+		err = errors.Wrapf(err, "SyncSap")
+	}
+	return
+}

+ 72 - 0
apiserver/service/service.go

@@ -0,0 +1,72 @@
+package service
+
+import (
+	"fmt"
+	"time"
+
+	"kpt.xdmy/apiserver/config"
+	"kpt.xdmy/apiserver/dao"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/pkg/http"
+	"kpt.xdmy/pkg/log"
+)
+
+// var s *Service
+
+var nch chan error
+
+type Service struct {
+	c    *config.Config
+	d    *dao.Dao
+	http *http.Client
+}
+
+func New(conf *config.Config) *Service {
+	c := http.NewClient(conf)
+	d := dao.New(conf)
+	model.ModelInit(d)
+	// SapJobInit()
+
+	s = &Service{
+		d:    d,
+		http: c,
+	}
+	return s
+}
+
+func (s *Service) queryDB(tname string, c interface{}, r interface{}) (err error) {
+	if err := s.d.DB.Table(tname).Where(c).Find(r).Error; err != nil {
+		err = log.Error("queryDB", err, c)
+	}
+	return
+}
+func (s *Service) insertDB(tname string, p interface{}) (err error) {
+	if err = s.d.DB.Table(tname).Create(p).Error; err != nil {
+		err = log.Error("insertDB "+tname, err, p)
+	}
+	return
+}
+func (s *Service) updateDB(tname string, c interface{}, r interface{}) (err error) {
+	if err = s.d.DB.Table(tname).Where(c).Updates(r).Error; err != nil {
+		err = log.Error("updateDB", err, r)
+	}
+	return
+}
+func (s *Service) RawDB(sql string, dest interface{}, c ...interface{}) (err error) {
+	err = s.d.DB.Raw(sql, c).Scan(&dest).Error
+	if err != nil {
+		err = log.Error("service RawDB", err, sql, c)
+	}
+	return
+}
+
+func (s *Service) Xorm() {
+	st := time.Now()
+	if r, e := s.d.DB.Raw("SELECT * FROM parts limit 3000").Rows(); e != nil {
+		fmt.Print(e)
+	} else {
+		r.Close()
+	}
+	log.Printf("xorm:%d", time.Now().Sub(st).Milliseconds())
+
+}

+ 118 - 0
apiserver/service/supplier.go

@@ -0,0 +1,118 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"kpt.xdmy/apiserver/config"
+	"time"
+
+	"github.com/pkg/errors"
+	log "github.com/sirupsen/logrus"
+
+	_ "github.com/go-sql-driver/mysql"
+
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+)
+
+var supplierChan chan error
+
+// 定时 从sap拉取供应商数据
+// 预留参数;时间、编码,提供给手动调用接口
+func (s *Service) SapSupplier(t time.Time, code string, pastureid int) {
+	supplierChan = make(chan error, 10)
+	r := new(http.SupplierReq)
+	rp := new(http.SupplierResp)
+	var e error
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "MM004"
+	//r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM004/QuerySupplier/"
+	r.Dest.Url = fmt.Sprintf("%s/Common/MM004/QuerySupplier/", config.Conf.Http.Routing)
+
+	if t.IsZero() {
+		t = time.Now()
+	}
+	r.Data.BudatB = t.Format("20060102")
+	r.Data.BudatE = t.Format("20060102")
+	//r.Data.BudatB = "20221004"
+	//r.Data.BudatE = "20221022"
+	//r.Data.CompanyCode = "1004"
+	r.Data.CompanyCode = code
+	r.Data.Types = []http.ZSORT{{Type: "设备"}, {Type: "服务类"}, {Type: "备品备件类"}, {Type: "工程类"}, {Type: "其他类"}}
+
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e = s.SyncSap(r, rp, rbyte); e == nil {
+		if rp.Dest.Status == "S" {
+			log.Infof("sap  supplier success :  mlen=%d", len(rp.Data.Master))
+		} else {
+			e = errors.Errorf("sap  supplier fail: %s", rp.Dest.MessText)
+		}
+	} else {
+		e = errors.Wrap(e, "sap supplier error:")
+	}
+	var update error
+	var count int
+	for _, v := range rp.Data.Master {
+		update = nil
+		s.updateProvider(&v)
+		update = <-supplierChan
+		if update != nil {
+			log.Error(update)
+			count++
+			l := model.SapDetailLog{Name: "supplier", Code: v.Code, ErrorText: update.Error()}
+			if e := s.d.DB.Create(&l); e != nil {
+				log.Errorf("add sapdetail log: %v", e)
+			}
+		}
+		// break
+	}
+	if e != nil {
+		log.Error(e)
+	} else if update != nil {
+		e = errors.Errorf("supplier update fail sum:%d", count)
+	} else {
+		log.Infof("supplier update success sum:%d", len(rp.Data.Master)-count)
+	}
+	s.AddSapLog(r, e)
+	return
+}
+
+// 更新供应商
+func (s *Service) updateProvider(sup *http.Supplier) {
+	pv := new(model.Provider)
+
+	if len(sup.UpDate) == 8 {
+		sup.UpDate = sup.UpDate[:4] + "-" + sup.UpDate[4:6] + "-" + sup.UpDate[6:]
+	}
+	if len(sup.UpTime) == 6 {
+		sup.UpTime = sup.UpTime[:2] + ":" + sup.UpTime[2:4] + ":" + sup.UpTime[4:]
+	}
+	if sup.UpTime != "" {
+		sup.UpDate = sup.UpDate + " " + sup.UpTime
+	}
+	if t, e := time.Parse("2006-01-02 15:04:05", sup.UpDate); e != nil {
+		supplierChan <- errors.Errorf("time parse  : %s, %s", sup.UpDate)
+	} else {
+		pv.ModifyTime = t
+	}
+	pv.ProviderIntro = sup.Name
+	pv.ProviderName = sup.ShortName
+	pv.ProviderNumber = sup.Code
+	pv.CompanyCode = sup.CompanyCode
+	pv.SortName = sup.ZSORT
+	pv.Linkman = sup.Contact
+	pv.Email = sup.Mail
+	pv.Telphone = sup.Phone
+	pv.SapCode = sup.Code
+	if sup.Dflag == "" {
+		pv.Enable = 1
+	}
+	fmt.Println(pv)
+	if e := s.d.DB.Where(model.Provider{SapCode: sup.Code}).Assign(pv).FirstOrCreate(&pv).Error; e != nil {
+		supplierChan <- errors.Wrapf(e, "provider update  failed:code =%s", sup.Code)
+	} else {
+		log.Infof("provider update succeeded:%s,%s,%s", sup.Code, sup.ShortName, sup.CompanyCode)
+		supplierChan <- nil
+	}
+}

+ 265 - 0
apiserver/service/transfer.go

@@ -0,0 +1,265 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	_ "github.com/go-sql-driver/mysql"
+	"github.com/jmoiron/sqlx"
+	log "github.com/sirupsen/logrus"
+	"kpt.xdmy/apiserver/config"
+	"strconv"
+	"time"
+
+	"github.com/pkg/errors"
+	"kpt.xdmy/apiserver/model"
+	"kpt.xdmy/apiserver/model/http"
+)
+
+// 定时每分钟读取已完成 未同步的的调拨单,同步到sap
+// 每个调拨单定时同步只进行一次
+func autoTransfer() {
+	bp := []model.BigPartTransfer{}
+	if e := s.d.DB.Raw(`select  b.* from bigparttransfer b join pasture p on b.pastureId = p.id  
+            where   CreatDate >='2022-11-01'  and  p.vendor = 1 and b.sapStatus =0  and b.statue = 1`).Find(&bp, model.BigPartTransfer{Statue: 1}).Error; e != nil {
+		log.Errorf("autoTransfer find :%v", e)
+		return
+	}
+	log.Infof("sap  transfer len=%d", len(bp))
+	//for _, v := range bp {
+	//err := SapTransfer(&v)
+	//TransferLog("auto", v.ApplyCode, err)
+	//}
+}
+
+// 手动同步调拨单到sap
+func ManualTransfer(bigPartTransferid float64, tx *sqlx.Tx) error {
+	bp := model.BigPartTransfer{}
+	//re := make(map[string]interface{})
+	//r := s.d.DB.Where("CreatDate >'2022-10-28'  ")
+	//if code != "" {
+	//	r = r.Where("applycode", code)
+	//}
+	//r = r.Find(&bp, model.BigPartTransfer{Statue: 1})
+	//if r.Error != nil {
+	//	log.Errorf("ManualTransfers find :%v", r.Error)
+	//	re["find"] = r.Error
+	//	return 0, re
+	//}
+	bigpartlaidByte, err := MapStr(tx, `select * from bigparttransfer where id = ? `, bigPartTransferid)
+	if err != nil {
+		log.Error(err)
+		return errors.New("无入库信息!!!")
+	}
+	if bigpartlaidByte != nil {
+		data := make(map[string]interface{})
+		err := json.Unmarshal(bigpartlaidByte, &data)
+		if err != nil {
+			log.Error(err)
+			return errors.New("入库详情转码出错!!!")
+		}
+		bp.ID, _ = strconv.Atoi(data["id"].(string))
+		t, err := time.Parse("2006-01-02T15:04:05", data["creatDate"].(string)[:len("2006-01-02 15:04:05")])
+		if err != nil {
+			log.Error(err)
+			return errors.New(fmt.Sprintf("入库详情转码出错 errors:%v", err))
+		}
+		bp.CreatDate = t
+		t1, err := time.Parse("2006-01-02T15:04:05", data["applyDate"].(string)[:len("2006-01-02 15:04:05")])
+		if err != nil {
+			log.Error(err)
+			return errors.New(fmt.Sprintf("入库详情转码出错 errors:%v", err))
+		}
+		bp.ApplyDate = t1
+		bp.InPastureID, _ = strconv.Atoi(data["inPastureId"].(string))
+		bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
+		bp.ApplyCode = data["applyCode"].(string)
+		bp.LaidCode = data["laidCode"].(string)
+	}
+
+	err = SapTransfer(&bp, tx)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// 调拨接口日志
+func TransferLog(c, code string, err error) {
+	m := make(map[string]interface{})
+	if err != nil {
+		err = errors.Wrap(err, code)
+		m["sapText"] = err.Error()
+		if c == "auto" {
+			m["sapStatus"] = 2
+		}
+	} else {
+		m["sapStatus"] = 1
+	}
+	if e := s.d.DB.Model(&model.BigPartTransfer{}).Where("applycode =?", code).Updates(m).Error; e != nil {
+		log.Errorf("BigPartTransfer update :%v", e)
+	}
+}
+func SapTransfer(bp *model.BigPartTransfer, tx *sqlx.Tx) error {
+	// 寄售(零库存)无调拨
+	r := new(http.TransferReq)
+
+	parts := []model.PartTransferStr{}
+	blaid := new(model.BigPartLaid)
+	inpa := new(model.Pasture)
+	outpa := new(model.Pasture)
+	//dp := new(model.Department)
+
+	//if e := s.d.DB.Find(&parts, model.PartTransfer{BigID: bp.ID}).Error; e != nil || len(parts) == 0 {
+	//	return errors.Wrapf(e, "parttarnsfer query bigid: %d", bp.ID)
+	//}
+	partsByte, err := GetDataList(tx, `select * from parttransfer  where bigid = ? `, []interface{}{bp.ID})
+	if err != nil {
+		log.Error(err)
+		return errors.New("无入库信息!!!")
+	}
+	if partsByte != nil {
+		err := json.Unmarshal(partsByte, &parts)
+		if err != nil {
+			log.Error(err)
+			return errors.New("入库信息转码出错!!!")
+		}
+	}
+
+	//fmt.Println(bp.LaidCode)
+	//if e := s.d.DB.First(blaid, model.BigPartLaid{LaidCode: bp.LaidCode}).Error; e != nil {
+	//	return errors.Wrapf(e, "bigpartlaid query laidcode: %s", bp.LaidCode)
+	//}
+
+	bigpartlaidByte, err := MapStr(tx, `select * from bigpartlaid where laidCode = ? `, bp.LaidCode)
+	if err != nil {
+		log.Error(err)
+		return errors.New("无入库信息!!!")
+	}
+	if bigpartlaidByte != nil {
+		data := make(map[string]interface{})
+		err := json.Unmarshal(bigpartlaidByte, &data)
+		if err != nil {
+			log.Error(err)
+			return errors.New("入库详情转码出错!!!")
+		}
+		blaid.ID, _ = strconv.Atoi(data["id"].(string))
+		t, err := time.Parse("2006-01-02T15:04:05", data["storageTime"].(string)[:len("2006-01-02 15:04:05")])
+		if err != nil {
+			log.Error(err)
+			return errors.New(fmt.Sprintf("入库详情转码出错 errors:%v", err))
+		}
+		blaid.StorageTime = t
+	}
+
+	if e := s.d.DB.First(inpa, model.Pasture{ID: bp.InPastureID}).Error; e != nil {
+		return errors.Wrapf(e, "pasture :id=%d", bp.InPastureID)
+	}
+	if e := s.d.DB.First(outpa, model.Pasture{ID: bp.PastureID}).Error; e != nil {
+		return errors.Wrapf(e, "pasture :id=%d", bp.PastureID)
+	}
+	//if e := s.d.DB.First(dp, model.Department{ID: bp.DeptId}).Error; e != nil {
+	//	return errors.Wrapf(e, "pasture :id=%d", bp.DeptId)
+	//}
+
+	r.Dest.DestID = "EQMAN"
+	r.Dest.BussTp = "MM012"
+	//r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM012/TransferStock"
+	r.Dest.Url = fmt.Sprintf("%s/Common/MM012/TransferStock", config.Conf.Http.Routing)
+
+	r.Data.OrderDate = bp.CreatDate.Format("20060102")
+	r.Data.PostDate = bp.ApplyDate.Format("20060102")
+	r.Data.TransferCode = bp.ApplyCode
+	r.Data.Group = inpa.PurchasingGroup
+	// r.Data.Group = inpa.PurchasingGroup //"B11"
+
+	for i, v := range parts {
+		detail := new(http.TransferDetail)
+		outStock := new(model.PartRepertory)
+		pslaid := new(model.PartLaidStr)
+		//inw := new(model.Warehouse)
+		c := new(model.Contract)
+		bc := new(model.BigContract)
+
+		if e := s.d.DB.Where(" id = ?", v.PartRepID).First(outStock).Error; e != nil {
+			return errors.Wrapf(e, "partrepertory query :id=%d", v.PartRepID)
+		}
+		bigpartlaidByte, err := MapStr(tx, `select * from partlaid where bigid = ? and partid = ? `, blaid.ID, v.PartID)
+		if err != nil {
+			log.Error(err)
+			return errors.New("无入库信息!!!")
+		}
+		if bigpartlaidByte != nil {
+			err := json.Unmarshal(bigpartlaidByte, &pslaid)
+			if err != nil {
+				log.Error(err)
+				return errors.New("入库详情转码出错!!!")
+			}
+
+		}
+
+		//if e := s.d.DB.First(inw, model.Warehouse{ID: pslaid.LocationID}).Error; e != nil {
+		//	return errors.Wrapf(e, "warehouse query :id=%d", pslaid.LocationID)
+		//}
+		if outStock.ContractID > 0 {
+			// if e := s.d.DB.Table("BigContract").Select("BigContract.IsZeroStock ").Joins("join Contract c on c.bigid =BigContract.id").
+			// 	Where("c.id  =?", outStock.ContractID).First(bc).Error; e != nil {
+			// 	return errors.Wrapf(e, "BigContract IsZeroStock  :id=%d", outStock.ContractID)
+			// }
+			if e := s.d.DB.First(c, model.Contract{ID: outStock.ContractID}).Error; e != nil {
+			}
+			if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
+				return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID)
+			}
+			if bc.IsZeroStock == 1 {
+				return errors.New("寄售无调拨")
+			}
+		}
+		if v.RowNumber != nil {
+			if v.RowNumber.(float64) > 0 {
+				detail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
+			} else {
+				detail.RowNumber = fmt.Sprintf("%d", (i + 1))
+			}
+		} else {
+			detail.RowNumber = fmt.Sprintf("%d", (i + 1))
+		}
+		detail.MaterialCode = v.PartCode.(string)
+		detail.Quantity = v.Amount.(string)
+		detail.Unit = v.Unit.(string)
+		detail.Per = "1"
+		detail.DeliverDate = blaid.StorageTime.Format("20060102")
+		detail.OutFactory = outpa.FactoryCode
+		detail.InFactory = inpa.FactoryCode
+		detail.NetPrice = outStock.Price
+		detail.OutLocation = "1004"
+		detail.InLocation = "1004"
+		r.Data.Detail = append(r.Data.Detail, *detail)
+		_, err = tx.Exec(` update parttransfer set rowNumber = ? where id = ? `, detail.RowNumber, v.ID)
+		if err != nil {
+			log.Error(err)
+			return errors.New("修改调拨行号出错!!!")
+		}
+	}
+	rp := new(http.TransferResp)
+
+	rbyte, _ := json.Marshal(r)
+	fmt.Println(string(rbyte))
+	if e := s.SyncSapTransfer(r, rp, rbyte); e != nil {
+		log.Info(r)
+		s.AddSapLog(r, e)
+		return errors.Wrapf(e, "transfer error:%v")
+	} else {
+		s.AddSapLog(r, e)
+		if rp.Dest.Status == "S" {
+			log.Printf("transfer success:%s,%s", rp.Data.Proof.EqTransferCode, rp.Data.Proof.ProofCode)
+			_, err = tx.Exec(` update bigparttransfer set ProofCode = ?,sapStatus = 1 where id = ? `, rp.Data.Proof.ProofCode, bp.ID)
+			if err != nil {
+				log.Error(err)
+				//return errors.New("修改调拨状态出错!!!")
+			}
+			return nil
+		} else {
+			return errors.New(fmt.Sprintf("tranfer fail: %s", rp.Dest.MessText))
+		}
+	}
+}

+ 29 - 0
apiserver/service/user_service/user.go

@@ -0,0 +1,29 @@
+package user_service
+
+import (
+	"github.com/casbin/casbin"
+	"kpt.xdmy/apiserver/routers/restful"
+	"kpt.xdmy/pkg/util"
+)
+
+type User struct {
+	ID       int
+	Username string
+	Password string
+	Fullname string
+	Deptid   int
+	Role     int
+
+	CreatedBy  string
+	ModifiedBy string
+
+	PageNum  int
+	PageSize int
+
+	Enforcer *casbin.Enforcer `inject:""`
+}
+
+func (a *User) Check() (bool, error) {
+	return restful.CheckUser(a.Username, util.EncodeMD5(a.Password))
+
+}

+ 3 - 0
bk/bat/arm.bat

@@ -0,0 +1,3 @@
+set GOARCH=arm
+set GOOS=linux
+go build -o KPTAdminARM

+ 1 - 0
bk/bat/doc.bat

@@ -0,0 +1 @@
+swag init

+ 3 - 0
bk/bat/linux64.bat

@@ -0,0 +1,3 @@
+set GOARCH=amd64
+set GOOS=linux
+go build -o KPTAdmin

+ 3 - 0
bk/bat/win32.bat

@@ -0,0 +1,3 @@
+set GOARCH=386
+set GOOS=windows
+go build -o KPTAdmin32.exe

+ 4 - 0
bk/bat/win64.bat

@@ -0,0 +1,4 @@
+set GOARCH=amd64
+set GOOS=windows
+go clean
+go build -o KPTAdmin64.exe

BIN
bk/browse/dist0624/.DS_Store


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
bk/browse/dist0624/datas/myMap.json


BIN
bk/browse/dist0624/favicon.ico


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
bk/browse/dist0624/index.html


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
bk/browse/dist0624/static/css/app.1c97fb9d.css


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
bk/browse/dist0624/static/css/chunk-elementUI.45ab9bc1.css


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
bk/browse/dist0624/static/css/chunk-libs.2e418612.css


BIN
bk/browse/dist0624/static/fonts/element-icons.535877f5.woff


BIN
bk/browse/dist0624/static/fonts/element-icons.732389de.ttf


BIN
bk/browse/dist0624/static/img/1.1ddf085a.png


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно