package order import ( "crypto/sha256" "errors" "fmt" "github.com/fonchain_enterprise/fonchain-main/api/account" "github.com/fonchain_enterprise/fonchain-main/api/order" "github.com/fonchain_enterprise/fonchain-main/pkg/e" "github.com/fonchain_enterprise/fonchain-main/pkg/model/login" "github.com/fonchain_enterprise/fonchain-main/pkg/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/shopspring/decimal" "github.com/tealeg/xlsx" "io/ioutil" "net/url" "os" "strconv" "strings" "time" ) func GetWeeklyStaffList(c *gin.Context) { req := &order.StaffWeeklyListRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } weeklyReq := &order.StaffWeeklyListRequest{ StartDate: req.StartDate, EndDate: req.EndDate, Status: 1, //UserIds: userIds.UserIds, UserName: req.UserName, SiteName: req.SiteName, JobNumber: req.JobNumber, Page: req.Page, PageSize: req.PageSize, } res, err := service.OrderProvider.StaffWeeklyList(c, weeklyReq) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } func GetWeeklyStaffExcel(c *gin.Context) { req := &order.StaffWeeklyListRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } weeklyReq := &order.StaffWeeklyListRequest{ StartDate: req.StartDate, EndDate: req.EndDate, Status: 1, UserName: req.UserName, SiteName: req.SiteName, JobNumber: req.JobNumber, } res, err := service.OrderProvider.StaffWeeklyList(c, weeklyReq) if err != nil { service.Error(c, e.InvalidParams, err) return } // 创建临时文件 tmpfile, err := ioutil.TempFile("", "StaffWeeklyReport_*.xlsx") if err != nil { service.Error(c, e.Error, err) return } // 将数据写入 Excel err = CreateWeeklyStaffExcel(res, tmpfile) if err != nil { service.Error(c, e.Error, err) return } defer os.Remove(tmpfile.Name()) // 删除临时文件 // 返回文件流 fileName := "员工汇报.xlsx" escapedFileName := url.QueryEscape(fileName) c.Header("Content-Disposition", "attachment; filename*=UTF-8''"+escapedFileName) c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") c.File(tmpfile.Name()) } func GetWeeklyBossList(c *gin.Context) { req := &order.WeeklyListRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } if len(req.Status) != 0 { for _, i := range req.Status { if i == 1 { req.Status = append(req.Status, 2) } } } else { req.Status = append(req.Status, 1, 2, 3) } res, err := service.OrderProvider.WeeklyList(c, req) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } func GetWeeklyBossInfo(c *gin.Context) { type WeeklyInfoRequest struct { Id uint64 `json:"id"` } req := &WeeklyInfoRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } infoReq := &order.WeeklyInfoRequest{ Id: strconv.FormatUint(req.Id, 10), } res, err := service.OrderProvider.WeeklyInfo(c, infoReq) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } func GetWeeklyComment(c *gin.Context) { req := &order.GetWeeklyCommentRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } if req.WeeklyId == 0 { service.Error(c, e.InvalidParams, errors.New("id不能为空")) return } res, err := service.OrderProvider.GetWeeklyComment(c, req) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } func CreateWeeklyComment(c *gin.Context) { req := &order.WeeklyCommentRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } userInfo := login.GetUserInfoFromC(c) req.UserId = userInfo.ID req.UserName = userInfo.NickName req.ReportTime = time.Now().Format("2006-01-02 15:04:05") if req.WeeklyId == 0 { service.Error(c, e.InvalidParams, errors.New("id不能为空")) return } res, err := service.OrderProvider.CreateWeeklyComment(c, req) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } // 将数据写入 Excel 文件 func CreateWeeklyStaffExcel(data *order.StaffWeeklyResponseList, file *os.File) error { // 创建 Excel 文件 xlsFile := xlsx.NewFile() sheet, err := xlsFile.AddSheet("员工汇报列表") if err != nil { return err } // 添加表头 row := sheet.AddRow() row.AddCell().SetValue("姓名") row.AddCell().SetValue("工号") row.AddCell().SetValue("站点") row.AddCell().SetValue("提交日期") row.AddCell().SetValue("当前业务金额") // 将数据写入 Excel for _, req := range data.WeeklyList { row := sheet.AddRow() row.AddCell().SetValue(req.StaffName) row.AddCell().SetValue(req.JobNumber) row.AddCell().SetValue(req.SiteName) row.AddCell().SetValue(req.FillingDate) row.AddCell().SetValue(req.BusinessAmount) } // 保存 Excel 文件 err = xlsFile.Write(file) if err != nil { return err } return nil } func GetWeeklyStaffInfo(c *gin.Context) { req := &order.ReportUserDetail{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } infoReq := &order.ReportUserDetail{ ID: req.ID, } res, err := service.OrderProvider.StaffWeeklyInfo(c, infoReq) if err != nil { service.Error(c, e.InvalidParams, err) return } service.Success(c, res) return } // GetEntrust 提交的报表列表 func GetEntrust(c *gin.Context) { req := &order.CommonRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := service.OrderProvider.GetEntrust(c, req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } func EntrustDelete(c *gin.Context) { req := &order.CommonRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := service.OrderProvider.EntrustDelete(c, req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } func EntrustBatchDelete(c *gin.Context) { req := &order.UpDateOrderEntrustsRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := service.OrderProvider.EntrustBatchDelete(c, req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } func EntrustCreate(c *gin.Context) { req := &order.EntrustRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := service.OrderProvider.EntrustCreate(c, req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } // GetEntrusts 列表 func GetEntrusts(c *gin.Context) { req := &order.EntrustList{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := service.OrderProvider.GetEntrusts(c, req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } // ImportEntrusts 导入 func ImportEntrusts(c *gin.Context) { file, err := c.FormFile("file") if err != nil { service.Error(c, e.Error, err) } c.SaveUploadedFile(file, file.Filename) err = importReal(c, file.Filename) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, nil) return } func isNum(s string) bool { _, err := strconv.ParseFloat(s, 64) return err == nil } func importReal(c *gin.Context, filename string) error { err := ExcelParse(c, filename) if err != nil { return err } /* if len(list) >= 2 { entrusts := getListFromRaw(list) if len(entrusts) > 0 { req := &order.EntrustListResponse{ Data: entrusts, } fmt.Println("1--------", req) _, err := service.OrderProvider.EntrustCreates(c, req) if err != nil { return err } } } */ return nil } func getListFromRaw(list []map[int]string) ([]*order.EntrustRequest, error) { var entrusts []*order.EntrustRequest kkMap := map[string]string{ "序号": "index", "委托人": "clientName", "客户服务编码": "serviceCode", "是否关联员工": "associatedEmployee", "身份证后8位": "clientId", "联系电话": "clientTel", "开户行": "bank", "银行账号": "bankNo", "委托申请单号": "entrustNo", "画家": "artistName", "画作编号": "artworkNum", "版权编号": "artworkNum", "画作名称": "artworkName", "画作尺寸(平尺)": "artworkSize", "成交价格": "price", "委托价格最低": "entrustPriceLow", "委托价格(最低价)": "entrustPriceLow", "委托价格(最低价)": "entrustPriceLow", "委托价格(最高价)": "entrustPrice", "委托价格(最高价)": "entrustPrice", "服务费最低": "serviceChargeLow", "服务费最低金额": "serviceChargeLow", "服务费(最低金额)": "serviceChargeLow", "服务费最高": "serviceCharge", "服务费最高金额": "serviceCharge", "服务费(最高金额)": "serviceCharge", "个税最低": "personTaxLow", "代扣个税最低金额": "personTaxLow", "代扣个税(最低金额)": "personTaxLow", "代扣个税最低": "personTaxLow", "代扣个税最高": "personTax", "个税最高": "personTax", "代扣个税最高金额": "personTax", "代扣个税(最高金额)": "personTax", "实际支付最低": "realPayLow", "实际支付(最低金额)": "realPayLow", "实际支付最低金额": "realPayLow", "实际支付金额最高": "realPay", "实际支付最高": "realPay", "实际支付(最高金额)": "realPay", "保真证明": "realProve", "销售公司": "saleSite", "委托人所属销售公司": "saleSite", "业务员": "sellerName", "日期": "optionDate", "受委托期限开始日期": "optionStartDate", "受委托期限结束日期": "optionEndDate", "委托押金款付款日期": "entrustDate", "是否有居间服务协议": "brokerage", "备注": "remark", "是否长期": "isLong", "数据是否有误": "mistake", } keyMap := list[0] fmt.Println("第一行头部", keyMap) for index, tt := range list { if index == 0 { continue } temp := &order.EntrustRequest{} fmt.Println("当前是行:", index) fmt.Println(tt) for i, r := range tt { var err error t := strings.TrimSpace(r) if _, ok := keyMap[i]; !ok { //fmt.Println("跳出", i) continue } keyString := strings.TrimSpace(keyMap[i]) //fmt.Println("字段i:", i) //fmt.Println("字段keystring", keyString) //fmt.Println("字段内容", t) if _, ok := kkMap[keyString]; !ok { //return entrusts, errors.New(fmt.Sprintf("行数:%d字段信息(%s)没有匹配,请以模版为准", i, keyString)) fmt.Println(fmt.Sprintf("行数:%d字段信息(%s)没有匹配,请以模版为准", i, keyString)) continue } switch kkMap[keyString] { case "index": temp.Index = t case "serviceCode": temp.ServiceCode = t case "clientName": temp.ClientName = t case "associatedEmployee": temp.AssociatedEmployee = t case "clientId": temp.ClientId = t case "clientTel": temp.ClientTel = t case "bank": temp.Bank = t case "bankNo": temp.BankNo = t case "entrustNo": temp.EntrustNo = t case "artistName": temp.ArtistName = t case "artworkNum": temp.ArtworkNum = t case "artworkName": temp.ArtworkName = t //case "artworkSize": // temp.ArtworkSize, err = stringToNumString(t) case "price": temp.Price, err = stringToNumString(t) case "entrustPriceLow": temp.EntrustPriceLow, err = stringToNumString(t) case "entrustPrice": temp.EntrustPrice, err = stringToNumString(t) case "serviceChargeLow": temp.ServiceChargeLow, err = stringToNumString(t) case "serviceCharge": temp.ServiceCharge, err = stringToNumString(t) case "personTaxLow": temp.PersonTaxLow, err = stringToNumString(t) case "personTax": temp.PersonTax, err = stringToNumString(t) case "realPayLow": temp.RealPayLow, err = stringToNumString(t) case "realPay": temp.RealPay, err = stringToNumString(t) case "realProve": temp.RealProve = t case "saleSite": temp.SaleSite = t case "sellerName": temp.SellerName = t case "optionDate": temp.OptionDate = t case "optionStartDate": temp.OptionStartDate = TimeProcessing(t) case "optionEndDate": temp.OptionEndDate = TimeProcessing(t) case "entrustDate": //时间格式做处理 temp.EntrustDate = TimeProcessing(t) case "brokerage": temp.Brokerage = t case "remark": temp.Remark = t case "isLong": temp.IsLong = t } if err != nil { return entrusts, errors.New(fmt.Sprintf("字段:%s提示错误:%s", keyString, err.Error())) } } if temp.ClientName == "" { //if !isNum(temp.Index) || temp.ClientName == "" { continue } EntrustPriceNum, err1 := strconv.ParseFloat(temp.EntrustPrice, 64) ServiceChargeNum, err2 := strconv.ParseFloat(temp.ServiceCharge, 64) PriceNum, err3 := strconv.ParseFloat(temp.Price, 64) PersonTaxNum, err4 := strconv.ParseFloat(temp.PersonTax, 64) RealPayNum, err5 := strconv.ParseFloat(temp.RealPay, 64) if err1 != nil || err2 != nil || err3 != nil || err4 != nil || err5 != nil { temp.Mistake = "1" fmt.Println("转换失败:", err1, err2, err3, err4, err5) } // 计算最高金额 var maxPersonTax int64 maxServiceCharge := int64(EntrustPriceNum) * 6 / 100 if temp.IsLong == "是" { maxPersonTax = (int64(EntrustPriceNum) - int64(PriceNum) - maxServiceCharge) * 3 / 100 } else { maxPersonTax = (int64(EntrustPriceNum) - int64(PriceNum) - maxServiceCharge) / 5 } maxRealPay := int64(EntrustPriceNum) - maxServiceCharge - maxPersonTax // 核对测算逻辑 if int64(EntrustPriceNum) != maxServiceCharge+maxPersonTax+maxRealPay || int64(ServiceChargeNum) != maxServiceCharge || int64(PersonTaxNum) != maxPersonTax || int64(RealPayNum) != maxRealPay { temp.Mistake = "1" } else { temp.Mistake = "0" } temp.IsCopyright = 2 if find := strings.Contains(temp.ArtworkNum, "IP"); find { temp.IsCopyright = 1 } entrusts = append(entrusts, temp) } sha256.New() fmt.Println("等待插入数据", entrusts) return entrusts, nil } func TimeProcessing(t string) (res string) { dayNum, err := strconv.Atoi(t) if err == nil { currentTime, _ := time.Parse("2006-01-02", "1899-12-31") oldTime := currentTime.AddDate(0, 0, dayNum-1) //若要获取3天前的时间,则应将-2改为-3 res = oldTime.Format("2006-01-02") } else { times, err := time.Parse("01-02-06", t) if err == nil { res = times.Format("2006-01-02") } else { times, err := time.Parse("2006.1.2", t) if err == nil { res = times.Format("2006-01-02") } } } return res } // UpdateEntrustKeys 批量更新 func UpdateEntrustKeys(c *gin.Context) { req := &order.EntrustListResponse{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { service.Error(c, e.InvalidParams, err) return } res, err := service.OrderProvider.UpdateEntrustKeys(c, req) if err != nil { service.Error(c, e.Error, err) return } service.Success(c, res) return } // ExcelParseToList xlsx文件解析 func ExcelParseToList(filePath string) ([]map[int]string, error) { //func ExcelParse(filePath string) ([][]string, error) { //filePath := "upload/" + fileName xlFile, err := xlsx.OpenFile(filePath) if err != nil { return []map[int]string{}, err } //开辟除表头外的行数的数组内存 //遍历sheet var resourceArr []map[int]string for _, sheet := range xlFile.Sheets { //遍历每一行 //for rowIndex, row := range sheet.Rows { for _, row := range sheet.Rows { //跳过第一行表头信息 /* if rowIndex == 0 { continue } */ //遍历每一个单元 //开辟除表头外的行数的数组内存 objMap := make(map[int]string) if len(row.Cells) <= 0 || row.Cells[0].String() == "" { continue } for cellIndex, cell := range row.Cells { text := cell.String() //如果是每一行的第一个单元格 objMap[cellIndex] = text /* if cellIndex == 0 { resourceArr[rowIndex-1][cellIndex] = text } */ } resourceArr = append(resourceArr, objMap) } } return resourceArr, nil } // ExcelParse xlsx文件解析 // func ExcelParse(filePath string) ([]map[int]string, error) { func ExcelParse(c *gin.Context, filePath string) error { //func ExcelParse(filePath string) ([][]string, error) { //filePath := "upload/" + fileName xlFile, err := xlsx.OpenFile(filePath) if err != nil { return err } //开辟除表头外的行数的数组内存 //遍历sheet for sheetIndex, sheet := range xlFile.Sheets { var resourceArr []map[int]string //遍历每一行 //for rowIndex, row := range sheet.Rows { for _, row := range sheet.Rows { //跳过第一行表头信息 /* if rowIndex == 0 { continue } */ //遍历每一个单元 //开辟除表头外的行数的数组内存 objMap := make(map[int]string) if len(row.Cells) <= 0 || row.Cells[0].String() == "" { continue } for cellIndex, cell := range row.Cells { text := cell.String() //如果是每一行的第一个单元格 objMap[cellIndex] = text /* if cellIndex == 0 { resourceArr[rowIndex-1][cellIndex] = text } */ } resourceArr = append(resourceArr, objMap) } if len(resourceArr) >= 2 { entrusts, err := getListFromRaw(resourceArr) if err != nil { return errors.New(fmt.Sprintf("页码:%d,文件读取错误信息%s", sheetIndex+1, err.Error())) } var sellerNames []string if len(entrusts) > 0 { for _, entrust := range entrusts { sellerNames = append(sellerNames, entrust.SellerName) } sellerNameList, _ := service.AccountProvider.QueryPersonnelWithTheSameName(c, &account.QueryPersonnelWithTheSameNameRequest{ Names: sellerNames, Domain: "fontree", //Status: "notactive", }) duplicateNameSet := make(map[string]struct{}) for _, name := range sellerNameList.Names { duplicateNameSet[name] = struct{}{} } for i := range entrusts { if _, exists := duplicateNameSet[entrusts[i].SellerName]; exists { entrusts[i].DuplicateName = true } else { entrusts[i].DuplicateName = false } } req := &order.EntrustListResponse{ Data: entrusts, } _, err = service.OrderProvider.EntrustCreates(c, req) if err != nil { return errors.New(fmt.Sprintf("页码:%d,数据生成错误信息%s", sheetIndex+1, err.Error())) } } } break } return nil } func stringToNumString(str string) (string, error) { if str == "" { return "0", nil } if str == "-" { return "0", nil } num, err := decimal.NewFromString(str) if err != nil { return "0", err } roundedNum := num.Floor() return roundedNum.String(), nil } func stringTofloat64(str string) (float64, error) { if str == "" { return 0, nil } vv, err := strconv.ParseFloat(str, 64) if err != nil { return 0, err } res, err := strconv.ParseFloat(fmt.Sprintf("%.2f", vv), 64) if err != nil { return 0, err } return res, nil }