diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6898445
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/logs/*.log
diff --git a/ModulePath/ModulePath.go b/ModulePath/ModulePath.go
new file mode 100644
index 0000000..5840a20
--- /dev/null
+++ b/ModulePath/ModulePath.go
@@ -0,0 +1,39 @@
+package ModulePath
+
+import (
+ // "errors"
+ // "fmt"
+ "os"
+ // "os/exec"
+ "path/filepath"
+ // "strings"
+)
+
+func GetModuleCurrentPath() (string, error) {
+
+ file, err := os.Executable()
+ if err != nil {
+ return "", err
+ }
+
+ exPath := filepath.Dir(file)
+ return exPath, nil
+
+ /*file, err := exec.LookPath(os.Args[0])
+ if err != nil {
+ fmt.Println("lookpath err:", err.Error())
+ return "", err
+ }
+ path, err := filepath.Abs(file)
+ if err != nil {
+ return "", err
+ }
+ i := strings.LastIndex(path, "/")
+ if i < 0 {
+ i = strings.LastIndex(path, "\\")
+ }
+ if i < 0 {
+ return "", errors.New(`error: Can't find "/" or "\".`)
+ }
+ return string(path[0 : i+1]), nil*/
+}
diff --git a/conf/app.conf b/conf/app.conf
new file mode 100644
index 0000000..c214803
--- /dev/null
+++ b/conf/app.conf
@@ -0,0 +1,5 @@
+server = 119.3.242.17
+port = 1433
+user = sa
+password = lh123456?
+database = pp
\ No newline at end of file
diff --git a/data.go b/data.go
new file mode 100644
index 0000000..19bcba4
--- /dev/null
+++ b/data.go
@@ -0,0 +1,156 @@
+package main
+
+type sp_2 struct {
+ ID int `json:"id"` //序号
+
+ Contract_id string `json:"contract_id"` //合同号
+
+ Supplier string `json:"supplier"` //供应商
+ Contract_name string `json:"contract_name"` //合同名称
+
+ Rdm string `json:"rdm"`
+ State string `json:"state"` //审批状态
+
+ Amount string `json:"amount"` //合同金额
+ Amount_1 string `json:"amount_1"` //审批金额
+
+ Warehouse_entry_number string `json:"warehouse_entry_number"`
+ Buyer string `json:"buyer"` //采购人员
+
+ State_1 string `json:"state_1"` //付款审批状态
+ Task_ids string `json:"task_ids"` //审批的任务id
+
+ If_modify bool `json:"if_modify"` //记录是否可修改
+}
+
+type sp_1 struct {
+ ID int `json:"id"` //序号
+
+ Contract_id string `json:"contract_id"` //合同号
+
+ Supplier string `json:"supplier"`
+ Applicant string `json:"applicant"` //申请人
+ Time string `json:"time"`
+ Contract_name string `json:"contract_name"` //合同名称
+ Contract_name_ex string `json:"contract_name_ex"` //正式合同
+ Rdm string `json:"rdm"`
+ Amount string `json:"amount"` //金额
+ State string `json:"state"` //审批状态
+
+ If_modify bool `json:"if_modify"` //记录是否可修改
+}
+
+type pp_plan struct {
+ Pre_id int `json:"pre_id"` //父id
+ ID int `json:"id"` //序号
+ RDM string `json:"rdm"` //rdm
+ Code string `json:"code"` //编号
+
+ Name string `json:"name"` //名称
+ Specs string `json:"specs"` //规格
+ Unit string `json:"unit"` //单位
+ Num string `json:"num"` //数量
+ Price string `json:"price"` //单价
+
+ Total_p string `json:"total_p"` //总计
+ Payment_type string `json:"pt"` //付款方式
+ Paid string `json:"paid"` //已付
+ Residual_p string `json:"rp"` //应付
+
+ Demand_date string `json:"demand_date"` //需求日期
+ Demand_date_update_cnt int `json:"dduc"` //需求日期更改次数
+ Purchasing_cycle string `json:"purchasing_cycle"` //采购周期
+ Order_date string `json:"order_date"` //下单日期
+
+ Over_due1 string `json:"over_due1"` //预计超期
+ Actual_delivery_date string `json:"add"` //实际交付日期
+ Residue string `json:"residue"` //剩余
+ Over_due2 string `json:"over_due2"` //超期
+
+ Buy_record string `json:"buy_record"` //采购记录
+ Arrival_quantity string `json:"aq"` //到货数量
+ Arrival_quantity_text string `json:"aqt"` //到货数量
+
+ State string `json:"state"` //状态
+ Warehouse_entry_number string `json:"wen"` //入库单号
+ Supplier string `json:"supplier"` //供应方
+
+ //Is_main int `json:"is_main"` //1-主任务 2-子
+ Flag string `json:"flag"`
+ //Has_child int `json:"has_child"` //是否有子任务
+ Child_task_id []int `json:"cti"` //子任务id
+
+ Factory string `json:"factory"` //生产厂家
+ Factory_code string `json:"factory_code"` //厂家编号
+ Qs string `json:"qs"` //质量标准
+ As string `json:"as"` //验收标准
+
+ Buyer string `json:"buyer"` //采购人员
+
+ If_modify bool `json:"if_modify"` //记录是否可修改
+
+ Contract_id string `json:"contract_id"` //合同号
+ Contract_state string `json:"contract_state"` //合同审批状态
+ Contract_amount string `json:"contract_amount"` //合同金额
+
+ State_1 string `json:"state_1"` //付款审批状态
+
+ Serial_num string `json:"serial_num"` //流水号
+ Contract_name string `json:"contract_name"` //合同名称
+ Pay_Contract_name string `json:"pay_contract_name"` //付款合同
+
+ Pay_Amount string `json:"pay_amount"` //付款金额
+ Batch_No string `json:"batch_no"` //批次号
+ Remark string `json:"remark"` //备注
+}
+
+type ma_plan struct {
+ ID int `json:"id"` //序号
+ Dispath_date string `json:"dispath_date"` //任务分配日期
+ Header string `json:"header"` //负责人
+
+ R_id_1 string `json:"r_id_1"` //需求R号
+ R_id_2 string `json:"r_id_2"` //申购R号
+
+ Material_id string `json:"m_id"`
+ Material_name string `json:"m_name"`
+ Material_describe string `json:"md"`
+
+ Unit string `json:"unit"` //单位
+
+ Number string `json:"num"` //数量
+
+ Unit_price string `json:"unit_price"` //单价
+
+ Amount_money string `json:"amount_money"` //金额
+
+ Tax_code string `json:"tax_code"` //税码
+
+ Supplier string `json:"supplier"` //供应方
+
+ Cycle string `json:"cycle"` //周期
+
+ Quality_standard string `json:"qs"` //质量标准
+ Acceptance_criteria string `json:"ac"` //验收标准
+
+ Information string `json:"information"` //随货资料
+
+ Purpose string `json:"purpose"` //用途
+
+ Order_r_id string `json:"order_r_id"` //订单号R号
+ Procure_id string `json:"procure_id"` //采购合同/订单号
+ Sap_id string `json:"sap_id"` //sap订单号
+
+ Production_date string `json:"Production_date"` //投产日期
+ Due_date string `json:"due_date"` //订单到期日期
+
+ Arrival_quantity string `json:"aq"` //到货数量
+ Undelivered_quantity string `json:"uq"` //未到货数量
+
+ SAP_Warehouse_entry_number string `json:"swen"` //SAP入库单号
+ SAP_Warehouse_entry_date string `json:"swed"` //SAP入库日期
+
+ Over_due string `json:"over_due"` //订单是否超期
+
+ Note string `json:"note"` //备注
+}
diff --git a/file/sp_1_ex/Battery usage report.pdf b/file/sp_1_ex/Battery usage report.pdf
new file mode 100644
index 0000000..929973f
Binary files /dev/null and b/file/sp_1_ex/Battery usage report.pdf differ
diff --git a/file/sp_1_ex/R244051立笙金属材料(上海)有限公司20240718 (7).docx b/file/sp_1_ex/R244051立笙金属材料(上海)有限公司20240718 (7).docx
new file mode 100644
index 0000000..b4c527f
Binary files /dev/null and b/file/sp_1_ex/R244051立笙金属材料(上海)有限公司20240718 (7).docx differ
diff --git a/file/sp_1_ex/prj.log b/file/sp_1_ex/prj.log
new file mode 100644
index 0000000..aaa431b
--- /dev/null
+++ b/file/sp_1_ex/prj.log
@@ -0,0 +1,350 @@
+2024/08/27 08:03:24.996 [I] [server.go:2136] getMenu recv req begin 2024-08-27 08:03:24
+2024/08/27 08:03:24.996 [I] [server.go:2136] get_prj recv req begin 2024-08-27 08:03:24
+2024/08/27 08:03:24.996 [I] [server.go:2136] getMenu recv req end, use time: 0 ms
+2024/08/27 08:03:24.996 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"afcf17b7-b7d0-4a7b-bcc8-fed67cc0504f","index":1,"count":50,"if_do":true}
+2024/08/27 08:03:24.996 [I] [server.go:2136] {李俊杉 afcf17b7-b7d0-4a7b-bcc8-fed67cc0504f 1 50 true}
+2024/08/27 08:03:24.996 [I] [server.go:2136] query_cnt: 50
+2024/08/27 08:03:24.996 [I] [server.go:2136] select count(ID) from [project_info] where [flag] = '1'
+2024/08/27 08:03:24.997 [I] [server.go:2136] get_prj recv req begin 2024-08-27 08:03:24
+2024/08/27 08:03:24.998 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"afcf17b7-b7d0-4a7b-bcc8-fed67cc0504f","index":1,"count":50}
+2024/08/27 08:03:24.998 [I] [server.go:2136] {李俊杉 afcf17b7-b7d0-4a7b-bcc8-fed67cc0504f 1 50 false}
+2024/08/27 08:03:24.998 [I] [server.go:2136] query_cnt: 50
+2024/08/27 08:03:24.999 [I] [server.go:2136] select count(ID) from [project_info] where [flag] != '1'
+2024/08/27 08:03:25.001 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] = '1' order by ID desc) and [flag] = '1' order by [ID] desc
+2024/08/27 08:03:25.001 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] != '1' order by ID desc) and [flag] != '1' order by [ID] desc
+2024/08/27 08:03:25.006 [I] [server.go:2136] get_prj recv req end, use time: 9 ms
+2024/08/27 08:03:25.007 [I] [server.go:2136] get_prj recv req end, use time: 9 ms
+2024/08/27 10:13:46.191 [I] [server.go:2136] get_task recv req begin 2024-08-27 10:13:46
+2024/08/27 10:13:46.191 [I] [server.go:2136] get_prj_by_id recv req begin 2024-08-27 10:13:46
+2024/08/27 10:13:46.191 [I] [server.go:2136] {"opuser":"李娜","opuser_uuid":"8ea0c901-7ea7-4e66-b3cb-615a0d940121","prj_id":42}
+2024/08/27 10:13:46.191 [I] [server.go:2136] query_cnt: 0
+2024/08/27 10:13:46.191 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [pre_id]=0 order by [ID] asc
+2024/08/27 10:13:46.211 [I] [server.go:2136] get_task recv req end, use time: 20 ms
+2024/08/27 10:13:46.216 [I] [server.go:2136] get_prj_by_id recv req end, use time: 25 ms
+2024/08/27 10:13:46.232 [I] [server.go:2136] get_ms_data recv req begin 2024-08-27 10:13:46
+2024/08/27 10:13:46.232 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [if_milestone]='1' order by [ID] desc
+2024/08/27 10:13:46.234 [I] [server.go:2136] get_ms_data recv req end, use time: 1 ms
+2024/08/27 10:13:54.180 [I] [server.go:2136] get_task1_by_task_id recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.180 [I] [server.go:2136] {"opuser":"李娜","opuser_uuid":"8ea0c901-7ea7-4e66-b3cb-615a0d940121","index":1,"count":50,"task_id":13}
+2024/08/27 10:13:54.180 [I] [server.go:2136] select [ID],[data],[data_ex] from [task] where [ID] = 13 order by [ID] asc
+2024/08/27 10:13:54.182 [I] [server.go:2136] get_task1_by_task_id recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.182 [I] [main.go:4291] select [data] FROM [task] where ID=13
+2024/08/27 10:13:54.182 [I] [server.go:2136] get_comment recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.182 [I] [main.go:1413] SELECT [ID]
+ ,[task_id]
+ ,[time]
+ ,[user_name]
+ ,[note],[file_data]
+ FROM [task_comment] where task_id=13 order by [time] desc
+2024/08/27 10:13:54.195 [I] [server.go:2136] get_task1_by_task_id recv req end, use time: 15 ms
+2024/08/27 10:13:54.196 [I] [server.go:2136] get_comment recv req end, use time: 13 ms
+2024/08/27 10:13:54.196 [I] [server.go:2136] get_task1_by_task_id recv req end, use time: 13 ms
+2024/08/27 10:13:54.200 [I] [server.go:2136] get_task1_by_task_id recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.200 [I] [main.go:4331] select [data] FROM [task] where ID=13
+2024/08/27 10:13:54.201 [I] [server.go:2136] get_task recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.201 [I] [server.go:2136] {"opuser":"李娜","opuser_uuid":"8ea0c901-7ea7-4e66-b3cb-615a0d940121","prj_id":42,"task_id":13,"index":1,"count":10000}
+2024/08/27 10:13:54.201 [I] [server.go:2136] query_cnt: 10000
+2024/08/27 10:13:54.201 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [pre_id]=0 and [ID]!=13 order by [ID] asc
+2024/08/27 10:13:54.202 [I] [server.go:2136] get_task1_by_task_id recv req end, use time: 2 ms
+2024/08/27 10:13:54.203 [I] [server.go:2136] get_task recv req end, use time: 2 ms
+2024/08/27 10:13:54.210 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.210 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.210 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=2 order by [time] desc
+2024/08/27 10:13:54.210 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=1 order by [time] desc
+2024/08/27 10:13:54.210 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.210 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=3 order by [time] desc
+2024/08/27 10:13:54.213 [E] [main.go:965] get_task_files_info err:{42S22}
+SQL Stmt: SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=2 order by [time] desc
+Bind Values:
+[Microsoft][ODBC SQL Server Driver][SQL Server]列名 'num' 无效。
+2024/08/27 10:13:54.213 [I] [server.go:2136] get_task_files recv req end, use time: 3 ms
+2024/08/27 10:13:54.213 [E] [main.go:965] get_task_files_info err:{42S22}
+SQL Stmt: SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=1 order by [time] desc
+Bind Values:
+[Microsoft][ODBC SQL Server Driver][SQL Server]列名 'num' 无效。
+2024/08/27 10:13:54.213 [I] [server.go:2136] get_task_files recv req end, use time: 3 ms
+2024/08/27 10:13:54.213 [E] [main.go:965] get_task_files_info err:{42S22}
+SQL Stmt: SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=3 order by [time] desc
+Bind Values:
+[Microsoft][ODBC SQL Server Driver][SQL Server]列名 'num' 无效。
+2024/08/27 10:13:54.213 [I] [server.go:2136] get_task_files recv req end, use time: 3 ms
+2024/08/27 10:13:54.219 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.219 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=6 order by [time] desc
+2024/08/27 10:13:54.220 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.220 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=4 order by [time] desc
+2024/08/27 10:13:54.220 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.220 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=5 order by [time] desc
+2024/08/27 10:13:54.221 [E] [main.go:965] get_task_files_info err:{42S22}
+SQL Stmt: SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=5 order by [time] desc
+Bind Values:
+[Microsoft][ODBC SQL Server Driver][SQL Server]列名 'num' 无效。
+2024/08/27 10:13:54.221 [I] [server.go:2136] get_task_files recv req end, use time: 0 ms
+2024/08/27 10:13:54.221 [E] [main.go:965] get_task_files_info err:{42S22}
+SQL Stmt: SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=6 order by [time] desc
+Bind Values:
+[Microsoft][ODBC SQL Server Driver][SQL Server]列名 'num' 无效。
+2024/08/27 10:13:54.221 [I] [server.go:2136] get_task_files recv req end, use time: 1 ms
+2024/08/27 10:13:54.222 [E] [main.go:965] get_task_files_info err:{42S22}
+SQL Stmt: SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=4 order by [time] desc
+Bind Values:
+[Microsoft][ODBC SQL Server Driver][SQL Server]列名 'num' 无效。
+2024/08/27 10:13:54.222 [I] [server.go:2136] get_task_files recv req end, use time: 1 ms
+2024/08/27 10:13:54.223 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.223 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=7 order by [time] desc
+2024/08/27 10:13:54.225 [E] [main.go:965] get_task_files_info err:{42S22}
+SQL Stmt: SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=13 and num=7 order by [time] desc
+Bind Values:
+[Microsoft][ODBC SQL Server Driver][SQL Server]列名 'num' 无效。
+2024/08/27 10:13:54.225 [I] [server.go:2136] get_task_files recv req end, use time: 2 ms
+2024/08/27 10:13:54.229 [I] [server.go:2136] get_task_aw_by_name recv req begin 2024-08-27 10:13:54
+2024/08/27 10:13:54.229 [I] [main.go:4049] select [data] FROM [task] where ID=13
+2024/08/27 10:13:54.231 [I] [server.go:2136] get_task_aw_by_name recv req end, use time: 1 ms
+2024/08/27 10:14:29.264 [I] [server.go:2136] get_prj recv req begin 2024-08-27 10:14:29
+2024/08/27 10:14:29.264 [I] [server.go:2136] {"opuser":"李娜","opuser_uuid":"8ea0c901-7ea7-4e66-b3cb-615a0d940121","index":1,"count":50}
+2024/08/27 10:14:29.264 [I] [server.go:2136] {李娜 8ea0c901-7ea7-4e66-b3cb-615a0d940121 1 50 false}
+2024/08/27 10:14:29.264 [I] [server.go:2136] query_cnt: 50
+2024/08/27 10:14:29.264 [I] [server.go:2136] select count(ID) from [project_info] where [flag] != '1'
+2024/08/27 10:14:29.264 [I] [server.go:2136] get_prj recv req begin 2024-08-27 10:14:29
+2024/08/27 10:14:29.264 [I] [server.go:2136] {"opuser":"李娜","opuser_uuid":"8ea0c901-7ea7-4e66-b3cb-615a0d940121","index":1,"count":50,"if_do":true}
+2024/08/27 10:14:29.264 [I] [server.go:2136] {李娜 8ea0c901-7ea7-4e66-b3cb-615a0d940121 1 50 true}
+2024/08/27 10:14:29.264 [I] [server.go:2136] query_cnt: 50
+2024/08/27 10:14:29.264 [I] [server.go:2136] select count(ID) from [project_info] where [flag] = '1'
+2024/08/27 10:14:29.267 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] != '1' order by ID desc) and [flag] != '1' order by [ID] desc
+2024/08/27 10:14:29.267 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] = '1' order by ID desc) and [flag] = '1' order by [ID] desc
+2024/08/27 10:14:29.273 [I] [server.go:2136] get_prj recv req end, use time: 8 ms
+2024/08/27 10:14:29.273 [I] [server.go:2136] get_prj recv req end, use time: 9 ms
+2024/08/27 13:20:44.343 [I] [main.go:377] connect success!
+2024/08/27 13:21:13.452 [I] [server.go:2136] get_prj recv req begin 2024-08-27 13:21:13
+2024/08/27 13:21:13.452 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50}
+2024/08/27 13:21:13.452 [I] [server.go:2136] {李俊杉 8249ef9d-c8b4-429b-9ea4-bcebdecd000f 1 50 false}
+2024/08/27 13:21:13.452 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:13.452 [I] [server.go:2136] select count(ID) from [project_info] where [flag] != '1'
+2024/08/27 13:21:13.452 [I] [server.go:2136] getMenu recv req begin 2024-08-27 13:21:13
+2024/08/27 13:21:13.452 [I] [server.go:2136] getMenu recv req end, use time: 0 ms
+2024/08/27 13:21:13.454 [I] [server.go:2136] get_prj recv req begin 2024-08-27 13:21:13
+2024/08/27 13:21:13.454 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50,"if_do":true}
+2024/08/27 13:21:13.454 [I] [server.go:2136] {李俊杉 8249ef9d-c8b4-429b-9ea4-bcebdecd000f 1 50 true}
+2024/08/27 13:21:13.454 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:13.454 [I] [server.go:2136] select count(ID) from [project_info] where [flag] = '1'
+2024/08/27 13:21:13.456 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] != '1' order by ID desc) and [flag] != '1' order by [ID] desc
+2024/08/27 13:21:13.460 [I] [server.go:2136] get_prj recv req end, use time: 7 ms
+2024/08/27 13:21:13.499 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] = '1' order by ID desc) and [flag] = '1' order by [ID] desc
+2024/08/27 13:21:13.504 [I] [server.go:2136] get_prj recv req end, use time: 50 ms
+2024/08/27 13:21:18.019 [I] [server.go:2136] get_ms_data recv req begin 2024-08-27 13:21:18
+2024/08/27 13:21:18.019 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [if_milestone]='1' order by [ID] desc
+2024/08/27 13:21:18.020 [I] [server.go:2136] get_task recv req begin 2024-08-27 13:21:18
+2024/08/27 13:21:18.020 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","prj_id":42}
+2024/08/27 13:21:18.020 [I] [server.go:2136] query_cnt: 0
+2024/08/27 13:21:18.020 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [pre_id]=0 order by [ID] asc
+2024/08/27 13:21:18.021 [I] [server.go:2136] get_ms_data recv req end, use time: 1 ms
+2024/08/27 13:21:18.021 [I] [server.go:2136] get_prj_by_id recv req begin 2024-08-27 13:21:18
+2024/08/27 13:21:18.022 [I] [server.go:2136] get_prj_by_id recv req end, use time: 0 ms
+2024/08/27 13:21:18.035 [I] [server.go:2136] get_task recv req end, use time: 15 ms
+2024/08/27 13:21:23.530 [I] [server.go:2136] get_prj recv req begin 2024-08-27 13:21:23
+2024/08/27 13:21:23.530 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f"}
+2024/08/27 13:21:23.530 [I] [server.go:2136] {李俊杉 8249ef9d-c8b4-429b-9ea4-bcebdecd000f 0 0 false}
+2024/08/27 13:21:23.530 [I] [server.go:2136] query_cnt: 0
+2024/08/27 13:21:23.530 [I] [server.go:2136] select count(ID) from [project_info] where [flag] != '1'
+2024/08/27 13:21:23.541 [I] [server.go:2136] get_prj_by_user recv req begin 2024-08-27 13:21:23
+2024/08/27 13:21:23.541 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50}
+2024/08/27 13:21:23.541 [I] [server.go:2136] {李俊杉 8249ef9d-c8b4-429b-9ea4-bcebdecd000f 1 50 false}
+2024/08/27 13:21:23.541 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:23.541 [I] [server.go:2136] select count(ID) from [project_info] where [flag] != '1' and [head] = '李俊杉'
+2024/08/27 13:21:23.542 [I] [server.go:2136] select top 0 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] != '1' order by ID desc) and [flag] != '1' order by [ID] desc
+2024/08/27 13:21:23.543 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] != '1' and [head] = '李俊杉' order by ID desc) and [flag] != '1' and [head] = '李俊杉' order by [ID] desc
+2024/08/27 13:21:23.544 [I] [server.go:2136] get_prj recv req end, use time: 13 ms
+2024/08/27 13:21:23.546 [I] [server.go:2136] get_prj_by_user recv req end, use time: 5 ms
+2024/08/27 13:21:24.936 [I] [server.go:2136] get_task_by_performer recv req begin 2024-08-27 13:21:24
+2024/08/27 13:21:24.936 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50,"task_id":"","prj_name":"","task_name":""}
+2024/08/27 13:21:24.936 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:24.936 [I] [server.go:2136] select [ID],[data] from [task] where [performer] = '李俊杉' order by [ID] asc
+2024/08/27 13:21:24.938 [I] [server.go:2136] get_task_by_performer recv req end, use time: 1 ms
+2024/08/27 13:21:24.962 [I] [server.go:2136] get_task_by_cur_p recv req begin 2024-08-27 13:21:24
+2024/08/27 13:21:24.963 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50,"task_id":"","prj_name":"","task_name":""}
+2024/08/27 13:21:24.963 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:24.963 [I] [server.go:2136] select [ID],[data] from [task] where [current_p] = '李俊杉' and [state]='2' order by [ID] asc
+2024/08/27 13:21:24.964 [I] [server.go:2136] get_task_by_cur_p recv req end, use time: 1 ms
+2024/08/27 13:21:25.569 [I] [server.go:2136] get_prj_by_user recv req begin 2024-08-27 13:21:25
+2024/08/27 13:21:25.569 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50}
+2024/08/27 13:21:25.569 [I] [server.go:2136] {李俊杉 8249ef9d-c8b4-429b-9ea4-bcebdecd000f 1 50 false}
+2024/08/27 13:21:25.569 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:25.569 [I] [server.go:2136] select count(ID) from [project_info] where [flag] != '1' and [head] = '李俊杉'
+2024/08/27 13:21:25.569 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] != '1' and [head] = '李俊杉' order by ID desc) and [flag] != '1' and [head] = '李俊杉' order by [ID] desc
+2024/08/27 13:21:25.570 [I] [server.go:2136] get_prj_by_user recv req end, use time: 0 ms
+2024/08/27 13:21:30.794 [I] [server.go:2136] get_prj recv req begin 2024-08-27 13:21:30
+2024/08/27 13:21:30.794 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50}
+2024/08/27 13:21:30.794 [I] [server.go:2136] {李俊杉 8249ef9d-c8b4-429b-9ea4-bcebdecd000f 1 50 false}
+2024/08/27 13:21:30.794 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:30.794 [I] [server.go:2136] select count(ID) from [project_info] where [flag] != '1'
+2024/08/27 13:21:30.800 [I] [server.go:2136] get_prj recv req begin 2024-08-27 13:21:30
+2024/08/27 13:21:30.800 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50,"if_do":true}
+2024/08/27 13:21:30.800 [I] [server.go:2136] {李俊杉 8249ef9d-c8b4-429b-9ea4-bcebdecd000f 1 50 true}
+2024/08/27 13:21:30.800 [I] [server.go:2136] query_cnt: 50
+2024/08/27 13:21:30.800 [I] [server.go:2136] select count(ID) from [project_info] where [flag] = '1'
+2024/08/27 13:21:30.801 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] != '1' order by ID desc) and [flag] != '1' order by [ID] desc
+2024/08/27 13:21:30.802 [I] [server.go:2136] select top 50 [ID],[data] from [project_info] where ID not in (select top 0 ID from [project_info] where [flag] = '1' order by ID desc) and [flag] = '1' order by [ID] desc
+2024/08/27 13:21:30.811 [I] [server.go:2136] get_prj recv req end, use time: 10 ms
+2024/08/27 13:21:30.812 [I] [server.go:2136] get_prj recv req end, use time: 18 ms
+2024/08/27 13:21:32.600 [I] [server.go:2136] get_ms_data recv req begin 2024-08-27 13:21:32
+2024/08/27 13:21:32.600 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [if_milestone]='1' order by [ID] desc
+2024/08/27 13:21:32.600 [I] [server.go:2136] get_ms_data recv req end, use time: 0 ms
+2024/08/27 13:21:32.601 [I] [server.go:2136] get_task recv req begin 2024-08-27 13:21:32
+2024/08/27 13:21:32.601 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","prj_id":42}
+2024/08/27 13:21:32.601 [I] [server.go:2136] query_cnt: 0
+2024/08/27 13:21:32.601 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [pre_id]=0 order by [ID] asc
+2024/08/27 13:21:32.602 [I] [server.go:2136] get_prj_by_id recv req begin 2024-08-27 13:21:32
+2024/08/27 13:21:32.602 [I] [server.go:2136] get_task recv req end, use time: 1 ms
+2024/08/27 13:21:32.603 [I] [server.go:2136] get_prj_by_id recv req end, use time: 1 ms
+2024/08/27 13:21:36.564 [I] [server.go:2136] get_task1_by_task_id recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.564 [I] [main.go:4317] select [data] FROM [task] where ID=32
+2024/08/27 13:21:36.565 [I] [main.go:4320] select [data] FROM [task] where ID=25
+2024/08/27 13:21:36.565 [I] [server.go:2136] get_task9_by_task_id recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.565 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","index":1,"count":50,"task_id":32}
+2024/08/27 13:21:36.565 [I] [server.go:2136] select [ID],[data],[data_ex] from [task] where [ID] = 32 order by [ID] asc
+2024/08/27 13:21:36.566 [I] [server.go:2136] get_task1_by_task_id recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.566 [I] [main.go:4357] select [data] FROM [task] where ID=32
+2024/08/27 13:21:36.566 [I] [server.go:2136] get_task1_by_task_id recv req end, use time: 1 ms
+2024/08/27 13:21:36.567 [I] [server.go:2136] get_comment recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.567 [I] [main.go:1413] SELECT [ID]
+ ,[task_id]
+ ,[time]
+ ,[user_name]
+ ,[note],[file_data]
+ FROM [task_comment] where task_id=32 order by [time] desc
+2024/08/27 13:21:36.568 [I] [server.go:2136] get_task recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.568 [I] [server.go:2136] {"opuser":"李俊杉","opuser_uuid":"8249ef9d-c8b4-429b-9ea4-bcebdecd000f","prj_id":42,"task_id":32,"index":1,"count":10000}
+2024/08/27 13:21:36.568 [I] [server.go:2136] query_cnt: 10000
+2024/08/27 13:21:36.568 [I] [server.go:2136] select [ID],[data] from [task] where [prj_id] = 42 and [pre_id]=0 and [ID]!=32 order by [ID] asc
+2024/08/27 13:21:36.572 [I] [server.go:2136] get_task recv req end, use time: 3 ms
+2024/08/27 13:21:36.578 [I] [server.go:2136] get_comment recv req end, use time: 10 ms
+2024/08/27 13:21:36.578 [I] [server.go:2136] get_task1_by_task_id recv req end, use time: 12 ms
+2024/08/27 13:21:36.581 [I] [server.go:2136] get_task9_by_task_id recv req end, use time: 16 ms
+2024/08/27 13:21:36.596 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.596 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=32 and num=1 order by [time] desc
+2024/08/27 13:21:36.600 [I] [server.go:2136] get_task_files recv req end, use time: 4 ms
+2024/08/27 13:21:36.613 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.613 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=32 and num=2 order by [time] desc
+2024/08/27 13:21:36.615 [I] [server.go:2136] get_task_files recv req end, use time: 1 ms
+2024/08/27 13:21:36.615 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.615 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=32 and num=6 order by [time] desc
+2024/08/27 13:21:36.616 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.616 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=32 and num=3 order by [time] desc
+2024/08/27 13:21:36.616 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.616 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=32 and num=4 order by [time] desc
+2024/08/27 13:21:36.618 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.618 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=32 and num=5 order by [time] desc
+2024/08/27 13:21:36.619 [I] [server.go:2136] get_task_files recv req end, use time: 3 ms
+2024/08/27 13:21:36.618 [I] [server.go:2136] get_task_files recv req end, use time: 2 ms
+2024/08/27 13:21:36.619 [I] [server.go:2136] get_task_files recv req end, use time: 3 ms
+2024/08/27 13:21:36.620 [I] [server.go:2136] get_task_files recv req end, use time: 1 ms
+2024/08/27 13:21:36.651 [I] [server.go:2136] get_task_files recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.651 [I] [main.go:965] SELECT [ID]
+ ,[task_id]
+ ,[file_name]
+ ,[time]
+ ,[user_name]
+ FROM [task_file] where task_id=32 and num=7 order by [time] desc
+2024/08/27 13:21:36.653 [I] [server.go:2136] get_task_files recv req end, use time: 1 ms
+2024/08/27 13:21:36.654 [I] [server.go:2136] get_task_aw_by_name recv req begin 2024-08-27 13:21:36
+2024/08/27 13:21:36.654 [I] [main.go:4049] select [data] FROM [task] where ID=32
+2024/08/27 13:21:36.656 [I] [server.go:2136] get_task_aw_by_name recv req end, use time: 2 ms
diff --git a/file/sp_1_ex/合同审核导入 (1).csv b/file/sp_1_ex/合同审核导入 (1).csv
new file mode 100644
index 0000000..0e60711
--- /dev/null
+++ b/file/sp_1_ex/合同审核导入 (1).csv
@@ -0,0 +1,2 @@
+Ӧ,,RDM,
+,,17200,30000
diff --git a/file/合同审核导入.csv b/file/合同审核导入.csv
new file mode 100644
index 0000000..0e60711
--- /dev/null
+++ b/file/合同审核导入.csv
@@ -0,0 +1,2 @@
+Ӧ,,RDM,
+,,17200,30000
diff --git a/file/审批导入.csv b/file/审批导入.csv
new file mode 100644
index 0000000..b96bcb8
--- /dev/null
+++ b/file/审批导入.csv
@@ -0,0 +1,2 @@
+Ӧ,Ӧ̱,ʽ,ϱ,,,λ,,,ɹ,Ч,,ұ,,ձ
+,1,1,2-C17200,ͭC17200,YG485,kg,335,45292,25,180,,,,
diff --git a/file/导入采购计划.csv b/file/导入采购计划.csv
new file mode 100644
index 0000000..f8f7f55
--- /dev/null
+++ b/file/导入采购计划.csv
@@ -0,0 +1,5 @@
+FLAG,RDM,,,,ɹԱ,µ
+3,21945755,2-C17200,3,2024/2/28,,2024/2/28
+1,21945755,,,2024/2/28,,2024/2/28
+2,21945755,2-C17200,4,2024/2/28,,2024/2/28
+3,21945755,2-C17200,6,2024/2/28,,2024/2/28
diff --git a/file/根据编号物料匹配.csv b/file/根据编号物料匹配.csv
new file mode 100644
index 0000000..bfd75ce
--- /dev/null
+++ b/file/根据编号物料匹配.csv
@@ -0,0 +1,3 @@
+六合编号
+LHE7413B
+2323
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..1c6e861
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,22 @@
+module pp
+
+go 1.16
+
+require (
+ github.com/LukeMauldin/lodbc v0.0.0-20130219161755-59316a7de9d4
+ github.com/OwnLocal/goes v1.0.0 // indirect
+ github.com/alexbrainman/odbc v0.0.0-20210605012845-39f8520b0d5f // indirect
+ github.com/astaxie/beego v1.12.3
+ github.com/denisenkom/go-mssqldb v0.11.0 // indirect
+ github.com/go-ole/go-ole v1.2.6 // indirect
+ github.com/mattn/go-adodb v0.0.1
+ github.com/mattn/go-sqlite3 v2.0.3+incompatible
+ github.com/satori/go.uuid v1.2.0
+ github.com/shopspring/decimal v1.3.1 // indirect
+ github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect
+ github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373 // indirect
+ github.com/tealeg/xlsx v1.0.5
+ github.com/weigj/go-odbc v0.0.0-20120414035027-f09eefba7e19 // indirect
+ gitlab.com/stone.code/odbc3-go v0.0.0-20140130212748-f9bdfa0350f2 // indirect
+ golang.org/x/net v0.0.0-20211020060615-d418f374d309
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..cc246b0
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,206 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/LukeMauldin/lodbc v0.0.0-20130219161755-59316a7de9d4 h1:MNptLl+J1e/11fmvv5sC47Kc6pJh336HGhEa4ga81IQ=
+github.com/LukeMauldin/lodbc v0.0.0-20130219161755-59316a7de9d4/go.mod h1:wVRoKWzJl1ZecJg0GW+iCvOyWUHSE87uCCxWaF9WMzw=
+github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alexbrainman/odbc v0.0.0-20210605012845-39f8520b0d5f h1:qJp6jWdG+PBNCDtIwRpspahMaZ3hlfde/25ExBORKso=
+github.com/alexbrainman/odbc v0.0.0-20210605012845-39f8520b0d5f/go.mod h1:c5eyz5amZqTKvY3ipqerFO/74a/8CYmXOahSr40c+Ww=
+github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
+github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
+github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
+github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
+github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
+github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
+github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
+github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
+github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
+github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI=
+github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
+github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
+github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/mattn/go-adodb v0.0.1 h1:g/pk3V8m/WFX2IQRI58wAC24OQUFFXEiNsvs7dQ1WKg=
+github.com/mattn/go-adodb v0.0.1/go.mod h1:jaSTRde4bohMuQgYQPxW3xRTPtX/cZKyxPrFVseJULo=
+github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA=
+github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
+github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.0 h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R9JX0FuA/U=
+github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
+github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
+github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
+github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
+github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
+github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
+github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
+github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
+github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
+github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/weigj/go-odbc v0.0.0-20120414035027-f09eefba7e19 h1:0n3XLY0QrWER887wlRh9pzd0dmfsYak/WYwXYMEwVso=
+github.com/weigj/go-odbc v0.0.0-20120414035027-f09eefba7e19/go.mod h1:I2IXPqsCTidAXyoiDDMxw9dTlFyFvpv25SiZl2Xhbnw=
+github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
+github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
+gitlab.com/stone.code/odbc3-go v0.0.0-20140130212748-f9bdfa0350f2 h1:euSt1+U+70sxHwOIiKaUthbzkuSWYDwDBO2FzK+6qec=
+gitlab.com/stone.code/odbc3-go v0.0.0-20140130212748-f9bdfa0350f2/go.mod h1:susDFwJTAkX5t89LhGIcv/+3ZXIPZCkpAg0s5QkoPw4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20211020060615-d418f374d309 h1:A0lJIi+hcTR6aajJH4YqKWwohY4aW9RO7oRMcdv+HKI=
+golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..1b410bf
--- /dev/null
+++ b/main.go
@@ -0,0 +1,6740 @@
+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")
+
+}
diff --git a/odbc/LICENSE b/odbc/LICENSE
new file mode 100644
index 0000000..6119f54
--- /dev/null
+++ b/odbc/LICENSE
@@ -0,0 +1,24 @@
+Copyright 2011 Wei guangjing. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/odbc/README b/odbc/README
new file mode 100644
index 0000000..fb5f36b
--- /dev/null
+++ b/odbc/README
@@ -0,0 +1,32 @@
+ODBC database driver for Go
+
+Install:
+ cd $GOPATH/src
+ git clone git://github.com/weigj/go-odbc.git odbc
+ cd odbc
+ go install
+
+Example:
+
+package main
+
+import (
+ "odbc"
+)
+
+func main() {
+ conn, _ := odbc.Connect("DSN=dsn;UID=user;PWD=password")
+ stmt, _ := conn.Prepare("select * from user where username = ?")
+ stmt.Execute("admin")
+ rows, _ := stmt.FetchAll()
+ for i, row := range rows {
+ println(i, row)
+ }
+ stmt.Close()
+ conn.Close()
+}
+
+Tested on:
+ SQL Server 2005 and Windows 7
+ SQL Server 2005 and Ubuntu 10.4 (UnixODBC+FreeTDS)
+ Oracle 10g and Windows 7
\ No newline at end of file
diff --git a/odbc/doc.go b/odbc/doc.go
new file mode 100644
index 0000000..80e50af
--- /dev/null
+++ b/odbc/doc.go
@@ -0,0 +1,5 @@
+// Copyright (c) 2011, Wei guangjing . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package odbc
diff --git a/odbc/driver/README.txt b/odbc/driver/README.txt
new file mode 100644
index 0000000..c99516b
--- /dev/null
+++ b/odbc/driver/README.txt
@@ -0,0 +1,32 @@
+Driver for database/sql
+
+Install:
+ go install
+
+Example:
+
+package main
+
+import (
+ "database/sql"
+ _ "odbc/driver"
+ "fmt"
+)
+
+func main() {
+ db, err := sql.Open("odbc", "DSN=test;")
+ defer db.Close()
+
+ stmt, err := db.Prepare("select name from table")
+ defer stmt.Close()
+
+ rows, err := stmt.Query()
+ defer rows.Close()
+
+ for rows.Next() {
+ var name string
+
+ _ = rows.Scan(&name)
+ fmt.Println(name)
+ }
+}
\ No newline at end of file
diff --git a/odbc/driver/sql.go b/odbc/driver/sql.go
new file mode 100644
index 0000000..ad5cf93
--- /dev/null
+++ b/odbc/driver/sql.go
@@ -0,0 +1,159 @@
+// Copyright (c) 2012, Wei guangjing . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package driver
+
+import (
+ "database/sql"
+ "database/sql/driver"
+ "errors"
+ "io"
+
+ "deescloud/odbc"
+)
+
+func init() {
+ d := &Driver{}
+ sql.Register("odbc", d)
+}
+
+type Driver struct {
+}
+
+func (d *Driver) Open(dsn string) (driver.Conn, error) {
+ c, err := odbc.Connect(dsn)
+ if err != nil {
+ return nil, err
+ }
+ conn := &conn{c: c}
+ return conn, nil
+}
+
+func (d *Driver) Close() error {
+ return nil
+}
+
+type conn struct {
+ c *odbc.Connection
+ t *tx
+}
+
+func (c *conn) Prepare(query string) (driver.Stmt, error) {
+ st, err := c.c.Prepare(query)
+ if err != nil {
+ return nil, err
+ }
+
+ stmt := &stmt{st: st}
+ return stmt, nil
+}
+
+func (c *conn) Begin() (driver.Tx, error) {
+ if err := c.c.AutoCommit(false); err != nil {
+ return nil, err
+ }
+
+ return &tx{c: c}, nil
+}
+
+func (c *conn) Close() error {
+ if c.c != nil {
+ return c.c.Close()
+ }
+ return nil
+}
+
+type tx struct {
+ c *conn
+}
+
+func (t *tx) Commit() error {
+ err := t.c.c.Commit()
+ return err
+}
+
+func (t *tx) Rollback() error {
+ err := t.c.c.Rollback()
+ return err
+}
+
+type stmt struct {
+ st *odbc.Statement
+}
+
+func (s *stmt) Exec(args []driver.Value) (driver.Result, error) {
+ if err := s.st.Execute2(args); err != nil {
+ return nil, err
+ }
+
+ rowsAffected, err := s.st.RowsAffected()
+ r := &result{rowsAffected: int64(rowsAffected)}
+ return r, err
+}
+
+func (s *stmt) NumInput() int {
+ return s.st.NumParams()
+}
+
+func (s *stmt) Query(args []driver.Value) (driver.Rows, error) {
+ //println(args)
+ if err := s.st.Execute2(args); err != nil {
+ return nil, err
+ }
+ rows := &rows{s: s}
+
+ return rows, nil
+}
+
+func (s *stmt) Close() error {
+ s.st.Close()
+ return nil
+}
+
+type result struct {
+ rowsAffected int64
+}
+
+func (r *result) LastInsertId() (int64, error) {
+ return 0, errors.New("not supported")
+}
+
+func (r *result) RowsAffected() (int64, error) {
+ return r.rowsAffected, nil
+}
+
+type rows struct {
+ s *stmt
+}
+
+func (r *rows) Columns() []string {
+ c, err := r.s.st.NumFields()
+ if err != nil {
+ return nil
+ }
+ columns := make([]string, c)
+ for i, _ := range columns {
+ f, err := r.s.st.FieldMetadata(i + 1)
+ if err != nil {
+ return nil
+ }
+ columns[i] = f.Name
+ }
+ return columns
+}
+
+func (r *rows) Close() error {
+ return r.s.Close()
+}
+
+func (r *rows) Next(dest []driver.Value) error {
+ eof, err := r.s.st.FetchOne2(dest)
+ if err != nil {
+ return err
+ }
+ if eof {
+ return io.EOF
+ }
+ return nil
+}
diff --git a/odbc/make.bash b/odbc/make.bash
new file mode 100644
index 0000000..44af607
--- /dev/null
+++ b/odbc/make.bash
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+export CGO_LDFLAGS=-lodbc
+go install
\ No newline at end of file
diff --git a/odbc/make.bat b/odbc/make.bat
new file mode 100644
index 0000000..bcbff12
--- /dev/null
+++ b/odbc/make.bat
@@ -0,0 +1,2 @@
+set CGO_LDFLAGS=-lodbc32
+go install
\ No newline at end of file
diff --git a/odbc/odbc.go b/odbc/odbc.go
new file mode 100644
index 0000000..0b8cab0
--- /dev/null
+++ b/odbc/odbc.go
@@ -0,0 +1,765 @@
+// Copyright (c) 2011, Wei guangjing . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package odbc
+
+/*
+#cgo darwin LDFLAGS: -lodbc
+#cgo freebsd LDFLAGS: -lodbc
+#cgo linux LDFLAGS: -lodbc
+#cgo windows LDFLAGS: -lodbc32
+
+#include
+#include
+
+#ifdef __MINGW32__
+ #include
+#else
+ typedef void* HANDLE;
+#endif
+
+#include
+#include
+#include
+
+SQLRETURN _SQLColAttribute (
+ SQLHSTMT StatementHandle,
+ SQLUSMALLINT ColumnNumber,
+ SQLUSMALLINT FieldIdentifier,
+ SQLPOINTER CharacterAttributePtr,
+ SQLSMALLINT BufferLength,
+ SQLSMALLINT * StringLengthPtr,
+ void * NumericAttributePtr) {
+ return SQLColAttribute(StatementHandle,
+ ColumnNumber,
+ FieldIdentifier,
+ CharacterAttributePtr,
+ BufferLength,
+ StringLengthPtr,
+ NumericAttributePtr);
+}
+
+*/
+import "C"
+import (
+ "database/sql/driver"
+ "fmt"
+ "reflect"
+ "time"
+ "unsafe"
+)
+
+const (
+ BUFFER_SIZE = 10 * 1024
+ INFO_BUFFER_LEN = 256
+)
+
+var (
+ Genv C.SQLHANDLE
+)
+
+type Connection struct {
+ Dbc C.SQLHANDLE
+ connected bool
+}
+
+type Statement struct {
+ executed bool
+ prepared bool
+ scrollable bool
+
+ handle C.SQLHANDLE
+}
+
+type ODBCError struct {
+ SQLState string
+ NativeError int
+ ErrorMessage string
+}
+
+func (e *ODBCError) Error() string {
+ return e.String()
+}
+
+func (e *ODBCError) String() string {
+ if e != nil {
+ return e.SQLState + " " + e.ErrorMessage
+ }
+ return ""
+}
+
+func initEnv() (err *ODBCError) {
+ ret := C.SQLAllocHandle(C.SQL_HANDLE_ENV, nil, &Genv)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_ENV, Genv)
+ return err
+ }
+ ret = C.SQLSetEnvAttr(C.SQLHENV(Genv), C.SQL_ATTR_ODBC_VERSION, C.SQLPOINTER(unsafe.Pointer(uintptr(C.SQL_OV_ODBC3))), C.SQLINTEGER(0))
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_ENV, Genv)
+ return err
+ }
+ return nil
+}
+
+func Connect(dsn string, params ...interface{}) (conn *Connection, err *ODBCError) {
+ var h C.SQLHANDLE
+ ret := C.SQLAllocHandle(C.SQL_HANDLE_DBC, Genv, &h)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, h)
+ return nil, err
+ }
+
+ var stringLength2 C.SQLSMALLINT
+ outBuf := make([]byte, BUFFER_SIZE*2)
+ outConnectionString := (*C.SQLWCHAR)(unsafe.Pointer(&outBuf[0]))
+
+ ret = C.SQLDriverConnectW(C.SQLHDBC(h),
+ C.SQLHWND(unsafe.Pointer(uintptr(0))),
+ (*C.SQLWCHAR)(unsafe.Pointer(StringToUTF16Ptr(dsn))),
+ C.SQL_NTS,
+ outConnectionString,
+ BUFFER_SIZE,
+ &stringLength2,
+ C.SQL_DRIVER_NOPROMPT)
+
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, h)
+ return nil, err
+ }
+ return &Connection{Dbc: h, connected: true}, nil
+}
+
+func (conn *Connection) ExecDirect(sql string) (stmt *Statement, err *ODBCError) {
+ if stmt, err = conn.newStmt(); err != nil {
+ return nil, err
+ }
+ wsql := StringToUTF16Ptr(sql)
+ ret := C.SQLExecDirectW(C.SQLHSTMT(stmt.handle), (*C.SQLWCHAR)(unsafe.Pointer(wsql)), C.SQL_NTS)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ stmt.Close()
+ return nil, err
+ }
+ stmt.executed = true
+ return stmt, nil
+}
+
+func (conn *Connection) newStmt() (*Statement, *ODBCError) {
+ stmt := &Statement{}
+
+ ret := C.SQLAllocHandle(C.SQL_HANDLE_STMT, conn.Dbc, &stmt.handle)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return nil, err
+ }
+ return stmt, nil
+}
+
+func (conn *Connection) Prepare(sql string, params ...interface{}) (*Statement, *ODBCError) {
+ wsql := StringToUTF16Ptr(sql)
+ stmt, err := conn.newStmt()
+ if err != nil {
+ return nil, err
+ }
+ ret := C.SQLPrepareW(C.SQLHSTMT(stmt.handle), (*C.SQLWCHAR)(unsafe.Pointer(wsql)), C.SQLINTEGER(len(sql)))
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ stmt.Close()
+ return nil, err
+ }
+ stmt.prepared = true
+ return stmt, nil
+}
+
+func (conn *Connection) Commit() (err *ODBCError) {
+ ret := C.SQLEndTran(C.SQL_HANDLE_DBC, conn.Dbc, C.SQL_COMMIT)
+ if !Success(ret) {
+ err = FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ }
+ return
+}
+
+func (conn *Connection) AutoCommit(b bool) (err *ODBCError) {
+ var n C.int
+ if b {
+ n = C.SQL_AUTOCOMMIT_ON
+ } else {
+ n = C.SQL_AUTOCOMMIT_OFF
+ }
+ ret := C.SQLSetConnectAttr(C.SQLHDBC(conn.Dbc), C.SQL_ATTR_AUTOCOMMIT, C.SQLPOINTER(unsafe.Pointer(uintptr(n))), C.SQL_IS_UINTEGER)
+ if !Success(ret) {
+ err = FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ }
+ return
+}
+
+func (conn *Connection) BeginTransaction() (err *ODBCError) {
+ ret := C.SQLSetConnectAttr(C.SQLHDBC(conn.Dbc), C.SQL_ATTR_AUTOCOMMIT, C.SQLPOINTER(unsafe.Pointer(uintptr(C.SQL_AUTOCOMMIT_OFF))), C.SQL_IS_UINTEGER)
+ if !Success(ret) {
+ err = FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ }
+ return
+}
+
+func (conn *Connection) Rollback() (err *ODBCError) {
+ ret := C.SQLEndTran(C.SQL_HANDLE_DBC, conn.Dbc, C.SQL_ROLLBACK)
+ if !Success(ret) {
+ err = FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ }
+ return
+}
+
+func (conn *Connection) ServerInfo() (string, string, string, *ODBCError) {
+ var info_len C.SQLSMALLINT
+ p := make([]byte, INFO_BUFFER_LEN)
+ ret := C.SQLGetInfo(C.SQLHDBC(conn.Dbc), C.SQL_DATABASE_NAME, C.SQLPOINTER(unsafe.Pointer(&p[0])), INFO_BUFFER_LEN, &info_len)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return "", "", "", err
+ }
+ db := string(p[0:info_len])
+ ret = C.SQLGetInfo(C.SQLHDBC(conn.Dbc), C.SQL_DBMS_VER, C.SQLPOINTER(unsafe.Pointer(&p[0])), INFO_BUFFER_LEN, &info_len)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return db, "", "", err
+ }
+ ver := string(p[0:info_len])
+ ret = C.SQLGetInfo(C.SQLHDBC(conn.Dbc), C.SQL_SERVER_NAME, C.SQLPOINTER(unsafe.Pointer(&p[0])), INFO_BUFFER_LEN, &info_len)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return db, ver, "", err
+ }
+ server := string(p[0:info_len])
+ return db, ver, server, nil
+}
+
+func (conn *Connection) ClientInfo() (string, string, string, *ODBCError) {
+ var info_len C.SQLSMALLINT
+ p := make([]byte, INFO_BUFFER_LEN)
+ ret := C.SQLGetInfo(C.SQLHDBC(conn.Dbc), C.SQL_DRIVER_NAME, C.SQLPOINTER(unsafe.Pointer(&p[0])), INFO_BUFFER_LEN, &info_len)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return "", "", "", err
+ }
+ drv_name := string(p[0:info_len])
+ ret = C.SQLGetInfo(C.SQLHDBC(conn.Dbc), C.SQL_DRIVER_ODBC_VER, C.SQLPOINTER(unsafe.Pointer(&p[0])), INFO_BUFFER_LEN, &info_len)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return "", "", "", err
+ }
+ drv_odbc_ver := string(p[0:info_len])
+ ret = C.SQLGetInfo(C.SQLHDBC(conn.Dbc), C.SQL_DRIVER_VER, C.SQLPOINTER(unsafe.Pointer(&p[0])), INFO_BUFFER_LEN, &info_len)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return "", "", "", err
+ }
+ drv_ver := string(p[0:info_len])
+ return drv_name, drv_odbc_ver, drv_ver, nil
+}
+
+func (conn *Connection) Close() *ODBCError {
+ if conn.connected {
+ ret := C.SQLDisconnect(C.SQLHDBC(conn.Dbc))
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return err
+ }
+ ret = C.SQLFreeHandle(C.SQL_HANDLE_DBC, conn.Dbc)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_DBC, conn.Dbc)
+ return err
+ }
+ conn.connected = false
+ }
+ return nil
+}
+
+/* func (stmt *Statement) RowsAffected() (int, *ODBCError)
+
+修改成func (stmt *Statement) RowsAffected() (int, error)
+
+*/
+func (stmt *Statement) RowsAffected() (int, error) {
+ var nor C.SQLLEN
+ ret := C.SQLRowCount(C.SQLHSTMT(stmt.handle), &nor)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return -1, err
+ }
+ return int(nor), nil
+}
+
+func (stmt *Statement) Cancel() *ODBCError {
+ ret := C.SQLCancel(C.SQLHSTMT(stmt.handle))
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return err
+ }
+ return nil
+}
+
+func (stmt *Statement) NumParams() int {
+ var cParams C.SQLSMALLINT
+ ret := C.SQLNumParams(C.SQLHSTMT(stmt.handle), &cParams)
+ if !Success(ret) {
+ return -1
+ }
+ return int(cParams)
+}
+
+func (stmt *Statement) Execute(params ...interface{}) *ODBCError {
+ if params != nil {
+ var cParams C.SQLSMALLINT
+ ret := C.SQLNumParams(C.SQLHSTMT(stmt.handle), &cParams)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return err
+ }
+ for i := 0; i < int(cParams); i++ {
+ stmt.BindParam(i+1, params[i])
+ }
+ }
+ ret := C.SQLExecute(C.SQLHSTMT(stmt.handle))
+ if ret == C.SQL_NEED_DATA {
+ // TODO
+ // send_data(stmt)
+ } else if ret == C.SQL_NO_DATA {
+ // Execute NO DATA
+ } else if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return err
+ }
+ stmt.executed = true
+ return nil
+}
+
+func (stmt *Statement) Execute2(params []driver.Value) *ODBCError {
+ if params != nil {
+ var cParams C.SQLSMALLINT
+ ret := C.SQLNumParams(C.SQLHSTMT(stmt.handle), &cParams)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return err
+ }
+ for i := 0; i < int(cParams); i++ {
+ stmt.BindParam(i+1, params[i])
+ }
+ }
+ ret := C.SQLExecute(C.SQLHSTMT(stmt.handle))
+ if ret == C.SQL_NEED_DATA {
+ // TODO
+ // send_data(stmt)
+ } else if ret == C.SQL_NO_DATA {
+ // Execute NO DATA
+ } else if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return err
+ }
+ stmt.executed = true
+ return nil
+}
+
+func (stmt *Statement) Fetch() (bool, *ODBCError) {
+ ret := C.SQLFetch(C.SQLHSTMT(stmt.handle))
+ if ret == C.SQL_NO_DATA {
+ return false, nil
+ }
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return false, err
+ }
+ return true, nil
+}
+
+type Row struct {
+ Data []interface{}
+}
+
+// Get(Columnindex)
+// TODO Get(ColumnName)
+func (r *Row) Get(a interface{}) interface{} {
+ value := reflect.ValueOf(a)
+ switch f := value; f.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return r.Data[f.Int()]
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return r.Data[f.Uint()]
+ // case *reflect.StringValue:
+ // i := r.Meta[f.Get()]
+ // return r.Data[i]
+ }
+ return nil
+}
+
+func (r *Row) GetInt(a interface{}) (ret int64) {
+ v := r.Get(a)
+ value := reflect.ValueOf(v)
+ switch f := value; f.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ ret = int64(f.Int())
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ ret = int64(f.Uint())
+ }
+ return
+}
+
+func (r *Row) GetFloat(a interface{}) (ret float64) {
+ v := r.Get(a)
+ value := reflect.ValueOf(v)
+ switch f := value; f.Kind() {
+ case reflect.Float32, reflect.Float64:
+ ret = float64(f.Float())
+ }
+ return
+}
+
+func (r *Row) GetString(a interface{}) (ret string) {
+ v := r.Get(a)
+ value := reflect.ValueOf(v)
+ switch f := value; f.Kind() {
+ case reflect.String:
+ ret = f.String()
+ }
+ return
+}
+
+func (r *Row) Length() int {
+ return len(r.Data)
+}
+
+func (stmt *Statement) FetchAll() (rows []*Row, err *ODBCError) {
+ for {
+ row, err := stmt.FetchOne()
+ if err != nil || row == nil {
+ break
+ }
+ rows = append(rows, row)
+ }
+
+ return rows, err
+}
+
+func (stmt *Statement) FetchOne() (*Row, *ODBCError) {
+ ok, err := stmt.Fetch()
+ if !ok {
+ return nil, err
+ }
+ n, _ := stmt.NumFields()
+ row := new(Row)
+ row.Data = make([]interface{}, n)
+ for i := 0; i < n; i++ {
+ v, _, _, _ := stmt.GetField(i)
+ row.Data[i] = v
+ }
+ return row, nil
+}
+
+func (stmt *Statement) FetchOne2(row []driver.Value) (eof bool, err *ODBCError) {
+ ok, err := stmt.Fetch()
+ if !ok && err == nil {
+ return !ok, nil
+ } else if err != nil {
+ return false, err
+ }
+ n, _ := stmt.NumFields()
+ for i := 0; i < n; i++ {
+ v, _, _, _ := stmt.GetField(i)
+ row[i] = v
+ }
+
+ //fmt.Println("row:", row)
+ return false, nil
+}
+
+func (stmt *Statement) GetField(field_index int) (v interface{}, ftype int, flen int, err *ODBCError) {
+ var field_type C.int
+ var field_len C.SQLLEN
+ var ll C.SQLSMALLINT
+ ret := C._SQLColAttribute(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_DESC_CONCISE_TYPE, C.SQLPOINTER(unsafe.Pointer(uintptr(0))), C.SQLSMALLINT(0), &ll, unsafe.Pointer(&field_type))
+ if !Success(ret) {
+ // TODO return err
+ }
+ ret = C._SQLColAttribute(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_DESC_LENGTH, C.SQLPOINTER(unsafe.Pointer(uintptr(0))), C.SQLSMALLINT(0), &ll, unsafe.Pointer(&field_len))
+ if !Success(ret) {
+ // TODO return err
+ }
+ var fl C.SQLLEN = C.SQLLEN(field_len)
+ switch int(field_type) {
+ case C.SQL_BIT:
+ var value C.BYTE
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_BIT, C.SQLPOINTER(unsafe.Pointer(&value)), 0, &fl)
+ if fl == -1 {
+ v = byte(0)
+ } else {
+ v = byte(value)
+ }
+ case C.SQL_INTEGER, C.SQL_SMALLINT, C.SQL_TINYINT:
+ var value C.long
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_LONG, C.SQLPOINTER(unsafe.Pointer(&value)), 0, &fl)
+ if fl == -1 {
+ v = byte(0)
+ } else {
+ v = int(value)
+ }
+ case C.SQL_BIGINT:
+ var value C.longlong
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_SBIGINT, C.SQLPOINTER(unsafe.Pointer(&value)), 0, &fl)
+ if fl == -1 {
+ v = int64(0)
+ } else {
+ v = int64(value)
+ }
+ case C.SQL_FLOAT, C.SQL_REAL, C.SQL_DOUBLE:
+ var value C.double
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_DOUBLE, C.SQLPOINTER(unsafe.Pointer(&value)), 0, &fl)
+ if fl == -1 {
+ v = float64(0)
+ } else {
+ v = float64(value)
+ }
+ case C.SQL_CHAR, C.SQL_VARCHAR, C.SQL_LONGVARCHAR, C.SQL_WCHAR, C.SQL_WVARCHAR, C.SQL_WLONGVARCHAR:
+ value := make([]uint16, int(field_len)+8)
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_WCHAR, C.SQLPOINTER(unsafe.Pointer(&value[0])), field_len+4, &fl)
+ s := UTF16ToString(value)
+ v = s
+ case C.SQL_TYPE_TIMESTAMP, C.SQL_TYPE_DATE, C.SQL_TYPE_TIME, C.SQL_DATETIME:
+ var value C.TIMESTAMP_STRUCT
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_TYPE_TIMESTAMP, C.SQLPOINTER(unsafe.Pointer(&value)), C.SQLLEN(unsafe.Sizeof(value)), &fl)
+ if fl == -1 {
+ v = nil
+ } else {
+ v = time.Date(int(value.year), time.Month(value.month), int(value.day), int(value.hour), int(value.minute), int(value.second), int(value.fraction), time.UTC)
+ }
+ case C.SQL_BINARY, C.SQL_VARBINARY, C.SQL_LONGVARBINARY:
+ var vv int
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_BINARY, C.SQLPOINTER(unsafe.Pointer(&vv)), 0, &fl)
+ if fl == -1 {
+ v = nil
+ } else {
+ value := make([]byte, fl)
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_BINARY, C.SQLPOINTER(unsafe.Pointer(&value[0])), C.SQLLEN(fl), &fl)
+ v = value
+ }
+ default:
+ value := make([]byte, field_len)
+ ret = C.SQLGetData(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(field_index+1), C.SQL_C_BINARY, C.SQLPOINTER(unsafe.Pointer(&value[0])), field_len, &fl)
+ v = value
+ }
+ if !Success(ret) {
+ err = FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ }
+ return v, int(field_type), int(fl), err
+}
+
+func (stmt *Statement) NumFields() (int, *ODBCError) {
+ var NOC C.SQLSMALLINT
+ ret := C.SQLNumResultCols(C.SQLHSTMT(stmt.handle), &NOC)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return -1, err
+ }
+ return int(NOC), nil
+}
+
+func (stmt *Statement) GetParamType(index int) (int, int, int, int, *ODBCError) {
+ var data_type, dec_ptr, null_ptr C.SQLSMALLINT
+ var size_ptr C.SQLULEN
+ ret := C.SQLDescribeParam(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(index), &data_type, &size_ptr, &dec_ptr, &null_ptr)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return -1, -1, -1, -1, err
+ }
+ return int(data_type), int(size_ptr), int(dec_ptr), int(null_ptr), nil
+}
+
+func (stmt *Statement) BindParam(index int, param interface{}) *ODBCError {
+ var ValueType C.SQLSMALLINT
+ var ParameterType C.SQLSMALLINT
+ var ColumnSize C.SQLULEN
+ var DecimalDigits C.SQLSMALLINT
+ var ParameterValuePtr C.SQLPOINTER
+ var BufferLength C.SQLLEN
+ var StrLen_or_IndPt C.SQLLEN
+ v := reflect.ValueOf(param)
+ if param == nil {
+ ft, _, _, _, err := stmt.GetParamType(index)
+ if err != nil {
+ return err
+ }
+ ParameterType = C.SQLSMALLINT(ft)
+ if ParameterType == C.SQL_UNKNOWN_TYPE {
+ ParameterType = C.SQL_VARCHAR
+ }
+ ValueType = C.SQL_C_DEFAULT
+ StrLen_or_IndPt = C.SQL_NULL_DATA
+ ColumnSize = 1
+ } else {
+ switch v.Kind() {
+ case reflect.Bool:
+ ParameterType = C.SQL_BIT
+ ValueType = C.SQL_C_BIT
+ var b [1]byte
+ if v.Bool() {
+ b[0] = 1
+ } else {
+ b[0] = 0
+ }
+ ParameterValuePtr = C.SQLPOINTER(unsafe.Pointer(&b[0]))
+ BufferLength = 1
+ StrLen_or_IndPt = 0
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ switch v.Type().Kind() {
+ case reflect.Int:
+ case reflect.Int8, reflect.Int16, reflect.Int32:
+ ParameterType = C.SQL_INTEGER
+ ValueType = C.SQL_C_LONG
+ var l C.long = C.long(v.Int())
+ ParameterValuePtr = C.SQLPOINTER(unsafe.Pointer(&l))
+ BufferLength = 4
+ StrLen_or_IndPt = 0
+ case reflect.Int64:
+ ParameterType = C.SQL_BIGINT
+ ValueType = C.SQL_C_SBIGINT
+ var ll C.longlong = C.longlong(v.Int())
+ ParameterValuePtr = C.SQLPOINTER(unsafe.Pointer(&ll))
+ BufferLength = 8
+ StrLen_or_IndPt = 0
+ }
+ case reflect.Float32, reflect.Float64:
+ ParameterType = C.SQL_DOUBLE
+ ValueType = C.SQL_C_DOUBLE
+ var d C.double = C.double(v.Float())
+ ParameterValuePtr = C.SQLPOINTER(unsafe.Pointer(&d))
+ BufferLength = 8
+ StrLen_or_IndPt = 0
+ case reflect.Complex64, reflect.Complex128:
+ case reflect.String:
+ var slen C.SQLUINTEGER = C.SQLUINTEGER(len(v.String()))
+ ParameterType = C.SQL_VARCHAR
+ ValueType = C.SQL_C_CHAR
+ s := []byte(v.String())
+ ParameterValuePtr = C.SQLPOINTER(unsafe.Pointer(&s[0]))
+ ColumnSize = C.SQLULEN(slen)
+ BufferLength = C.SQLLEN(slen + 1)
+ StrLen_or_IndPt = C.SQLLEN(slen)
+ default:
+ fmt.Println("Not support type", v)
+ }
+ }
+ ret := C.SQLBindParameter(C.SQLHSTMT(stmt.handle), C.SQLUSMALLINT(index), C.SQL_PARAM_INPUT, ValueType, ParameterType, ColumnSize, DecimalDigits, ParameterValuePtr, BufferLength, &StrLen_or_IndPt)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return err
+ }
+
+ return nil
+}
+
+func (stmt *Statement) NextResult() bool {
+ ret := C.SQLMoreResults(C.SQLHSTMT(stmt.handle))
+ if ret == C.SQL_NO_DATA {
+ return false
+ }
+ return true
+}
+
+func (stmt *Statement) NumRows() (int, *ODBCError) {
+ var NOR C.SQLLEN
+ ret := C.SQLRowCount(C.SQLHSTMT(stmt.handle), &NOR)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return -1, err
+ }
+ return int(NOR), nil
+}
+
+func (stmt *Statement) HasRows() bool {
+ n, _ := stmt.NumRows()
+ return n > 0
+}
+
+type Field struct {
+ Name string
+ Type int
+ Size int
+ DecimalDigits int
+ Nullable int
+}
+
+func (stmt *Statement) FieldMetadata(col int) (*Field, *ODBCError) {
+ var BufferLength C.SQLSMALLINT = INFO_BUFFER_LEN
+ var NameLength C.SQLSMALLINT
+ var DataType C.SQLSMALLINT
+ var ColumnSize C.SQLULEN
+ var DecimalDigits C.SQLSMALLINT
+ var Nullable C.SQLSMALLINT
+ ColumnName := make([]byte, INFO_BUFFER_LEN)
+ ret := C.SQLDescribeCol(C.SQLHSTMT(stmt.handle),
+ C.SQLUSMALLINT(col),
+ (*C.SQLCHAR)(unsafe.Pointer(&ColumnName[0])),
+ BufferLength,
+ &NameLength,
+ &DataType,
+ &ColumnSize,
+ &DecimalDigits,
+ &Nullable)
+ if !Success(ret) {
+ err := FormatError(C.SQL_HANDLE_STMT, stmt.handle)
+ return nil, err
+ }
+ field := &Field{string(ColumnName[0:NameLength]), int(DataType), int(ColumnSize), int(DecimalDigits), int(Nullable)}
+ return field, nil
+}
+
+func (stmt *Statement) free() {
+ if stmt.handle != nil {
+ C.SQLFreeHandle(C.SQL_HANDLE_STMT, stmt.handle)
+ stmt.handle = nil
+ }
+}
+
+func (stmt *Statement) Close() {
+ stmt.free()
+}
+
+func Success(ret C.SQLRETURN) bool {
+ return int(ret) == C.SQL_SUCCESS || int(ret) == C.SQL_SUCCESS_WITH_INFO
+}
+
+func FormatError(ht C.SQLSMALLINT, h C.SQLHANDLE) (err *ODBCError) {
+ sqlState := make([]uint16, 6)
+ var nativeError C.SQLINTEGER
+ messageText := make([]uint16, C.SQL_MAX_MESSAGE_LENGTH)
+ var textLength C.SQLSMALLINT
+ err = &ODBCError{}
+ i := 0
+ for {
+ i++
+ ret := C.SQLGetDiagRecW(C.SQLSMALLINT(ht),
+ h,
+ C.SQLSMALLINT(i),
+ (*C.SQLWCHAR)(unsafe.Pointer(&sqlState[0])),
+ &nativeError,
+ (*C.SQLWCHAR)(unsafe.Pointer(&messageText[0])),
+ C.SQL_MAX_MESSAGE_LENGTH,
+ &textLength)
+ if ret == C.SQL_INVALID_HANDLE || ret == C.SQL_NO_DATA {
+ break
+ }
+ if i == 1 { // first error message save the SQLSTATE.
+ err.SQLState = UTF16ToString(sqlState)
+ err.NativeError = int(nativeError)
+ }
+ err.ErrorMessage += UTF16ToString(messageText)
+ }
+
+ return err
+}
+
+func init() {
+ if err := initEnv(); err != nil {
+ panic("odbc init env error!" + err.String())
+ }
+}
diff --git a/odbc/util.go b/odbc/util.go
new file mode 100644
index 0000000..0514f58
--- /dev/null
+++ b/odbc/util.go
@@ -0,0 +1,25 @@
+package odbc
+
+import (
+ "unicode/utf16"
+)
+
+// StringToUTF16 returns the UTF-16 encoding of the UTF-8 string s,
+// with a terminating NUL added.
+func StringToUTF16(s string) []uint16 { return utf16.Encode([]rune(s + "\x00")) }
+
+// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
+// with a terminating NUL removed.
+func UTF16ToString(s []uint16) string {
+ for i, v := range s {
+ if v == 0 {
+ s = s[0:i]
+ break
+ }
+ }
+ return string(utf16.Decode(s))
+}
+
+// StringToUTF16Ptr returns pointer to the UTF-16 encoding of
+// the UTF-8 string s, with a terminating NUL added.
+func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] }
diff --git a/req.go b/req.go
new file mode 100644
index 0000000..a2b3d2a
--- /dev/null
+++ b/req.go
@@ -0,0 +1,495 @@
+package main
+
+type mul_sp_2_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan []sp_2 `json:"data"`
+}
+
+type update_sp_2_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan sp_2 `json:"data"`
+}
+
+type get_sp_2_resp struct {
+ Data []sp_2 `json:"data"`
+ Total int `json:"total"`
+}
+
+type get_sp_2_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Index int `json:"index"`
+ Count int `json:"count"`
+
+ Contract_id int `json:"contract_id"` //合同号
+ Supplier string `json:"supplier"` //供应商
+ Contract_name string `json:"contract_name"` //合同名称
+ Rdm string `json:"rdm"`
+ Buyer string `json:"buyer"` //采购人员
+
+ If_done bool `json:"if_done"`
+}
+
+type mul_sp_1_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan []sp_1 `json:"data"`
+}
+
+type update_sp_1_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan sp_1 `json:"data"`
+}
+
+type get_sp_1_resp struct {
+ Data []sp_1 `json:"data"`
+ Total int `json:"total"`
+}
+
+type get_sp_1_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Index int `json:"index"`
+ Count int `json:"count"`
+
+ ID int `json:"id"` //序号
+
+ Supplier string `json:"supplier"`
+ Applicant string `json:"applicant"` //申请人
+ Time string `json:"time"`
+ Contract_name string `json:"contract_name"` //合同名称
+ Rdm string `json:"rdm"`
+ Amount string `json:"amount"` //金额
+
+ If_done bool `json:"if_done"`
+ State string `json:"state"` //审批状态
+}
+
+type import_sp_1_Req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan []sp_1 `json:"plan"`
+}
+
+type update_payment_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+
+ Data payment_info `json:"data"`
+}
+
+type get_payment_by_id_resp struct {
+ Data payment_info `json:"data"`
+}
+
+type get_payment_resp struct {
+ Data []payment_info `json:"data"`
+ Total int `json:"total"`
+}
+
+type payment_info struct {
+ Pre_id int `json:"pre_id"` //父id
+ ID int `json:"id"`
+
+ Supplier string `json:"supplier"` //供应商
+
+ Code string `json:"code"` //编号
+ Name string `json:"name"` //名称
+ Spec string `json:"spec"` //规格
+ Unit string `json:"unit"` //单位
+ Num string `json:"num"` //数量
+ Price string `json:"price"` //单价
+
+ Payment_type string `json:"pt"` //付款方式
+
+ Total_p string `json:"total_p"` //总计
+
+ Paid string `json:"paid"` //已付
+
+ Residual_p string `json:"rp"` //应付
+
+ Payment_data []payment_month `json:"payment_data"`
+}
+
+type payment_month struct {
+ Month string `json:"payment_month"`
+ Payment string `json:"payment"`
+ Payment_user string `json:"payment_user"`
+}
+
+type get_payment_by_id_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+
+ ID int `json:"id"`
+}
+
+type get_payment_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+
+ Index int `json:"index"`
+ Count int `json:"count"`
+ //ID string `json:"id"`
+
+ Code string `json:"code"` //编号
+ Name string `json:"name"` //名称
+ Supplier string `json:"supplier"` //供应商
+}
+
+type approve_ok_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+
+ ID int `json:"id"`
+
+ Data []approve_m_detail `json:"data"`
+}
+
+type del_approve_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+
+ Data []approve_m_info `json:"ids"`
+}
+
+type import_approve_m_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Data []approve_m_detail `json:"data"`
+}
+
+type approve_m_detail struct {
+ ID int `json:"id"`
+
+ Supplier string `json:"supplier"` //供应商
+ Supplier_code string `json:"supplier_code"` //供应商
+ Payment_type string `json:"pt"` //付款方式
+
+ Code string `json:"code"` //编号
+ Name string `json:"name"` //名称
+ Spec string `json:"spec"` //规格
+ Unit string `json:"unit"` //单位
+ Price string `json:"price"` //单价
+ Update_date string `json:"update_date"` //更新日期
+
+ Procurement_cycle string `json:"pc"` //采购周期
+
+ Validity_period_of_quotation string `json:"vpoq"` //报价有效期
+
+ Effective_time string `json:"effective_time"` //报价有效时间=更新时间-today+报价有效期
+
+ Op_type string `json:"op_type"`
+ Price_span string `json:"price_span"`
+
+ Last_price string `json:"last_price"`
+
+ Factory string `json:"factory"` //生产厂家
+ Factory_code string `json:"factory_code"` //厂家编号
+ Qs string `json:"qs"` //质量标准
+ As string `json:"as"` //验收标准
+}
+
+type get_approve_m_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Index int `json:"index"`
+ Count int `json:"count"`
+ Applicant string `json:"applicant"` //申请人
+}
+
+type get_approve_m_resp struct {
+ Data []approve_m_info `json:"data"`
+ Total int `json:"total"`
+}
+
+type approve_m_info struct {
+ ID int `json:"id"`
+ Applicant string `json:"applicant"`
+ Time string `json:"time"`
+ Record_cnt int `json:"record_cnt"`
+ Update_cnt int `json:"update_cnt"`
+ Add_cnt int `json:"add_cnt"`
+ State string `json:"state"`
+ Data string `json:"data"`
+}
+
+type get_material_resp struct {
+ Data []material_info `json:"data"`
+ Total int `json:"total"`
+}
+
+type material_info struct {
+ ID int `json:"id"`
+
+ Supplier string `json:"supplier"` //供应商
+ Supplier_code string `json:"supplier_code"` //供应商
+ Payment_type string `json:"pt"` //付款方式
+
+ Code string `json:"code"` //编号
+ Name string `json:"name"` //名称
+ Spec string `json:"spec"` //规格
+ Unit string `json:"unit"` //单位
+ Price string `json:"price"` //单价
+ Update_date string `json:"update_date"` //更新日期
+
+ Procurement_cycle string `json:"pc"` //采购周期
+
+ Validity_period_of_quotation string `json:"vpoq"` //报价有效期
+
+ Effective_time string `json:"effective_time"` //报价有效时间=更新时间-today+报价有效期
+
+ Price_2 string `json:"price_2"` //单价
+ Update_date_2 string `json:"update_date_2"` //更新日期
+
+ Price_3 string `json:"price_3"` //单价
+ Update_date_3 string `json:"update_date_3"` //更新日期
+
+ Price_4 string `json:"price_4"` //单价
+ Update_date_4 string `json:"update_date_4"` //更新日期
+
+ Price_5 string `json:"price_5"` //单价
+ Update_date_5 string `json:"update_date_5"` //更新日期
+
+ Price_arr []price_update_info `json:"price_arr"`
+
+ Factory string `json:"factory"` //生产厂家
+ Factory_code string `json:"factory_code"` //厂家编号
+ Qs string `json:"qs"` //质量标准
+ As string `json:"as"` //验收标准
+
+ Del_time string `json:"del_time"`
+ Del_user string `json:"del_user"`
+}
+
+type price_update_info struct {
+ Price_ string `json:"price_"` //单价
+ Update_date_ string `json:"update_date_"` //更新日期
+}
+
+type get_material_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Index int `json:"index"`
+ Count int `json:"count"`
+ //ID string `json:"id"`
+
+ Code string `json:"code"` //编号
+ Name string `json:"name"` //名称
+ Supplier string `json:"supplier"` //供应商
+ Bt string `json:"bt"` //开始时间
+ Et string `json:"et"` //结束时间
+
+ If_del bool `json:"if_del"` //是否已删除
+}
+
+type post_rs_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ ID int `json:"id"`
+ State string `json:"rs"`
+ Oper_type int `json:"oper_type"`
+}
+
+type get_rs_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ State string `json:"state"`
+}
+
+type cal_completion_date_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Bt string `json:"bt"`
+ Days string `json:"days"`
+}
+
+type remove_material_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ ID []int `json:"ids"`
+}
+
+type remove_ma_plan_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ ID int `json:"id"`
+}
+
+type get_ma_username_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+}
+
+type get_p_name_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ P_id string `json:"p_id"`
+}
+
+type get_p_id_options_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ P_like_id string `json:"p_like_id"`
+}
+
+type mul_update_pp_plan_num_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan []pp_plan `json:"data"`
+}
+
+type update_ma_plan_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan pp_plan `json:"data"`
+}
+
+type get_single_plan_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ ID []int `json:"id"`
+ If_done bool `json:"if_done"` //已处理
+}
+
+type get_single_plan_resp struct {
+ Data []pp_plan `json:"data"`
+}
+
+type get_ma_plan_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Index int `json:"index"`
+ Count int `json:"count"`
+ ID string `json:"id"`
+ RDM string `json:"rdm"`
+ Bt string `json:"bt"`
+ Et string `json:"et"`
+ Code string `json:"code"` //编号
+ Name string `json:"name"` //名称
+ Supplier string `json:"supplier"` //供应方
+
+ If_done bool `json:"if_done"` //已处理
+
+ State string `json:"state"`
+
+ Buyer string `json:"buyer"` //采购人
+ Codes []string `json:"codes"` //编号
+}
+
+type import_ma_plan_Req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Plan []pp_plan `json:"plan"`
+}
+
+type del_process_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Ids []process_info `json:"ids"`
+}
+
+type update_process_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Data process_info `json:"data"`
+}
+
+type import_process_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Data []process_info `json:"data"`
+}
+
+type get_process_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ P_id string `json:"p_id"`
+ Process_name string `json:"process_name"`
+ Index int `json:"index"`
+ Count int `json:"count"`
+}
+
+type import_p_Req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Data []p_sap `json:"data"`
+}
+
+type del_p_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Ids []p_sap `json:"ids"`
+}
+
+type post_p_req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Id int `json:"id"`
+ P_id string `json:"p_id"`
+ P_name string `json:"p_name"`
+ OperType int `json:"oper_type"`
+}
+
+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"`
+}
+
+type download_template_file_Req struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+}
+
+type getUserNamesReq struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+}
+
+type PostUserReq struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Id int `json:"id"`
+ Username string `json:"username"`
+ Password string `json:"password"`
+ Role string `json:"role"`
+ Department string `json:"department"`
+ OperType int `json:"oper_type"`
+ State string `json:"state"`
+
+ If_buyer int `json:"if_buyer"`
+}
+
+type getUsersReq struct {
+ OpUser string `json:"opuser"`
+ OpUserUuid string `json:"opuser_uuid"`
+ Id string `json:"id"`
+ Index int `json:"index"`
+ Count int `json:"count"`
+}
+
+type GetMenuReq struct {
+ UserName string `json:"username"`
+ Uuid string `json:"uuid"`
+}
+
+type LoginOutReq struct {
+ Username string `json:"username"`
+}
+
+type RefreshUserReq struct {
+ Uuid string `json:"uuid"`
+ Username string `json:"username"`
+}
+
+type LoginReq struct {
+ Username string `json:"username"`
+ Password string `json:"password"`
+}
diff --git a/res.go b/res.go
new file mode 100644
index 0000000..f5e12c1
--- /dev/null
+++ b/res.go
@@ -0,0 +1,154 @@
+package main
+
+type get_rs_resp struct {
+ Data []Repair_state `json:"data"`
+}
+
+type Repair_state struct {
+ ID int `json:"id"`
+ Rs string `json:"rs"`
+}
+
+type cal_completion_date_resp struct {
+ Completion_date string `json:"completion_date"`
+}
+
+type get_ma_username_resp struct {
+ Data []string `json:"data"`
+}
+
+type get_p_name_resp struct {
+ P_name string `json:"p_name"`
+}
+
+type get_p_id_options_resp struct {
+ Data []string `json:"data"`
+}
+
+type get_ma_plan_resp struct {
+ Data []pp_plan `json:"data"`
+ Total int `json:"total"`
+}
+
+type get_process_resp struct {
+ Data []process_info `json:"data"`
+ Total int `json:"total"`
+}
+
+type process_info struct {
+ ID int `json:"id"`
+ P_id string `json:"p_id"`
+ Process_name string `json:"process_name"`
+ Process_t string `json:"process_t"`
+}
+
+type upload_resp struct {
+ Ret int `json:"ret"`
+}
+
+type get_pf_Resp struct {
+ Data []plan_file `json:"data"`
+ Total int `json:"total"`
+}
+
+type plan_file struct {
+ ID int `json:"id"`
+ P_id string `json:"p_id"`
+ P_name string `json:"p_name"`
+ Plan_name string `json:"plan_name"`
+
+ Plan_process_file string `json:"plan_process_file"`
+ Filing_time string `json:"filing_time"`
+ Filing_user string `json:"filing_user"`
+ Project_file string `json:"project_file"`
+ P_filing_time string `json:"p_filing_time"`
+}
+
+type import_p_resp PostUserResp
+
+type del_p_resp PostUserResp
+
+type post_p_resp PostUserResp
+
+type get_p_Resp struct {
+ Data []p_sap `json:"data"`
+ Total int `json:"total"`
+}
+
+type p_sap struct {
+ ID int `json:"id"`
+ P_id string `json:"p_id"`
+ P_name string `json:"p_name"`
+}
+
+type download_file_Resp struct {
+ FileId string `json:"fileId"`
+}
+
+type getUserNamesResp struct {
+ Names []usernams `json:"names"`
+}
+
+type usernams struct {
+ Value string `json:"value"`
+ Label string `json:"label"`
+}
+
+type PostUserResp struct {
+ Ret int `json:"r"`
+}
+
+type GetMenuResp struct {
+ MenuData []GetMenuRespData `json:"data"`
+}
+
+type Svg struct {
+ First string `json:"first"`
+ Second string `json:"second"`
+}
+
+type GetMenuRespData struct {
+ Title string `json:"title"`
+ Class string `json:"classname"`
+ SvgData Svg `json:"svg"`
+ Index string `json:"index"`
+ Key string `json:"key"`
+ Items []menuItem `json:"items"`
+}
+
+type menuItem struct {
+ Title string `json:"title"`
+ Index string `json:"index"`
+ Key string `json:"key"`
+}
+
+type LoginResp struct {
+ Ret int `json:"r"`
+ Uuid string `json:"uuid"`
+ RoleId int `json:"roleid"`
+ Url string `json:"url"`
+ DId int `json:"did"`
+}
+
+type GetUsersResp struct {
+ Data []useInfo `json:"data"`
+ Total int `json:"total"`
+}
+
+type useInfo struct {
+ Userid int `json:"userid"`
+ Username string `json:"username"`
+ Password string `json:"password"`
+ RoleName string `json:"rolename"`
+ RoleId int `json:"roleid"`
+ Department string `json:"department"`
+ DepartmentId int `json:"departmentid"`
+ State string `json:"state"`
+
+ If_buyer int `json:"if_buyer"`
+}
+
+type CommonResp struct {
+ Ret int `json:"r"`
+ Context string `json:"context"`
+}
diff --git a/upload_file/DEES 软件 V1.5.3 迭代更新说明-en.docx b/upload_file/DEES 软件 V1.5.3 迭代更新说明-en.docx
new file mode 100644
index 0000000..812e5cf
Binary files /dev/null and b/upload_file/DEES 软件 V1.5.3 迭代更新说明-en.docx differ
diff --git a/upload_file/DEES 软件 V1.5.3 迭代更新说明.docx b/upload_file/DEES 软件 V1.5.3 迭代更新说明.docx
new file mode 100644
index 0000000..4750070
Binary files /dev/null and b/upload_file/DEES 软件 V1.5.3 迭代更新说明.docx differ
diff --git a/upload_file/今日计划.txt b/upload_file/今日计划.txt
new file mode 100644
index 0000000..6f62383
--- /dev/null
+++ b/upload_file/今日计划.txt
@@ -0,0 +1,33 @@
+
+-------------------------------------------------------------------------------------------------
+2436003019405186
+
+չƻ
+һĿ
+1. PRJ2203ƽ̨ĿWEB
+ 1.1 ƽ̨쳣ݡ
+ 1.2 ͳ㷨Żɡ
+ 1.3 ¶Ȱʽĺ汣һ£İɡ
+2.Ŀ*
+ 2.1 Ŀ¼ܱдɡ
+ 2.2 ̼¼ҵҵʱ628ա
+3.ɹ
+ 3.1 /ձϴɡ
+4.
+ 4.1 붨λģɡ
+5.
+ ˾վMWD
+
+-------------------------------------------------------------------------------------------------
+ݣ
+5511LHE2031B
+3111C LHE2031A
+-------------------------------------------------------------------------------------------------
+ 9,300 һ
+ˮƽ 5,060 ﻪH90-3
+
+ܶ
+ѹ
+¶ 220 ǧ̽1
+-------------------------------------------------------------------------------------------------
+
diff --git a/upload_file/质检未完成工序 240626 165927.csv b/upload_file/质检未完成工序 240626 165927.csv
new file mode 100644
index 0000000..2739b34
--- /dev/null
+++ b/upload_file/质检未完成工序 240626 165927.csv
@@ -0,0 +1 @@
+订单日期,编码,部门,计划/项目号,产品编号,产品名称,数量,需求日期,RDM,交付人,承诺到料,生产班组,派产数量,计划派产日期,承诺完成日期,实际完成日期,超期,生产状态,编程状态,工序,工时,准备时间,编程时间,生产人员,派产数量,计划派产日期,计划完成日期,实际完成日期,超期天数
diff --git a/upload_file_cache.go b/upload_file_cache.go
new file mode 100644
index 0000000..e777059
--- /dev/null
+++ b/upload_file_cache.go
@@ -0,0 +1,89 @@
+package main
+
+import (
+ "fmt"
+ "time"
+
+ "database/sql"
+
+ "github.com/astaxie/beego/logs"
+)
+
+var (
+ file_cache_data map[string]plan_file
+ file_cache_time string
+
+ file_ch chan int
+)
+
+func init() {
+ file_cache_data = make(map[string]plan_file)
+ file_cache_time = "2023-01-01 00:00:00"
+
+ file_ch = make(chan int, 100)
+
+}
+
+func sync_file_cache() {
+
+ var sqlstr string
+ var rdRow *sql.Rows
+ var err error
+
+ sqlstr = fmt.Sprintf("select [ID],[p_id],[p_name],[plan_name],[process_file],[filing_time],[project_file],[p_filing_time],[op_time] from [plan_file] order by ID asc")
+ fmt.Println(sqlstr)
+
+ rdRow, err = sqlConn.Query(sqlstr)
+ if err != nil {
+ logs.Error(fmt.Sprintf("sync_file_cache Query err:%v", err.Error()))
+ goto exit
+ }
+
+ for rdRow.Next() {
+ var d plan_file
+ var op_t string
+ if err := rdRow.Scan(&d.ID, &d.P_id, &d.P_name, &d.Plan_name, &d.Plan_process_file, &d.Filing_time, &d.Project_file, &d.P_filing_time, &op_t); err == nil {
+ file_cache_data[d.P_id+d.Plan_name] = d
+
+ if op_t > file_cache_time {
+ file_cache_time = op_t
+ }
+ } else {
+ logs.Error("sync_file_cache scan Error", err.Error())
+ }
+ }
+ rdRow.Close()
+
+ for {
+ select {
+ case <-file_ch:
+ sqlstr = fmt.Sprintf("select [ID],[p_id],[p_name],[plan_name],[process_file],[filing_time],[project_file],[p_filing_time],[op_time] from [plan_file] where [op_time]>'%s' order by ID asc", file_cache_time)
+ fmt.Println(sqlstr)
+
+ rdRow, err = sqlConn.Query(sqlstr)
+ if err != nil {
+ logs.Error(fmt.Sprintf("sync_file_cache Query err:%v", err.Error()))
+ } else {
+ for rdRow.Next() {
+ var d plan_file
+ var op_t string
+ if err := rdRow.Scan(&d.ID, &d.P_id, &d.P_name, &d.Plan_name, &d.Plan_process_file, &d.Filing_time, &d.Project_file, &d.P_filing_time, &op_t); err == nil {
+ file_cache_data[d.P_id+d.Plan_name] = d
+
+ if op_t > file_cache_time {
+ file_cache_time = op_t
+ }
+ } else {
+ logs.Error("sync_file_cache scan Error", err.Error())
+ }
+ }
+ rdRow.Close()
+ }
+ default:
+ time.Sleep(time.Second * 5)
+ }
+ }
+
+exit:
+ return
+}
diff --git a/userCache.go b/userCache.go
new file mode 100644
index 0000000..e050967
--- /dev/null
+++ b/userCache.go
@@ -0,0 +1,43 @@
+package main
+
+import (
+ "sync"
+ "time"
+)
+
+type DeesUserStat struct {
+ Uuid string `json:"uuid"`
+ Username string `json:"username"`
+ State int `json:"state"`
+ RefreshTime time.Time `json:"refreshTime"`
+ ExpireTime time.Time `json:"expireTime"`
+ UserRole int `json:"userrole"`
+
+ lck sync.RWMutex
+}
+
+func (d *DeesUserStat) Lock() {
+ d.lck.Lock()
+}
+
+func (d *DeesUserStat) Unlock() {
+ d.lck.Unlock()
+}
+
+func (d *DeesUserStat) RLock() {
+ d.lck.RLock()
+}
+
+func (d *DeesUserStat) RUnlock() {
+ d.lck.RUnlock()
+}
+
+var (
+ deesUserStatMap map[string]*DeesUserStat
+
+ deesUserStatMaplck sync.RWMutex
+)
+
+func init() {
+ deesUserStatMap = make(map[string]*DeesUserStat)
+}