package main
import (
"encoding/csv"
"fmt"
"io"
// "sort"
// "io"
"net/http"
"encoding/json"
"strconv"
"io/ioutil"
"time"
"database/sql"
"strings"
_ "github.com/LukeMauldin/lodbc"
_ "github.com/denisenkom/go-mssqldb"
_ "github.com/mattn/go-adodb"
"pp/ModulePath"
"os"
"sync"
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
_ "github.com/mattn/go-sqlite3"
uuid "github.com/satori/go.uuid"
//_ "net/http/pprof"
// "runtime"
// "github.com/shopspring/decimal"
// "github.com/tealeg/xlsx"
)
/*
go-adodb ---cache leak
github.com/weigj/go-odbc ---查询处理特殊字符有问题
github.com/alexbrainman/odbc ---sqlserver读取汉字乱码(编码格式没有转换)
*/
func testAdo() {
var conf []string
var db *sql.DB
var err error
conf = append(conf, "Provider=SQLOLEDB")
conf = append(conf, "Data Source=127.0.0.1,1433") // sqlserver IP 和 服务器名称
conf = append(conf, "Initial Catalog=WellNameInformation") // 数据库名
conf = append(conf, "user id=sa") // 登陆用户名
conf = append(conf, "password=lh123456") // 登陆密码
fmt.Println(strings.Join(conf, ";"))
db, err = sql.Open("adodb", strings.Join(conf, ";"))
if err != nil {
fmt.Println("sql open:", err)
return
} else {
}
defer db.Close()
beginTime := time.Now()
// 执行SQL语句
rows, err := db.Query("select [6506] from [AUTHINFO] order by ID")
if err != nil {
fmt.Println("query: ", err)
return
}
for rows.Next() {
var id float32
rows.Scan(&id)
fmt.Println("id: ", id)
}
defer rows.Close()
fmt.Println(fmt.Sprintf("use time:%v", (time.Now().UnixNano()-beginTime.UnixNano())/1e6))
}
// 2008是要升级sqlserver数据库的补丁的,不建议使用。
func testMssqldb() {
var server = "127.0.0.1"
port := 1433
var user = "sa"
var password = "lh123456"
var database = "WellNameInformation"
//连接字符串
connString := fmt.Sprintf("server=%s;port%d;database=%s;user id=%s;password=%s", server, port, database, user, password)
fmt.Println(connString)
//建立连接
db, err := sql.Open("mssql", connString)
if err != nil {
fmt.Println("Open Connection failed:", err.Error())
}
defer db.Close()
//通过连接对象执行查询
rows, err := db.Query(`select ID from WellInformation order by ID`)
if err != nil {
fmt.Println("Query failed:", err.Error())
return
}
defer rows.Close()
for rows.Next() {
var id int64
rows.Scan(&id)
fmt.Printf("id: %d \n", id)
}
}
func testOdbc() {
conn, err := sql.Open("odbc", "driver={SQL Server};SERVER=127.0.0.1;UID=sa;PWD=lh123456?;DATABASE=WellNameInformation")
if err != nil {
fmt.Println("Connecting Error", err.Error())
return
} else {
fmt.Println("connect success!")
}
defer conn.Close()
beginTime := time.Now()
stmt, err := conn.Prepare("select ID from [WellNameInformation].[dbo].[WellInformation] order by ID")
if err != nil {
fmt.Println("Query Error", err)
return
}
defer stmt.Close()
row, err := stmt.Query()
if err != nil {
fmt.Println("Query Error", err)
return
}
defer row.Close()
cnt := 0
for row.Next() {
var id int
if err := row.Scan(&id); err == nil {
//fmt.Println(id)
cnt++
}
}
fmt.Println("record len:", cnt)
fmt.Println(fmt.Sprintf("use time:%v", (time.Now().UnixNano()-beginTime.UnixNano())/1e6))
fmt.Printf("%s\n", "finish")
return
}
var (
server string
port int
user string
password string
database string
sqlConn *sql.DB
//odbcConn *sql.DB
//user
refreshSpan int64
ExpireTimeSpan time.Duration
modelePath string
mu sync.Mutex
p_lock sync.Mutex
p_import_f int
process_lock sync.Mutex
process_lock_n int
ma_plan_lock sync.Mutex
ma_plan_lock_n int
g_time_format string = "2006-01-02 15:04:05"
g_date_format string = "2006-01-02"
approve_m_lock sync.Mutex
approve_m_lock_n int
material_map map[string]material_info
ch_material_notify chan int
g_material_maxid int
)
func initLog() {
beego.BeeLogger.DelLogger("console")
var err error
modelePath, err = ModulePath.GetModuleCurrentPath()
if err != nil {
fmt.Println("ModulePath.GetModuleCurrentPath() failed err:", err.Error())
return
}
fmt.Println("modelePath:", modelePath)
config := make(map[string]interface{})
config["filename"] = modelePath + string("/logs/ma.log")
config["level"] = 7
config["maxlines"] = 0
config["maxsize"] = 50 * 1024 * 1024 //50M
config["daily"] = true
config["maxdays"] = 10
configJsonStr, err := json.Marshal(config)
if err != nil {
fmt.Println("package main init json.Marshal(config) failed,err:", err.Error())
os.Exit(-1)
}
logs.SetLogger(logs.AdapterFile, string(configJsonStr))
}
func initSqlPool(driverType string) {
if driverType == "ado" {
var conf []string
var err error
conf = append(conf, "Provider=SQLOLEDB")
conf = append(conf, fmt.Sprintf("Data Source=%s,%d", server, port)) // sqlserver IP 和 服务器名称
conf = append(conf, fmt.Sprintf("Initial Catalog=%s", database)) // 数据库名
conf = append(conf, fmt.Sprintf("user id=%s", user)) // 登陆用户名
conf = append(conf, fmt.Sprintf("password=%s", password)) // 登陆密码
fmt.Println(strings.Join(conf, ";"))
sqlConn, err = sql.Open("adodb", strings.Join(conf, ";"))
if err != nil {
fmt.Println("sql open:", err.Error())
os.Exit(0)
} else {
fmt.Println("connect success!")
}
} else {
// dataSource := fmt.Sprintf("driver={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s", server, user, password, database)
// fmt.Println(dataSource)
// var err error
// sqlConn, err = sql.Open("lodbc", dataSource)
// if err != nil {
// fmt.Println("sql open:", err.Error())
// os.Exit(0)
// } else {
// logs.Info("connect success!")
// }
dataSource := fmt.Sprintf(
"server=%s;user id=%s;password=%s;database=%s;port=%d;encrypt=disable;TrustServerCertificate=true",
server, // 仅服务器 IP 或域名(不包含端口)
user,
password,
database,
port, // 端口通过 port 参数单独指定
)
fmt.Println("lalalalala", dataSource)
var err error
// sqlConn, err = sql.Open("lodbc", dataSource)
// sqlConn, err = sql.Open("odbc", dataSource)
sqlConn, err = sql.Open("sqlserver", dataSource)
if err = sqlConn.Ping(); err != nil {
fmt.Println("sql open:", err.Error())
os.Exit(0)
} else {
logs.Info("connect success!")
}
}
sqlConn.SetMaxOpenConns(10)
sqlConn.SetMaxIdleConns(3)
}
func getConn(db string) (conn *sql.DB, err error) {
var conf []string
conf = append(conf, "Provider=SQLOLEDB")
conf = append(conf, fmt.Sprintf("Data Source=%s,%d", server, port)) // sqlserver IP 和 服务器名称
conf = append(conf, fmt.Sprintf("Initial Catalog=%s", db)) // 数据库名
conf = append(conf, fmt.Sprintf("user id=%s", user)) // 登陆用户名
conf = append(conf, fmt.Sprintf("password=%s", password)) // 登陆密码
//fmt.Println(strings.Join(conf, ";"))
conn, err = sql.Open("adodb", strings.Join(conf, ";"))
if err != nil {
fmt.Println("sql open:", err.Error())
logs.Error("sql open:", err.Error())
return
}
conn.SetMaxIdleConns(1)
conn.SetMaxOpenConns(2)
return
}
func getOdbcConn(db string) (conn *sql.DB, err error) {
dataSource := fmt.Sprintf("driver={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s", server, user, password, db)
fmt.Println(dataSource)
conn, err = sql.Open("lodbc", dataSource)
if err != nil {
logs.Error("sql open:", err.Error())
return
}
conn.SetMaxOpenConns(2)
conn.SetMaxIdleConns(1)
return
}
func init() {
refreshSpan = 5 //5s
ExpireTimeSpan = time.Second * 25
initLog()
server = beego.AppConfig.String("server")
port, _ = beego.AppConfig.Int("port")
user = beego.AppConfig.String("user")
password = beego.AppConfig.String("password")
database = beego.AppConfig.String("database")
initSqlPool("odbc")
material_map = make(map[string]material_info, 10000)
ch_material_notify = make(chan int, 100)
}
func sync_material_map_ex() {
resp := get_material_data_by_maxid(g_material_maxid)
//fmt.Println(resp)
for i := 0; i < len(resp.Data); i++ {
v := resp.Data[i]
material_map[v.Code] = v
}
//fmt.Println("物料", material_map)
}
func sync_material_map() {
var req get_material_req
req.Index = 1
req.Count = 1000000
resp := get_material_data(req, true)
//fmt.Println(resp)
for i := 0; i < len(resp.Data); i++ {
v := resp.Data[i]
material_map[v.Code] = v
}
//fmt.Println("物料", material_map)
}
func sync_material_map_G() {
tick := time.NewTicker(time.Hour * 1)
fmt.Println("sync_material_map_G collect begin")
sync_material_map()
fmt.Println("sync_material_map_G collect end")
for {
select {
case <-tick.C:
sync_material_map()
case <-ch_material_notify:
sync_material_map()
default:
time.Sleep(time.Second * 1)
}
}
}
func sync_plan_empty_price() {
sel_sql := fmt.Sprintf(`select [ID],[data] FROM [plan] order by [ID] desc`)
rows, err := sqlConn.Query(sel_sql)
if err != nil {
logs.Error(fmt.Sprintf(`sync_plan_empty_price err:%s`, err.Error()))
}
for rows.Next() {
var s string
var id int
var d pp_plan
if err = rows.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &d)
if d.Price == "" {
for k, v := range material_map {
if strings.Contains(k, d.Code) {
d.Name = v.Name
d.Specs = v.Spec
d.Unit = v.Unit
d.Price = v.Price
d.Payment_type = v.Payment_type
d.Purchasing_cycle = v.Procurement_cycle
d.Supplier = v.Supplier
d.Factory = v.Factory
d.Factory_code = v.Factory_code
d.Qs = v.Qs
d.As = v.As
js_data, _ := json.Marshal(d)
update_sql := fmt.Sprintf(`UPDATE [plan] SET [data] = '%s' WHERE [ID] = %d`, string(js_data), id)
fmt.Println(update_sql)
sqlConn.Exec(update_sql)
}
}
}
}
}
rows.Close()
}
func main() {
go checkFileExpired()
go sync_material_map_G()
http.HandleFunc("/test", test)
http.HandleFunc("/pp/login", Login)
http.HandleFunc("/pp/loginOut", LoginOut)
http.HandleFunc("/pp/refreshUser", refreshUser)
http.HandleFunc("/pp/getMenu", getMenu)
http.HandleFunc("/pp/getUsers", getUsers)
http.HandleFunc("/pp/postUser", postUser)
http.HandleFunc("/pp/download_file", download_file)
http.HandleFunc("/pp/import_ma_plan", import_ma_plan)
http.HandleFunc("/pp/get_ma_plan", get_ma_plan)
http.HandleFunc("/pp/update_ma_plan_ex", update_ma_plan_ex)
http.HandleFunc("/pp/remove_ma_plan", remove_ma_plan)
http.HandleFunc("/pp/export_ma_plan", export_ma_plan)
http.HandleFunc("/pp/get_p_id_options", get_p_id_options)
http.HandleFunc("/pp/get_p_name", get_p_name)
http.HandleFunc("/pp/get_ma_username", get_ma_username)
http.HandleFunc("/pp/cal_completion_date", cal_completion_date)
http.HandleFunc("/pp/get_material", get_material)
http.HandleFunc("/pp/get_approve_m", get_approve_m)
http.HandleFunc("/pp/import_approve_m", import_approve_m)
http.HandleFunc("/pp/del_approve", del_approve)
http.HandleFunc("/pp/approve_ok", approve_ok)
http.HandleFunc("/pp/get_payment", get_payment)
http.HandleFunc("/pp/update_payment", update_payment)
http.HandleFunc("/pp/get_single_plan", get_single_plan)
http.HandleFunc("/pp/get_payment_by_id", get_payment_by_id)
http.HandleFunc("/pp/mul_update_pp_plan_num", mul_update_pp_plan_num)
http.HandleFunc("/pp/export_ma_temp_plan", export_ma_temp_plan)
http.HandleFunc("/pp/update_user_buyer", update_user_buyer)
http.HandleFunc("/pp/export_plan", export_plan)
http.HandleFunc("/pp/get_warning_plan", get_warning_plan)
http.HandleFunc("/pp/upload_ds_file", upload_ds_file)
http.HandleFunc("/pp/download_ds_file", download_ds_file)
http.HandleFunc("/pp/del_material", remove_material)
http.HandleFunc("/pp/import_sp_1", import_sp_1)
http.HandleFunc("/pp/get_sp_1", get_sp_1)
http.HandleFunc("/pp/update_sp_1", update_sp_1)
http.HandleFunc("/pp/remove_sp_1", remove_sp_1)
http.HandleFunc("/pp/mul_sp_1", mul_sp_1)
http.HandleFunc("/pp/upload_sp_1_file", upload_sp_1_file)
http.HandleFunc("/pp/download_sp_1_file", download_sp_1_file)
http.HandleFunc("/pp/get_sp_2", get_sp_2)
http.HandleFunc("/pp/update_sp_2", update_sp_2)
http.HandleFunc("/pp/mul_sp_2", mul_sp_2)
http.HandleFunc("/pp/mul_payment_application", mul_payment_application)
http.HandleFunc("/pp/mul_contract_approval", mul_contract_approval)
http.HandleFunc("/pp/del_contract_file", del_contract_file)
http.HandleFunc("/pp/upload_sp_2_file", upload_sp_2_file)
http.HandleFunc("/pp/download_sp_2_file", download_sp_2_file)
http.HandleFunc("/pp/del_contract_ex_file", del_contract_ex_file)
// http.HandleFunc("/pp/get_sp_by_id", get_sp_by_id)
//http.HandleFunc("/pp/get_sp2_by_id", get_sp2_by_id)
http.HandleFunc("/pp/search_plan_by_code", search_plan_by_code)
http.HandleFunc("/pp/export_plan_by_code", export_plan_by_code)
http.HandleFunc("/pp/export_warning_plan", export_warning_plan)
//监听服务
fmt.Println("listen server ...")
err := http.ListenAndServe("0.0.0.0:8874", nil)
if err != nil {
fmt.Println("服务器错误")
}
}
// 删除正式合同
func del_contract_ex_file(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("del_contract_ex_file recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req update_sp_2_req
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
update_sql := fmt.Sprintf(`UPDATE [sp_2]
SET [contract_name] = ''
WHERE ID=%d`, req.Plan.ID)
//fmt.Println(update_sql)
_, err := sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`del_contract_ex_file err:%s`, err.Error()))
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
base_file_path := modelePath + "/file/sp_1_ex/"
os.Remove(base_file_path + req.Plan.Contract_name)
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("del_contract_ex_file recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 下载文件
func download_sp_2_file(rw http.ResponseWriter, r *http.Request) {
//获取请求参数
/*var req download_file_req
reqdata, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(reqdata, &req)
fn := req.Filename*/
id := r.FormValue("id")
base_file_path := modelePath + "/file/sp_1_ex/"
sel_sql := fmt.Sprintf(`select [contract_name] from [sp_2] where ID=%s`, id)
fmt.Println(sel_sql)
rows, err := sqlConn.Query(sel_sql)
if err == nil {
var contract_name string
for rows.Next() {
if err = rows.Scan(&contract_name); err == nil {
}
}
rows.Close()
if contract_name != "" {
filename := strings.ReplaceAll(contract_name, `#`, "")
if filename != "" {
//设置响应头
header := rw.Header()
header.Add("Content-Type", "application/octet-stream")
//header.Add("Content-Disposition", "attachment;filename="+fn)
//使用ioutil包读取文件
filepath := base_file_path + filename
fmt.Println(filepath)
b, _ := ioutil.ReadFile(filepath)
//写入到响应流中
rw.Write(b)
}
}
}
}
// 上传文件
func upload_sp_2_file(w http.ResponseWriter, r *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("upload_sp_2_file recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var resp upload_resp
var f *os.File
var err error
var sqlstr string
//配置文件读取
base_file_path := modelePath + "/file/sp_1_ex/"
r.ParseMultipartForm(32 << 20)
id, _ := strconv.Atoi(r.Form.Get("id"))
//fmt.Println("id:", id)
// file_type := r.Form.Get("file_type")
//读取文件信息
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
defer file.Close()
fmt.Println(handler.Filename)
//logs.Info(base_file_path + handler.Filename)
filename := strings.ReplaceAll(handler.Filename, `#`, ``)
if filename == "" {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
os.Remove(base_file_path + filename)
f, err = os.OpenFile(base_file_path+filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
defer f.Close()
io.Copy(f, file)
sqlstr = fmt.Sprintf(`UPDATE [sp_2]
SET [contract_name] = '%s'
where ID=%d`, handler.Filename, id)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("upload_sp_2_file exec err:%v", err.Error()))
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("upload_sp_2_file recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 删除草稿合同
func del_contract_file(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("del_contract_file recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req update_sp_1_req
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
update_sql := fmt.Sprintf(`UPDATE [sp_1]
SET [contract_name] = ''
WHERE ID=%d`, req.Plan.ID)
//fmt.Println(update_sql)
_, err := sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_sp_1 err:%s`, err.Error()))
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
base_file_path := modelePath + "/file/sp_1/"
os.Remove(base_file_path + req.Plan.Contract_name)
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("del_contract_file recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 合同审批请求
func mul_contract_approval(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("mul_contract_approval recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req mul_update_pp_plan_num_req
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
var data []sp_1
//Contract_id_map := make(map[string]int)
for i := 0; i < len(req.Plan); i++ {
if req.Plan[i].Flag == "1" || req.Plan[i].Flag == "3" {
v := req.Plan[i]
var sp1_data sp_1
sp1_data.ID = v.ID
sp1_data.Amount = v.Total_p
sp1_data.Applicant = req.OpUser
sp1_data.Contract_id = v.Contract_id
sp1_data.Rdm = v.RDM
sp1_data.State = "待审批"
sp1_data.Supplier = v.Supplier
sp1_data.Time = time.Now().Format(g_date_format)
data = append(data, sp1_data)
/*
if index, ok := Contract_id_map[v.Contract_id]; ok {
data[index] = sp1_data
} else {
data = append(data, sp1_data)
Contract_id_map[v.Contract_id] = len(data) - 1
}
*/
}
}
for i := 0; i < len(data); i++ {
v := data[i]
del_sql := fmt.Sprintf(`delete from [sp_1] where [ID] =%d `, v.ID)
fmt.Println(del_sql)
sqlConn.Exec(del_sql)
insert_sql := fmt.Sprintf(`INSERT INTO [dbo].[sp_1]
([ID],[supplier]
,[applicant]
,[time]
,[contract_id]
,[contract_name]
,[contract_name_ex]
,[rdm]
,[amount]
,[state])
VALUES
(%d,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s')`, v.ID, v.Supplier, v.Applicant, v.Time, v.Contract_id, v.Contract_name, v.Contract_name_ex,
v.Rdm, v.Amount, v.State)
fmt.Println(insert_sql)
_, err := sqlConn.Exec(insert_sql)
if err != nil {
logs.Error(fmt.Sprintf(`mul_contract_approval insert err:%s`, err.Error()))
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
}
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("mul_contract_approval recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 更新任务和父任务已付金额
func update_pp_plan_paid(req sp_2) (r int) {
/*var task_id int
if req.Task_ids != "" {
task_id, _ = strconv.Atoi(req.Task_ids)
}*/
if req.ID > 0 {
var pv pp_plan
selsql := fmt.Sprintf(`select [data] FROM [plan] where ID=%d or [pre_id]=%d`, req.ID, req.ID)
fmt.Println(selsql)
rows, err := sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &pv)
}
}
rows.Close()
}
pv.Paid = pv.Total_p
pv.Residual_p = "0.00"
pv.State_1 = "待付款"
pv.State = "待付款"
js_data, _ := json.Marshal(pv)
selsql = fmt.Sprintf(`UPDATE [plan] SET [data] = '%s',[state]='%s' where ID=%d`, string(js_data), pv.State, req.ID)
fmt.Println(selsql)
_, err = sqlConn.Exec(selsql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
return
}
/*
if pv.Pre_id > 0 {
var total_p, total_paid float64
var d pp_plan
selsql := fmt.Sprintf(`select [data] FROM [plan] where ID=%d`, pv.Pre_id)
rows, err := sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &d)
}
}
rows.Close()
}
var treq get_single_plan_req
treq.ID = append(treq.ID, d.Child_task_id...)
//fmt.Println("子任务id:", treq)
pdata := get_s_plan(treq)
//fmt.Println("子任务:", pdata)
for i := 0; i < len(pdata.Data); i++ {
v := pdata.Data[i]
t_total_p, _ := strconv.ParseFloat(strings.ReplaceAll(v.Total_p, ",", ""), 64)
total_p += t_total_p
paid, _ := strconv.ParseFloat(v.Paid, 64)
total_paid += paid
}
d.Total_p = fmt.Sprintf(`%.2f`, total_p)
//total_p, _ = strconv.ParseFloat(d.Total_p, 64)
d.Paid = fmt.Sprintf(`%.2f`, total_paid)
d.Residual_p = fmt.Sprintf(`%.2f`, total_p-total_paid)
js_data, _ := json.Marshal(d)
selsql = fmt.Sprintf(`UPDATE [plan] SET [data] = '%s' where ID=%d`, string(js_data), pv.Pre_id)
_, err = sqlConn.Exec(selsql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
return
}
}*/
}
return
}
// 付款申请
func mul_payment_application(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("mul_payment_application recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req mul_update_pp_plan_num_req
var resp CommonResp
var js_data []byte
var update_sql string
// var ids []int
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
/*for i := 0; i < len(req.Plan); i++ {
if req.Plan[i].Flag == "1" {
ids = append(ids, req.Plan[i].Child_task_id...)
} else if req.Plan[i].Flag == "3" {
ids = append(ids, req.Plan[i].ID)
}
}
var err_context string
//var pp_data []pp_plan
for i := 0; i < len(ids); i++ {
var d pp_plan
selsql := fmt.Sprintf(`select ID,data FROM [plan] where ID=%d`, ids[i])
rows, err := sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
var id int
if err = rows.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
if d.Contract_state != "已审批" {
if err_context == "" {
err_context = d.Contract_id
} else {
err_context += "
" + d.Contract_id
}
}
}
}
rows.Close()
}
}
if err_context != "" {
resp.Ret = 2
resp.Context = fmt.Sprintf(`合同号:
%s
未批准,付款申请必须合同已批准`, err_context)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}*/
for i := 0; i < len(req.Plan); i++ {
d := req.Plan[i]
fmt.Println(d.ID)
if d.ID > 0 {
var sp2_info sp_2
sp2_info.ID = d.ID
sp2_info.Contract_id = d.Contract_id
sp2_info.Amount = d.Contract_amount
sp2_info.Amount_1 = d.Total_p
sp2_info.Buyer = d.Buyer
sp2_info.Contract_name = ""
sp2_info.Rdm = d.RDM
sp2_info.State = d.Contract_state
sp2_info.State_1 = "待审批"
sp2_info.Supplier = d.Supplier
sp2_info.Warehouse_entry_number = d.Warehouse_entry_number
sp2_info.Task_ids = strconv.Itoa(d.ID)
del_sql := fmt.Sprintf(`delete from [sp_2] where ID=%d `, d.ID)
fmt.Println(del_sql)
_, err := sqlConn.Exec(del_sql)
if err != nil {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
insert_sql := fmt.Sprintf(`INSERT INTO [dbo].[sp_2]
([ID],[contract_id]
,[supplier]
,[contract_name]
,[rdm]
,[state]
,[amount]
,[amount_1]
,[warehouse_entry_number]
,[buyer]
,[state_1]
,[task_ids])
VALUES
(%d,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s')`,
sp2_info.ID, sp2_info.Contract_id, sp2_info.Supplier, sp2_info.Contract_name, sp2_info.Rdm,
sp2_info.State, sp2_info.Amount, sp2_info.Amount_1, sp2_info.Warehouse_entry_number,
sp2_info.Buyer, sp2_info.State_1, sp2_info.Task_ids)
_, err = sqlConn.Exec(insert_sql)
if err != nil {
logs.Error(err.Error())
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
d.State_1 = "待审批"
js_data, _ = json.Marshal(d)
update_sql = fmt.Sprintf(`UPDATE [plan]
SET [data] = '%s'
WHERE ID=%d`, string(js_data), d.ID)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`mul_update_pp_plan_num err:%s`, err.Error()))
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
if len(d.Child_task_id) > 0 {
for k := 0; k < len(d.Child_task_id); k++ {
tid := d.Child_task_id[k]
t_sql := fmt.Sprintf(`select ID,data from [plan] where ID = %d`, tid)
rows, err := sqlConn.Query(t_sql)
if err != nil {
continue
}
for rows.Next() {
var t_pv pp_plan
var t_s string
var t_id int
if err = rows.Scan(&t_id, &t_s); err == nil {
json.Unmarshal([]byte(t_s), &t_pv)
t_pv.ID = t_id
t_pv.State_1 = "待审批"
js_data, _ = json.Marshal(t_pv)
update_sql = fmt.Sprintf(`UPDATE [plan]
SET [data] = '%s'
WHERE ID=%d`, string(js_data), t_id)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`mul_update_pp_plan_num err:%s`, err.Error()))
}
}
}
rows.Close()
}
}
}
}
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("mul_payment_application recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func mul_sp_2(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("mul_sp_2 recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req mul_sp_2_req
var resp CommonResp
var update_sql string
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Plan); i++ {
v := req.Plan[i]
update_sql = fmt.Sprintf(`UPDATE [sp_2]
SET [state_1] = '%s'
WHERE [ID]=%d`, string("已审批"), v.ID)
fmt.Println(update_sql)
_, err := sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`mul_sp_2 err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
update_pp_plan_paid(v)
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("mul_sp_2 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func update_sp_2(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("update_sp_2 recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req update_sp_2_req
var resp CommonResp
var update_sql string
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
req.Plan.Amount = strings.ReplaceAll(req.Plan.Amount, ",", "")
update_sql = fmt.Sprintf(`UPDATE [sp_2]
SET [state_1] = '%s'
WHERE [ID]=%d`,
req.Plan.State_1, req.Plan.ID)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_sp_2 err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
if req.Plan.State_1 == "已审批" || req.Plan.State_1 == "批准" {
fmt.Println("已审批", req.Plan)
update_pp_plan_paid(req.Plan)
} else if req.Plan.State_1 == "驳回" || req.Plan.State_1 == "拒绝" {
task_id, _ := strconv.Atoi(req.Plan.Task_ids)
sel_sql := fmt.Sprintf(`select [ID],[data] from [plan] where ID=%d `, task_id)
rows, err := sqlConn.Query(sel_sql)
if err == nil {
var pv pp_plan
for rows.Next() {
var s string
var id int
if err = rows.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &pv)
pv.ID = id
}
}
rows.Close()
pv.State_1 = "拒绝"
str, _ := json.Marshal(pv)
update_sql := fmt.Sprintf(`
UPDATE [dbo].[plan]
SET [data] = '%s'
WHERE [ID] = %d`, string(str), pv.ID)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_sp_2 update err:%s`, err.Error()))
}
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("update_sp_2 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_sp_2_info(req get_sp_2_req) (resp get_sp_2_resp) {
var sqlstr string
var where_sql string
var if_where bool
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
user_info, _ := getUserInfo(req.OpUser)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.Contract_id != 0 {
//likeStr := "%" + req.ID + "%"
where_sql = fmt.Sprintf(" [contract_id] = %d", req.Contract_id)
if_where = true
}
if req.Supplier != "" {
likeStr := "%" + req.Supplier + "%"
if if_where {
where_sql += fmt.Sprintf(" and [supplier] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [supplier] like '%s'", likeStr)
}
if_where = true
}
if req.Contract_name != "" {
likeStr := "%" + req.Contract_name + "%"
if if_where {
where_sql += fmt.Sprintf(" and [contract_name] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [contract_name] like '%s'", likeStr)
}
if_where = true
}
if req.Rdm != "" {
likeStr := "%" + req.Rdm + "%"
if if_where {
where_sql += fmt.Sprintf(" and [rdm] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [rdm] like '%s'", likeStr)
}
if_where = true
}
if req.Buyer != "" {
likeStr := "%" + req.Buyer + "%"
if if_where {
where_sql += fmt.Sprintf(" and [buyer] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [buyer] like '%s'", likeStr)
}
if_where = true
}
if req.If_done {
if if_where {
where_sql += fmt.Sprintf(" and [state_1] != '%s'", "待审批")
} else {
where_sql += fmt.Sprintf(" [state_1] != '%s'", "待审批")
}
if_where = true
} else {
if if_where {
where_sql += fmt.Sprintf(" and [state_1] = '%s'", "待审批")
} else {
where_sql += fmt.Sprintf(" [state_1] = '%s'", "待审批")
}
if_where = true
}
if if_where {
sqlstr = fmt.Sprintf("select count(ID) from [sp_2] where %s ", where_sql)
} else {
sqlstr = fmt.Sprintf("select count(ID) from [sp_2] ")
}
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_sp_1_info query %s err:%v", sqlstr, err.Error()))
goto exit
}
for cntRow.Next() {
var cnt int
if err = cntRow.Scan(&cnt); err != nil {
logs.Error(fmt.Sprintf("get_sp_1_info scan %s err:%v", sqlstr, err.Error()))
goto exit
} else {
resp.Total = cnt
}
}
cntRow.Close()
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[contract_id],[supplier],[contract_name],[rdm],[state],[amount],[amount_1],[warehouse_entry_number],[buyer],[state_1],[task_ids] from [sp_2] where ID not in (select top %v ID from [sp_2] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[contract_id],[supplier],[contract_name],[rdm],[state],[amount],[amount_1],[warehouse_entry_number],[buyer],[state_1],[task_ids] from [sp_2] where %s and ID not in (select top %v ID from [sp_2] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_sp_1_info Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d sp_2
if err := rdRow.Scan(&d.ID, &d.Contract_id, &d.Supplier, &d.Contract_name, &d.Rdm, &d.State, &d.Amount, &d.Amount_1, &d.Warehouse_entry_number,
&d.Buyer, &d.State_1, &d.Task_ids); err == nil {
if d.Amount_1 != "" {
d.Amount_1 = convert_price(d.Amount_1)
}
if d.State_1 == "" {
d.State_1 = "未审核"
}
if user_info.RoleId == 1 {
d.If_modify = true
} else {
if !req.If_done {
d.If_modify = true
}
}
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_sp_1_info scan Error", err.Error())
}
}
exit:
return
}
func get_sp_2(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_sp_2 recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_sp_2_req
var resp get_sp_2_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_sp_2_info(req)
jdata, _ := json.Marshal(resp)
str := string(jdata)
str = strings.ReplaceAll(str, "%", "%%")
fmt.Fprintf(response, str)
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_sp_2 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 下载文件
func download_sp_1_file(rw http.ResponseWriter, r *http.Request) {
//获取请求参数
/*var req download_file_req
reqdata, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(reqdata, &req)
fn := req.Filename*/
id := r.FormValue("id")
fmt.Println(id)
sel_sql := fmt.Sprintf(`select [contract_name] from [sp_1] where ID=%s`, id)
fmt.Println(sel_sql)
rows, err := sqlConn.Query(sel_sql)
if err == nil {
var contract_name string
for rows.Next() {
if err = rows.Scan(&contract_name); err == nil {
}
}
rows.Close()
if contract_name != "" {
filename := strings.ReplaceAll(contract_name, `#`, ``)
fmt.Println(filename)
base_file_path := modelePath + "/file/sp_1/"
if filename != "" {
//设置响应头
header := rw.Header()
header.Add("Content-Type", "application/octet-stream")
//header.Add("Content-Disposition", "attachment;filename="+fn)
//使用ioutil包读取文件
filepath := base_file_path + filename
fmt.Println(filepath)
b, _ := ioutil.ReadFile(filepath)
//写入到响应流中
rw.Write(b)
}
}
}
}
// 上传文件
func upload_sp_1_file(w http.ResponseWriter, r *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("upload_sp_1_file recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var resp upload_resp
var f *os.File
var err error
var sqlstr string
//配置文件读取
base_file_path := modelePath + "/file/sp_1/"
r.ParseMultipartForm(32 << 20)
id, _ := strconv.Atoi(r.Form.Get("id"))
//fmt.Println("id:", id)
// file_type := r.Form.Get("file_type")
//读取文件信息
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
defer file.Close()
filename := strings.ReplaceAll(handler.Filename, `#`, "")
//logs.Info(base_file_path + filename)
fmt.Println(filename)
if filename == "" {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
os.Remove(base_file_path + filename)
f, err = os.OpenFile(base_file_path+filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
defer f.Close()
io.Copy(f, file)
sqlstr = fmt.Sprintf(`UPDATE [sp_1]
SET [contract_name] = '%s'
where ID=%d`, handler.Filename, id)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("upload_sp_1_file exec err:%v", err.Error()))
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("upload_sp_1_file recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func mul_sp_1(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("mul_sp_1 recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req mul_sp_1_req
var resp CommonResp
var update_sql string
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Plan); i++ {
v := req.Plan[i]
update_sql = fmt.Sprintf(`UPDATE [sp_1]
SET [state] = '%s'
WHERE ID=%d`, string("批准"), v.ID)
fmt.Println(update_sql)
_, err := sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`mul_sp_1 err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
v.State = "批准"
update_pp_plan_state_1_by_sp1(v)
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("mul_sp_1 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func remove_sp_1(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("remove_ma_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req remove_ma_plan_req
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
if req.ID == 0 {
logs.Info("remove_sp_1 req id ==0")
resp.Ret = -1
goto exit
}
sqlstr = fmt.Sprintf(`DELETE FROM [sp_1] WHERE ID=%d`, req.ID)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("remove_sp_1 err:", err.Error())
resp.Ret = -1
goto exit
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("remove_sp_1 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func update_pp_plan_state_1_by_sp1(req sp_1) (r int) {
var child_task_ids []int
sel_sql := fmt.Sprintf(`select [ID],[data] from [plan] where [ID]=%d`, req.ID)
rows, err := sqlConn.Query(sel_sql)
if err == nil {
for rows.Next() {
var pv pp_plan
var s string
var id int
if err = rows.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &pv)
pv.ID = id
pv.Contract_state = req.State
str, _ := json.Marshal(pv)
update_sql := fmt.Sprintf(`
UPDATE [dbo].[plan]
SET [data] = '%s'
WHERE [ID] = %d`, string(str), id)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_pp_plan_state_1_by_sp1 err:%s`, err.Error()))
}
child_task_ids = append(child_task_ids, pv.Child_task_id...)
}
}
rows.Close()
}
if len(child_task_ids) > 0 {
for i := 0; i < len(child_task_ids); i++ {
v := child_task_ids[i]
sel_sql := fmt.Sprintf(`select [ID],[data] from [plan] where [ID]=%d`, v)
rows, err := sqlConn.Query(sel_sql)
if err == nil {
for rows.Next() {
var pv pp_plan
var s string
var id int
if err = rows.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &pv)
pv.ID = id
pv.Contract_state = req.State
str, _ := json.Marshal(pv)
update_sql := fmt.Sprintf(`
UPDATE [dbo].[plan]
SET [data] = '%s'
WHERE [ID] = %d`, string(str), id)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_pp_plan_state_1_by_sp1 err:%s`, err.Error()))
}
}
}
rows.Close()
}
}
}
return
}
func update_sp_1(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("update_sp_1 recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req update_sp_1_req
var resp CommonResp
var update_sql string
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
req.Plan.Amount = strings.ReplaceAll(req.Plan.Amount, ",", "")
update_sql = fmt.Sprintf(`UPDATE [sp_1]
SET [supplier] = '%s'
,[applicant]='%s'
,[rdm] = '%s'
,[amount] = '%s'
,[state] = '%s'
WHERE ID=%d`,
req.Plan.Supplier, req.Plan.Applicant, req.Plan.Rdm,
req.Plan.Amount, req.Plan.State,
req.Plan.ID)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_sp_1 err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
resp.Ret = update_pp_plan_state_1_by_sp1(req.Plan)
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("update_sp_1 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_sp_1_info(req get_sp_1_req) (resp get_sp_1_resp) {
var sqlstr string
var where_sql string
var if_where bool
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
user_info, _ := getUserInfo(req.OpUser)
/*b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}*/
if req.ID != 0 {
//likeStr := "%" + req.ID + "%"
where_sql = fmt.Sprintf(" [ID] = %d", req.ID)
if_where = true
}
if req.Supplier != "" {
likeStr := "%" + req.Supplier + "%"
if if_where {
where_sql += fmt.Sprintf(" and [supplier] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [supplier] like '%s'", likeStr)
}
if_where = true
}
if req.Applicant != "" {
likeStr := "%" + req.Applicant + "%"
if if_where {
where_sql += fmt.Sprintf(" and [applicant] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [applicant] like '%s'", likeStr)
}
if_where = true
}
if req.Contract_name != "" {
likeStr := "%" + req.Contract_name + "%"
if if_where {
where_sql += fmt.Sprintf(" and [contract_name] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [contract_name] like '%s'", likeStr)
}
if_where = true
}
if req.Rdm != "" {
likeStr := "%" + req.Rdm + "%"
if if_where {
where_sql += fmt.Sprintf(" and [rdm] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [rdm] like '%s'", likeStr)
}
if_where = true
}
if req.If_done {
if if_where {
where_sql += fmt.Sprintf(" and [state] != '%s'", "待审批")
} else {
where_sql += fmt.Sprintf(" [state] != '%s'", "待审批")
}
if_where = true
} else {
if if_where {
where_sql += fmt.Sprintf(" and [state] = '%s'", "待审批")
} else {
where_sql += fmt.Sprintf(" [state] = '%s'", "待审批")
}
if_where = true
}
if if_where {
sqlstr = fmt.Sprintf("select count(ID) from [sp_1] where %s ", where_sql)
} else {
sqlstr = fmt.Sprintf("select count(ID) from [sp_1] ")
}
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_sp_1_info query %s err:%v", sqlstr, err.Error()))
goto exit
}
for cntRow.Next() {
var cnt int
if err = cntRow.Scan(&cnt); err != nil {
logs.Error(fmt.Sprintf("get_sp_1_info scan %s err:%v", sqlstr, err.Error()))
goto exit
} else {
resp.Total = cnt
}
}
cntRow.Close()
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[supplier],[applicant],[time] ,[contract_id],[contract_name],[contract_name_ex],[rdm],[amount],[state] from [sp_1] where ID not in (select top %v ID from [sp_1] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[supplier],[applicant],[time] ,[contract_id],[contract_name],[contract_name_ex],[rdm],[amount],[state] from [sp_1] where %s and ID not in (select top %v ID from [sp_1] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_sp_1_info Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d sp_1
if err := rdRow.Scan(&d.ID, &d.Supplier, &d.Applicant, &d.Time, &d.Contract_id, &d.Contract_name, &d.Contract_name_ex, &d.Rdm, &d.Amount, &d.State); err == nil {
//fmt.Println(d.Contract_name, d.Contract_id)
if d.Amount != "" {
d.Amount = convert_price(d.Amount)
}
if d.State == "" {
d.State = "未审核"
}
if user_info.RoleId == 1 {
d.If_modify = true
} else {
if !req.If_done {
d.If_modify = true
}
}
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_sp_1_info scan Error", err.Error())
}
}
exit:
return
}
func get_sp_1(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_sp_1 recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_sp_1_req
var resp get_sp_1_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_sp_1_info(req)
jdata, _ := json.Marshal(resp)
str := string(jdata)
str = strings.ReplaceAll(str, "%", "%%")
fmt.Fprintf(response, str)
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_sp_1 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// add by marcy
func get_sp_by_id(id int) (resp get_sp_1_resp) {
var sqlstr string
var cntRow *sql.Rows
var err error
beginTime := time.Now().UnixNano()
logs.Info("get_sp_by_id recv req begin", time.Now().Format("2006-01-02 15:04:05"))
// var req get_sp_1_req
//var resp get_sp_1_resp
// reqdata, _ := ioutil.ReadAll(request.Body)
// json.Unmarshal(reqdata, &req)
sqlstr = fmt.Sprintf("select [ID],[supplier],[applicant],[time] ,[contract_id],[contract_name],[contract_name_ex],[rdm],[amount],[state] from [sp_1] where [ID] =%d", id)
fmt.Println(sqlstr)
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_sp_1_info Query err:%v", err.Error()))
return
}
defer cntRow.Close()
for cntRow.Next() {
var d sp_1
if err := cntRow.Scan(&d.ID, &d.Supplier, &d.Applicant, &d.Time, &d.Contract_id, &d.Contract_name, &d.Contract_name_ex, &d.Rdm, &d.Amount, &d.State); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_sp_by_id scan Error", err.Error())
}
}
//jdata, _ := json.Marshal(resp)
//fmt.Fprintf(response, resp)
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_sp_by_id recv req end, use time: %v ms", (endTime-beginTime)/1e6))
return
}
func get_sp2_by_id(id int) (resp get_sp_1_resp) {
var sqlstr string
var cntRow *sql.Rows
var err error
beginTime := time.Now().UnixNano()
logs.Info("get_sp_by_id recv req begin", time.Now().Format("2006-01-02 15:04:05"))
//var req get_sp_1_req
//var resp get_sp_1_resp
//reqdata, _ := ioutil.ReadAll(request.Body)
//json.Unmarshal(reqdata, &req)
sqlstr = fmt.Sprintf("select [ID],[supplier],[contract_id],[contract_name],[state] from [sp_2] where [ID] =%d", id)
fmt.Println(sqlstr)
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_sp_2_info Query err:%v", err.Error()))
return
}
defer cntRow.Close()
for cntRow.Next() {
var d sp_1
if err := cntRow.Scan(&d.ID, &d.Supplier, &d.Contract_id, &d.Contract_name, &d.State); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_sp_by_id scan Error", err.Error())
}
}
// jdata, _ := json.Marshal(resp)
// fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_sp2_by_id recv req end, use time: %v ms", (endTime-beginTime)/1e6))
return
}
// 导入合同审批
func import_sp_1(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("import_sp_1 recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var reqdata []byte
var req import_sp_1_Req
var resp CommonResp
reqdata, _ = ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Plan); i++ {
v := req.Plan[i]
v.Time = strings.ReplaceAll(time.Now().Format(g_date_format), "-", "/")
amount, _ := strconv.ParseFloat(strings.ReplaceAll(v.Amount, ",", ""), 64)
v.Amount = fmt.Sprintf(`%.2f`, amount)
sqlstr := fmt.Sprintf(`INSERT INTO [sp_1]
([supplier]
,[applicant]
,[time]
,[contract_name]
,[rdm]
,[amount]
,[state])
VALUES
('%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s')`,
v.Supplier, v.Applicant, v.Time, v.Contract_name, v.Rdm, v.Amount, v.State)
_, err := sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("import_sp_1 Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("import_sp_1 recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 下载文件
func download_ds_file(rw http.ResponseWriter, r *http.Request) {
//获取请求参数
/*var req download_file_req
reqdata, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(reqdata, &req)
fn := req.Filename*/
filename := r.FormValue("id")
base_file_path := modelePath + "/upload_file/"
if filename != "" {
//设置响应头
header := rw.Header()
header.Add("Content-Type", "application/octet-stream")
//header.Add("Content-Disposition", "attachment;filename="+fn)
//使用ioutil包读取文件
filepath := base_file_path + filename
fmt.Println(filepath)
b, _ := ioutil.ReadFile(filepath)
//写入到响应流中
rw.Write(b)
}
}
// 上传文件
func upload_ds_file(w http.ResponseWriter, r *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("upload_ds_file recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var resp upload_resp
var f *os.File
var err error
var sqlstr string
//配置文件读取
base_file_path := modelePath + "/upload_file/"
r.ParseMultipartForm(32 << 20)
id, _ := strconv.Atoi(r.Form.Get("id"))
//fmt.Println("id:", id)
file_type := r.Form.Get("file_type")
//读取文件信息
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
defer file.Close()
fmt.Println(handler.Filename)
logs.Info(base_file_path + handler.Filename)
if handler.Filename == "" {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
os.Remove(base_file_path + handler.Filename)
f, err = os.OpenFile(base_file_path+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
defer f.Close()
io.Copy(f, file)
resp.Ret = 0
sqlstr = fmt.Sprintf(`select [data] FROM [material] where [ID]=%d `, id)
rows, err := sqlConn.Query(sqlstr)
if err != nil {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
var d material_info
var if_exist bool
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &d)
if_exist = true
}
}
rows.Close()
if if_exist {
if file_type == "1" {
d.Qs = handler.Filename
} else if file_type == "2" {
d.As = handler.Filename
} else {
return
}
js_data, _ := json.Marshal(d)
sqlstr = fmt.Sprintf(`UPDATE [material]
SET [data] = '%s'
where ID=%d`, string(js_data), id)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("upload_ds_file exec err:%v", err.Error()))
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
return
}
}
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("upload_ds_file recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func export_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("export_ma_temp_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var csv_data [][]string
var filename string
filename = fmt.Sprintf(`./file/%v.csv`, beginTime)
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var req get_ma_plan_req
var resp download_file_Resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
var where_sql string
var if_where bool
if req.ID != "" {
likeStr := "%" + req.ID + "%"
where_sql = fmt.Sprintf(" [ID] like '%s'", likeStr)
if_where = true
}
if req.RDM != "" {
likeStr := "%" + req.RDM + "%"
if if_where {
where_sql += fmt.Sprintf(" and [rdm] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [rdm] like '%s'", likeStr)
}
if_where = true
}
if req.Bt != "" {
if if_where {
where_sql += fmt.Sprintf(" and [op_time] > '%s'", req.Bt)
} else {
where_sql += fmt.Sprintf(" [op_time] > '%s'", req.Bt)
}
if_where = true
}
if req.Et != "" {
if if_where {
where_sql += fmt.Sprintf(" and [op_time] < '%s'", req.Et)
} else {
where_sql += fmt.Sprintf(" [op_time] < '%s'", req.Et)
}
if_where = true
}
if req.Code != "" {
likeStr := "%" + req.Code + "%"
if if_where {
where_sql += fmt.Sprintf(" and [code] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [code] like '%s'", likeStr)
}
if_where = true
}
if req.Name != "" {
likeStr := "%" + req.Name + "%"
if if_where {
where_sql += fmt.Sprintf(" and [name] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [name] like '%s'", likeStr)
}
if_where = true
}
if req.Supplier != "" {
likeStr := "%" + req.Supplier + "%"
if if_where {
where_sql += fmt.Sprintf(" and [supplier] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [supplier] like '%s'", likeStr)
}
if_where = true
}
if req.State != "" {
likeStr := "%" + req.State + "%"
if if_where {
where_sql += fmt.Sprintf(" and [state] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [state] like '%s'", likeStr)
}
if_where = true
}
if req.Buyer != "" {
likeStr := "%" + req.Buyer + "%"
if if_where {
where_sql += fmt.Sprintf(" and [buyer] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [buyer] like '%s'", likeStr)
}
if_where = true
}
if req.If_done {
if if_where {
where_sql += " and [if_done]=1"
} else {
where_sql += " [if_done]=1"
}
if_where = true
} else { //未处理
if if_where {
where_sql += " and [if_done]!=1 "
} else {
where_sql += " [if_done]!=1 "
}
if_where = true
}
if if_where {
where_sql += fmt.Sprintf(" and [flag] !='1'")
} else {
where_sql += fmt.Sprintf(" [flag] !='1'")
}
if if_where {
where_sql += fmt.Sprintf(" and [if_del] !=1")
} else {
where_sql += fmt.Sprintf(" [if_del] !=1")
}
sel_sql := fmt.Sprintf(`select [ID],[data] from [plan] where %s`, where_sql)
rows, err := sqlConn.Query(sel_sql)
if err != nil {
return
}
var pp_data []pp_plan
for rows.Next() {
var s string
var d pp_plan
var id int
if err := rows.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
if d.Payment_type == "1" {
d.Payment_type = "全款"
} else if d.Payment_type == "2" {
d.Payment_type = "分期"
}
if len(d.Child_task_id) == 0 {
d.Child_task_id = []int{}
}
if d.Flag == "1" {
d.Price = ""
} else {
d.Price = convert_price(d.Price)
}
if len(d.Demand_date) > 2 {
if d.Demand_date[2] != byte('/') {
d.Demand_date = d.Demand_date[2:]
}
}
if len(d.Order_date) > 2 {
d.Order_date = d.Order_date[2:]
}
if len(d.Actual_delivery_date) > 2 {
if d.Actual_delivery_date[2] != byte('/') {
d.Actual_delivery_date = d.Actual_delivery_date[2:]
}
}
if d.Actual_delivery_date != "" {
loc, _ := time.LoadLocation("Local")
actual_delivery_date, _ := time.ParseInLocation(g_time_format, "20"+strings.ReplaceAll(d.Actual_delivery_date, "/", "-")+" 00:00:00", loc)
demand_date, _ := time.ParseInLocation(g_time_format, "20"+strings.ReplaceAll(d.Demand_date, "/", "-")+" 00:00:00", loc)
span := (actual_delivery_date.Sub(demand_date).Hours()) / 24
if int(span) >= 1 {
d.Over_due2 = fmt.Sprintf(`%d`, int(span))
}
}
d.Total_p = convert_price(d.Total_p)
d.Residual_p = convert_price(d.Residual_p)
if d.Flag == "2" || d.Flag == "3" {
d.Arrival_quantity_text = fmt.Sprintf(`%v/%v`, d.Arrival_quantity, d.Num)
} else {
d.Arrival_quantity_text = ""
}
if d.Flag == "1" && d.Code == "" {
d.Name = ""
d.Specs = ""
d.Unit = ""
d.Price = ""
d.Payment_type = ""
d.Purchasing_cycle = ""
d.Supplier = ""
d.Factory = ""
d.Factory_code = ""
d.Qs = ""
d.As = ""
}
pp_data = append(pp_data, d)
}
}
rows.Close()
csv_data = append(csv_data,
[]string{
"序号", "RDM", "编号", "名称", "规格", "单位", "数量", "到货数量", "单价", "合计", "付款方式",
"已付", "应付", "需求日期", "采购周期", "下单日期", "预计超期", "实际交付", "剩余", "超期",
"采购记录", "状态", "入库单号", "供应商"})
for i := 0; i < len(pp_data); i++ {
v := pp_data[i]
csv_data = append(csv_data,
[]string{
strconv.Itoa(v.ID), v.RDM, v.Code, v.Name, v.Specs, v.Unit, v.Num, v.Arrival_quantity, v.Price, v.Total_p, v.Payment_type,
v.Paid, v.Residual_p, v.Demand_date, v.Purchasing_cycle, v.Order_date, v.Over_due1, v.Actual_delivery_date, v.Residue, v.Over_due2,
v.Buy_record, v.State, v.Warehouse_entry_number, v.Supplier})
}
f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码
w := csv.NewWriter(f) //创建一个新的写入文件流
w.WriteAll(csv_data)
w.Flush()
resp.FileId = fmt.Sprintf(`%v.csv`, beginTime)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("export_ma_temp_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func export_ma_temp_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("export_ma_temp_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var csv_data [][]string
var filename string
filename = fmt.Sprintf(`./file/%v.csv`, beginTime)
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var req get_ma_plan_req
var resp download_file_Resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
req.Index = 1
req.Count = 100000
req.If_done = false
resp_data := get_plan(req)
csv_data = append(csv_data,
[]string{
"序号", "RDM", "编号", "名称", "规格", "单位", "数量", "单价", "合计", "付款方式",
"已付", "应付", "需求日期", "采购周期", "下单日期", "预计超期", "实际交付", "剩余", "超期",
"采购记录", "到货数量", "状态", "入库单号", "供应商"})
for i := 0; i < len(resp_data.Data); i++ {
v := resp_data.Data[i]
rp, _ := strconv.ParseFloat(strings.ReplaceAll(v.Residual_p, ",", ""), 64)
if rp > 0.01 {
csv_data = append(csv_data,
[]string{
strconv.Itoa(v.ID), v.RDM, v.Code, v.Name, v.Specs, v.Unit, v.Num, v.Price, v.Total_p, v.Payment_type,
v.Paid, v.Residual_p, v.Demand_date, v.Purchasing_cycle, v.Order_date, v.Over_due1, v.Actual_delivery_date, v.Residue, v.Over_due2,
v.Buy_record, v.Arrival_quantity_text, v.State, v.Warehouse_entry_number, v.Supplier})
} else {
continue
}
}
f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码
w := csv.NewWriter(f) //创建一个新的写入文件流
w.WriteAll(csv_data)
w.Flush()
resp.FileId = fmt.Sprintf(`%v.csv`, beginTime)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("export_ma_temp_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func mul_update_pp_plan_num(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("mul_update_pp_plan_num recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req mul_update_pp_plan_num_req
var resp CommonResp
var js_data []byte
var update_sql string
var ids []int
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Plan); i++ {
if req.Plan[i].Flag == "1" {
ids = append(ids, req.Plan[i].Child_task_id...)
} else if req.Plan[i].Flag == "3" {
ids = append(ids, req.Plan[i].ID)
}
}
for i := 0; i < len(ids); i++ {
var d pp_plan
selsql := fmt.Sprintf(`select ID,data FROM [plan] where ID=%d`, ids[i])
rows, err := sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
var id int
if err = rows.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
d.Arrival_quantity = d.Num
d.Arrival_quantity_text = fmt.Sprintf(`%v/%v`, d.Num, d.Num)
}
}
rows.Close()
}
fmt.Println(d)
if d.ID > 0 {
js_data, _ = json.Marshal(d)
update_sql = fmt.Sprintf(`UPDATE [plan]
SET [data] = '%s'
WHERE ID=%d`, string(js_data), d.ID)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`mul_update_pp_plan_num err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("mul_update_pp_plan_num recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_payment_data_by_id(req get_payment_by_id_req) (resp get_payment_by_id_resp) {
var sqlstr string
var rdRow *sql.Rows
var err error
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.ID == 0 {
goto exit
}
sqlstr = fmt.Sprintf("select [data] from [payment] where ID =%d", req.ID)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_payment_data Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d payment_info
var s string
if err := rdRow.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &d)
if len(d.Payment_data) == 0 {
d.Payment_data = []payment_month{}
}
resp.Data = d
} else {
logs.Error("get_payment_data scan Error", err.Error())
}
}
exit:
resp.Data.ID = req.ID
if len(resp.Data.Payment_data) == 0 {
resp.Data.Payment_data = []payment_month{}
}
return
}
func get_payment_by_id(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_payment_by_id recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_payment_by_id_req
var resp get_payment_by_id_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_payment_data_by_id(req)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_payment_by_id recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func update_payment(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("update_payment recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req update_payment_req
var resp CommonResp
var js_data []byte
var update_sql string
var err error
var sql_str string
var rows *sql.Rows
var if_exist bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
fmt.Println(string(reqdata))
sql_str = fmt.Sprintf(`select ID FROM [payment] where ID=%d `, req.Data.ID)
rows, err = sqlConn.Query(sql_str)
if err == nil {
for rows.Next() {
var id int
if err = rows.Scan(&id); err == nil {
if_exist = true
}
}
rows.Close()
}
if if_exist {
js_data, _ = json.Marshal(req.Data)
update_sql = fmt.Sprintf(`UPDATE [dbo].[payment]
SET [supplier] = '%s'
,[code] = '%s'
,[name] = '%s'
,[data] = '%s'
,[pre_id]=%d
WHERE ID=%d`, req.Data.Supplier, req.Data.Code, req.Data.Name, string(js_data), req.Data.Pre_id, req.Data.ID)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
} else {
js_data, _ = json.Marshal(req.Data)
update_sql = fmt.Sprintf(`INSERT INTO [payment]
([ID]
,[supplier]
,[code]
,[name]
,[data]
,[pre_id])
VALUES
(%d
,'%s'
,'%s'
,'%s'
,'%s'
,%d)`, req.Data.ID, req.Data.Supplier, req.Data.Code, req.Data.Name, string(js_data), req.Data.Pre_id)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
}
{
//更新任务付款信息
var d pp_plan
selsql := fmt.Sprintf(`select [data] FROM [plan] where ID=%d`, req.Data.ID)
rows, err = sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &d)
}
}
rows.Close()
d.Total_p = req.Data.Total_p
d.Paid = req.Data.Paid
d.Residual_p = req.Data.Residual_p
js_data, _ := json.Marshal(d)
selsql = fmt.Sprintf(`UPDATE [plan] SET [data] = '%s' where ID=%d`, string(js_data), req.Data.ID)
fmt.Println(selsql)
_, err = sqlConn.Exec(selsql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
}
}
//更新父任务金额
if req.Data.Pre_id > 0 {
var total_p, total_paid float64
var d pp_plan
selsql := fmt.Sprintf(`select [data] FROM [plan] where ID=%d`, req.Data.Pre_id)
rows, err = sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &d)
}
}
rows.Close()
}
var treq get_single_plan_req
treq.ID = append(treq.ID, d.Child_task_id...)
//fmt.Println("子任务id:", treq)
pdata := get_s_plan(treq)
//fmt.Println("子任务:", pdata)
for i := 0; i < len(pdata.Data); i++ {
v := pdata.Data[i]
paid, _ := strconv.ParseFloat(v.Paid, 64)
total_paid += paid
}
//d.Total_p = fmt.Sprintf(`%.2f`, total_p)
total_p, _ = strconv.ParseFloat(d.Total_p, 64)
d.Paid = fmt.Sprintf(`%.2f`, total_paid)
d.Residual_p = fmt.Sprintf(`%.2f`, total_p-total_paid)
js_data, _ := json.Marshal(d)
selsql = fmt.Sprintf(`UPDATE [plan] SET [data] = '%s' where ID=%d`, string(js_data), req.Data.Pre_id)
_, err = sqlConn.Exec(selsql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("update_payment recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
//-----------------支付接口---------------------------//
func update_payment_data(req payment_info) (r int) {
var js_data []byte
var update_sql string
var err error
var sql_str string
var rows *sql.Rows
var if_exist bool
var old_payment payment_info
sql_str = fmt.Sprintf(`select [ID],[data] FROM [payment] where ID=%d `, req.ID)
rows, err = sqlConn.Query(sql_str)
if err == nil {
for rows.Next() {
var id int
var s string
if err = rows.Scan(&id, &s); err == nil {
if_exist = true
json.Unmarshal([]byte(s), &old_payment)
}
}
rows.Close()
}
if if_exist {
old_payment.Total_p = req.Total_p
old_payment.Residual_p = req.Residual_p
old_payment.Paid = req.Paid
js_data, _ = json.Marshal(req)
update_sql = fmt.Sprintf(`UPDATE [dbo].[payment]
SET [data] = '%s'
WHERE ID=%d`, string(js_data), req.ID)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
r = -1
return
}
}
r = 0
return
}
// //更新父任务金额
func update_pre_task_paid(pre_id int) {
//更新父任务金额
if pre_id > 0 {
var total_p, total_paid float64
var d pp_plan
selsql := fmt.Sprintf(`select [data] FROM [plan] where ID=%d`, pre_id)
rows, err := sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &d)
}
}
rows.Close()
}
var treq get_single_plan_req
treq.ID = append(treq.ID, d.Child_task_id...)
//fmt.Println("子任务id:", treq)
pdata := get_s_plan(treq)
//fmt.Println("子任务:", pdata)
for i := 0; i < len(pdata.Data); i++ {
v := pdata.Data[i]
t_total_p, _ := strconv.ParseFloat(strings.ReplaceAll(v.Total_p, ",", ""), 64)
total_p += t_total_p
paid, _ := strconv.ParseFloat(v.Paid, 64)
total_paid += paid
}
d.Total_p = fmt.Sprintf(`%.2f`, total_p)
//total_p, _ = strconv.ParseFloat(d.Total_p, 64)
d.Paid = fmt.Sprintf(`%.2f`, total_paid)
d.Residual_p = fmt.Sprintf(`%.2f`, total_p-total_paid)
js_data, _ := json.Marshal(d)
selsql = fmt.Sprintf(`UPDATE [plan] SET [data] = '%s' where ID=%d`, string(js_data), pre_id)
_, err = sqlConn.Exec(selsql)
if err != nil {
logs.Error(fmt.Sprintf(`update_payment err:%s`, err.Error()))
return
}
}
}
//-----------------支付接口---------------------------//
func get_payment_data(req get_payment_req) (resp get_payment_resp) {
var sqlstr string
var where_sql string
var if_where bool
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.Code != "" {
likeStr := "%" + req.Code + "%"
where_sql = fmt.Sprintf(" [code] like '%s'", likeStr)
if_where = true
}
if req.Name != "" {
likeStr := "%" + req.Name + "%"
if if_where {
where_sql = fmt.Sprintf(" and [name] like '%s'", likeStr)
} else {
where_sql = fmt.Sprintf(" [name] like '%s'", likeStr)
}
if_where = true
}
if req.Supplier != "" {
likeStr := "%" + req.Supplier + "%"
if if_where {
where_sql = fmt.Sprintf(" and [supplier] like '%s'", likeStr)
} else {
where_sql = fmt.Sprintf(" [supplier] like '%s'", likeStr)
}
if_where = true
}
if if_where {
sqlstr = fmt.Sprintf("select count(ID) from [payment] where %s ", where_sql)
} else {
sqlstr = fmt.Sprintf("select count(ID) from [payment] ")
}
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_payment_data query %s err:%v", sqlstr, err.Error()))
goto exit
}
for cntRow.Next() {
var cnt int
if err = cntRow.Scan(&cnt); err != nil {
logs.Error(fmt.Sprintf("get_payment_data scan %s err:%v", sqlstr, err.Error()))
goto exit
} else {
resp.Total = cnt
}
}
cntRow.Close()
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[data],[pre_id] from [payment] where ID not in (select top %v ID from [payment] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[data],[pre_id] from [payment] where %s and ID not in (select top %v ID from [payment] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_payment_data Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d payment_info
var id, pre_id int
var s string
if err := rdRow.Scan(&id, &s, &pre_id); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
d.Pre_id = pre_id
fmt.Println(id, pre_id)
if len(d.Payment_data) == 0 {
d.Payment_data = []payment_month{}
}
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_payment_data scan Error", err.Error())
}
}
exit:
return
}
func get_payment(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_payment recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_payment_req
var resp get_payment_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_payment_data(req)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_payment recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func cal_effective_date(Update_date string, Validity_period_of_quotation string) (Effective_time string) {
loc, _ := time.LoadLocation("Local")
bt, _ := time.ParseInLocation(g_time_format, strings.ReplaceAll(Update_date, "/", "-")+" 00:00:00", loc)
hour := bt.Sub(time.Now()).Hours()
vp, _ := strconv.Atoi(Validity_period_of_quotation)
Effective_time = fmt.Sprintf(`%d`, int(hour/24)+vp)
return
}
func approve_ok(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("approve_ok recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req approve_ok_req
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
for i := 0; i < len(req.Data); i++ {
req.Data[i].Code = strings.TrimSpace(req.Data[i].Code)
v := req.Data[i]
if v.Op_type == "新增" {
var d material_info
d.Code = v.Code
d.Effective_time = v.Effective_time
d.Name = v.Name
d.Payment_type = v.Payment_type
d.Price = v.Price
d.Update_date = v.Update_date
var dd price_update_info
dd.Price_ = d.Price
dd.Update_date_ = d.Update_date
d.Price_arr = append(d.Price_arr, dd)
d.Procurement_cycle = v.Procurement_cycle
d.Spec = v.Spec
d.Supplier = v.Supplier
d.Supplier_code = v.Supplier_code
d.Unit = v.Unit
d.Validity_period_of_quotation = v.Validity_period_of_quotation
d.Factory = v.Factory
d.Factory_code = v.Factory_code
d.Qs = v.Qs
d.As = v.As
js_data, _ := json.Marshal(d)
insert_sql := fmt.Sprintf(`INSERT INTO [material]
([data]
,[code]
,[name]
,[supplier]
,[update_time])
VALUES
('%s'
,'%s'
,'%s'
,'%s'
,'%s')`, string(js_data), d.Code, d.Name, d.Supplier, d.Update_date)
fmt.Println(insert_sql)
_, err := sqlConn.Exec(insert_sql)
if err != nil {
fmt.Println(err.Error())
resp.Ret = -1
}
} else {
sqlstr := fmt.Sprintf("select [ID],[data] from [material] where code ='%s'", v.Code)
rdRow, err := sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("approve_ok Query err:%v", err.Error()))
return
}
var mv material_info
for rdRow.Next() {
var id int
var s string
if err := rdRow.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &mv)
mv.ID = id
} else {
logs.Error("approve_ok scan Error", err.Error())
}
}
rdRow.Close()
mv.Supplier = v.Supplier
mv.Supplier_code = v.Supplier_code
mv.Payment_type = v.Payment_type
mv.Name = v.Name
mv.Spec = v.Spec
mv.Unit = v.Unit
//Price string `json:"price"` //单价
//Update_date string `json:"update_date"` //更新日期
mv.Procurement_cycle = v.Procurement_cycle
mv.Validity_period_of_quotation = v.Validity_period_of_quotation
mv.Effective_time = v.Effective_time
var dd price_update_info
dd.Price_ = v.Price
dd.Update_date_ = v.Update_date
var arr []price_update_info
arr = append(arr, dd)
arr = append(arr, mv.Price_arr...)
mv.Price_arr = []price_update_info{}
mv.Price_arr = append(mv.Price_arr, arr...)
for k := 0; k < len(mv.Price_arr); k++ {
if k == 0 {
mv.Price = mv.Price_arr[k].Price_
mv.Update_date = mv.Price_arr[k].Update_date_
} else if k == 1 {
mv.Price_2 = mv.Price_arr[k].Price_
mv.Update_date_2 = mv.Price_arr[k].Update_date_
} else if k == 2 {
mv.Price_3 = mv.Price_arr[k].Price_
mv.Update_date_3 = mv.Price_arr[k].Update_date_
} else if k == 3 {
mv.Price_4 = mv.Price_arr[k].Price_
mv.Update_date_4 = mv.Price_arr[k].Update_date_
} else if k == 4 {
mv.Price_5 = mv.Price_arr[k].Price_
mv.Update_date_5 = mv.Price_arr[k].Update_date_
}
}
mv.Factory = v.Factory
mv.Factory_code = v.Factory_code
mv.Qs = v.Qs
mv.As = v.As
js_data, _ := json.Marshal(mv)
update_sql := fmt.Sprintf(`UPDATE [dbo].[material]
SET [data] = '%s'
,[code] = '%s'
,[name] = '%s'
,[supplier] = '%s'
,[update_time] = '%s'
WHERE ID=%d`, string(js_data), mv.Code, mv.Name, mv.Supplier, mv.Update_date, mv.ID)
_, err = sqlConn.Exec(update_sql)
if err != nil {
fmt.Println(err.Error())
resp.Ret = -1
}
}
}
if resp.Ret == 0 {
update_sql := fmt.Sprintf(`UPDATE [dbo].[m_approve]
SET [state] = '已批准' WHERE ID=%d`, req.ID)
sqlConn.Exec(update_sql)
sync_material_map_ex() //更新cache
sqlstr := fmt.Sprintf(`select [ID],[applicant],[time],[record_cnt],[update_cnt],[add_cnt],[state],[data] from [m_approve] where [state]!='已批准'`)
rdRow, err := sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_approve_m_data Query err:%v", err.Error()))
//goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d approve_m_info
if err := rdRow.Scan(&d.ID, &d.Applicant, &d.Time, &d.Record_cnt, &d.Update_cnt, &d.Add_cnt, &d.State, &d.Data); err == nil {
d.Add_cnt = 0
d.Update_cnt = 0
var t_data []approve_m_detail
json.Unmarshal([]byte(d.Data), &t_data)
for i := 0; i < len(t_data); i++ {
if _, ok := material_map[t_data[i].Code]; ok {
d.Update_cnt++
t_data[i].Op_type = "替换"
t_data[i].Last_price = material_map[t_data[i].Code].Price
last_price := strings.ReplaceAll(t_data[i].Last_price, ",", "")
price := strings.ReplaceAll(t_data[i].Price, ",", "")
p1, _ := strconv.ParseFloat(last_price, 64)
p2, _ := strconv.ParseFloat(price, 64)
t_data[i].Price_span = fmt.Sprintf(`%.2f`, p2-p1)
} else {
d.Add_cnt++
t_data[i].Op_type = "新增"
}
}
str, _ := json.Marshal(t_data)
d.Data = string(str)
update_sql := fmt.Sprintf(`UPDATE [dbo].[m_approve]
SET [update_cnt] = %d
,[add_cnt] = %d
,[data] = '%s'
WHERE ID=%d`, d.Update_cnt, d.Add_cnt, d.Data, d.ID)
fmt.Println(update_sql)
sqlConn.Exec(update_sql)
} else {
logs.Error("get_approve_m_data scan Error", err.Error())
}
}
}
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("approve_ok recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func del_approve(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("del_approve recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req del_approve_req
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
for i := 0; i < len(req.Data); i++ {
del_sql := fmt.Sprintf(`delete from [m_approve] where ID=%d`, req.Data[i].ID)
_, err := sqlConn.Exec(del_sql)
if err != nil {
logs.Error(fmt.Sprintf(`del_approve err:%s`, err.Error()))
}
}
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("del_approve recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 导入审批物料
func import_approve_m(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("import_approve_m recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var flag int
var reqdata []byte
var req import_approve_m_req
var resp CommonResp
var b bool
var rdRow *sql.Rows
var d approve_m_info
var insert_sql string
var if_ok bool
var err_context string
code_map := make(map[string]int)
approve_m_lock.Lock()
flag = ma_plan_lock_n
approve_m_lock.Unlock()
if flag == 1 {
resp.Ret = 1
goto exit
} else {
approve_m_lock.Lock()
approve_m_lock_n = 1
approve_m_lock.Unlock()
}
reqdata, _ = ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b = checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Data); i++ {
if _, ok := code_map[req.Data[i].Code]; ok {
if_ok = true
if err_context == "" {
err_context = req.Data[i].Code
} else {
err_context += " " + req.Data[i].Code
}
}
}
if if_ok {
resp.Ret = 2
resp.Context = fmt.Sprintf(`编号(%s)重复`, err_context)
goto exit
}
d.Applicant = req.OpUser
{
year := time.Now().Year()
month := int(time.Now().Month())
day := time.Now().Day()
d.Time = fmt.Sprintf(`%d/%02d/%02d`, year, month, day)
}
d.Record_cnt = len(req.Data)
d.State = "待审批"
for i := 0; i < len(req.Data); i++ {
req.Data[i].Price = strings.TrimSpace(req.Data[i].Price)
if req.Data[i].Update_date == "" {
year := time.Now().Year()
month := int(time.Now().Month())
day := time.Now().Day()
req.Data[i].Update_date = fmt.Sprintf(`%d/%02d/%02d`, year, month, day)
}
if req.Data[i].Update_date[2] == byte('/') {
req.Data[i].Update_date = "20" + req.Data[i].Update_date
}
req.Data[i].Update_date = strings.ReplaceAll(req.Data[i].Update_date, "-", "/")
t := strings.Split(req.Data[i].Update_date, "/")
if len(t) == 3 {
month, _ := strconv.Atoi(t[1])
day, _ := strconv.Atoi(t[2])
req.Data[i].Update_date = fmt.Sprintf(`%s/%02d/%02d`, t[0], month, day)
}
loc, _ := time.LoadLocation("Local")
bt, _ := time.ParseInLocation(g_time_format, strings.ReplaceAll(req.Data[i].Update_date, "/", "-")+" 00:00:00", loc)
hour := bt.Sub(time.Now()).Hours()
vp, _ := strconv.Atoi(req.Data[i].Validity_period_of_quotation)
req.Data[i].Effective_time = fmt.Sprintf(`%d`, int(hour/24)+vp)
sqlstr := fmt.Sprintf("select [ID],[data] from [material] where code ='%s'", req.Data[i].Code)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("import_approve_m Query err:%v", err.Error()))
goto exit
}
var mv material_info
for rdRow.Next() {
var id int
var s string
if err := rdRow.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &mv)
mv.ID = id
} else {
logs.Error("import_approve_m scan Error", err.Error())
}
}
rdRow.Close()
if mv.ID > 0 {
req.Data[i].Op_type = "替换"
req.Data[i].Last_price = mv.Price
p1, _ := strconv.ParseFloat(mv.Price, 64)
p2, _ := strconv.ParseFloat(req.Data[i].Price, 64)
req.Data[i].Price_span = fmt.Sprintf(`%.2f`, p2-p1)
d.Update_cnt++
} else {
req.Data[i].Op_type = "新增"
d.Add_cnt++
}
}
reqdata, _ = json.Marshal(req.Data)
d.Data = string(reqdata)
insert_sql = fmt.Sprintf(`INSERT INTO [dbo].[m_approve]
([applicant]
,[time]
,[record_cnt]
,[update_cnt]
,[add_cnt]
,[state]
,[data])
VALUES
('%s'
,'%s'
,%d
,%d
,%d
,'%s'
,'%s')`, d.Applicant, d.Time, d.Record_cnt, d.Update_cnt, d.Add_cnt,
d.State, d.Data)
_, err = sqlConn.Exec(insert_sql)
if err != nil {
logs.Error(fmt.Sprintf("import_approve_m err:%v", err.Error()))
goto exit
}
resp.Ret = 0
exit:
if resp.Ret != 1 {
approve_m_lock.Lock()
approve_m_lock_n = 0
approve_m_lock.Unlock()
}
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("import_approve_m recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_approve_m_data(req get_approve_m_req) (resp get_approve_m_resp) {
var sqlstr string
var where_sql string
var if_where bool
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.Applicant != "" {
likeStr := "%" + req.Applicant + "%"
where_sql = fmt.Sprintf(" [applicant] like '%s'", likeStr)
if_where = true
}
if if_where {
sqlstr = fmt.Sprintf("select count(ID) from [m_approve] where %s ", where_sql)
} else {
sqlstr = fmt.Sprintf("select count(ID) from [m_approve] ")
}
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_approve_m_data query %s err:%v", sqlstr, err.Error()))
goto exit
}
for cntRow.Next() {
var cnt int
if err = cntRow.Scan(&cnt); err != nil {
logs.Error(fmt.Sprintf("get_approve_m_data scan %s err:%v", sqlstr, err.Error()))
goto exit
} else {
resp.Total = cnt
}
}
cntRow.Close()
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[applicant],[time],[record_cnt],[update_cnt],[add_cnt],[state],[data] from [m_approve] where ID not in (select top %v ID from [m_approve] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[applicant],[time],[record_cnt],[update_cnt],[add_cnt],[state],[data] from [m_approve] where %s and ID not in (select top %v ID from [m_approve] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_approve_m_data Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d approve_m_info
if err := rdRow.Scan(&d.ID, &d.Applicant, &d.Time, &d.Record_cnt, &d.Update_cnt, &d.Add_cnt, &d.State, &d.Data); err == nil {
/*if d.State != "已批准" {
d.Add_cnt = 0
d.Update_cnt = 0
var t_data []approve_m_detail
json.Unmarshal([]byte(d.Data), &t_data)
for i := 0; i < len(t_data); i++ {
if _, ok := material_map[t_data[i].Code]; ok {
d.Update_cnt++
t_data[i].Op_type = "替换"
t_data[i].Last_price = material_map[t_data[i].Code].Price
last_price := strings.ReplaceAll(t_data[i].Last_price, ",", "")
price := strings.ReplaceAll(t_data[i].Price, ",", "")
p1, _ := strconv.ParseFloat(last_price, 64)
p2, _ := strconv.ParseFloat(price, 64)
t_data[i].Price_span = fmt.Sprintf(`%.2f`, p2-p1)
} else {
d.Add_cnt++
t_data[i].Op_type = "新增"
}
}
str, _ := json.Marshal(t_data)
d.Data = string(str)
}
*/
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_approve_m_data scan Error", err.Error())
}
}
exit:
return
}
func get_approve_m(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_approve_m recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_approve_m_req
var resp get_approve_m_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_approve_m_data(req)
jdata, _ := json.Marshal(resp)
str := string(jdata)
str = strings.ReplaceAll(str, "%", "%%")
fmt.Fprintf(response, str)
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_approve_m recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 删除物料
func remove_material(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("remove_material recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req remove_material_req
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
year := time.Now().Year()
month := int(time.Now().Month())
day := time.Now().Day()
del_time := fmt.Sprintf(`%d/%02d/%02d`, year, month, day)
for i := 0; i < len(req.ID); i++ {
selsql := fmt.Sprintf(`update [material] SET [if_del] = 1,[del_time]='%s',[del_user]='%s' where ID=%d`,
del_time, req.OpUser,
req.ID[i])
sqlConn.Exec(selsql)
}
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("remove_material recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_material_data_by_maxid(max_id int) (resp get_material_resp) {
var sqlstr string
var if_where bool
var rdRow *sql.Rows
var err error
if !if_where {
sqlstr = fmt.Sprintf("select [ID],[data] from [material] order by ID desc ")
} else {
sqlstr = fmt.Sprintf("select [ID],[data] from [material] where ID>%d order by ID desc", max_id)
}
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_material_data Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d material_info
var id int
var s string
if err := rdRow.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
d.Effective_time = cal_effective_date(d.Update_date, d.Validity_period_of_quotation)
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_material_data scan Error", err.Error())
}
}
if len(resp.Data) > 0 {
g_material_maxid = resp.Data[0].ID
}
exit:
return
}
func get_material_data(req get_material_req, flag bool) (resp get_material_resp) {
var sqlstr string
var where_sql string
var if_where bool
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
if !flag {
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
}
if req.Code != "" {
likeStr := "%" + req.Code + "%"
where_sql = fmt.Sprintf(" [code] like '%s'", likeStr)
if_where = true
}
if req.Name != "" {
likeStr := "%" + req.Name + "%"
if if_where {
where_sql += fmt.Sprintf(" and [name] like '%s'", likeStr)
} else {
where_sql = fmt.Sprintf(" [name] like '%s'", likeStr)
}
if_where = true
}
if req.Supplier != "" {
likeStr := "%" + req.Supplier + "%"
if if_where {
where_sql += fmt.Sprintf(" and [supplier] like '%s'", likeStr)
} else {
where_sql = fmt.Sprintf(" [supplier] like '%s'", likeStr)
}
if_where = true
}
if req.Bt != "" {
if if_where {
where_sql += fmt.Sprintf(" and [update_time] > '%s'", req.Bt)
} else {
where_sql = fmt.Sprintf(" [update_time] > '%s'", req.Bt)
}
if_where = true
}
if req.Et != "" {
if if_where {
where_sql += fmt.Sprintf(" and [update_time] < '%s'", req.Et)
} else {
where_sql = fmt.Sprintf(" [update_time] < '%s'", req.Et)
}
if_where = true
}
if req.If_del {
if if_where {
where_sql += fmt.Sprintf(" and [if_del]=1 ")
} else {
where_sql = fmt.Sprintf(" [if_del]=1 ")
}
if_where = true
} else {
if if_where {
where_sql += fmt.Sprintf(" and ([if_del]!=1 or if_del is null)")
} else {
where_sql = fmt.Sprintf(" ([if_del]!=1 or if_del is null) ")
}
if_where = true
}
if if_where {
sqlstr = fmt.Sprintf("select count(ID) from [material] where %s ", where_sql)
} else {
sqlstr = fmt.Sprintf("select count(ID) from [material] ")
}
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_material_data query %s err:%v", sqlstr, err.Error()))
goto exit
}
for cntRow.Next() {
var cnt int
if err = cntRow.Scan(&cnt); err != nil {
logs.Error(fmt.Sprintf("get_material_data scan %s err:%v", sqlstr, err.Error()))
goto exit
} else {
resp.Total = cnt
}
}
cntRow.Close()
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[data],[del_time],[del_user] from [material] where ID not in (select top %v ID from [material] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[data],[del_time],[del_user] from [material] where %s and ID not in (select top %v ID from [material] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_material_data Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d material_info
var id int
var s, del_time, del_user string
if err := rdRow.Scan(&id, &s, &del_time, &del_user); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
d.Del_time = del_time
d.Del_user = del_user
if d.Validity_period_of_quotation != "长期" {
if len(d.Update_date) > 2 && d.Update_date[2] != byte('/') {
d.Update_date = d.Update_date[2:]
}
if len(d.Update_date_2) > 2 && d.Update_date_2[2] != byte('/') {
d.Update_date_2 = d.Update_date_2[2:]
}
if len(d.Update_date_3) > 2 && d.Update_date_3[2] != byte('/') {
d.Update_date_3 = d.Update_date_3[2:]
}
if len(d.Update_date_4) > 2 && d.Update_date_4[2] != byte('/') {
d.Update_date_4 = d.Update_date_4[2:]
}
if len(d.Update_date_5) > 2 && d.Update_date_5[2] != byte('/') {
d.Update_date_5 = d.Update_date_5[2:]
}
if d.Update_date != "" {
d.Effective_time = cal_effective_date("20"+d.Update_date, d.Validity_period_of_quotation)
}
} else {
d.Effective_time = ""
}
d.Price = convert_price(d.Price)
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_material_data scan Error", err.Error())
}
}
exit:
return
}
func get_material(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_material recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_material_req
var resp get_material_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_material_data(req, false)
jdata, _ := json.Marshal(resp)
str := string(jdata)
str = strings.ReplaceAll(str, "%", "%%")
fmt.Fprintf(response, str)
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_material recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func cal_completion_date(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("cal_completion_date recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var sqlstr string
var resp cal_completion_date_resp
var days int
reqdata, _ := ioutil.ReadAll(request.Body)
var req cal_completion_date_req
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.Bt == "" {
logs.Info("cal_completion_date req bt 为空")
goto exit
}
req.Bt = strings.ReplaceAll(req.Bt, "/", "-") + " 00:00:00"
days, _ = strconv.Atoi(req.Days)
if days > 0 {
m := make(map[int]int)
var cnt int
loc, _ := time.LoadLocation("Local")
bt, _ := time.ParseInLocation(g_time_format, req.Bt, loc)
fmt.Println(bt.Month())
id := bt.Year()*10000 + int(bt.Month())*100 + bt.Day()
sqlstr = fmt.Sprintf(`select [day],[type] FROM [holiday] where [day] >%d `, id)
fmt.Println(sqlstr)
rows, err := sqlConn.Query(sqlstr)
if err != nil {
logs.Info("cal_completion_date err:", err.Error())
goto exit
}
for rows.Next() {
var day, day_type int
if err = rows.Scan(&day, &day_type); err == nil {
m[day] = day_type
}
}
rows.Close()
fmt.Println(m)
for {
if cnt >= days {
resp.Completion_date = bt.Format(g_time_format)
if len(resp.Completion_date) >= 19 {
resp.Completion_date = resp.Completion_date[:10]
}
break
}
bt = bt.Add(time.Hour * 24)
key := bt.Year()*10000 + int(bt.Month())*100 + bt.Day()
if _, ok := m[key]; ok {
//1--假期 2--上班
if m[key] == 1 {
} else if m[key] == 2 {
cnt++
}
} else {
if int(bt.Weekday()) == 0 || int(bt.Weekday()) == 6 {
} else {
cnt++
}
}
}
} else {
resp.Completion_date = req.Bt
goto exit
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("cal_completion_date recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func export_ma_plan(response http.ResponseWriter, request *http.Request) {
/*beginTime := time.Now().UnixNano()
logs.Info("export_ma_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var csv_data [][]string
var filename string
filename = fmt.Sprintf(`./file/%v.csv`, beginTime)
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var req get_ma_plan_req
var resp download_file_Resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
req.Index = 1
req.Count = 100000
resp_data := get_plan(req)
csv_data = append(csv_data,
[]string{
"序号", "任务分配日期", "负责人", "需求R号", "申购R号",
"物料编号", "物料名称", "物料规格描述", "单位", "数量", "单价", "金额", "税码",
"供方编码及名称", "周期", "质量标准", "验收标准", "随货资料", "用途",
"采购合同/订单号R号", "采购合同/订单号", "SAP订单号", "投产日期", "订单到期日",
"已到货数量", "未到货数量", "SAP入库单号", "SAP入库日期", "订单是否超期", "备注"})
for i := 0; i < len(resp_data.Data); i++ {
v := resp_data.Data[i]
csv_data = append(csv_data,
[]string{
strconv.Itoa(v.ID), v.Dispath_date, v.Header, v.R_id_1, v.R_id_2,
v.Material_id, v.Material_name, v.Material_describe, v.Unit, v.Number, v.Unit_price, v.Amount_money, v.Tax_code,
v.Supplier, v.Cycle, v.Quality_standard, v.Acceptance_criteria, v.Information, v.Purpose,
v.Order_r_id, v.Procure_id, v.Sap_id, v.Production_date, v.Due_date,
v.Arrival_quantity, v.Undelivered_quantity, v.SAP_Warehouse_entry_number, v.SAP_Warehouse_entry_date,
v.Over_due, v.Note})
}
f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码
w := csv.NewWriter(f) //创建一个新的写入文件流
w.WriteAll(csv_data)
w.Flush()
resp.FileId = fmt.Sprintf(`%v.csv`, beginTime)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("export_ma_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
*/
}
func remove_ma_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("remove_ma_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
var selsql string
var plan pp_plan
var rows *sql.Rows
// var if_del bool = true
var ids []int
reqdata, _ := ioutil.ReadAll(request.Body)
var req remove_ma_plan_req
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
if req.ID == 0 {
logs.Info("remove_ma_plan req id ==0")
resp.Ret = -1
goto exit
}
selsql = fmt.Sprintf(`SELECT [data] FROM [plan] where ID=%d`, req.ID)
rows, err = sqlConn.Query(selsql)
if err == nil {
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &plan)
}
}
rows.Close()
} else {
resp.Ret = -1
goto exit
}
if plan.ID == 0 {
resp.Ret = -1
goto exit
}
fmt.Println(plan.Child_task_id)
/*for i := 0; i < len(plan.Child_task_id); i++ {
selsql = fmt.Sprintf(`SELECT [if_del] FROM [plan] where ID=%d`, req.ID)
rows, err = sqlConn.Query(selsql)
if err == nil {
var b int
for rows.Next() {
if err = rows.Scan(&b); err == nil {
}
}
rows.Close()
if b == 0 {
if_del = false
break
}
}
}*/
if len(plan.Child_task_id) > 0 {
ids = append(ids, plan.Child_task_id...)
}
ids = append(ids, plan.ID)
fmt.Println(ids)
for i := 0; i < len(ids); i++ {
sqlstr = fmt.Sprintf(`DELETE FROM [plan] WHERE ID=%d`, ids[i])
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("remove_ma_plan err:", err.Error())
resp.Ret = -1
goto exit
}
sqlstr = fmt.Sprintf(`DELETE FROM [payment] WHERE ID=%d`, ids[i])
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("remove_ma_plan err:", err.Error())
resp.Ret = -1
goto exit
}
}
if plan.Pre_id > 0 {
update_pre_task_paid(plan.Pre_id)
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("remove_ma_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_ma_username(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_ma_username recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ma_username_req
var resp get_ma_username_resp
var users []useInfo
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
users, _ = get_all_user()
for i := 0; i < len(users); i++ {
resp.Data = append(resp.Data, users[i].Username)
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_ma_username recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_p_name(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_p_name recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_p_name_req
var resp get_p_name_resp
var sqlstr string
var rdRow *sql.Rows
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_id != "" {
sqlstr = fmt.Sprintf("select [p_name] from [sap] where p_id = '%s' order by ID desc", req.P_id)
} else {
goto exit
}
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_p_name Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d string
if err := rdRow.Scan(&d); err == nil {
resp.P_name = d
} else {
logs.Error("get_p_name scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_p_name recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_p_id_options(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_p_id_options recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_p_id_options_req
var resp get_p_id_options_resp
var sqlstr string
var rdRow *sql.Rows
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_like_id != "" {
like_id := "%" + req.P_like_id + "%"
sqlstr = fmt.Sprintf("select [p_id] from [sap] where p_id like '%s' order by ID desc", like_id)
} else {
sqlstr = fmt.Sprintf("select [p_id] from [sap] order by ID desc")
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_p_id_options Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d string
if err := rdRow.Scan(&d); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_p_id_options scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_p_id_options recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func update_ma_plan_ex(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("update_ma_plan_ex recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req update_ma_plan_req
var resp CommonResp
var js_data []byte
var update_sql string
var err error
var if_done int
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
//req.Plan.Demand_date = "20" + req.Plan.Demand_date
sel_sql := fmt.Sprintf(`select [data] from [plan] where ID=%d`, req.Plan.ID)
rows, err := sqlConn.Query(sel_sql)
if err != nil {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
var old_data pp_plan
for rows.Next() {
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &old_data)
}
}
rows.Close()
if old_data.ID == 0 {
resp.Ret = -1
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
return
}
old_demand_date := convert_date(old_data.Demand_date)
demand_date := convert_date(req.Plan.Demand_date)
if old_demand_date != demand_date {
old_data.Demand_date_update_cnt += 1
}
old_data.RDM = req.Plan.RDM
old_data.Num = strings.ReplaceAll(req.Plan.Num, ",", "")
old_data.Demand_date = req.Plan.Demand_date
old_data.Buy_record = req.Plan.Buy_record
old_data.Arrival_quantity = req.Plan.Arrival_quantity
old_data.State = req.Plan.State
old_data.Warehouse_entry_number = req.Plan.Warehouse_entry_number
old_data.Buyer = req.Plan.Buyer
old_data.Serial_num = req.Plan.Serial_num
old_data.Contract_id = req.Plan.Contract_id
old_data.Pay_Amount = req.Plan.Pay_Amount
old_data.Batch_No = req.Plan.Batch_No
old_data.Remark = req.Plan.Remark
if old_data.State == "待收货" {
old_data.Order_date = fmt.Sprintf(`%d/%02d/%02d`, time.Now().Year(), time.Now().Month(), time.Now().Day())
}
//预计超期
if old_data.Order_date != "" && old_data.Demand_date != "" {
fmt.Println(old_data.Demand_date, old_data.Order_date)
t_order := convert_date(old_data.Order_date)
t_demand := convert_date(old_data.Demand_date)
fmt.Println(t_demand, t_order)
if t_order != "" && t_demand != "" {
loc, _ := time.LoadLocation("Local")
order_date, _ := time.ParseInLocation(g_time_format, t_order+" 00:00:00", loc)
demand_date, _ := time.ParseInLocation(g_time_format, t_demand+" 00:00:00", loc)
span := (demand_date.Sub(order_date).Hours()) / 24
cycle, _ := strconv.Atoi(old_data.Purchasing_cycle)
if int(span)-cycle < 0 {
old_data.Over_due1 = fmt.Sprintf(`%d`, cycle-int(span))
//fmt.Println(req.Plan.Residue)
old_data.Residue = ""
} else {
old_data.Residue = strconv.Itoa(int(span) - cycle)
old_data.Over_due1 = ""
}
}
}
if old_data.State == "已收货" {
old_data.Actual_delivery_date = fmt.Sprintf(`%d/%02d/%02d`, time.Now().Year(), time.Now().Month(), time.Now().Day())
}
if old_data.State == "交检" && old_data.Pre_id == 0 {
if_done = 1
} else if old_data.Pre_id == 0 && old_data.State != "交检" {
if_done = 0
}
old_data.Arrival_quantity_text = fmt.Sprintf(`%v/%v`, old_data.Arrival_quantity, old_data.Num)
if old_data.Flag == "2" || old_data.Flag == "3" {
// num, _ := strconv.ParseFloat(old_data.Num, 64)
numStr := strings.ReplaceAll(old_data.Num, ",", "")
num, _ := strconv.ParseFloat(numStr, 64)
price, _ := strconv.ParseFloat(strings.ReplaceAll(old_data.Price, ",", ""), 64)
fmt.Println(old_data.Price)
fmt.Println(num, price, num*price)
old_data.Total_p = fmt.Sprintf(`%.2f`, num*price)
paid, _ := strconv.ParseFloat(old_data.Paid, 64)
old_data.Residual_p = fmt.Sprintf(`%.2f`, num*price-paid)
var payment_data payment_info
payment_data.Total_p = old_data.Total_p
payment_data.Residual_p = old_data.Residual_p
payment_data.Paid = old_data.Paid
update_payment_data(payment_data)
}
js_data, _ = json.Marshal(old_data)
update_sql = fmt.Sprintf(`UPDATE [plan]
SET [data] = '%s'
,[state]='%s'
,[rdm] = '%s'
,[op_time] = '%s'
,[code] = '%s'
,[name] = '%s'
,[supplier] = '%s'
,[if_done]=%d
,[buyer]='%s',[order_date]='%s',[remark]='%s'
WHERE ID=%d`, string(js_data), old_data.State, old_data.RDM, time.Now().Format("2006-01-02 15:04:05"),
old_data.Code, old_data.Name, old_data.Supplier, if_done, old_data.Buyer, old_data.Order_date, old_data.Remark,
old_data.ID)
fmt.Println(update_sql)
_, err = sqlConn.Exec(update_sql)
if err != nil {
logs.Error(fmt.Sprintf(`update_ma_plan_ex err:%s`, err.Error()))
resp.Ret = -1
goto exit
}
resp.Ret = 0
if old_data.Pre_id > 0 {
//主任务付款信息
update_pre_task_paid(old_data.Pre_id)
go func(pre_id int) {
sel_sql := fmt.Sprintf(`select [state] from [plan] where [pre_id]=%d`, pre_id)
fmt.Println(sel_sql)
if_all_done := true
rows, err := sqlConn.Query(sel_sql)
if err == nil {
for rows.Next() {
var state string
if err = rows.Scan(&state); err == nil {
fmt.Println(state)
if state != "交检" {
if_all_done = false
}
} else {
fmt.Println(err.Error())
return
}
}
rows.Close()
} else {
return
}
fmt.Println(if_all_done)
if if_all_done {
update_sql = fmt.Sprintf(`UPDATE [plan]
SET [if_done]=%d
WHERE [pre_id]=%d`, 1, pre_id)
sqlConn.Exec(update_sql)
update_sql = fmt.Sprintf(`UPDATE [plan]
SET [if_done]=%d
WHERE ID=%d`, 1, pre_id)
sqlConn.Exec(update_sql)
} else {
update_sql = fmt.Sprintf(`UPDATE [plan]
SET [if_done]=%d
WHERE ID=%d`, 0, pre_id)
sqlConn.Exec(update_sql)
}
}(old_data.Pre_id)
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("update_ma_plan_ex recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_s_plan(req get_single_plan_req) (resp get_single_plan_resp) {
var sqlstr string
var where_sql string
var rdRow *sql.Rows
var err error
user_info, _ := getUserInfo(req.OpUser)
/*b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}*/
if len(req.ID) == 0 {
return
}
where_sql += " where ID in ( "
for i := 0; i < len(req.ID); i++ {
if i == 0 {
where_sql += strconv.Itoa(req.ID[i])
} else {
where_sql += "," + strconv.Itoa(req.ID[i])
}
}
where_sql += " ) and [if_del] !=1"
sqlstr = fmt.Sprintf("select [ID],[data] from [plan] %s", where_sql)
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_s_plan Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d pp_plan
var id int
var s string
if err := rdRow.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
if d.Payment_type == "1" {
d.Payment_type = "全款"
} else if d.Payment_type == "2" {
d.Payment_type = "分期"
}
if len(d.Child_task_id) == 0 {
d.Child_task_id = []int{}
}
if d.Flag == "1" {
d.Price = ""
} else {
d.Price = convert_price(d.Price)
}
if len(d.Demand_date) > 2 {
if d.Demand_date[2] != byte('/') {
d.Demand_date = d.Demand_date[2:]
}
}
if len(d.Order_date) > 2 {
if d.Order_date[2] != byte('/') {
d.Order_date = d.Order_date[2:]
}
}
if len(d.Actual_delivery_date) > 2 {
if d.Actual_delivery_date[2] != byte('/') {
d.Actual_delivery_date = d.Actual_delivery_date[2:]
}
}
if d.Actual_delivery_date != "" && d.Demand_date != "" {
t_actual_date := convert_date(d.Actual_delivery_date)
t_demand := convert_date(d.Demand_date)
if t_actual_date != "" && t_demand != "" {
loc, _ := time.LoadLocation("Local")
actual_delivery_date, _ := time.ParseInLocation(g_time_format, "20"+strings.ReplaceAll(d.Actual_delivery_date, "/", "-")+" 00:00:00", loc)
demand_date, _ := time.ParseInLocation(g_time_format, "20"+strings.ReplaceAll(d.Demand_date, "/", "-")+" 00:00:00", loc)
span := (actual_delivery_date.Sub(demand_date).Hours()) / 24
if int(span) >= 1 {
d.Over_due2 = fmt.Sprintf(`%d`, int(span))
}
}
}
d.Total_p = convert_price(d.Total_p)
d.Paid = convert_price(d.Paid)
d.Residual_p = convert_price(d.Residual_p)
if d.Flag == "2" || d.Flag == "3" {
if d.Arrival_quantity == "" {
d.Arrival_quantity = "0"
}
d.Arrival_quantity_text = fmt.Sprintf(`%v/%v`, d.Arrival_quantity, d.Num)
} else {
d.Arrival_quantity_text = ""
}
if user_info.RoleId == 1 {
d.If_modify = true
} else {
if !req.If_done {
d.If_modify = true
}
}
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_ma_plan scan Error", err.Error())
}
}
exit:
return
}
func get_single_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_single_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_single_plan_req
var resp get_single_plan_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_s_plan(req)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_single_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 价格转换千分位显示
func convert_price(old_prive string) (price_t string) {
var t_str string
index := strings.Index(old_prive, ".")
if index > 0 {
t_str = old_prive[index:]
}
var price_str string
price, _ := strconv.ParseFloat(strings.ReplaceAll(old_prive, ",", ""), 64)
//fmt.Println("价格:", price)
n := int(price)
str := strconv.Itoa(n)
var arr []byte
var cnt int
for i := len(str) - 1; i >= 0; i-- {
cnt++
if cnt%4 == 0 {
arr = append(arr, byte(','))
arr = append(arr, str[i])
cnt = 1
} else {
arr = append(arr, str[i])
}
}
//fmt.Println(string(arr))
var t_arr []byte
for i := len(arr) - 1; i >= 0; i-- {
t_arr = append(t_arr, arr[i])
}
//fmt.Println(string(t_arr))
price_str = string(t_arr)
if price_str != "" {
price_str += t_str
} else {
price_str += fmt.Sprintf(`0%s`, t_str)
}
/*n4 := (price - float64(int(price))) * 100
fmt.Println(n4)
n5 := int(n4) % 100
if n5 >= 0 {
if price_str != "" {
price_str += fmt.Sprintf(`.%02d`, n5)
} else {
price_str += fmt.Sprintf(`0.%02d`, n5)
}
}*/
price_t = price_str
return
}
// 日期转成2006-04-05格式
func convert_date(old_date string) (date string) {
old_date = strings.ReplaceAll(old_date, "/", "-")
t_arr := strings.Split(old_date, "-")
if len(t_arr) == 3 {
year, _ := strconv.Atoi(t_arr[0])
if year < 100 {
year += 2000
}
month, _ := strconv.Atoi(t_arr[1])
day, _ := strconv.Atoi(t_arr[2])
date = fmt.Sprintf(`%d-%02d-%02d`, year, month, day)
}
return
}
func get_warning(req get_ma_plan_req) (resp get_ma_plan_resp) {
var sqlstr string
var where_sql string
var if_where bool
var rdRow *sql.Rows
var err error
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
where_sql += " [if_done]!=1 and ([flag]='2' or [flag]='3')"
if_where = true
if if_where {
where_sql += fmt.Sprintf(" and [if_del] !=1")
} else {
where_sql += fmt.Sprintf(" [if_del] !=1")
}
sqlstr = fmt.Sprintf("select [ID],[data] from [plan] where %s order by supplier desc,order_date desc", where_sql)
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ma_plan Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d pp_plan
var id int
var s string
if err := rdRow.Scan(&id, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
if d.Payment_type == "1" {
d.Payment_type = "全款"
} else if d.Payment_type == "2" {
d.Payment_type = "分期"
}
if len(d.Child_task_id) == 0 {
d.Child_task_id = []int{}
}
if d.Flag == "1" {
d.Price = ""
} else {
d.Price = convert_price(d.Price)
}
d.Total_p = convert_price(d.Total_p)
d.Residual_p = convert_price(d.Residual_p)
var warning_flag bool
date := strings.ReplaceAll(time.Now().Format("2006-01-02"), "-", "/")
if date > d.Demand_date {
warning_flag = true
}
if d.Order_date != "" {
t_order := convert_date(d.Order_date)
if t_order != "" {
loc, _ := time.LoadLocation("Local")
bt, _ := time.ParseInLocation(g_time_format, t_order+" 00:00:00", loc)
if int(time.Now().Sub(bt).Hours()) > 96 && d.State == "待签署" {
warning_flag = true
}
}
}
if d.Flag == "2" || d.Flag == "3" {
d.Arrival_quantity_text = fmt.Sprintf(`%v/%v`, d.Arrival_quantity, d.Num)
} else {
d.Arrival_quantity_text = ""
}
if warning_flag {
resp.Data = append(resp.Data, d)
}
} else {
logs.Error("get_ma_plan scan Error", err.Error())
}
}
exit:
if len(resp.Data) == 0 {
resp.Data = []pp_plan{}
}
return
}
func get_warning_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_ma_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ma_plan_req
var resp get_ma_plan_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_warning(req)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_ma_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func export_warning_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("export_ma_temp_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var csv_data [][]string
var filename string
filename = fmt.Sprintf(`./file/%v.csv`, beginTime)
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var req get_ma_plan_req
var resp download_file_Resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp_data := get_warning(req)
csv_data = append(csv_data,
[]string{
"序号", "RDM", "编号", "名称", "规格", "单位", "数量", "单价", "合计", "状态", "交付日期",
"下单日期", "预计超期", "供应商"})
for i := 0; i < len(resp_data.Data); i++ {
v := resp_data.Data[i]
csv_data = append(csv_data,
[]string{
strconv.Itoa(v.ID), v.RDM, v.Code, v.Name, v.Specs, v.Unit, v.Num, v.Price, v.Total_p,
v.State, v.Demand_date, v.Order_date, v.Over_due1, v.Supplier})
}
f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码
w := csv.NewWriter(f) //创建一个新的写入文件流
w.WriteAll(csv_data)
w.Flush()
resp.FileId = fmt.Sprintf(`%v.csv`, beginTime)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("export_warning_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_plan(req get_ma_plan_req) (resp get_ma_plan_resp) {
var sqlstr string
var where_sql string
var if_where bool
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
var sp_resp get_sp_1_resp
var sp_2_resp get_sp_1_resp
user_info, _ := getUserInfo(req.OpUser)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.ID != "" {
//likeStr := "%" + req.ID + "%"
where_sql = fmt.Sprintf(" [ID] = %s", req.ID)
if_where = true
}
if req.RDM != "" {
likeStr := "%" + req.RDM + "%"
if if_where {
where_sql += fmt.Sprintf(" and [rdm] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [rdm] like '%s'", likeStr)
}
if_where = true
}
if req.Bt != "" {
if if_where {
where_sql += fmt.Sprintf(" and [op_time] > '%s'", req.Bt)
} else {
where_sql += fmt.Sprintf(" [op_time] > '%s'", req.Bt)
}
if_where = true
}
if req.Et != "" {
if if_where {
where_sql += fmt.Sprintf(" and [op_time] < '%s'", req.Et)
} else {
where_sql += fmt.Sprintf(" [op_time] < '%s'", req.Et)
}
if_where = true
}
if req.Code != "" {
likeStr := "%" + req.Code + "%"
if if_where {
where_sql += fmt.Sprintf(" and [code] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [code] like '%s'", likeStr)
}
if_where = true
}
if req.Name != "" {
likeStr := "%" + req.Name + "%"
if if_where {
where_sql += fmt.Sprintf(" and [name] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [name] like '%s'", likeStr)
}
if_where = true
}
if req.Supplier != "" {
likeStr := "%" + req.Supplier + "%"
if if_where {
where_sql += fmt.Sprintf(" and [supplier] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [supplier] like '%s'", likeStr)
}
if_where = true
}
if req.State != "" {
likeStr := "%" + req.State + "%"
if if_where {
where_sql += fmt.Sprintf(" and [state] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [state] like '%s'", likeStr)
}
if_where = true
}
if req.Buyer != "" {
likeStr := "%" + req.Buyer + "%"
if if_where {
where_sql += fmt.Sprintf(" and [buyer] like '%s'", likeStr)
} else {
where_sql += fmt.Sprintf(" [buyer] like '%s'", likeStr)
}
if_where = true
}
if if_where { //有查询条件则全部查询
where_sql += fmt.Sprintf(" ")
} else {
where_sql += fmt.Sprintf(" [flag] !='2'")
if_where = true
}
if req.If_done {
if if_where {
where_sql += " and [if_done]=1"
} else {
where_sql += " [if_done]=1"
}
if_where = true
} else { //未处理
if if_where {
where_sql += " and [if_done]!=1 "
} else {
where_sql += " [if_done]!=1 "
}
if_where = true
}
if if_where {
where_sql += fmt.Sprintf(" and [if_del] !=1")
} else {
where_sql += fmt.Sprintf(" [if_del] !=1")
}
if if_where {
sqlstr = fmt.Sprintf("select count(ID) from [plan] where %s ", where_sql)
} else {
sqlstr = fmt.Sprintf("select count(ID) from [plan] ")
}
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ma_plan query %s err:%v", sqlstr, err.Error()))
goto exit
}
for cntRow.Next() {
var cnt int
if err = cntRow.Scan(&cnt); err != nil {
logs.Error(fmt.Sprintf("get_ma_plan scan %s err:%v", sqlstr, err.Error()))
goto exit
} else {
resp.Total = cnt
}
}
cntRow.Close()
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[remark],[data] from [plan] where ID not in (select top %v ID from [plan] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[remark],[data] from [plan] where %s and ID not in (select top %v ID from [plan] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ma_plan Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d pp_plan
var id int
var s string
var remark string
if err := rdRow.Scan(&id, &remark, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
d.Remark = remark
if d.Payment_type == "1" {
d.Payment_type = "全款"
} else if d.Payment_type == "2" {
d.Payment_type = "分期"
}
if len(d.Child_task_id) == 0 {
d.Child_task_id = []int{}
}
if d.Flag == "1" {
d.Price = ""
} else {
d.Price = convert_price(d.Price)
}
if len(d.Demand_date) > 2 {
if d.Demand_date[2] != byte('/') {
d.Demand_date = d.Demand_date[2:]
}
}
if len(d.Order_date) > 2 {
if d.Order_date[2] != byte('/') {
d.Order_date = d.Order_date[2:]
}
}
if len(d.Actual_delivery_date) > 2 {
if d.Actual_delivery_date[2] != byte('/') {
d.Actual_delivery_date = d.Actual_delivery_date[2:]
}
}
if d.Actual_delivery_date != "" && d.Demand_date != "" {
t_actual_date := convert_date(d.Actual_delivery_date)
t_demand := convert_date(d.Demand_date)
if t_actual_date != "" && t_demand != "" {
loc, _ := time.LoadLocation("Local")
actual_delivery_date, _ := time.ParseInLocation(g_time_format, t_actual_date+" 00:00:00", loc)
demand_date, _ := time.ParseInLocation(g_time_format, t_demand+" 00:00:00", loc)
span := (actual_delivery_date.Sub(demand_date).Hours()) / 24
if int(span) >= 1 {
d.Over_due2 = fmt.Sprintf(`%d`, int(span))
}
}
}
d.Total_p = convert_price(d.Total_p)
d.Paid = convert_price(d.Paid)
d.Residual_p = convert_price(d.Residual_p)
if d.Flag == "2" || d.Flag == "3" {
if d.Arrival_quantity == "" {
d.Arrival_quantity = "0"
}
d.Arrival_quantity_text = fmt.Sprintf(`%v/%v`, d.Arrival_quantity, d.Num)
} else {
d.Arrival_quantity_text = ""
}
if d.Flag == "1" && d.Code == "" {
d.Name = ""
d.Specs = ""
d.Unit = ""
d.Price = ""
d.Payment_type = ""
d.Purchasing_cycle = ""
d.Supplier = ""
d.Factory = ""
d.Factory_code = ""
d.Qs = ""
d.As = ""
}
if user_info.RoleId == 1 {
d.If_modify = true
} else {
if !req.If_done {
d.If_modify = true
}
}
//查询原合同链接
sp_resp = get_sp_by_id(id)
fmt.Println("sp_resp", sp_resp.Data)
if len(sp_resp.Data) > 0 {
d.Contract_name = sp_resp.Data[0].Contract_name
}
//查询付款合同链接
sp_2_resp = get_sp2_by_id(id)
if len(sp_2_resp.Data) > 0 {
d.Pay_Contract_name = sp_2_resp.Data[0].Contract_name
}
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_ma_plan scan Error", err.Error())
}
}
exit:
return
}
func get_ma_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("get_ma_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ma_plan_req
var resp get_ma_plan_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
resp = get_plan(req)
jdata, _ := json.Marshal(resp)
str := string(jdata)
str = strings.ReplaceAll(str, "%", "%%")
fmt.Fprintf(response, str)
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_ma_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func export_plan_by_code(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("export_plan_by_code recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var csv_data [][]string
var filename string
filename = fmt.Sprintf(`./file/%v.csv`, beginTime)
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var req get_ma_plan_req
//var resp get_ma_plan_resp
var resp download_file_Resp
var pp_data []pp_plan
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
var sqlstr string
var where_sql string
var if_where bool
var rdRow *sql.Rows
//var err error
var test_map map[string]int
test_map = make(map[string]int)
var count int
if len(req.Codes) > 0 {
var codes string
for i := 0; i < len(req.Codes); i++ {
if i == 0 {
codes = "'" + req.Codes[i] + "'"
} else {
codes += ",'" + req.Codes[i] + "'"
}
}
fmt.Println("---req.Codes", codes)
if if_where {
where_sql += fmt.Sprintf(" and [code] in (%s)", codes)
} else {
where_sql += fmt.Sprintf(" [code] in (%s)", codes)
}
if_where = true
}
if if_where { //有查询条件则全部查询
where_sql += fmt.Sprintf(" ")
} else {
where_sql += fmt.Sprintf(" [flag] !='2'")
if_where = true
}
if if_where {
where_sql += fmt.Sprintf(" and [if_del] !=1")
} else {
where_sql += fmt.Sprintf(" [if_del] !=1")
}
sqlstr = fmt.Sprintf("select [ID],[code],[data] from [plan] where %s order by supplier, op_time desc", where_sql)
fmt.Println("-----sqlstr", sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ma_plan Query err:%v", err.Error()))
return
}
defer rdRow.Close()
for rdRow.Next() {
var d pp_plan
var id int
var code string
var s string
if err := rdRow.Scan(&id, &code, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
if d.Flag == "1" {
d.Price = ""
} else {
d.Price = convert_price(d.Price)
}
if _, ok := test_map[code]; ok {
count = count + 1
if count > 5 {
continue
}
} else {
count = 1
}
test_map[code] = id
pp_data = append(pp_data, d)
} else {
logs.Error("get_ma_plan scan Error", err.Error())
}
}
for i := 0; i < len(req.Codes); i++ {
var dd pp_plan
if _, ok := test_map[req.Codes[i]]; ok {
} else {
dd.Code = req.Codes[i]
pp_data = append(pp_data, dd)
}
}
csv_data = append(csv_data,
[]string{
"六合编号", "日期", "单价", "供应商", "需求任务"})
for i := 0; i < len(pp_data); i++ {
v := pp_data[i]
csv_data = append(csv_data,
[]string{
v.Code, v.Order_date, v.Price, v.Supplier, v.RDM})
}
f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码
w := csv.NewWriter(f) //创建一个新的写入文件流
w.WriteAll(csv_data)
w.Flush()
resp.FileId = fmt.Sprintf(`%v.csv`, beginTime)
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("export_ma_temp_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func search_plan_by_code(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("search_plan_by_code recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ma_plan_req
var resp get_ma_plan_resp
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
fmt.Println("----req", req)
resp = get_plan_by_code(req)
jdata, _ := json.Marshal(resp)
str := string(jdata)
str = strings.ReplaceAll(str, "%", "%%")
fmt.Fprintf(response, str)
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("get_ma_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_plan_by_code(req get_ma_plan_req) (resp get_ma_plan_resp) {
var sqlstr string
var where_sql string
var if_where bool
var rdRow *sql.Rows
var err error
var test_map map[string]int
test_map = make(map[string]int)
var count int
if len(req.Codes) > 0 {
var codes string
for i := 0; i < len(req.Codes); i++ {
if i == 0 {
codes = "'" + req.Codes[i] + "'"
} else {
codes += ",'" + req.Codes[i] + "'"
}
}
fmt.Println("---req.Codes", codes)
if if_where {
where_sql += fmt.Sprintf(" and [code] in (%s)", codes)
} else {
where_sql += fmt.Sprintf(" [code] in (%s)", codes)
}
if_where = true
}
if if_where { //有查询条件则全部查询
where_sql += fmt.Sprintf(" ")
} else {
where_sql += fmt.Sprintf(" [flag] !='2'")
if_where = true
}
if if_where {
where_sql += fmt.Sprintf(" and [if_del] !=1")
} else {
where_sql += fmt.Sprintf(" [if_del] !=1")
}
sqlstr = fmt.Sprintf("select [ID],[code],[data] from [plan] where %s order by supplier, op_time desc", where_sql)
fmt.Println("-----sqlstr", sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ma_plan Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d pp_plan
var id int
var code string
var s string
if err := rdRow.Scan(&id, &code, &s); err == nil {
json.Unmarshal([]byte(s), &d)
d.ID = id
if d.Flag == "1" {
d.Price = ""
} else {
d.Price = convert_price(d.Price)
}
if _, ok := test_map[code]; ok {
count = count + 1
if count > 5 {
continue
}
} else {
count = 1
}
test_map[code] = id
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_ma_plan scan Error", err.Error())
}
}
for i := 0; i < len(req.Codes); i++ {
var dd pp_plan
if _, ok := test_map[req.Codes[i]]; ok {
} else {
dd.Code = req.Codes[i]
resp.Data = append(resp.Data, dd)
}
}
exit:
return
}
func import_ma_plan(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("import_ma_plan recv req begin", time.Now().Format("2006-01-02 15:04:05"))
m_map := make(map[string]material_info)
m_pre_id := make(map[int]int)
var flag int
var reqdata []byte
var req import_ma_plan_Req
var resp CommonResp
var b bool
var total_p, total_paid, total_residual_p float64
var sel_sql string
var rows *sql.Rows
var err error
var max_id int
var child_task_id []int
var err_context string
var if_ok bool
// var get_sp_1_req_data get_sp_1_req
// sp_1_map := make(map[int]sp_1)
ma_plan_lock.Lock()
flag = ma_plan_lock_n
ma_plan_lock.Unlock()
if flag == 1 {
resp.Ret = 1
goto exit
} else {
ma_plan_lock.Lock()
ma_plan_lock_n = 1
ma_plan_lock.Unlock()
}
reqdata, _ = ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b = checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Plan); i++ {
if req.Plan[i].Flag == "1" {
continue
}
var if_exist bool
sel_sql := fmt.Sprintf(`select [data] from [material] where [code]='%s' `, req.Plan[i].Code)
rows, err := sqlConn.Query(sel_sql)
if err == nil {
for rows.Next() {
var v material_info
var s string
if err = rows.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &v)
m_map[strings.TrimSpace(v.Code)] = v
if_exist = true
}
}
rows.Close()
}
//导入编号不存在
if !if_exist {
if_ok = true
if err_context == "" {
err_context = req.Plan[i].Code
} else {
err_context += "
" + req.Plan[i].Code
}
}
if req.Plan[i].Buyer == "" || req.Plan[i].Order_date == "" {
resp.Ret = 2
resp.Context = fmt.Sprintf(`编码:%s 采购人员(下单日期)不可为空!`, req.Plan[i].Code)
goto exit
}
/*if req.Plan[i].Contract_id == "" {
resp.Ret = 2
resp.Context = fmt.Sprintf(`编码:%s 合同号不可为空!`, req.Plan[i].Code)
goto exit
}*/
if len(req.Plan[i].Demand_date) > 2 && (req.Plan[i].Demand_date[2] == byte('/') || req.Plan[i].Demand_date[2] == byte('-')) {
resp.Ret = 2
resp.Context = fmt.Sprintf(`编码:%s 时间格式不对!`, req.Plan[i].Code)
goto exit
}
if len(req.Plan[i].Order_date) > 2 && (req.Plan[i].Order_date[2] == byte('/') || req.Plan[i].Order_date[2] == byte('-')) {
resp.Ret = 2
resp.Context = fmt.Sprintf(`编码:%s 时间格式不对!`, req.Plan[i].Code)
goto exit
}
}
if if_ok {
resp.Ret = 2
resp.Context = fmt.Sprintf(`编码:
%s
对应的物料数据没有,请先导入物料数据!`, err_context)
goto exit
}
/*{
get_sp_1_req_data.Index = 1
get_sp_1_req_data.Count = 1000000
sp_1_data := get_sp_1_info(get_sp_1_req_data)
for i := 0; i < len(sp_1_data.Data); i++ {
sp_1_map[sp_1_data.Data[i].ID] = sp_1_data.Data[i]
}
}*/
sel_sql = fmt.Sprintf(`select top 1 [ID] from [plan] order by [ID] desc`)
rows, err = sqlConn.Query(sel_sql)
if err != nil {
resp.Ret = -1
fmt.Println(err.Error())
goto exit
}
for rows.Next() {
if err = rows.Scan(&max_id); err != nil {
}
}
rows.Close()
for i := len(req.Plan) - 1; i >= 0; i-- {
req.Plan[i].ID = max_id + 1
max_id = req.Plan[i].ID
req.Plan[i].Demand_date = strings.ReplaceAll(req.Plan[i].Demand_date, "-", "/")
t := strings.Split(req.Plan[i].Demand_date, "/")
if len(t) == 3 {
month, _ := strconv.Atoi(t[1])
day, _ := strconv.Atoi(t[2])
req.Plan[i].Demand_date = fmt.Sprintf(`%s/%02d/%02d`, t[0], month, day)
}
req.Plan[i].Order_date = strings.ReplaceAll(req.Plan[i].Order_date, "-", "/")
t = strings.Split(req.Plan[i].Order_date, "/")
if len(t) == 3 {
month, _ := strconv.Atoi(t[1])
day, _ := strconv.Atoi(t[2])
req.Plan[i].Order_date = fmt.Sprintf(`%s/%02d/%02d`, t[0], month, day)
}
code := strings.TrimSpace(req.Plan[i].Code)
if v, ok := m_map[code]; ok {
req.Plan[i].Name = v.Name
req.Plan[i].Specs = v.Spec
req.Plan[i].Unit = v.Unit
req.Plan[i].Price = v.Price
fmt.Println("单价:", v.Price)
req.Plan[i].Payment_type = v.Payment_type
req.Plan[i].Purchasing_cycle = v.Procurement_cycle
req.Plan[i].Supplier = v.Supplier
req.Plan[i].Factory = v.Factory
req.Plan[i].Factory_code = v.Factory_code
req.Plan[i].Qs = v.Qs
req.Plan[i].As = v.As
} else {
fmt.Println("单价:0")
js_data, _ := json.Marshal(m_map)
fmt.Println(string(js_data))
}
req.Plan[i].Num = strings.TrimSpace(req.Plan[i].Num)
num, _ := strconv.ParseFloat(req.Plan[i].Num, 64)
price, _ := strconv.ParseFloat(strings.ReplaceAll(req.Plan[i].Price, ",", ""), 64)
req.Plan[i].Total_p = fmt.Sprintf(`%.2f`, num*price)
paid, _ := strconv.ParseFloat(req.Plan[i].Paid, 64)
req.Plan[i].Residual_p = fmt.Sprintf(`%.2f`, num*price-paid)
if req.Plan[i].Flag == "2" {
total_p += num * price
total_paid += paid
total_residual_p += (num*price - paid)
child_task_id = append(child_task_id, req.Plan[i].ID)
} else {
if len(child_task_id) > 0 {
for j := 0; j < len(child_task_id); j++ {
m_pre_id[child_task_id[j]] = req.Plan[i].ID
}
req.Plan[i].Total_p = fmt.Sprintf(`%.2f`, total_p)
req.Plan[i].Paid = fmt.Sprintf(`%.2f`, total_paid)
req.Plan[i].Residual_p = fmt.Sprintf(`%.2f`, total_residual_p)
req.Plan[i].Child_task_id = append(req.Plan[i].Child_task_id, child_task_id...)
child_task_id = []int{}
total_p = 0
total_paid = 0
total_residual_p = 0
}
}
if req.Plan[i].State == "待收货" {
req.Plan[i].Order_date = fmt.Sprintf(`%d/%02d/%02d`, time.Now().Year(), time.Now().Month(), time.Now().Day())
}
//预计超期
if req.Plan[i].Order_date != "" && req.Plan[i].Demand_date != "" {
//fmt.Println(req.Plan[i].Demand_date, req.Plan[i].Order_date)
t_order := convert_date(req.Plan[i].Order_date)
t_demand := convert_date(req.Plan[i].Demand_date)
//fmt.Println(t_demand, t_order)
if t_order != "" && t_demand != "" {
loc, _ := time.LoadLocation("Local")
order_date, _ := time.ParseInLocation(g_time_format, t_order+" 00:00:00", loc)
demand_date, _ := time.ParseInLocation(g_time_format, t_demand+" 00:00:00", loc)
span := (demand_date.Sub(order_date).Hours()) / 24
cycle, _ := strconv.Atoi(req.Plan[i].Purchasing_cycle)
fmt.Println(fmt.Sprintf(`span:%v cycle:%v`, span, cycle))
if int(span)-cycle < 0 {
req.Plan[i].Over_due1 = fmt.Sprintf(`%d`, cycle-int(span))
} else {
req.Plan[i].Residue = fmt.Sprintf(`%d`, int(span)-cycle)
}
}
}
if req.Plan[i].State == "已收货" {
req.Plan[i].Actual_delivery_date = fmt.Sprintf(`%d/%02d/%02d`, time.Now().Year(), time.Now().Month(), time.Now().Day())
}
if req.Plan[i].Actual_delivery_date != "" && req.Plan[i].Demand_date != "" {
t_date := convert_date(req.Plan[i].Actual_delivery_date)
t_demand := convert_date(req.Plan[i].Demand_date)
if t_date != "" && t_demand != "" {
loc, _ := time.LoadLocation("Local")
actual_delivery_date, _ := time.ParseInLocation(g_time_format, t_date+" 00:00:00", loc)
demand_date, _ := time.ParseInLocation(g_time_format, t_demand+" 00:00:00", loc)
span := (actual_delivery_date.Sub(demand_date).Hours()) / 24
if int(span) >= 1 {
req.Plan[i].Over_due2 = fmt.Sprintf(`%d`, int(span))
}
}
}
}
for i := 0; i < len(req.Plan); i++ {
if _, ok := m_pre_id[req.Plan[i].ID]; ok {
req.Plan[i].Pre_id = m_pre_id[req.Plan[i].ID]
} else {
req.Plan[i].Pre_id = 0
}
/*if contract_info, ok := sp_1_map[req.Plan[i].Contract_id]; ok {
req.Plan[i].Contract_amount = contract_info.Amount
}*/
req.Plan[i].Contract_state = "待审批"
req.Plan[i].State_1 = ""
var if_done int
if req.Plan[i].State == "交检" {
if_done = 1
}
req.Plan[i].Arrival_quantity_text = fmt.Sprintf(`%v/%v`, req.Plan[i].Arrival_quantity, req.Plan[i].Num)
jdata, _ := json.Marshal(req.Plan[i])
sqlstr := fmt.Sprintf(`INSERT INTO [plan]
([ID],[data]
,[state]
,[rdm]
,[op_time]
,[code]
,[name]
,[supplier]
,[flag]
,[if_del]
,[pre_id]
,[if_done],[buyer],[order_date] ,[contract_id])
VALUES
(%d,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s'
,'%s',%d,%d,%d,'%s','%s','%s')`,
req.Plan[i].ID, string(jdata), req.Plan[i].State, req.Plan[i].RDM, time.Now().Format("2006-01-02 15:04:05"),
req.Plan[i].Code, req.Plan[i].Name, req.Plan[i].Supplier, req.Plan[i].Flag, 0,
req.Plan[i].Pre_id, if_done, req.Plan[i].Buyer, req.Plan[i].Order_date,
req.Plan[i].Contract_id)
_, err := sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("import_ma_plan Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
}
resp.Ret = 0
exit:
if resp.Ret != 1 {
ma_plan_lock.Lock()
ma_plan_lock_n = 0
ma_plan_lock.Unlock()
}
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("import_ma_plan recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func download_file(rw http.ResponseWriter, r *http.Request) {
//获取请求参数
/*var req download_file_req
reqdata, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(reqdata, &req)
fn := req.Filename*/
filename := r.FormValue("id")
base_file_path := modelePath + "/file/"
if filename != "" {
//设置响应头
header := rw.Header()
header.Add("Content-Type", "application/octet-stream")
//header.Add("Content-Disposition", "attachment;filename="+fn)
//使用ioutil包读取文件
filepath := base_file_path + filename
fmt.Println(filepath)
b, _ := ioutil.ReadFile(filepath)
//写入到响应流中
rw.Write(b)
}
}
func get_time_ex(search_time string) (st []string, b bool) {
t := strings.Split(search_time, "-")
if len(t) == 2 {
t0 := strings.Split(t[0], "/")
if len(t0) == 3 {
year, _ := strconv.Atoi(t0[0])
month, _ := strconv.Atoi(t0[1])
day, _ := strconv.Atoi(t0[2])
t0 := fmt.Sprintf(`20%02d/%02d/%02d`, year, month, day)
st = append(st, t0)
} else {
b = true
}
t1 := strings.Split(t[1], "/")
if len(t1) == 3 {
year, _ := strconv.Atoi(t1[0])
month, _ := strconv.Atoi(t1[1])
day, _ := strconv.Atoi(t1[2])
t0 := fmt.Sprintf(`20%02d/%02d/%02d`, year, month, day)
st = append(st, t0)
} else {
b = true
}
} else if len(t) == 1 {
tt := strings.Split(t[0], "/")
if len(tt) == 3 {
year, _ := strconv.Atoi(tt[0])
month, _ := strconv.Atoi(tt[1])
day, _ := strconv.Atoi(tt[2])
bt := fmt.Sprintf(`20%02d/%02d/%02d`, year, month, day)
et := fmt.Sprintf(`20%02d/%02d/%02d`, year, month, day)
st = append(st, bt)
st = append(st, et)
} else {
b = true
}
}
if b {
st = []string{}
}
return
}
func get_time(search_time string) (whereSql string) {
t := strings.Split(search_time, "-")
if len(t) == 2 {
var if_where bool
t0 := strings.Split(t[0], "/")
if len(t0) == 2 {
year, _ := strconv.Atoi(t0[0])
month, _ := strconv.Atoi(t0[1])
t := (year+2000)*100 + month
whereSql += fmt.Sprintf(` [month] >= %d `, t)
if_where = true
} else if len(t0) == 3 {
year, _ := strconv.Atoi(t0[0])
month, _ := strconv.Atoi(t0[1])
day, _ := strconv.Atoi(t0[2])
t := fmt.Sprintf(`20%02d-%02d-%02d 00:00:00`, year, month, day)
whereSql += fmt.Sprintf(` [time]>='%s' `, t)
if_where = true
}
t1 := strings.Split(t[1], "/")
if len(t1) == 2 {
year, _ := strconv.Atoi(t1[0])
month, _ := strconv.Atoi(t1[1])
t := (year+2000)*100 + month
if if_where {
whereSql += fmt.Sprintf(` and [month] <= %d `, t)
} else {
whereSql += fmt.Sprintf(` [month] <= %d `, t)
}
} else if len(t1) == 3 {
year, _ := strconv.Atoi(t1[0])
month, _ := strconv.Atoi(t1[1])
day, _ := strconv.Atoi(t1[2])
t := fmt.Sprintf(`20%02d-%02d-%02d 23:59:59`, year, month, day)
if if_where {
whereSql += fmt.Sprintf(` and [time]<='%s' `, t)
} else {
whereSql += fmt.Sprintf(` [time]<='%s' `, t)
}
if_where = true
}
} else if len(t) == 1 {
tt := strings.Split(t[0], "/")
if len(tt) == 2 {
year, _ := strconv.Atoi(tt[0])
month, _ := strconv.Atoi(tt[1])
search_month := (year+2000)*100 + month
whereSql = fmt.Sprintf(` [month] = %d`, search_month)
} else if len(tt) == 3 {
year, _ := strconv.Atoi(tt[0])
month, _ := strconv.Atoi(tt[1])
day, _ := strconv.Atoi(tt[2])
bt := fmt.Sprintf(`20%02d-%02d-%02d 00:00:00`, year, month, day)
et := fmt.Sprintf(`20%02d-%02d-%02d 23:59:59`, year, month, day)
whereSql = fmt.Sprintf(` [time]>='%s' and [time] <='%s' `, bt, et)
}
}
return
}
//用户管理相关接口
func getUserNames(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("getUserNames recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req getUserNamesReq
var resp getUserNamesResp
var sqlstr string
var rdRow *sql.Rows
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
sqlstr = fmt.Sprintf("select [username] from [user] order by ID asc")
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("getUserNames Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var name string
var v usernams
if err := rdRow.Scan(&name); err == nil {
v.Label = name
v.Value = name
resp.Names = append(resp.Names, v)
} else {
logs.Error("getUserNames scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("getUserNames recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func checkIsSysUserOnline(username string, op_uuid string) bool {
deesUserStatMaplck.RLock()
if v, ok := deesUserStatMap[username]; ok {
deesUserStatMaplck.RUnlock()
v.RLock()
refreshTime := v.RefreshTime
userrole := v.UserRole
uuid := v.Uuid
v.RUnlock()
if int64(time.Since(refreshTime).Seconds()) > int64(refreshSpan+1) {
return false
}
if op_uuid != uuid {
return false
}
if userrole != 1 {
return false
}
return true
} else {
deesUserStatMaplck.RUnlock()
return false
}
}
func update_user_buyer(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("update_user_buyer recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp PostUserResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req PostUserReq
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
if req.Id == 0 {
logs.Info("update userinfo req id ==0")
resp.Ret = -1
goto exit
}
sqlstr = fmt.Sprintf(`UPDATE [user] SET [if_buyer] = %d WHERE ID=%d`,
req.If_buyer, req.Id)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("update_user_buyer Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("update_user_buyer recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func postUser(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("postUser recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var roleid int
var err error
var sqlstr string
var resp PostUserResp
var departmentid int
reqdata, _ := ioutil.ReadAll(request.Body)
var req PostUserReq
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
if (req.OperType == 2 || req.OperType == 3) && req.Id == 0 {
logs.Info("update userinfo req id ==0")
resp.Ret = -1
goto exit
}
//add op check user for same username
if req.OperType == 1 {
var cnt int
row, err := sqlConn.Query(fmt.Sprintf(`select ID from [user] where [username] = '%s'`, req.Username))
if err != nil {
logs.Error(fmt.Sprintf("postUser get user cnt err:%v", err.Error()))
resp.Ret = -1
goto exit
}
for row.Next() {
cnt++
}
row.Close()
if cnt > 0 {
resp.Ret = 1
goto exit
}
}
roleid = 2
if req.Role == "管理员" {
roleid = 1
}
//1生产 2质检 3供应链 4交付 5研发 6 保温瓶
/*if req.Department == "生产" {
departmentid = 1
} else if req.Department == "质检" {
departmentid = 2
} else if req.Department == "供应链" {
departmentid = 3
} else if req.Department == "交付" {
departmentid = 4
} else if req.Department == "研发" {
departmentid = 5
} else if req.Department == "保温瓶" {
departmentid = 6
} else if req.Department == "技术" {
departmentid = 7
} else {
if req.OperType != 3 {
goto exit
}
}*/
if req.OperType == 1 { //add
//opType = 10001
//opContent = fmt.Sprintf(`新增用户%s`, req.Username)
sqlstr = fmt.Sprintf(`INSERT INTO [user] ([username],[password],[role_name],[role_id],[department],[department_id],[state]) VALUES ('%s','%s','%s',%d,'%s',%d,'%s')`,
req.Username, req.Password, req.Role, roleid, req.Department, departmentid,
"")
} else if req.OperType == 2 { //update
//opType = 10002
//opContent = fmt.Sprintf(`修改用户%s`, req.Username)
sqlstr = fmt.Sprintf(`UPDATE [user] SET [username] = '%s',[password] = '%s',[role_name] = '%s',[role_id] = %d,[department]='%s',[department_id]=%d ,[state]='%s' WHERE ID=%d`,
req.Username, req.Password, req.Role, roleid, req.Department, departmentid, "",
req.Id)
} else if req.OperType == 3 {
//opType = 10003
// opContent = fmt.Sprintf(`删除用户%s`, req.Username)
sqlstr = fmt.Sprintf(`DELETE FROM [user] WHERE ID=%d`, req.Id)
} else {
resp.Ret = -1
goto exit
}
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("postUser Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("postUser recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func getUsers(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("getUsers recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req getUsersReq
var resp GetUsersResp
var sqlstr string
var rcnt int
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.Id == "" {
sqlstr = "select count(ID) from [user] "
} else {
likeStr := "%" + req.Id + "%"
sqlstr = fmt.Sprintf("select count(ID) from [user] where [username] like '%s'", likeStr)
}
fmt.Println(sqlstr)
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("getUsers query %s err:%v", sqlstr, err.Error()))
goto exit
}
defer cntRow.Close()
for cntRow.Next() {
if err = cntRow.Scan(&rcnt); err != nil {
logs.Error(fmt.Sprintf("getUsers scan %s err:%v", sqlstr, err.Error()))
goto exit
}
}
resp.Total = rcnt
if req.Id == "" {
sqlstr = fmt.Sprintf("select top %v [ID],[username],[password],[role_name],[role_id],[department] ,[state],[if_buyer] from [user] where ID not in (select top %v ID from [user] order by ID asc) order by ID asc", req.Count, (req.Index-1)*req.Count)
} else {
likeStr := "%" + req.Id + "%"
sqlstr = fmt.Sprintf("select top %v [ID],[username],[password],[role_name],[role_id],[department] ,[state],[if_buyer] from [user] where username like '%s' and ID not in (select top %v ID from [user] where username like '%s' order by ID asc) order by ID asc", req.Count, likeStr, (req.Index-1)*req.Count, likeStr)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("getUsers Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d useInfo
if err := rdRow.Scan(&d.Userid, &d.Username, &d.Password, &d.RoleName, &d.RoleId,
&d.Department, &d.State, &d.If_buyer); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("getUsers scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("getUsers recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func checkUserIfOnline(username string, uuid string) bool {
deesUserStatMaplck.RLock()
if v, ok := deesUserStatMap[username]; ok {
deesUserStatMaplck.RUnlock()
v.RLock()
refreshTime := v.RefreshTime
lastuuid := v.Uuid
v.RUnlock()
if uuid != lastuuid {
return false
}
if int64(time.Since(refreshTime).Seconds()) > int64(refreshSpan+1) {
return false
}
return true
} else {
deesUserStatMaplck.RUnlock()
return false
}
}
func getUserInfo(username string) (d useInfo, err error) {
var sql string
sql = fmt.Sprintf("select [username],[password],[role_name],[role_id],[department],[department_id] from [user] where [username] = '%s'", username)
row, err := sqlConn.Query(sql)
if err != nil {
logs.Info("getUserInfo Query Error", err.Error())
return
}
for row.Next() {
if err = row.Scan(&d.Username, &d.Password, &d.RoleName, &d.RoleId, &d.Department, &d.DepartmentId); err == nil {
} else {
logs.Info("Query Error", err.Error())
}
}
row.Close()
return
}
func get_all_user() (resp []useInfo, err error) {
var sql string
sql = fmt.Sprintf("select [username],[password],[role_name],[role_id],[department],[department_id],[state] from [user] ")
row, err := sqlConn.Query(sql)
if err != nil {
logs.Info("get_all_user Query Error", err.Error())
return
}
for row.Next() {
var d useInfo
if err = row.Scan(&d.Username, &d.Password, &d.RoleName, &d.RoleId, &d.Department, &d.DepartmentId,
&d.State); err == nil {
resp = append(resp, d)
} else {
logs.Info("get_all_user scan Error", err.Error())
}
}
row.Close()
return
}
// 菜单
func getMenu(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("getMenu recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var req GetMenuReq
var resp GetMenuResp
var menu GetMenuRespData
var mItem menuItem
var userInfo useInfo
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
ifOnline := checkUserIfOnline(req.UserName, req.Uuid)
if !ifOnline {
logs.Error("用户不在线")
goto exit
}
userInfo, err = getUserInfo(req.UserName)
if err != nil {
logs.Error("getMenu:", err.Error())
goto exit
}
menu.Title = "计划管理"
menu.Index = "2"
//menu.Class = "el-icon-s-data"
//menu.SvgData.First = "M992.256 960 960 960 960 576.192C960 540.032 931.072 512 895.424 512l-126.784 0C732.352 512 704 540.736 704 576.192L704 960l-64 0L640 64.448C640 28.736 611.072 0 575.424 0L448.576 0C412.352 0 384 28.864 384 64.448L384 960 320 960 320 319.744C320 284.48 291.072 256 255.424 256L128.576 256C92.352 256 64 284.544 64 319.744L64 960 31.744 960C14.464 960 0 974.336 0 992 0 1009.152 14.208 1024 31.744 1024l960.448 0C1009.536 1024 1024 1009.664 1024 992 1024 974.848 1009.792 960 992.256 960z"
menu.SvgData.First = "M955.3 77.1H798.1V59.3c0-16.6-13.4-30-30-30s-30 13.4-30 30v17.8H278.3V59.3c0-16.6-13.4-30-30-30s-30 13.4-30 30v17.8H69.2c-22.1 0-40 17.9-40 40v837.1c0 22.1 17.9 40 40 40h886.1c22.1 0 40-17.9 40-40V117.1c0-22.1-17.9-40-40-40z m-29.9 847.1H99.2V376.4h826.2v547.8z m0-607.8H99.2V137.1h119.1v17.8c0 16.6 13.4 30 30 30s30-13.4 30-30v-17.8h459.9v17.8c0 16.6 13.4 30 30 30s30-13.4 30-30v-17.8h127.2v179.3z"
menu.SvgData.Second = "M470.4 551.3h321.4c18.2 0 33-14.8 33-33s-14.8-33-33-33H470.4c-18.2 0-33 14.8-33 33s14.8 33 33 33zM210.3 562.6l64.8 64.8 110.8-110.8c9.5-9.5 9.5-25 0-34.5s-25-9.5-34.5 0l-76.3 76.3-30.3-30.3c-9.5-9.5-25-9.5-34.5 0s-9.5 25 0 34.5zM470.4 785h321.4c18.2 0 33-14.8 33-33s-14.8-33-33-33H470.4c-18.2 0-33 14.8-33 33s14.8 33 33 33zM316.8 719.2h-67.9c-18.2 0-33 14.8-33 33s14.8 33 33 33h67.9c18.2 0 33-14.8 33-33s-14.8-33-33-33z"
menu.Key = menu.Index
mItem.Index = "/scb"
mItem.Title = "采购计划"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)
resp.MenuData = append(resp.MenuData, menu)
menu.Title = "审核"
menu.Index = "4"
//menu.Class = "el-icon-s-data"
//menu.SvgData.First = "M992.256 960 960 960 960 576.192C960 540.032 931.072 512 895.424 512l-126.784 0C732.352 512 704 540.736 704 576.192L704 960l-64 0L640 64.448C640 28.736 611.072 0 575.424 0L448.576 0C412.352 0 384 28.864 384 64.448L384 960 320 960 320 319.744C320 284.48 291.072 256 255.424 256L128.576 256C92.352 256 64 284.544 64 319.744L64 960 31.744 960C14.464 960 0 974.336 0 992 0 1009.152 14.208 1024 31.744 1024l960.448 0C1009.536 1024 1024 1009.664 1024 992 1024 974.848 1009.792 960 992.256 960z"
menu.SvgData.First = "M450.56 597.12L342.4 489.6l-44.8 44.8 147.84 148.48 342.4-273.92-39.68-49.92-297.6 238.08z"
menu.SvgData.Second = "M512 32A480 480 0 1 0 992 512 480.64 480.64 0 0 0 512 32z m0 896A416 416 0 1 1 928 512 416.64 416.64 0 0 1 512 928z"
menu.Key = menu.Index
menu.Items = []menuItem{}
mItem.Index = "/sp_1"
mItem.Title = "合同录入审批"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)
mItem.Index = "/sp_2"
mItem.Title = "付款申请审批"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)
resp.MenuData = append(resp.MenuData, menu)
if userInfo.RoleId == 1 {
menu.Title = "数据管理"
menu.Index = "3"
//menu.Class = "el-icon-user"
menu.SvgData.First = "M64 192V896h896V192H64zM0 128h1024v832H0V128z"
menu.SvgData.Second = "M64 384h896v64H64zM64 640h896v64H64zM128 256h192v64H128zM128 512h192v64H128zM128 768h192v64H128z"
menu.Key = menu.Index
menu.Items = []menuItem{}
mItem.Index = "/base_data"
mItem.Title = "物料数据库"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)
mItem.Index = "/pf"
mItem.Title = "导入物料审批"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)
mItem.Index = "/search_code"
mItem.Title = "根据编码匹配物料"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)
/*mItem.Index = "/payment"
mItem.Title = "付款维护"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)*/
resp.MenuData = append(resp.MenuData, menu)
}
if userInfo.RoleId == 1 {
menu.Title = "用户管理"
menu.Index = "1"
//menu.Class = "el-icon-user"
menu.SvgData.First = "M955.456 765.12a41.792 41.792 0 0 0-34.368-32.64 8.256 8.256 0 0 1-6.08-3.904 8.256 8.256 0 0 1-0.384-7.104 41.856 41.856 0 0 0-11.136-45.696 165.76 165.76 0 0 0-60.096-34.56 41.728 41.728 0 0 0-45.056 13.12c-1.216 1.472-3.328 3.264-6.336 3.264s-5.12-1.728-6.336-3.264a41.6 41.6 0 0 0-45.056-13.184 166.4 166.4 0 0 0-60.224 34.624 41.728 41.728 0 0 0-11.136 45.632 8.064 8.064 0 0 1-0.384 7.104 8.256 8.256 0 0 1-6.08 3.904 41.728 41.728 0 0 0-34.304 32.64 166.72 166.72 0 0 0 0 68.928c3.584 16.96 17.28 29.952 34.432 32.64 1.92 0.32 4.544 1.216 6.08 3.904a8.256 8.256 0 0 1 0.384 7.104 41.6 41.6 0 0 0 11.136 45.696c17.344 15.616 37.568 27.2 60.096 34.56a41.728 41.728 0 0 0 45.056-13.056c1.216-1.472 3.328-3.264 6.336-3.264s5.12 1.728 6.336 3.264a41.728 41.728 0 0 0 45.056 13.12c22.528-7.296 42.688-18.88 59.968-34.432 12.8-11.52 17.216-29.696 11.136-45.76a8.192 8.192 0 0 1 0.384-7.168 8.256 8.256 0 0 1 6.08-3.904 41.728 41.728 0 0 0 34.496-32.64 166.144 166.144 0 0 0 0-68.928z m-40.832 60.288a49.92 49.92 0 0 0-35.904 24.256 49.92 49.92 0 0 0-3.264 42.752 123.584 123.584 0 0 1-44.992 25.792 49.92 49.92 0 0 0-38.528-18.432 49.664 49.664 0 0 0-38.528 18.432 125.44 125.44 0 0 1-45.056-25.856 49.728 49.728 0 0 0-39.04-66.944 123.712 123.712 0 0 1 0-51.776 49.92 49.92 0 0 0 35.648-24.256 49.92 49.92 0 0 0 3.328-42.624c12.928-11.648 28.224-20.416 45.12-25.92a49.92 49.92 0 0 0 38.528 18.432c15.68 0 29.44-7.296 38.592-18.432 16.896 5.504 32.128 14.272 45.056 25.856a49.728 49.728 0 0 0 39.04 66.944 122.624 122.624 0 0 1 0 51.776z"
menu.SvgData.Second = "M791.936 736.96c-34.496 0-62.592 28.096-62.592 62.592s28.096 62.592 62.592 62.592 62.592-28.096 62.592-62.592-28.096-62.592-62.592-62.592z m0 83.456a20.864 20.864 0 1 1 0-41.728 20.864 20.864 0 0 1 0 41.728zM670.336 588.736c0.256 0.128 0.512 0.064 0.768 0.128l1.472 0.512 0.064-0.256a35.392 35.392 0 0 0 22.912-67.008l-0.384-0.064c-8.512-3.392-17.472-6.144-26.304-9.088a247.424 247.424 0 0 0 104.192-201.472 248.192 248.192 0 1 0-496.384 0c0 83.072 41.216 156.224 103.936 201.28-175.68 57.984-304.832 218.368-315.776 410.688 0 0.128 0.256 0.192 0.256 0.256a35.328 35.328 0 0 0 68.608 13.504c1.344-3.456 1.536-7.04 1.728-10.56l0.256-0.192a390.016 390.016 0 0 1 389.248-366.336c51.264 0 100.032 10.176 144.832 28.16 0.192 0.192 0.32 0.384 0.576 0.448zM347.648 311.424a177.28 177.28 0 1 1 354.56 0 177.28 177.28 0 0 1-354.56 0z"
menu.Key = menu.Index
menu.Items = []menuItem{}
mItem.Index = "/user"
mItem.Title = "用户信息"
mItem.Key = mItem.Index
menu.Items = append(menu.Items, mItem)
resp.MenuData = append(resp.MenuData, menu)
}
exit:
jdata, _ := json.Marshal(resp)
_, err = response.Write(jdata)
if err != nil {
logs.Error("getMenu:", err.Error())
}
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("getMenu recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func checkFileExpired() {
t := time.NewTicker(time.Minute * 3)
for {
select {
case <-t.C:
modelePath, err := ModulePath.GetModuleCurrentPath()
if err != nil {
logs.Error("GetModuleCurrentPath() failed err:", err.Error())
return
}
fileInfoList, err := ioutil.ReadDir(modelePath + "/file")
if err != nil {
logs.Error("ioutil.ReadDir err:", err.Error())
}
for i := range fileInfoList {
index := strings.Index(fileInfoList[i].Name(), ".")
if index > 0 {
filename := fileInfoList[i].Name()[:index]
//filename := strings.TrimSuffix(fileInfoList[i].Name(), ".auf")
logs.Info(filename) //打印当前文件或目录下的文件或目录名
t, err := strconv.ParseInt(filename, 10, 64)
if err == nil {
t = t / 1e9
if time.Now().Unix()-t > 60 {
os.Remove(modelePath + "/file/" + fileInfoList[i].Name())
}
} else {
//logs.Error("checkFileExpired err:", err.Error())
}
}
}
default:
time.Sleep(time.Minute * 1)
}
}
}
// 登录
func getUuid() string {
return uuid.NewV4().String()
}
func refreshUser(response http.ResponseWriter, request *http.Request) {
//beginTime := time.Now().UnixNano()
//logs.Info("refreshUser recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req RefreshUserReq
json.Unmarshal(reqdata, &req)
deesUserStatMaplck.RLock()
if v, ok := deesUserStatMap[req.Username]; ok {
deesUserStatMaplck.RUnlock()
v.Lock()
if v.Uuid == req.Uuid {
if time.Now().Before(v.ExpireTime) {
v.RefreshTime = time.Now()
v.ExpireTime = time.Now().Add(ExpireTimeSpan)
} else {
resp.Ret = -1
}
//logs.Info(fmt.Sprintf("refreshTime:%v expiretime:%v", v.RefreshTime.Format("2006-01-02 15:04:05"), v.ExpireTime.Format("2006-01-02 15:04:05")))
v.Unlock()
} else {
v.Unlock()
resp.Ret = -1
//fmt.Println("uuid:", v.Uuid)
//fmt.Println("req.uuid", req.Uuid)
}
} else {
deesUserStatMaplck.RUnlock()
resp.Ret = -1
}
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
// endTime := time.Now().UnixNano()
//logs.Info(fmt.Sprintf("refreshUser recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func LoginOut(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("LoginOut recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req LoginOutReq
json.Unmarshal(reqdata, &req)
/*
deesUserStatMaplck.Lock()
if _, ok := deesUserStatMap[req.Username]; ok {
delete(deesUserStatMap, req.Username)
}
deesUserStatMaplck.Unlock()
*/
resp.Ret = 0
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("LoginOut recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func Login(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("Login recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req LoginReq
var resp LoginResp
var err error
var uuid string
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
userinfo, err := getUserInfo(req.Username)
fmt.Println(userinfo)
if err != nil {
resp.Ret = -1
logs.Error("login::getUserInfo err:", err.Error())
goto exit
}
deesUserStatMaplck.RLock()
if v, ok := deesUserStatMap[req.Username]; ok {
deesUserStatMaplck.RUnlock()
v.RLock()
uuid = v.Uuid
if time.Now().Before(v.ExpireTime) {
refreshTime := v.RefreshTime
v.RUnlock()
if int64(time.Since(refreshTime).Seconds()) <= refreshSpan {
resp.Ret = 1
goto exit
}
//online user nojust refresh
//...
} else {
v.RUnlock()
}
uuid = getUuid()
} else {
deesUserStatMaplck.RUnlock()
uuid = getUuid()
}
if req.Password != userinfo.Password {
resp.Ret = -1
goto exit
}
exit:
if resp.Ret == 0 {
resp.RoleId = userinfo.RoleId
resp.DId = userinfo.DepartmentId
//refresh user state
var v DeesUserStat
v.Username = req.Username
v.RefreshTime = time.Now()
v.ExpireTime = time.Now().Add(ExpireTimeSpan)
v.Uuid = uuid
v.UserRole = userinfo.RoleId
resp.Uuid = uuid
deesUserStatMaplck.Lock()
deesUserStatMap[req.Username] = &v
deesUserStatMaplck.Unlock()
}
resp.Url = "main.html"
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("Login recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
// 跨域测试
func test(response http.ResponseWriter, request *http.Request) {
fmt.Println("recv test req")
response.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
response.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的类型
response.Header().Set("content-type", "application/json") //返回数据格式是json
fmt.Fprintf(response, "3")
}