新增前置计划的新功能
This commit is contained in:
parent
0827397a05
commit
83275fe36d
|
|
@ -1 +1 @@
|
|||
计划/项目号,产品编号,数量,需求日期,RDM任务号,需求人,是否附图加工,是否缺料,是否首次加工,是否使用新螺纹规
|
||||
计划/项目号,产品编号,数量,需求日期,生产回复日期,RDM任务号,需求人,是否附图加工,是否缺料,是否首次加工,是否使用新螺纹规,备注
|
||||
|
|
|
|||
|
696
main.go
696
main.go
|
|
@ -429,6 +429,7 @@ func main() {
|
|||
http.HandleFunc("/pkpi/getkpi", getKpi)
|
||||
http.HandleFunc("/pkpi/getPrekpi", getPrekpi)
|
||||
http.HandleFunc("/pkpi/importKpi", importKpi)
|
||||
http.HandleFunc("/pkpi/importPreTaskKpi", importPreTaskKpi)
|
||||
http.HandleFunc("/pkpi/importPreKpi", importPreKpi)
|
||||
http.HandleFunc("/pkpi/updatekpi_5", updatekpi_5)
|
||||
|
||||
|
|
@ -473,6 +474,7 @@ func main() {
|
|||
http.HandleFunc("/pkpi/import_plan_t", import_plan_t)
|
||||
|
||||
http.HandleFunc("/pkpi/get_p_id_options", get_p_id_options)
|
||||
http.HandleFunc("/pkpi/get_options_byId", get_options_byId)
|
||||
|
||||
http.HandleFunc("/pkpi/get_p_process_options", get_p_process_options)
|
||||
|
||||
|
|
@ -535,6 +537,9 @@ func main() {
|
|||
http.HandleFunc("/pkpi/export_not_completed_Kpi", export_not_completed_Kpi)
|
||||
http.HandleFunc("/pkpi/export_completed_Kpi", export_completed_Kpi)
|
||||
|
||||
http.HandleFunc("/pkpi/getPrePlanMess", getPrePlanMess)
|
||||
http.HandleFunc("/pkpi/ConfirmBaseData", ConfirmBaseData)
|
||||
|
||||
// ==================== 08/28 添加操作日志 start ====================
|
||||
http.HandleFunc("/pkpi/add_operation_log", add_operation_log)
|
||||
http.HandleFunc("/pkpi/get_operation_log", get_operation_log)
|
||||
|
|
@ -1970,9 +1975,9 @@ func get_p_id_options(response http.ResponseWriter, request *http.Request) {
|
|||
|
||||
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)
|
||||
sqlstr = fmt.Sprintf("select [p_id] from [sap] where p_id like '%s' and flag = '1' order by ID desc", like_id)
|
||||
} else {
|
||||
sqlstr = fmt.Sprintf("select [p_id] from [sap] order by ID desc")
|
||||
sqlstr = fmt.Sprintf("select [p_id] from [sap] where flag = '1' order by ID desc")
|
||||
}
|
||||
|
||||
fmt.Println(sqlstr)
|
||||
|
|
@ -2003,6 +2008,78 @@ exit:
|
|||
|
||||
}
|
||||
|
||||
func get_options_byId(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
|
||||
// 定义新的返回类型
|
||||
type OptionItem struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
// 修改:定义新的响应结构
|
||||
resp := struct {
|
||||
Data []OptionItem `json:"data"`
|
||||
}{
|
||||
Data: []OptionItem{},
|
||||
}
|
||||
|
||||
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 + "%"
|
||||
// 修改SQL查询,增加p_name字段
|
||||
sqlstr = fmt.Sprintf("select DISTINCT [p_id], [p_name] from [sap] where p_id like '%s' and flag = '1' order by p_id desc", like_id)
|
||||
} else {
|
||||
// 修改SQL查询,增加p_name字段
|
||||
sqlstr = fmt.Sprintf("select DISTINCT [p_id], [p_name] from [sap] where flag = '1' order by p_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 code string
|
||||
var name string // 增加name变量
|
||||
|
||||
// 修改Scan,扫描两个字段
|
||||
if err := rdRow.Scan(&code, &name); err == nil {
|
||||
// 将数据添加到resp中
|
||||
resp.Data = append(resp.Data, OptionItem{
|
||||
Code: code,
|
||||
Name: name,
|
||||
})
|
||||
} 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 import_plan_t(response http.ResponseWriter, request *http.Request) {
|
||||
beginTime := time.Now().UnixNano()
|
||||
fmt.Println("import_plan_t recv req begin", time.Now().Format("2006-01-02 15:04:05"))
|
||||
|
|
@ -2167,8 +2244,8 @@ func import_p(response http.ResponseWriter, request *http.Request) {
|
|||
rows.Close()
|
||||
|
||||
if id == 0 {
|
||||
sqlstr = fmt.Sprintf(`INSERT INTO [sap] ([p_id],[p_name])
|
||||
VALUES ('%s','%s')`, req.Data[i].P_id, req.Data[i].P_name)
|
||||
sqlstr = fmt.Sprintf(`INSERT INTO [sap] ([p_id],[p_name],[flag])
|
||||
VALUES ('%s','%s','%s')`, req.Data[i].P_id, req.Data[i].P_name, "1")
|
||||
} else {
|
||||
sqlstr = fmt.Sprintf(`UPDATE [dbo].[sap]
|
||||
SET [p_id] = '%s'
|
||||
|
|
@ -2274,7 +2351,7 @@ func post_p(response http.ResponseWriter, request *http.Request) {
|
|||
//add op check user for same info
|
||||
if req.OperType == 1 {
|
||||
var cnt int
|
||||
row, err := sqlConn.Query(fmt.Sprintf(`select ID from [sap] where [p_id] = '%s'`, req.P_id))
|
||||
row, err := sqlConn.Query(fmt.Sprintf(`select ID from [sap] where [p_id] = '%s' and [flag] = '1'`, req.P_id))
|
||||
if err != nil {
|
||||
logs.Error(fmt.Sprintf("post_p get sap cnt err:%v", err.Error()))
|
||||
resp.Ret = -1
|
||||
|
|
@ -2544,7 +2621,7 @@ func get_p_info(p_id string) (p_name string, if_exist bool) {
|
|||
var rdRow *sql.Rows
|
||||
var err error
|
||||
|
||||
sqlstr = fmt.Sprintf("select [p_name] from [sap] where p_id='%s'", p_id)
|
||||
sqlstr = fmt.Sprintf("select [p_name] from [sap] where p_id='%s' and [flag] = '1'", p_id)
|
||||
fmt.Println(sqlstr)
|
||||
|
||||
rdRow, err = sqlConn.Query(sqlstr)
|
||||
|
|
@ -2611,8 +2688,26 @@ func get_p(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
}
|
||||
|
||||
if req.Show_unconfirmed {
|
||||
if if_where {
|
||||
where_sql += fmt.Sprintf(` and [flag] = 0`)
|
||||
if_where = true
|
||||
} else {
|
||||
where_sql += fmt.Sprintf(`[flag] = 0`)
|
||||
if_where = true
|
||||
}
|
||||
} else {
|
||||
if if_where {
|
||||
where_sql += fmt.Sprintf(` and [flag] = 1`)
|
||||
if_where = true
|
||||
} else {
|
||||
where_sql += fmt.Sprintf(`[flag] = 1`)
|
||||
if_where = true
|
||||
}
|
||||
}
|
||||
|
||||
if !if_where {
|
||||
sqlstr = "select count(ID) from [sap]"
|
||||
sqlstr = "select count(ID) from [sap] and [flag] = '1'"
|
||||
} else {
|
||||
sqlstr = fmt.Sprintf("select count(ID) from [sap] where %s", where_sql)
|
||||
}
|
||||
|
|
@ -5319,8 +5414,9 @@ func task_transfer(response http.ResponseWriter, request *http.Request) {
|
|||
resp.Ret = -1
|
||||
goto exit
|
||||
}
|
||||
|
||||
fmt.Println("转入生产计划depa22222rtmentid", req.DepartmentName)
|
||||
departmentid = get_department_id_from_name(req.DepartmentName)
|
||||
fmt.Println("转入生产计划departmentid", departmentid)
|
||||
now_time = time.Now().Format("2006-01-02 15:04:05")
|
||||
for i := 0; i < len(req.ID); i++ {
|
||||
var kpiData kpi
|
||||
|
|
@ -5341,8 +5437,10 @@ func task_transfer(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
}
|
||||
rows.Close()
|
||||
fmt.Println("转入生产计划depa33333333rtmentid", departmentid)
|
||||
|
||||
scan_flag = scan_flag | (1 << (departmentid - 1))
|
||||
fmt.Println("转入生产计划depa444444444rtmentid", scan_flag)
|
||||
//update time
|
||||
task_transfer_update_time(stay_departmentid, departmentid, &kpiData)
|
||||
|
||||
|
|
@ -5350,6 +5448,8 @@ func task_transfer(response http.ResponseWriter, request *http.Request) {
|
|||
kpiData.Plan_state = "待分解"
|
||||
}
|
||||
|
||||
fmt.Println("kpiData.Plan_state = ", kpiData.Plan_state)
|
||||
|
||||
if stay_departmentid == 1 && departmentid != 1 {
|
||||
kpiData.Flag1 = true
|
||||
}
|
||||
|
|
@ -5373,6 +5473,8 @@ func task_transfer(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
|
||||
jdata, _ = json.Marshal(kpiData)
|
||||
fmt.Println("kpiData---------", kpiData)
|
||||
fmt.Println("jdata---------", jdata)
|
||||
sqlstr = fmt.Sprintf(`UPDATE [plan]
|
||||
SET [data] = '%s' ,[stay_department_id] = %d,[scan_flag] = %d,[p_state]='%s' WHERE ID=%d`,
|
||||
escapeSingleQuote(string(jdata)), departmentid, scan_flag, kpiData.Plan_state, req.ID[i])
|
||||
|
|
@ -5744,7 +5846,8 @@ func updatePrekpi(response http.ResponseWriter, request *http.Request) {
|
|||
promise_date = '%s',
|
||||
rmd_id = '%s',
|
||||
conveyer = '%s',
|
||||
total_num = '%s'
|
||||
total_num = '%s',
|
||||
remarks = '%s'
|
||||
WHERE id = %d`,
|
||||
escapeSingleQuote(req.Data.Task_id),
|
||||
req.Data.Product_id,
|
||||
|
|
@ -5753,6 +5856,7 @@ func updatePrekpi(response http.ResponseWriter, request *http.Request) {
|
|||
req.Data.RDM_id,
|
||||
req.Data.Conveyer,
|
||||
req.Data.Total_num,
|
||||
req.Data.Remarks,
|
||||
req.Data.ID)
|
||||
|
||||
fmt.Println("Update SQL:", sqlstr)
|
||||
|
|
@ -7574,7 +7678,7 @@ exit:
|
|||
|
||||
}
|
||||
|
||||
func importPreKpi(response http.ResponseWriter, request *http.Request) {
|
||||
func importPreTaskKpi(response http.ResponseWriter, request *http.Request) {
|
||||
beginTime := time.Now().UnixNano()
|
||||
fmt.Println("importKpi recv req begin", time.Now().Format("2006-01-02 15:04:05"))
|
||||
|
||||
|
|
@ -7614,9 +7718,8 @@ func importPreKpi(response http.ResponseWriter, request *http.Request) {
|
|||
v := req.Data[i]
|
||||
|
||||
if v.Task_id == "" || v.Product_id == "" || v.Total_num == "" ||
|
||||
v.Demand_date == "" || v.Conveyer == "" || v.RDM_id == "" || v.Is_img == "" || v.Is_materials == "" ||
|
||||
v.Is_new_gauge == "" || v.First_procesds == "" {
|
||||
resp.Err_text = "计划/项目号,产品编号,数量,需求日期,RDM任务号,交付人,是否附图加工,是否缺料,是否首次加工,是否使用新螺纹规,不可为空!"
|
||||
v.Demand_date == "" || v.Conveyer == "" {
|
||||
resp.Err_text = "计划/项目号,产品编号,数量,生产回复日期,RDM任务号,需求人不可为空!"
|
||||
resp.Ret = 1
|
||||
goto exit
|
||||
}
|
||||
|
|
@ -7723,12 +7826,345 @@ func importPreKpi(response http.ResponseWriter, request *http.Request) {
|
|||
err_context3 += " 不存在,请联系生产管理员添加!"
|
||||
}
|
||||
|
||||
if err_context4 != "" {
|
||||
err_context4 += " 需求日期必须大于当前日期三天及以上!"
|
||||
if err_context1 != "" || err_context2 != "" || err_context3 != "" {
|
||||
resp.Err_text = err_context3 + err_context2 + err_context1
|
||||
resp.Ret = 1
|
||||
goto exit
|
||||
}
|
||||
|
||||
if err_context1 != "" || err_context2 != "" || err_context3 != "" || err_context4 != "" {
|
||||
resp.Err_text = err_context3 + err_context2 + err_context1 + err_context4
|
||||
for i := 0; i < len(req.Data); i++ {
|
||||
req.Data[i].RDM_id = strings.ReplaceAll(req.Data[i].RDM_id, "#", "")
|
||||
|
||||
demand_t := req.Data[i].Demand_date
|
||||
demand_t = strings.ReplaceAll(demand_t, "-", "/")
|
||||
t := strings.Split(demand_t, "/")
|
||||
if len(t) == 3 {
|
||||
month, _ := strconv.Atoi(t[1])
|
||||
day, _ := strconv.Atoi(t[2])
|
||||
req.Data[i].Demand_date = fmt.Sprintf(`%s/%02d/%02d`, t[0], month, day)
|
||||
}
|
||||
|
||||
var maxid int
|
||||
var rows *sql.Rows
|
||||
|
||||
var start_department_id int
|
||||
var stay_department_id int
|
||||
var scan_flag int
|
||||
//mark stay did
|
||||
text := req.Data[i].Plan_state
|
||||
if text == "" {
|
||||
start_department_id = usrinfo.DepartmentId
|
||||
stay_department_id = start_department_id
|
||||
scan_flag = 1 << (usrinfo.DepartmentId - 1)
|
||||
|
||||
task_transfer_update_time(0, usrinfo.DepartmentId, &req.Data[i])
|
||||
} else {
|
||||
start_department_id = usrinfo.DepartmentId
|
||||
task_transfer_update_time(0, usrinfo.DepartmentId, &req.Data[i])
|
||||
|
||||
if strings.Contains(text, "核对物料") {
|
||||
stay_department_id = 3
|
||||
} else {
|
||||
stay_department_id = start_department_id
|
||||
}
|
||||
task_transfer_update_time(start_department_id, stay_department_id, &req.Data[i])
|
||||
|
||||
scan_flag = (1 << (start_department_id - 1)) | (1 << (stay_department_id - 1))
|
||||
}
|
||||
|
||||
req.Data[i].Department_name = usrinfo.Department
|
||||
req.Data[i].Plan_state = ""
|
||||
if req.Data[i].Plan_state == "" {
|
||||
req.Data[i].Plan_state = "待分解"
|
||||
}
|
||||
data, _ = json.Marshal(req.Data[i])
|
||||
month = time.Now().Year()*100 + int(time.Now().Month())
|
||||
|
||||
// 对包含单引号的字符串进行转义
|
||||
escapeSingleQuote := func(s string) string {
|
||||
return strings.Replace(s, "'", "''", -1)
|
||||
}
|
||||
|
||||
sqlstr = fmt.Sprintf(`INSERT INTO [plan]
|
||||
([time]
|
||||
,[month]
|
||||
,[data]
|
||||
,[start_department_id]
|
||||
,[stay_department_id]
|
||||
,[scan_flag]
|
||||
,[del_flag]
|
||||
,[p_id]
|
||||
,[p_name]
|
||||
,[group_leader]
|
||||
,[p_state]
|
||||
,[group_name]
|
||||
,[task_id]
|
||||
,[conveyer]
|
||||
,[rmd_id])
|
||||
VALUES ('%s',%d,'%s',%d,%d,%d,%d,'%s','%s','%s','%s','%s','%s','%s','%s')`,
|
||||
time.Now().Format("2006-01-02 15:04:05"), month,
|
||||
escapeSingleQuote(string(data)), // 转义JSON中的单引号
|
||||
start_department_id, stay_department_id,
|
||||
scan_flag, 0,
|
||||
escapeSingleQuote(req.Data[i].Product_id),
|
||||
escapeSingleQuote(req.Data[i].Product_name),
|
||||
"",
|
||||
req.Data[i].Plan_state,
|
||||
escapeSingleQuote(req.Data[i].Group_name),
|
||||
escapeSingleQuote(req.Data[i].Task_id),
|
||||
escapeSingleQuote(req.Data[i].Conveyer),
|
||||
escapeSingleQuote(req.Data[i].RDM_id))
|
||||
|
||||
mu.Lock()
|
||||
_, err = sqlConn.Exec(sqlstr)
|
||||
fmt.Println("sqlstr-------------------", sqlstr)
|
||||
if err != nil {
|
||||
mu.Unlock()
|
||||
logs.Info("importKpi Exec Error:", err.Error())
|
||||
fmt.Println("sqlstr-------------------", err.Error())
|
||||
resp.Ret = -1
|
||||
goto exit
|
||||
}
|
||||
|
||||
//将前置表更新为提交状态
|
||||
sqlstr = fmt.Sprintf(`UPDATE [pre_plan] SET [commit_flag] = 1 WHERE [id] = %v`, req.Data[i].ID)
|
||||
_, err = sqlConn.Exec(sqlstr)
|
||||
if err != nil {
|
||||
mu.Unlock()
|
||||
logs.Info("前置表更新失败:", err.Error())
|
||||
fmt.Println("前置表更新失败-------------------", err.Error())
|
||||
resp.Ret = -1
|
||||
goto exit
|
||||
}
|
||||
//获取id
|
||||
sqlstr = fmt.Sprintf(`SELECT top 1 [ID] FROM [plan] order by ID desc`)
|
||||
rows, err = sqlConn.Query(sqlstr)
|
||||
if err == nil {
|
||||
|
||||
for rows.Next() {
|
||||
if err = rows.Scan(&maxid); err != nil {
|
||||
logs.Info("addKpi scan Error:", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
rows.Close()
|
||||
}
|
||||
mu.Unlock()
|
||||
|
||||
if maxid > 0 {
|
||||
|
||||
now_time := time.Now().Format("2006-01-02 15:04:05")
|
||||
update_context := fmt.Sprintf(`任务导入`)
|
||||
sqlstr = fmt.Sprintf(`INSERT INTO [update_history] ([ID],[op_time],[op_user],[data]) VALUES (%d,'%s','%s','%s')`, maxid, now_time, req.OpUser, update_context)
|
||||
_, err = sqlConn.Exec(sqlstr)
|
||||
if err != nil {
|
||||
logs.Info("importKpi Exec Error:", err.Error())
|
||||
goto exit
|
||||
}
|
||||
|
||||
if stay_department_id != start_department_id {
|
||||
stay_did_name := get_department_name_from_did(stay_department_id)
|
||||
update_context = fmt.Sprintf(`任务从%s转到%s`, usrinfo.Department, stay_did_name)
|
||||
sqlstr = fmt.Sprintf(`INSERT INTO [update_history] ([ID],[op_time],[op_user],[data]) VALUES (%d,'%s','%s','%s')`, maxid, now_time, req.OpUser, update_context)
|
||||
_, err = sqlConn.Exec(sqlstr)
|
||||
if err != nil {
|
||||
logs.Info("importKpi Exec Error:", err.Error())
|
||||
goto exit
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resp.Ret = 0
|
||||
|
||||
exit:
|
||||
|
||||
jdata, _ := json.Marshal(resp)
|
||||
fmt.Fprintf(response, string(jdata))
|
||||
|
||||
endTime := time.Now().UnixNano()
|
||||
fmt.Println(fmt.Sprintf("importKpi recv req end, use time: %v ms", (endTime-beginTime)/1e6))
|
||||
|
||||
}
|
||||
|
||||
func importPreKpi(response http.ResponseWriter, request *http.Request) {
|
||||
beginTime := time.Now().UnixNano()
|
||||
fmt.Println("importKpi recv req begin", time.Now().Format("2006-01-02 15:04:05"))
|
||||
|
||||
var data []byte
|
||||
var month int
|
||||
|
||||
var err error
|
||||
var sqlstr string
|
||||
var resp import_kpi_resp
|
||||
|
||||
var usrinfo useInfo
|
||||
var err_context1 string
|
||||
var err_context2 string
|
||||
var err_context3 string
|
||||
var err_context4 string
|
||||
// var err_context5 string
|
||||
|
||||
reqdata, _ := ioutil.ReadAll(request.Body)
|
||||
var req importKpiReq
|
||||
json.Unmarshal(reqdata, &req)
|
||||
fmt.Println("Data------", req.Data)
|
||||
|
||||
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
|
||||
if !b {
|
||||
logs.Info(fmt.Sprintf("用户%s不在线"))
|
||||
resp.Ret = -1
|
||||
goto exit
|
||||
}
|
||||
|
||||
usrinfo, err = getUserInfo(req.OpUser)
|
||||
if err != nil {
|
||||
logs.Info(fmt.Sprintf("importKpi getUserInfo err:%s", err.Error()))
|
||||
resp.Ret = -1
|
||||
goto exit
|
||||
}
|
||||
|
||||
for i := 0; i < len(req.Data); i++ {
|
||||
v := req.Data[i]
|
||||
|
||||
if v.Task_id == "" || v.Product_id == "" || v.Total_num == "" ||
|
||||
v.Demand_date == "" || v.Conveyer == "" || v.RDM_id == "" || v.Is_img == "" || v.Is_materials == "" ||
|
||||
v.Is_new_gauge == "" || v.First_procesds == "" {
|
||||
resp.Err_text = "计划/项目号,产品编号,数量,需求日期,RDM任务号,交付人,是否附图加工,是否缺料,是否首次加工,是否使用新螺纹规,不可为空!"
|
||||
resp.Ret = 1
|
||||
goto exit
|
||||
}
|
||||
|
||||
if v.Total_num != "" {
|
||||
n, err := strconv.Atoi(v.Total_num)
|
||||
if err != nil {
|
||||
if err_context1 == "" {
|
||||
err_context1 += fmt.Sprintf(`产品编号:%s`, v.Product_id)
|
||||
} else {
|
||||
err_context1 += fmt.Sprintf(`;产品编号:%s`, v.Product_id)
|
||||
}
|
||||
} else {
|
||||
if n > 9999 {
|
||||
if err_context1 == "" {
|
||||
err_context1 += fmt.Sprintf(`产品编号:%s`, v.Product_id)
|
||||
} else {
|
||||
err_context1 += fmt.Sprintf(`;产品编号:%s`, v.Product_id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if v.RDM_id != "" {
|
||||
v.RDM_id = strings.ReplaceAll(v.RDM_id, "#", "")
|
||||
n, err := strconv.Atoi(v.RDM_id)
|
||||
if err != nil {
|
||||
if err_context2 == "" {
|
||||
err_context2 += fmt.Sprintf(`产品编号:%s`, v.Product_id)
|
||||
} else {
|
||||
err_context2 += fmt.Sprintf(`;产品编号:%s`, v.Product_id)
|
||||
}
|
||||
} else {
|
||||
if n > 9999999 {
|
||||
if err_context2 == "" {
|
||||
err_context2 += fmt.Sprintf(`产品编号:%s`, v.Product_id)
|
||||
} else {
|
||||
err_context2 += fmt.Sprintf(`;产品编号:%s`, v.Product_id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sqlstr = fmt.Sprintf("select [p_name] from [sap] where p_id='%s'", v.Product_id)
|
||||
fmt.Println(sqlstr)
|
||||
logs.Error("导入产品编号-------------", sqlstr)
|
||||
rdRow, err := sqlConn.Query(sqlstr)
|
||||
if err != nil {
|
||||
logs.Error(fmt.Sprintf("importKpi Query err:%v", err.Error()))
|
||||
goto exit
|
||||
}
|
||||
|
||||
var p_name string
|
||||
for rdRow.Next() {
|
||||
if err := rdRow.Scan(&p_name); err == nil {
|
||||
} else {
|
||||
logs.Error("importKpi scan Error", err.Error())
|
||||
}
|
||||
}
|
||||
logs.Error("导入产品名称-------------", p_name)
|
||||
rdRow.Close()
|
||||
|
||||
if p_name == "" {
|
||||
if err_context3 == "" {
|
||||
err_context3 += fmt.Sprintf(`产品编号:%s`, v.Product_id)
|
||||
} else {
|
||||
err_context3 += fmt.Sprintf(`;产品编号:%s`, v.Product_id)
|
||||
}
|
||||
} else {
|
||||
req.Data[i].Product_name = p_name
|
||||
}
|
||||
|
||||
demand_t := req.Data[i].Demand_date
|
||||
demand_t = strings.ReplaceAll(demand_t, "-", "/")
|
||||
t := strings.Split(demand_t, "/")
|
||||
if len(t) == 3 {
|
||||
month, _ := strconv.Atoi(t[1])
|
||||
day, _ := strconv.Atoi(t[2])
|
||||
demand_time := fmt.Sprintf(`%s-%02d-%02d 00:00:00`, t[0], month, day)
|
||||
fmt.Println(demand_time)
|
||||
|
||||
timeLayout := "2006-01-02 15:04:05"
|
||||
loc, _ := time.LoadLocation("Local")
|
||||
|
||||
bt, _ := time.ParseInLocation(timeLayout, demand_time, loc)
|
||||
fmt.Println("hour:", bt.Sub(time.Now()).Hours())
|
||||
// if int(bt.Sub(time.Now()).Hours()) < 72 {
|
||||
// if err_context4 == "" {
|
||||
// err_context4 += fmt.Sprintf(`需求日期必须大于当前日期三天及以上!`)
|
||||
// } else {
|
||||
// err_context4 += fmt.Sprintf(`需求日期必须大于当前日期三天及以上!`)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
if req.Data[i].Promise_date != "" {
|
||||
promise_date := req.Data[i].Promise_date
|
||||
promise_date = strings.ReplaceAll(promise_date, "-", "/")
|
||||
s := strings.Split(promise_date, "/")
|
||||
if len(s) == 3 {
|
||||
month, _ := strconv.Atoi(s[1])
|
||||
day, _ := strconv.Atoi(s[2])
|
||||
promise_date := fmt.Sprintf(`%s-%02d-%02d 00:00:00`, s[0], month, day)
|
||||
fmt.Println(promise_date)
|
||||
|
||||
timeLayout := "2006-01-02 15:04:05"
|
||||
loc, _ := time.LoadLocation("Local")
|
||||
|
||||
bt, _ := time.ParseInLocation(timeLayout, promise_date, loc)
|
||||
fmt.Println("hour:", bt.Sub(time.Now()).Hours())
|
||||
if int(bt.Sub(time.Now()).Hours()) < 72 {
|
||||
if err_context4 == "" {
|
||||
err_context4 += fmt.Sprintf(`生产确认日期必须大于当前日期三天及以上!`)
|
||||
} else {
|
||||
err_context4 += fmt.Sprintf(`生产确认日期必须大于当前日期三天及以上!`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if err_context1 != "" {
|
||||
err_context1 += " 数量含非数字或大于9999,请仔细核对!"
|
||||
}
|
||||
if err_context2 != "" {
|
||||
err_context2 += " RDM任务号只允许1-9999999,请仔细核对!"
|
||||
}
|
||||
|
||||
// if err_context3 != "" {
|
||||
// err_context3 += " 不存在,请联系生产管理员添加!"
|
||||
// }
|
||||
|
||||
if err_context1 != "" || err_context2 != "" || err_context4 != "" {
|
||||
resp.Err_text = err_context2 + err_context1 + err_context4
|
||||
resp.Ret = 1
|
||||
goto exit
|
||||
}
|
||||
|
|
@ -7785,6 +8221,28 @@ func importPreKpi(response http.ResponseWriter, request *http.Request) {
|
|||
return strings.Replace(s, "'", "''", -1)
|
||||
}
|
||||
|
||||
//插入数据之前,如果不存在产品数据,则插入sap基础数据表中
|
||||
countSql := fmt.Sprintf(`SELECT COUNT(*) from sap where p_id='%s'`, req.Data[i].Product_id)
|
||||
fmt.Println(countSql)
|
||||
|
||||
var count int
|
||||
err := sqlConn.QueryRow(countSql).Scan(&count)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if count == 0 {
|
||||
sqlstr = fmt.Sprintf(`INSERT INTO [sap] ([p_id],[p_name] , [flag]) VALUES ('%s','%s','0')`,
|
||||
req.Data[i].Product_id, req.Data[i].Product_name)
|
||||
_, err = sqlConn.Exec(sqlstr)
|
||||
fmt.Println("sap-------------------", sqlstr)
|
||||
if err != nil {
|
||||
mu.Unlock()
|
||||
fmt.Println("sap-------------------", err.Error())
|
||||
resp.Ret = -1
|
||||
goto exit
|
||||
}
|
||||
}
|
||||
|
||||
sqlstr = fmt.Sprintf(`INSERT INTO [pre_plan]
|
||||
([time]
|
||||
,[month]
|
||||
|
|
@ -7805,8 +8263,11 @@ func importPreKpi(response http.ResponseWriter, request *http.Request) {
|
|||
,[start_dept]
|
||||
,[remarks]
|
||||
,[task_id]
|
||||
,[total_num])
|
||||
VALUES ('%s', %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s','%s','%s')`,
|
||||
,[demand_date]
|
||||
,[total_num]
|
||||
,[commit_flag]
|
||||
,[promise_date])
|
||||
VALUES ('%s', %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s','%s','%s','%s','%s','%s')`,
|
||||
time.Now().Format("2006-01-02 15:04:05"),
|
||||
month,
|
||||
escapeSingleQuote(string(data)),
|
||||
|
|
@ -7826,7 +8287,11 @@ func importPreKpi(response http.ResponseWriter, request *http.Request) {
|
|||
escapeSingleQuote(usrinfo.Department),
|
||||
escapeSingleQuote(req.Data[i].Remarks),
|
||||
escapeSingleQuote(req.Data[i].Task_id),
|
||||
req.Data[i].Total_num)
|
||||
req.Data[i].Demand_date,
|
||||
req.Data[i].Total_num,
|
||||
"0",
|
||||
req.Data[i].Promise_date)
|
||||
|
||||
mu.Lock()
|
||||
_, err = sqlConn.Exec(sqlstr)
|
||||
fmt.Println("sqlstr-------------------", sqlstr)
|
||||
|
|
@ -7992,6 +8457,7 @@ func getKpi(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
|
||||
usrinfo, err = getUserInfo(req.OpUser)
|
||||
|
||||
if err != nil {
|
||||
logs.Info(fmt.Sprintf("getKpi getUserInfo err:%s", err.Error()))
|
||||
goto exit
|
||||
|
|
@ -8160,6 +8626,7 @@ func getKpi(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
|
||||
logs.Info(sqlstr)
|
||||
fmt.Println("首页查询sql ", sqlstr)
|
||||
cntRow, err = sqlConn.Query(sqlstr)
|
||||
if err != nil {
|
||||
logs.Error(fmt.Sprintf("getKpi query %s err:%v", sqlstr, err.Error()))
|
||||
|
|
@ -8462,23 +8929,32 @@ func getPrekpi(response http.ResponseWriter, request *http.Request) {
|
|||
ifwhere = true
|
||||
}
|
||||
|
||||
if req.Bt != "" {
|
||||
s := get_time(req.Bt)
|
||||
if s != "" {
|
||||
if ifwhere {
|
||||
whereSql += fmt.Sprintf(` and %s`, s)
|
||||
} else {
|
||||
whereSql += fmt.Sprintf(` %s`, s)
|
||||
}
|
||||
ifwhere = true
|
||||
if req.Bt != "" && req.Et != "" {
|
||||
fmt.Println("req.Bt-------", req.Bt)
|
||||
fmt.Println("req.Et-------", req.Et)
|
||||
|
||||
timeCondition := fmt.Sprintf(" [time] >= '%s 00:00:00' and [time] <= '%s 23:59:59' ", req.Bt, req.Et)
|
||||
|
||||
if ifwhere {
|
||||
whereSql += fmt.Sprintf(" and %s", timeCondition)
|
||||
} else {
|
||||
whereSql += fmt.Sprintf(" %s", timeCondition)
|
||||
}
|
||||
ifwhere = true
|
||||
}
|
||||
|
||||
if req.If_finished {
|
||||
if ifwhere {
|
||||
whereSql += fmt.Sprintf(` and [promise_date] IS NULL`)
|
||||
whereSql += fmt.Sprintf(` and [commit_flag] = 1 `)
|
||||
} else {
|
||||
whereSql += fmt.Sprintf(` [promise_date] IS NULL`)
|
||||
whereSql += fmt.Sprintf(` [commit_flag] = 1`)
|
||||
}
|
||||
ifwhere = true
|
||||
} else {
|
||||
if ifwhere {
|
||||
whereSql += fmt.Sprintf(` and [commit_flag] = 0 `)
|
||||
} else {
|
||||
whereSql += fmt.Sprintf(` [commit_flag] = 0`)
|
||||
}
|
||||
ifwhere = true
|
||||
}
|
||||
|
|
@ -8532,11 +9008,11 @@ func getPrekpi(response http.ResponseWriter, request *http.Request) {
|
|||
|
||||
cnt = req.Count
|
||||
if ifwhere {
|
||||
sqlstr = fmt.Sprintf("select top %v [ID],[time],[p_id],[p_name],[p_state],[group_name],[rmd_id],[promise_date],[conveyer],[is_img],[is_materials],[is_frist_process],[is_new_gauge],[start_dept],[task_id],[total_num] from [pre_plan] where ID not in (select top %v ID from [plan] where %s order by ID desc) and %s order by [ID] desc",
|
||||
cnt, (req.Index-1)*req.Count, whereSql, whereSql)
|
||||
sqlstr = fmt.Sprintf("SELECT [ID],[time],[p_id],[p_name],[p_state],[group_name],[rmd_id],[promise_date],[conveyer],[is_img],[is_materials],[is_frist_process],[is_new_gauge],[start_dept],[task_id],[total_num],[remarks],[demand_date] FROM [pre_plan] WHERE %s ORDER BY [ID] DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
|
||||
whereSql, (req.Index-1)*req.Count, cnt)
|
||||
} else {
|
||||
sqlstr = fmt.Sprintf("select top %v [ID],[time],[p_id],[p_name],[p_state],[group_name],[rmd_id],[promise_date],[conveyer],[is_img],[is_materials],[is_frist_process],[is_new_gauge],[start_dept],[task_id],[total_num] from [pre_plan] where ID not in (select top %v ID from [plan] order by ID desc) order by [ID] desc",
|
||||
cnt, (req.Index-1)*req.Count)
|
||||
sqlstr = fmt.Sprintf("SELECT [ID],[time],[p_id],[p_name],[p_state],[group_name],[rmd_id],[promise_date],[conveyer],[is_img],[is_materials],[is_frist_process],[is_new_gauge],[start_dept],[task_id],[total_num],[remarks],[demand_date] FROM [pre_plan] ORDER BY [ID] DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY",
|
||||
(req.Index-1)*req.Count, cnt)
|
||||
}
|
||||
fmt.Println("sqlstr数据----------", sqlstr)
|
||||
logs.Info(sqlstr)
|
||||
|
|
@ -8549,15 +9025,18 @@ func getPrekpi(response http.ResponseWriter, request *http.Request) {
|
|||
|
||||
for rdRow.Next() {
|
||||
var d preKpi
|
||||
if err := rdRow.Scan(&d.ID, &d.CreateTime, &d.Product_id, &d.Product_name, &d.Product_state, &d.Group_name, &d.RDM_id, &d.Promise_date, &d.Conveyer, &d.Is_img, &d.Is_materials, &d.First_procesds, &d.Is_new_gauge, &d.Department_name, &d.Task_id, &d.Total_num); err == nil {
|
||||
if err := rdRow.Scan(&d.ID, &d.CreateTime, &d.Product_id, &d.Product_name, &d.Product_state, &d.Group_name, &d.RDM_id, &d.Promise_date, &d.Conveyer, &d.Is_img, &d.Is_materials, &d.First_procesds, &d.Is_new_gauge, &d.Department_name, &d.Task_id, &d.Total_num, &d.Remarks, &d.Demand_date); err == nil {
|
||||
|
||||
if d.CreateTime != "" {
|
||||
// 如果 CreateTime 是字符串类型
|
||||
if t, err := time.Parse("2006-01-02 15:04:05", d.CreateTime); err == nil {
|
||||
d.CreateTime = t.Format("2006-01-02 15:04:05")
|
||||
d.CreateTime = t.Format("2006-01-02")
|
||||
} else if t, err := time.Parse(time.RFC3339, d.CreateTime); err == nil {
|
||||
// 如果是 RFC3339 格式(如数据库的 datetime 格式)
|
||||
d.CreateTime = t.Format("2006-01-02 15:04:05")
|
||||
d.CreateTime = t.Format("2006-01-02")
|
||||
} else if t, err := time.Parse("2006-01-02", d.CreateTime); err == nil {
|
||||
// 如果本来就是只有日期的格式,保持原样
|
||||
d.CreateTime = t.Format("2006-01-02")
|
||||
}
|
||||
// 可以根据需要添加其他时间格式的解析
|
||||
}
|
||||
|
|
@ -8570,7 +9049,6 @@ func getPrekpi(response http.ResponseWriter, request *http.Request) {
|
|||
}
|
||||
|
||||
resp.Data = append(resp.Data, d)
|
||||
fmt.Println("------------------next", resp.Data)
|
||||
} else {
|
||||
logs.Error("getPrekpi scan Error", err.Error())
|
||||
fmt.Println("getPrekpi scan Error", err.Error())
|
||||
|
|
@ -9866,6 +10344,146 @@ func export_operation_log(response http.ResponseWriter, request *http.Request) {
|
|||
logs.Info(fmt.Sprintf("export_operation_log recv req end, use time: %v ms", (endTime-beginTime)/1e6))
|
||||
}
|
||||
|
||||
func getPrePlanMess(response http.ResponseWriter, request *http.Request) {
|
||||
beginTime := time.Now().UnixNano()
|
||||
fmt.Println("getPrePlanMess----------- ")
|
||||
var req getPrePlanMessReq
|
||||
var resp getPrePlanMessResp
|
||||
var usrinfo useInfo
|
||||
var err error // 修复:声明 err 变量
|
||||
var name string
|
||||
|
||||
reqdata, _ := ioutil.ReadAll(request.Body)
|
||||
json.Unmarshal(reqdata, &req)
|
||||
|
||||
logs.Info(string(reqdata))
|
||||
|
||||
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
|
||||
if !b {
|
||||
logs.Info(fmt.Sprintf("用户%s不在线", req.OpUser))
|
||||
goto exit
|
||||
}
|
||||
|
||||
usrinfo, err = getUserInfo(req.OpUser)
|
||||
name = usrinfo.Username
|
||||
if err != nil {
|
||||
logs.Error("getPrePlanMess getUserInfo err:", err.Error())
|
||||
resp.Ret = -1
|
||||
goto exit
|
||||
}
|
||||
fmt.Println("getPrePlanMess--name--------- ", name)
|
||||
|
||||
// TODO: 添加获取前置计划消息的业务逻辑
|
||||
if name == "尚永强" {
|
||||
var sqlstr = "select count([ID]) from [pre_plan] where [promise_date] IS NULL"
|
||||
fmt.Println(sqlstr)
|
||||
|
||||
rdRow, err := sqlConn.Query(sqlstr)
|
||||
if err != nil {
|
||||
logs.Error(fmt.Sprintf("查询条数出错:%v", err.Error()))
|
||||
return
|
||||
}
|
||||
defer rdRow.Close()
|
||||
|
||||
// 读取查询结果
|
||||
var count int
|
||||
if rdRow.Next() {
|
||||
err = rdRow.Scan(&count)
|
||||
if err != nil {
|
||||
logs.Error(fmt.Sprintf("读取查询结果出错:%v", err.Error()))
|
||||
return
|
||||
}
|
||||
}
|
||||
if count > 0 {
|
||||
resp.Mess = fmt.Sprintf("您当前有 %d 条未回复的前置计划,请及时处理!", count)
|
||||
} else {
|
||||
resp.Mess = " "
|
||||
// 或者直接不设置 resp.Mess,让前端根据 Mess 是否为空来判断
|
||||
}
|
||||
|
||||
// 设置返回消息
|
||||
}
|
||||
resp.Ret = 0
|
||||
|
||||
exit:
|
||||
jdata, _ := json.Marshal(resp)
|
||||
fmt.Fprintf(response, string(jdata))
|
||||
|
||||
endTime := time.Now().UnixNano()
|
||||
logs.Info(fmt.Sprintf("getPrePlanMess recv req end, use time: %v ms", (endTime-beginTime)/1e6))
|
||||
}
|
||||
|
||||
func ConfirmBaseData(response http.ResponseWriter, request *http.Request) {
|
||||
beginTime := time.Now().UnixNano()
|
||||
fmt.Println("ConfirmBaseData recv req begin", time.Now().Format("2006-01-02 15:04:05"))
|
||||
|
||||
var resp CommonResp
|
||||
var req struct {
|
||||
Ids []int `json:"ids"`
|
||||
OpUser string `json:"opUser"`
|
||||
OpUserUuid string `json:"opUserUuid"`
|
||||
}
|
||||
|
||||
// 提前声明所有变量
|
||||
var idsStr []string
|
||||
var idsList string
|
||||
var sqlstr string
|
||||
var jdata []byte
|
||||
var reqdata []byte
|
||||
var b bool
|
||||
var err error
|
||||
|
||||
// 初始化响应,确保总是有值
|
||||
resp.Ret = -1 // 默认失败
|
||||
|
||||
reqdata, err = ioutil.ReadAll(request.Body)
|
||||
if err != nil {
|
||||
logs.Error("ConfirmBaseData ReadAll Error:", err.Error())
|
||||
goto exit
|
||||
}
|
||||
|
||||
err = json.Unmarshal(reqdata, &req)
|
||||
if err != nil {
|
||||
logs.Error("ConfirmBaseData Unmarshal Error:", err.Error())
|
||||
goto exit
|
||||
}
|
||||
|
||||
b = checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
|
||||
if !b {
|
||||
goto exit
|
||||
}
|
||||
|
||||
if len(req.Ids) == 0 {
|
||||
goto exit
|
||||
}
|
||||
|
||||
// 构造IN查询语句
|
||||
idsStr = make([]string, 0, len(req.Ids))
|
||||
for _, id := range req.Ids {
|
||||
idsStr = append(idsStr, strconv.Itoa(id))
|
||||
}
|
||||
idsList = strings.Join(idsStr, ",")
|
||||
|
||||
sqlstr = fmt.Sprintf("UPDATE [sap] SET [flag] = 1 WHERE [ID] IN (%s)", idsList)
|
||||
fmt.Println(sqlstr)
|
||||
|
||||
_, err = sqlConn.Exec(sqlstr)
|
||||
if err != nil {
|
||||
logs.Error("ConfirmBaseData Exec Error:", err.Error())
|
||||
fmt.Println("ConfirmBaseData Exec Error:", err.Error())
|
||||
goto exit
|
||||
}
|
||||
|
||||
resp.Ret = 0
|
||||
|
||||
exit:
|
||||
jdata, _ = json.Marshal(resp)
|
||||
fmt.Fprintf(response, string(jdata))
|
||||
|
||||
endTime := time.Now().UnixNano()
|
||||
fmt.Println(fmt.Sprintf("ConfirmBaseData recv req end, use time: %v ms", (endTime-beginTime)/1e6))
|
||||
}
|
||||
|
||||
// ================== 日志操作 end ==============================
|
||||
|
||||
// 跨域测试
|
||||
|
|
|
|||
18
req.go
18
req.go
|
|
@ -446,12 +446,13 @@ type post_p_req struct {
|
|||
}
|
||||
|
||||
type get_p_Req struct {
|
||||
OpUser string `json:"opuser"`
|
||||
OpUserUuid string `json:"opuser_uuid"`
|
||||
P_id string `json:"p_id"`
|
||||
P_name string `json:"p_name"`
|
||||
Index int `json:"index"`
|
||||
Count int `json:"count"`
|
||||
OpUser string `json:"opuser"`
|
||||
OpUserUuid string `json:"opuser_uuid"`
|
||||
P_id string `json:"p_id"`
|
||||
P_name string `json:"p_name"`
|
||||
Index int `json:"index"`
|
||||
Count int `json:"count"`
|
||||
Show_unconfirmed bool `json:"show_unconfirmed"`
|
||||
}
|
||||
|
||||
type download_template_file_Req struct {
|
||||
|
|
@ -582,6 +583,11 @@ type getKpiReq struct {
|
|||
Product_user string `json:"product_user"`
|
||||
}
|
||||
|
||||
type getPrePlanMessReq struct {
|
||||
OpUser string `json:"opuser"`
|
||||
OpUserUuid string `json:"opuser_uuid"`
|
||||
}
|
||||
|
||||
type getPreKpiReq struct {
|
||||
OpUser string `json:"opuser"`
|
||||
OpUserUuid string `json:"opuser_uuid"`
|
||||
|
|
|
|||
12
res.go
12
res.go
|
|
@ -85,6 +85,13 @@ type get_p_id_options_resp struct {
|
|||
Data []string `json:"data"`
|
||||
}
|
||||
|
||||
type get_options_byId_resp struct {
|
||||
Data []struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type import_kpi_resp import_plan_t_resp
|
||||
|
||||
type import_plan_t_resp struct {
|
||||
|
|
@ -371,3 +378,8 @@ type GetOperationLogUserResp struct {
|
|||
type download_file_Resp struct {
|
||||
FileId string `json:"fileId"`
|
||||
}
|
||||
|
||||
type getPrePlanMessResp struct {
|
||||
Ret int `json:"ret"`
|
||||
Mess string `json:"mess"`
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue