company.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. package statistic_report
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/paging"
  6. "github.com/shopspring/decimal"
  7. "hongze/hz_crm_api/models/company"
  8. statisticModels "hongze/hz_crm_api/models/statistic_report"
  9. "hongze/hz_crm_api/models/system"
  10. "hongze/hz_crm_api/services"
  11. "hongze/hz_crm_api/utils"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. func CompanyList(sysUser *system.Admin, req statisticModels.IncrementalCompanyListReq) (resp CompanyListResp, err error, errMsg string) {
  17. pageSize := req.PageSize
  18. currentIndex := req.CurrentIndex
  19. CompanyIds := req.CompanyIds
  20. //排序参数
  21. sortParam := req.SortParam
  22. sortType := req.SortType
  23. roleTypeCode := sysUser.RoleTypeCode
  24. var total int
  25. page := paging.GetPaging(currentIndex, pageSize, total)
  26. //resp := new(CompanyListResp)
  27. var startSize int
  28. if pageSize <= 0 {
  29. pageSize = utils.PageSize20
  30. }
  31. if currentIndex <= 0 {
  32. currentIndex = 1
  33. }
  34. startSize = paging.StartIndex(currentIndex, pageSize)
  35. var condition string
  36. var pars []interface{}
  37. if CompanyIds != "" {
  38. fmt.Println("CompanyIds:", CompanyIds)
  39. condition += ` AND b.company_id IN (` + strings.Replace(CompanyIds, "\"", "", -1) + `) `
  40. }
  41. productId := services.GetProductId(roleTypeCode)
  42. {
  43. //权限控制
  44. //如果不是超级管理员或者财务
  45. if roleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && roleTypeCode != utils.ROLE_TYPE_CODE_FINANCE {
  46. //如果是部门管理员
  47. condition += ` AND b.product_id=? `
  48. pars = append(pars, productId)
  49. }
  50. }
  51. total, err = company.GetCompanyListCount(condition, pars)
  52. if err != nil {
  53. errMsg = "获取数据总数失败,Err:" + err.Error()
  54. err = errors.New("获取失败")
  55. return
  56. }
  57. status := `全部`
  58. sortStr := ``
  59. if sortParam != "" && sortType != "" {
  60. if sortParam == "expireDay" {
  61. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  62. if sortType == "asc" {
  63. sortStr = " ORDER BY min_end_date"
  64. } else {
  65. sortStr = " ORDER BY max_end_date"
  66. }
  67. } else {
  68. sortStr = " ORDER BY b.end_date "
  69. }
  70. } else if sortParam == "createTime" {
  71. sortStr = " ORDER BY a.created_time "
  72. } else if sortParam == "viewTotal" {
  73. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  74. sortStr = " ORDER BY all_view_total"
  75. } else {
  76. sortStr = " ORDER BY b.view_total"
  77. }
  78. } else if sortParam == "viewTime" {
  79. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  80. if sortType == "asc" {
  81. sortStr = " ORDER BY min_last_view_time"
  82. } else {
  83. sortStr = " ORDER BY max_last_view_time"
  84. }
  85. } else {
  86. sortStr = " ORDER BY b.last_view_time "
  87. }
  88. } else if sortParam == "roadShowTotal" {
  89. sortStr = " ORDER BY b.road_show_total "
  90. } else if sortParam == "formalTime" {
  91. sortStr = " ORDER BY b.formal_time "
  92. } else if sortParam == "freezeTime" {
  93. sortStr = " ORDER BY b.freeze_time "
  94. } else if sortParam == "lossTime" {
  95. sortStr = " ORDER BY b.loss_time "
  96. } else if sortParam == "deadline" {
  97. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  98. sortStr = " ORDER BY sort_todo_end_time asc, all_view_total desc, a.created_time desc"
  99. } else {
  100. sortStr = " ORDER BY sort_todo_end_time asc, b.view_total desc, a.created_time desc"
  101. }
  102. } else if sortParam == "sellerName" {
  103. sortStr = " ORDER BY b.seller_name "
  104. } else if sortParam == "shareSellerName" {
  105. sortStr = " ORDER BY b.share_seller "
  106. } else if sortParam == "status" {
  107. sortStr = " ORDER BY b.status "
  108. } else if sortParam == "serviceYears" {
  109. sortStr = " ORDER BY d.first_date"
  110. } else if sortParam == "LatestServiceRecord" {
  111. sortStr = " ORDER BY c.latest_service_record "
  112. }else {
  113. errMsg = "排序字段传入数据异常:" + sortParam
  114. err = errors.New("获取失败")
  115. return
  116. }
  117. if sortParam != "deadline" {
  118. if sortType == "asc" {
  119. sortStr += " ASC "
  120. } else if sortType == "desc" {
  121. sortStr += " DESC "
  122. } else {
  123. errMsg = "排序类型传入数据异常:" + sortType
  124. err = errors.New("获取失败")
  125. return
  126. }
  127. }
  128. } else {
  129. //2、客户列表选择“全部”时,支持按照“创建时间”对“全部”分类下所有客户列表进行升降序排列;选择“正式”时按照“转正时间”、选择“冻结”时按照“冻结时间”、选择“流失”时按照“流失时间”、选择“永续”时按照“创建时间”;
  130. if status == "全部" || status == "永续" {
  131. sortStr = " ORDER BY a.created_time "
  132. } else if status == "正式" {
  133. sortStr = " ORDER BY b.formal_time "
  134. } else if status == "冻结" {
  135. sortStr = " ORDER BY b.freeze_time "
  136. } else if status == "流失" {
  137. sortStr = " ORDER BY b.loss_time "
  138. } else if status == "试用" {
  139. if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  140. sortStr = " ORDER BY all_view_total "
  141. } else {
  142. sortStr = " ORDER BY b.view_total "
  143. }
  144. }
  145. sortStr += " DESC "
  146. }
  147. list, err := company.GetCompanyList(condition, status, sortStr, pars, startSize, pageSize)
  148. if err != nil {
  149. errMsg = "获取数据失败,Err:" + err.Error()
  150. err = errors.New("获取失败")
  151. return
  152. }
  153. //企业用户数组切片
  154. companyIdSlice := make([]string, 0)
  155. for _, v := range list {
  156. companyIdSlice = append(companyIdSlice, strconv.Itoa(v.CompanyId))
  157. }
  158. //企业用户产品开通数
  159. companyIdStr := strings.Join(companyIdSlice, ",")
  160. companyProductTotalList, _ := company.GetCountProductByCompanyIds(companyIdStr)
  161. companyProductTotalMap := make(map[int]*company.CompanyProductTotalSlice)
  162. for _, companyProductTotal := range companyProductTotalList {
  163. companyProductTotalMap[companyProductTotal.CompanyId] = companyProductTotal
  164. }
  165. lenList := len(list)
  166. // 客户产品详细信息
  167. companyProductMap := make(map[string]*company.CompanyProduct)
  168. var companyProductCondition string
  169. var companyProductPars []interface{}
  170. if productId != 0 {
  171. companyProductCondition += ` AND product_id=? `
  172. companyProductPars = append(companyProductPars, productId)
  173. }
  174. companyProductList, err := company.GetCompanyProductsByCompanyIds(companyIdStr, companyProductCondition, companyProductPars)
  175. if err != nil {
  176. errMsg = "获取客户产品数据失败,Err:" + err.Error()
  177. err = errors.New("获取失败")
  178. return
  179. }
  180. for _, companyProduct := range companyProductList {
  181. key := fmt.Sprint(companyProduct.CompanyId, "_", companyProduct.ProductId)
  182. companyProductMap[key] = companyProduct
  183. }
  184. sysUserProductId := 0
  185. //获取名下所有的分组
  186. myChildSysGroupMap := make(map[int]*system.SysGroup)
  187. switch sysUser.RoleTypeCode {
  188. case utils.ROLE_TYPE_CODE_FICC_GROUP: //ficc主管
  189. myChildSysGroupMap, err = services.GetBigGroupByFiccGroupId(sysUser.GroupId)
  190. sysUserProductId = 1
  191. case utils.ROLE_TYPE_CODE_FICC_TEAM: //ficc组长
  192. myChildSysGroupMap, err = services.GetBigGroupAllGroupInfo(sysUser.GroupId)
  193. sysUserProductId = 1
  194. case utils.ROLE_TYPE_CODE_RAI_GROUP: //权益组长
  195. myChildSysGroupMap, err = services.GetBigGroupAllGroupInfo(sysUser.GroupId)
  196. sysUserProductId = 2
  197. case utils.ROLE_TYPE_CODE_RAI_SELLER: //权益销售
  198. myChildSysGroupMap, err = services.GetBigGroupAllGroupInfo(sysUser.GroupId)
  199. sysUserProductId = 2
  200. case utils.ROLE_TYPE_CODE_FICC_SELLER: //ficc销售
  201. myChildSysGroupMap, err = services.GetBigGroupAllGroupInfo(sysUser.GroupId)
  202. sysUserProductId = 1
  203. }
  204. for i := 0; i < lenList; i++ {
  205. item := list[i]
  206. //校验该客户是否存在多个产品,如果是,那么代表是共享客户
  207. if companyProductTotal, ok := companyProductTotalMap[int(item.CompanyId)]; ok {
  208. if companyProductTotal.Total > 1 {
  209. list[i].IsShared = true
  210. }
  211. }
  212. var expireDay string
  213. itemStatus := item.Status
  214. if itemStatus != "" {
  215. if !strings.Contains(item.Status, "/") {
  216. if itemStatus == utils.COMPANY_STATUS_FOREVER { //永续
  217. expireDay = "-"
  218. } else if itemStatus == utils.COMPANY_STATUS_TRY_OUT || itemStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
  219. if item.StartDate != "" && item.EndDate != "" {
  220. endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
  221. endDateTime = endDateTime.AddDate(0, 0, 1)
  222. sub := endDateTime.Sub(time.Now())
  223. if sub < 0 {
  224. sub = 0
  225. }
  226. expireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  227. } else {
  228. expireDay = "-"
  229. }
  230. } else if itemStatus == utils.COMPANY_STATUS_LOSE {
  231. expireDay = "-"
  232. } else if itemStatus == utils.COMPANY_STATUS_FREEZE {
  233. if item.StartDate != "" && item.EndDate != "" {
  234. endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
  235. endDateTime = endDateTime.AddDate(0, 0, 0)
  236. sub := endDateTime.Sub(time.Now())
  237. if sub < 0 {
  238. sub = 0
  239. }
  240. expireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  241. } else {
  242. expireDay = "-"
  243. }
  244. } else {
  245. expireDay = "-"
  246. }
  247. } else {
  248. statusArr := strings.Split(item.Status, "/")
  249. ficcStatus := statusArr[0]
  250. raiStatus := statusArr[1]
  251. var ficcEndDate, tryEndDate string
  252. var ficcExpireDay, tryExpireDay string
  253. if item.EndDate != "" {
  254. endDateArr := strings.Split(item.EndDate, "/")
  255. if len(endDateArr) == 1 {
  256. ficcEndDate = endDateArr[0]
  257. } else if len(endDateArr) > 1 {
  258. ficcEndDate = endDateArr[0]
  259. tryEndDate = endDateArr[1]
  260. }
  261. if ficcStatus == utils.COMPANY_STATUS_FOREVER { //永续
  262. ficcExpireDay = "-"
  263. } else if ficcStatus == utils.COMPANY_STATUS_TRY_OUT || ficcStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
  264. if ficcEndDate != "" {
  265. endDateTime, _ := time.Parse(utils.FormatDate, ficcEndDate)
  266. endDateTime = endDateTime.AddDate(0, 0, 1)
  267. sub := endDateTime.Sub(time.Now())
  268. if sub < 0 {
  269. sub = 0
  270. }
  271. ficcExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  272. } else {
  273. ficcExpireDay = "-"
  274. }
  275. } else if ficcStatus == utils.COMPANY_STATUS_LOSE { //流失
  276. ficcExpireDay = "-"
  277. } else if ficcStatus == utils.COMPANY_STATUS_FREEZE { //冻结
  278. if item.StartDate != "" && item.EndDate != "" {
  279. endDateTime, _ := time.Parse(utils.FormatDate, ficcEndDate)
  280. endDateTime = endDateTime.AddDate(0, 0, 0)
  281. sub := endDateTime.Sub(time.Now())
  282. if sub < 0 {
  283. sub = 0
  284. }
  285. ficcExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  286. } else {
  287. ficcExpireDay = "-"
  288. }
  289. } else {
  290. ficcExpireDay = "-"
  291. }
  292. if raiStatus == utils.COMPANY_STATUS_FOREVER { //永续
  293. tryExpireDay = "-"
  294. } else if raiStatus == utils.COMPANY_STATUS_TRY_OUT || raiStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
  295. if tryEndDate != "" {
  296. endDateTime, _ := time.Parse(utils.FormatDate, tryEndDate)
  297. endDateTime = endDateTime.AddDate(0, 0, 1)
  298. sub := endDateTime.Sub(time.Now())
  299. if sub < 0 {
  300. sub = 0
  301. }
  302. tryExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  303. } else {
  304. tryExpireDay = "-"
  305. }
  306. } else if raiStatus == utils.COMPANY_STATUS_LOSE { //流失
  307. tryExpireDay = "-"
  308. } else if raiStatus == utils.COMPANY_STATUS_FREEZE { //冻结
  309. if item.StartDate != "" && item.EndDate != "" {
  310. endDateTime, _ := time.Parse(utils.FormatDate, tryEndDate)
  311. endDateTime = endDateTime.AddDate(0, 0, 0)
  312. sub := endDateTime.Sub(time.Now())
  313. if sub < 0 {
  314. sub = 0
  315. }
  316. tryExpireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
  317. } else {
  318. tryExpireDay = "-"
  319. }
  320. } else {
  321. tryExpireDay = "-"
  322. }
  323. }
  324. expireDay = ficcExpireDay + "/" + tryExpireDay
  325. }
  326. }
  327. list[i].ExpireDay = expireDay
  328. ficcKey := fmt.Sprint(item.CompanyId, "_", 1)
  329. //ficc
  330. if tmpCompanyProduct, ok := companyProductMap[ficcKey]; ok && (productId == 0 || productId == 1) {
  331. //套餐类型
  332. item.FiccPackageType = tmpCompanyProduct.PackageType
  333. //总阅读次数
  334. item.FiccView = tmpCompanyProduct.ViewTotal
  335. if !tmpCompanyProduct.LastViewTime.IsZero() {
  336. //最近一次阅读时间
  337. item.FiccLastViewTime = tmpCompanyProduct.LastViewTime.Format(utils.FormatDateTime)
  338. }
  339. item.FiccTryOutDay = tmpCompanyProduct.TryOutDayTotal
  340. }
  341. //权益
  342. raiKey := fmt.Sprint(item.CompanyId, "_", 2)
  343. if tmpCompanyProduct, ok := companyProductMap[raiKey]; ok && (productId == 0 || productId == 2) {
  344. //总阅读次数
  345. item.RaiView = tmpCompanyProduct.ViewTotal
  346. if !tmpCompanyProduct.LastViewTime.IsZero() {
  347. //最近一次阅读时间
  348. item.RaiLastViewTime = tmpCompanyProduct.LastViewTime.Format(utils.FormatDateTime)
  349. }
  350. item.RaiTryOutDay = tmpCompanyProduct.TryOutDayTotal
  351. }
  352. }
  353. companyLists := make([]*CompanyListItem, 0)
  354. //查询阅读次数
  355. if list == nil {
  356. companyLists = make([]*CompanyListItem, 0)
  357. } else {
  358. for _, v := range list {
  359. //viewTotal:=GetviewTotal(v.CompanyId)
  360. //活跃(客户状态)
  361. tmpStatus := v.Status
  362. //productIdSlice := strings.Split(v.ProductIds, "/")
  363. //statusSlice := strings.Split(v.Status, "/")
  364. // 试用客户子标签
  365. tryStageSlice := make([]company.TryStageSliceItem, 0)
  366. for _, vProductId := range []int{1, 2} {
  367. ficcKey := fmt.Sprint(v.CompanyId, "_", vProductId)
  368. //ficc
  369. if tmpCompanyProduct, ok := companyProductMap[ficcKey]; ok {
  370. if tmpCompanyProduct.Status == utils.COMPANY_STATUS_TRY_OUT {
  371. key := fmt.Sprint(v.CompanyId, "_", vProductId)
  372. if pro, ok := companyProductMap[key]; ok {
  373. tryItem := company.TryStageSliceItem{
  374. ProductId: vProductId,
  375. TryStage: pro.TryStage,
  376. }
  377. if pro.SellerId == sysUser.AdminId { //产品销售ID和登录ID相等
  378. tryItem.HasPermission = true
  379. }
  380. tryStageSlice = append(tryStageSlice, tryItem)
  381. }
  382. }
  383. }
  384. }
  385. // 是否存在进行中的任务
  386. var todoStatus bool
  387. //是否支持确认完成待办任务
  388. var canConfirm bool
  389. var hiddenConfirm bool //是否隐藏确定完成按钮
  390. var hiddenCreate bool //是否隐藏新增/编辑按钮
  391. hiddenConfirm = true
  392. hiddenCreate = true
  393. todoButtonColor := `green`
  394. //'无任务','未完成','已完成'
  395. if strings.Contains(v.TodoStatuss, "未完成") {
  396. todoButtonColor = "red"
  397. todoStatus = true
  398. } else if strings.Contains(v.TodoStatuss, "已完成") {
  399. todoButtonColor = "green"
  400. } else if strings.Contains(v.TodoStatuss, "无任务") {
  401. todoButtonColor = "gray"
  402. }
  403. for _, vProductId := range []int{1, 2} {
  404. ficcKey := fmt.Sprint(v.CompanyId, "_", vProductId)
  405. //ficc
  406. if tmpCompanyProduct, ok := companyProductMap[ficcKey]; ok {
  407. if tmpCompanyProduct.Status != utils.COMPANY_STATUS_LOSE && tmpCompanyProduct.Status != utils.COMPANY_STATUS_CLOSE { //非流失
  408. hiddenCreate = false
  409. switch sysUser.RoleTypeCode {
  410. case utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RAI_ADMIN, utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_RAI_GROUP:
  411. //部门管理员、ficc主管、权益组长
  412. hiddenConfirm = false //不展示
  413. if todoStatus { //有任务,需要展示
  414. canConfirm = true
  415. }
  416. case utils.ROLE_TYPE_CODE_FICC_TEAM: //ficc组长
  417. if todoStatus { //有任务,需要展示
  418. canConfirm = true
  419. }
  420. if v.SellerId != sysUser.AdminId { //不是自己的客户
  421. hiddenConfirm = false //展示
  422. }
  423. case utils.ROLE_TYPE_CODE_RAI_SELLER: //权益销售
  424. if v.SellerId == sysUser.AdminId { //是自己的客户
  425. has := services.CheckRaiApprovePermission(sysUser.AdminId) //这些个权益销售是有权限的
  426. if has {
  427. if todoStatus { //有任务,需要展示
  428. canConfirm = true
  429. }
  430. hiddenConfirm = false //展示
  431. }
  432. }
  433. }
  434. }
  435. }
  436. }
  437. // To-Do任务状态为未完成的对应任务的截止日期-当前日期;
  438. tmpDeadline := v.Deadline
  439. if strings.Contains(v.TodoStatuss, "未完成") {
  440. if strings.Contains(v.TodoEndTimeStr, "/") {
  441. edtSlice := strings.Split(v.TodoEndTimeStr, "/")
  442. v.TodoEndTime, _ = time.ParseInLocation(utils.FormatDateTime, edtSlice[0], time.Local)
  443. } else {
  444. v.TodoEndTime, _ = time.ParseInLocation(utils.FormatDateTime, v.TodoEndTimeStr, time.Local)
  445. }
  446. tmpEndTime := v.TodoEndTime.Format(utils.FormatDate)
  447. if tmpEndTime == "0001-01-01" {
  448. tmpEndTime = ""
  449. }
  450. if tmpEndTime != "" {
  451. dlTime1 := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local)
  452. dlTime2 := time.Date(v.TodoEndTime.Year(), v.TodoEndTime.Month(), v.TodoEndTime.Day(), 0, 0, 0, 0, time.Local)
  453. dldays := int(dlTime2.Sub(dlTime1).Hours() / 24)
  454. tmpDeadline = strconv.Itoa(dldays)
  455. }
  456. }
  457. var isShow bool //是否可见
  458. {
  459. switch sysUser.RoleTypeCode {
  460. case utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RAI_ADMIN:
  461. //超管、部门管理员
  462. isShow = true
  463. case utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_RAI_GROUP, utils.ROLE_TYPE_CODE_FICC_TEAM: //ficc主管、权益主管、ficc组长
  464. ficcKey := fmt.Sprint(v.CompanyId, "_", sysUserProductId)
  465. if _, ok := companyProductMap[ficcKey]; ok {
  466. if _, ok2 := myChildSysGroupMap[v.GroupId]; ok2 {
  467. isShow = true
  468. }
  469. }
  470. case utils.ROLE_TYPE_CODE_RAI_SELLER, utils.ROLE_TYPE_CODE_FICC_SELLER: //权益销售、ficc销售
  471. ficcKey := fmt.Sprint(v.CompanyId, "_", sysUserProductId)
  472. if tmpCompanyProduct, ok := companyProductMap[ficcKey]; ok {
  473. if tmpCompanyProduct.SellerId == sysUser.AdminId { //是自己的客户
  474. isShow = true
  475. }
  476. }
  477. }
  478. }
  479. // 计算合同开始日期和结束日期之间的小时差
  480. duration := time.Since(v.FirstDate).Hours()
  481. hoursDiff := decimal.NewFromFloat(duration)
  482. // 计算总小时数
  483. const hoursPerYear = 24 * 365
  484. totalHours := decimal.NewFromInt(hoursPerYear)
  485. // 计算相差的年数,保留一位小数
  486. numYearDecimal := hoursDiff.Div(totalHours).Round(1)
  487. companyList := &CompanyListItem{
  488. CompanyId: v.CompanyId,
  489. CompanyName: v.CompanyName,
  490. CreditCode: v.CreditCode,
  491. CompanyCode: v.CompanyCode,
  492. StartDate: v.StartDate,
  493. EndDate: v.EndDate,
  494. LoseReason: v.LoseReason,
  495. RenewalReason: v.RenewalReason,
  496. FreezeReason: v.FreezeReason,
  497. LossTime: v.LossTime,
  498. Status: tmpStatus,
  499. CompanyType: v.CompanyType,
  500. ApproveStatus: v.ApproveStatus,
  501. SellerName: v.SellerName,
  502. SellerId: v.SellerId,
  503. SellerIds: v.SellerIds,
  504. ExpireDay: v.ExpireDay,
  505. FreezeTime: v.FreezeTime,
  506. GroupId: v.GroupId,
  507. GroupIds: v.GroupIds,
  508. DepartmentId: v.DepartmentId,
  509. IndustryName: v.IndustryName,
  510. IsSuspend: v.IsSuspend,
  511. CreatedTime: v.CreatedTime,
  512. Source: v.Source,
  513. Province: v.Province,
  514. City: v.City,
  515. Address: v.Address,
  516. Reasons: v.Reasons,
  517. FreezeStartDate: v.FreezeStartDate,
  518. FreezeEndDate: v.FreezeEndDate,
  519. FreezeExpireDays: v.FreezeExpireDays,
  520. ProductId: v.ProductId,
  521. FormalTime: v.FormalTime,
  522. IsShared: v.IsShared,
  523. RegionType: v.RegionType,
  524. FiccPackageType: v.FiccPackageType,
  525. FiccLastViewTime: v.FiccLastViewTime,
  526. RaiLastViewTime: v.RaiLastViewTime,
  527. FiccView: v.FiccView,
  528. RaiView: v.RaiView,
  529. RoadShowTotal: v.RoadShowTotal,
  530. FiccTryOutDay: v.FiccTryOutDay,
  531. RaiTryOutDay: v.RaiTryOutDay,
  532. TodoStatus: todoStatus,
  533. CanConfirm: canConfirm,
  534. HiddenConfirm: hiddenConfirm,
  535. HiddenCreate: hiddenCreate,
  536. TodoButtonColor: todoButtonColor,
  537. AllViewTotal: v.AllViewTotal,
  538. Deadline: tmpDeadline,
  539. IsShow: isShow,
  540. TryStageSlice: tryStageSlice,
  541. ShareSellerId: v.ShareSellerId,
  542. ShareSeller: v.ShareSeller,
  543. LatestServiceRecord: v.LatestServiceRecord.Format(utils.FormatDate2),
  544. ServiceYears: numYearDecimal.String(),
  545. }
  546. if strings.Contains(companyList.ApproveStatus, "已审批") {
  547. companyList.ApproveStatus = ""
  548. }
  549. companyLists = append(companyLists, companyList)
  550. }
  551. }
  552. if companyLists == nil {
  553. companyLists = make([]*CompanyListItem, 0)
  554. }
  555. page = paging.GetPaging(currentIndex, pageSize, total)
  556. resp.List = companyLists
  557. resp.Paging = page
  558. return
  559. }