package aftersale import ( "time" "zhiyuan/pkg/app" "zhiyuan/pkg/config" "zhiyuan/pkg/db" orderParam "zhiyuan/pkg/param/order" "zhiyuan/pkg/utils" "zhiyuan/services/admin" "zhiyuan/services/aftersale" "zhiyuan/services/aftersale/order" "zhiyuan/services/form" "zhiyuan/services/material/brand" "zhiyuan/services/material/pkg" "zhiyuan/services/user" "github.com/gin-gonic/gin" "github.com/tealeg/xlsx/v3" ) func IssueList(c *gin.Context) { type IssueList struct { ID int `json:"id"` IssueName string `json:"issue_name"` } issueList := make([]*IssueList, 0) aftersale.GetIssueList(nil, nil, app.Page{}, &issueList) app.Success(c, issueList) } func IssueAdd(c *gin.Context) { var form form.ASIssueAdd if app.Bind(c, &form) != nil { return } if id, err := aftersale.AddIssue(form); err != nil { app.Error(c, err.Error()) return } else { app.Success(c, gin.H{"id": id}) } } func IssueEdit(c *gin.Context) { id := utils.StrTo(c.Param("id")).MustInt() if id <= 0 { app.Error(c, "类型id有误") return } var form form.ASIssueAdd if app.Bind(c, &form) != nil { return } if _, err := aftersale.EditIssue(form, id); err != nil { app.ErrorMsg(c, err.Error(), nil) return } app.Success(c, nil) } func IssueExport(c *gin.Context) { where := map[string]string{ "where": "o.deleted_at=0", "_order_by": "id desc", } params := make(map[string]interface{}) // leader leaderID := utils.ToInt(c.Query("leader_id")) if leaderID > 0 { where["where"] += " AND o.leader={{leader_id}}" params["leader_id"] = leaderID } // state state := utils.ToInt(c.Query("state")) if state != 0 { where["where"] += " AND if(o.state=90,90,if(o.is_force=0,o.state,100))={{state}}" params["state"] = state } // is_force isForce := utils.ToInt(c.Query("is_force")) if isForce != 0 { if isForce == 2 { where["where"] += " AND o.is_force!=0" } else { where["where"] += " AND o.is_force={{isForce}}" params["isForce"] = isForce - 1 } } // type typ := utils.ToInt(c.Query("type")) if typ != 0 { where["where"] += " AND o.type={{type}}" params["type"] = typ - 1 } // address address := c.Query("address") if address != "" { where["where"] += " AND o.address LIKE {{address}}" params["address"] = "%" + address + "%" } // inWarranty inWarranty := utils.ToInt(c.Query("in_warranty")) if utils.IsContain([]int{0, 1}, inWarranty) { where["where"] += " AND o.in_warranty={{in_warranty}}" params["in_warranty"] = inWarranty } // user user1 := c.Query("user") if user1 != "" { where["where"] += " AND (o.link_name LIKE {{user}} OR o.link_phone LIKE {{user}})" params["user"] = "%" + user1 + "%" } // state finish_state := utils.ToInt(c.Query("finish_state")) if finish_state != 0 { switch finish_state { case 1: where["where"] += " AND (o.finish_state=1)" break case 2: where["where"] += " AND (o.finish_state=2)" break case 3: where["where"] += " AND (o.finish_state=1 AND UNIX_TIMESTAMP()<=o.end_time)" break case 4: where["where"] += " AND (o.finish_state=1 AND UNIX_TIMESTAMP()>o.end_time)" break case 5: where["_order_by"] = "o.incomplete_count desc" break } } createdDate := c.QueryArray("created_date[]") if createdDate != nil && len(createdDate) == 2 { where["where"] += " AND o.created_at BETWEEN {{created_at_min}} AND {{created_at_max}}" params["created_at_min"] = utils.DateParseUnix(createdDate[0], "Y-m-d") params["created_at_max"] = utils.DateParseUnix(createdDate[1], "Y-m-d") + 86399 } if adminInfo := admin.GetAdminCache(c.GetInt("adminID")); adminInfo.SiteID > 0 { where["where"] += " AND (o.site_id={{site_id}} or o.site_id=0)" params["site_id"] = adminInfo.SiteID } type House struct { ID int `json:"id"` Address string `json:"address"` Designer int `json:"designer"` DesignerName string `json:"designer_name"` District int `json:"district"` DistrictName string `json:"district_name"` Supervisor int `json:"supervisor"` SupervisorName string `json:"supervisor_name"` ProjectManager int `json:"project_manager"` ProjectManagerName string `json:"project_manager_name"` ProjectLeader int `json:"project_leader"` ProjectLeaderName string `json:"project_leader_name"` ProjectStart string `json:"project_start"` ProjectEnd string `json:"project_end"` WarrantyStart string `json:"warranty_start"` PkgID int `json:"pkg_id"` } type Visit struct { OrderID int `json:"order_id"` Content string `json:"content"` FinishedAt string `json:"finished_at"` } type Detail struct { OrderID int `json:"order_id"` Address string `json:"address"` Content string `json:"content"` } type Repair struct { OrderID int `json:"order_id"` WorkerName string `json:"worker_name"` } type Orders struct { ID int `json:"id"` CreatedAt string `json:"created_at"` LinkName string `json:"link_name"` LinkPhone string `json:"link_phone"` UserID int `json:"user_id"` InWarranty int `json:"in_warranty"` Leader int `json:"leader"` LeaderName string `json:"leader_name"` HouseID int `json:"house_id"` House *House `json:"house"` Repair *Repair `json:"repair"` Director int `json:"director"` DirectorName string `json:"director_name"` IssueID int `json:"issue_id"` IssueName string `json:"issue_name"` IssueDesc string `json:"issue_desc"` Brand int `json:"brand"` BrandName string `json:"brand_name"` Detail *Detail `json:"detial"` Visit string `json:"visit"` IsForce int `json:"is_force"` } orderList := make([]*Orders, 0) err := order.GetIssueWidthOrder(where, params, &orderList) houseIds := make([]int, 0) orderIds := make([]int, 0) userIds := make([]int, 0) adminIds := make([]int, 0) brandIds := make([]int, 0) for _, v := range orderList { houseIds = append(houseIds, v.HouseID) orderIds = append(orderIds, v.ID) userIds = append(userIds, v.UserID) adminIds = append(adminIds, v.Leader) if v.Brand > 0 { brandIds = utils.AppendUniqueInt(brandIds, v.Brand) } } houseMap := make(map[int]*House, 0) if len(houseIds) > 0 { houseList := make([]*House, 0) user.GetHouseList(map[string]interface{}{"id in": houseIds}, nil, app.Page{}, &houseList) for _, v := range houseList { adminIds = append(adminIds, v.Designer, v.Supervisor, v.ProjectManager, v.ProjectLeader) houseMap[v.ID] = v } } userMap := make(map[int]string, 0) userSiteMap := make(map[int]int, 0) if len(userIds) > 0 { userList, _ := user.GetList(map[string]interface{}{"id in": userIds}, nil, app.Page{}, nil) for _, v := range userList { userMap[v.ID] = v.Name userSiteMap[v.ID] = v.SiteID } } type AdminInfo struct { Username string `json:"username"` State int `json:"state"` } adminMap := make(map[int]AdminInfo, 0) if len(adminIds) > 0 { adminList, _ := admin.GetAdmins(map[string]interface{}{"id in": adminIds}, nil, app.Page{}, nil) for _, v := range adminList { adminMap[v.ID] = AdminInfo{Username: v.Username, State: v.State} } } for k, v := range houseMap { if v.Designer > 0 { v.DesignerName = adminMap[v.Designer].Username } if v.Supervisor > 0 { v.SupervisorName = adminMap[v.Supervisor].Username } if v.ProjectLeader > 0 { v.ProjectLeaderName = adminMap[v.ProjectLeader].Username } if v.ProjectManager > 0 { v.ProjectManagerName = adminMap[v.ProjectManager].Username } if v.Supervisor > 0 { if adminMap[v.Supervisor].State == -1 { v.SupervisorName = "离职项目经理" } else { v.SupervisorName = adminMap[v.Supervisor].Username } } houseMap[k] = v } brandMap := make(map[int]string) if len(brandIds) > 0 { if brandList, err := brand.GetList(map[string]interface{}{"id in": brandIds}, nil, app.Page{}, nil); err == nil { for _, v := range brandList { brandMap[v.ID] = v.BrandName } } } issueDirectorMap := orderParam.GetIssueDirectorMap() issueMap := aftersale.GetIssueMapByCache() for _, v := range orderList { if v.Leader > 0 { v.LeaderName = adminMap[v.Leader].Username } if v.Director > 0 { v.DirectorName = issueDirectorMap[v.Director] } if v.IssueID > 0 { v.IssueName = issueMap[v.IssueID] } if v.Brand > 0 { v.BrandName = brandMap[v.Brand] } v.House = houseMap[v.HouseID] } wb := xlsx.NewFile() filename := "售后问题汇总表-" + db.ToString(time.Now().Unix()) + ".xlsx" fullPath := config.Cfg.App.ExportPath + filename styleBold := utils.GetCommonStyle(utils.StyleCfg{IsBold: true, FontSize: 10}) styleCommon := utils.GetCommonStyle(utils.StyleCfg{FontSize: 9}) sh, err := wb.AddSheet("Sheet1") if err != nil { app.Error(c, err.Error()) return } var row *xlsx.Row height := float64(30) row = utils.AddRow(sh, utils.Row{Height: height}) utils.AddCell(row, utils.Cell{Value: "售后问题汇总表", HMerge: 22, Style: styleBold}) sh = utils.SetColWidth(sh, []float64{5, 5, 10, 15, 15, 15, 15, 20, 10, 15, 10, 10, 10, 10, 10, 10, 10, 10, 15, 15, 15, 15}) row = utils.AddRow(sh, utils.Row{Height: height}) utils.AddCell(row, utils.Cell{Value: "序号", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "级别", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "工地性质", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "开工日期", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "竣工", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "保修卡时间", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "报修时间", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "工地名称", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "业主姓名", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "联系电话", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "设计师", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "工程主管", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "队长", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "项目经理", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "渠道", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "报修人", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "年份", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "是否过保修", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "责任人", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "问题原因", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "详细原因", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "主材", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "套餐", Style: styleBold}) utils.AddCell(row, utils.Cell{Value: "强制完结", Style: styleBold}) type PkgList struct { ID int `json:"id"` PkgName string `json:"pkg_name"` } pkgList := make([]*PkgList, 0) pkg.GetPkgs(nil, nil, app.Page{}, &pkgList) pkgMap := make(map[int]string) for _, v := range pkgList { pkgMap[v.ID] = v.PkgName } for k, v := range orderList { v.CreatedAt = utils.DateS(v.CreatedAt, "YYYY/MM/DD") year := "" if v.House.ProjectStart == "0" { v.House.ProjectStart = "" } else { v.House.ProjectStart = utils.DateS(v.House.ProjectStart, "YYYY/MM/DD") } if v.House.ProjectEnd == "0" { v.House.ProjectEnd = "" } else { //year = utils.DateS(v.House.ProjectEnd, "YYYY") v.House.ProjectEnd = utils.DateS(v.House.ProjectEnd, "YYYY/MM/DD") } if v.House.WarrantyStart == "0" { v.House.WarrantyStart = "" } else { year = utils.DateS(v.House.WarrantyStart, "YYYY") v.House.WarrantyStart = utils.DateS(v.House.WarrantyStart, "YYYY/MM/DD") } row = utils.AddRow(sh, utils.Row{Height: height}) utils.AddCell(row, utils.Cell{Value: utils.ToStr(k + 1), Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: "一级", Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: "全包", Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.ProjectStart, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.ProjectEnd, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.WarrantyStart, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.CreatedAt, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.Address, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.LinkName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.LinkPhone, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.DesignerName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.ProjectManagerName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.ProjectLeaderName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.House.SupervisorName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: "售后", Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: "客户", Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: year, Style: styleCommon}) inWarranty := "是" if v.InWarranty > 0 { inWarranty = "否" } utils.AddCell(row, utils.Cell{Value: inWarranty, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.DirectorName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.IssueName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.IssueDesc, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: v.BrandName, Style: styleCommon}) utils.AddCell(row, utils.Cell{Value: pkgMap[houseMap[v.HouseID].PkgID], Style: styleCommon}) forceTypes := []string{"正常", "强制完结", "业主不交尾款", "业主不点击确认", "业主自行问题", "报修后联系不上业主", "维修完后联系不上业主"} isForce := forceTypes[v.IsForce] utils.AddCell(row, utils.Cell{Value: isForce, Style: styleCommon}) } if err := wb.Save(fullPath); err != nil { app.Error(c, err.Error()) return } app.Success(c, gin.H{"path": "export/" + filename, "filename": filename}) }