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