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) +}