assessment_variety.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. package assessment
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/utils"
  7. "fmt"
  8. "github.com/rdlucklib/rdluck_tools/paging"
  9. "github.com/tealeg/xlsx"
  10. "os"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. // AssessmentVarietyController 考核品种
  16. type AssessmentVarietyController struct {
  17. controllers.BaseAuthController
  18. }
  19. // Add
  20. // @Title 新增品种
  21. // @Description 新增品种
  22. // @Param request body models.AssessmentVarietyAddReq true "type json string"
  23. // @Success 200 string "操作成功"
  24. // @router /variety/add [post]
  25. func (this *AssessmentVarietyController) Add() {
  26. br := new(models.BaseResponse).Init()
  27. defer func() {
  28. if br.ErrMsg == "" {
  29. br.IsSendEmail = false
  30. }
  31. this.Data["json"] = br
  32. this.ServeJSON()
  33. }()
  34. sysUser := this.SysUser
  35. if sysUser == nil {
  36. br.Msg = "请登录"
  37. br.ErrMsg = "请登录,SysUser Is Empty"
  38. br.Ret = 408
  39. return
  40. }
  41. var req models.AssessmentVarietyAddReq
  42. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  43. br.Msg = "参数有误"
  44. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  45. return
  46. }
  47. req.VarietyCode = strings.TrimSpace(req.VarietyCode)
  48. if req.VarietyCode == "" {
  49. br.Msg = "请输入品种编码"
  50. return
  51. }
  52. req.VarietyName = strings.TrimSpace(req.VarietyName)
  53. if req.VarietyName == "" {
  54. br.Msg = "请输入品种名称"
  55. return
  56. }
  57. if req.MonthlyFluctuate <= 0 {
  58. br.Msg = "请输入月度波动阈值"
  59. return
  60. }
  61. if req.WeeklyFluctuate <= 0 {
  62. br.Msg = "请输入周度波动阈值"
  63. return
  64. }
  65. // 检验重名
  66. varietyOb := new(models.AssessmentVariety)
  67. {
  68. cond := fmt.Sprintf(` AND (%s = ? OR %s = ?)`, varietyOb.Cols().VarietyCode, varietyOb.Cols().VarietyName)
  69. pars := make([]interface{}, 0)
  70. pars = append(pars, req.VarietyCode, req.VarietyName)
  71. exists, e := varietyOb.GetItemByCondition(cond, pars, "")
  72. if e != nil && !utils.IsErrNoRow(e) {
  73. br.Msg = "操作失败"
  74. br.ErrMsg = fmt.Sprintf("获取考核品种失败, %v", e)
  75. return
  76. }
  77. if exists != nil && exists.AssessmentVarietyId > 0 {
  78. if exists.VarietyCode == req.VarietyCode {
  79. br.Msg = "品种编码已存在,请勿重复添加"
  80. return
  81. }
  82. if exists.VarietyName == req.VarietyName {
  83. br.Msg = "品种名称已存在,请勿重复添加"
  84. return
  85. }
  86. return
  87. }
  88. }
  89. newVariety := new(models.AssessmentVariety)
  90. newVariety.VarietyCode = req.VarietyCode
  91. newVariety.VarietyName = req.VarietyName
  92. newVariety.MonthlyFluctuate = req.MonthlyFluctuate
  93. newVariety.WeeklyFluctuate = req.WeeklyFluctuate
  94. newVariety.CreateTime = time.Now().Local()
  95. newVariety.ModifyTime = time.Now().Local()
  96. if e := newVariety.Create(); e != nil {
  97. br.Msg = "操作失败"
  98. br.ErrMsg = fmt.Sprintf("新增考核品种失败, %v", e)
  99. return
  100. }
  101. // 关联研究员
  102. mappings := make([]*models.AssessmentResearcherVarietyMapping, 0)
  103. if len(req.AssessmentResearcherIds) > 0 {
  104. researcherOb := new(models.AssessmentResearcher)
  105. cond := fmt.Sprintf(` AND %s = ? AND %s IN (?)`, researcherOb.Cols().Enabled, researcherOb.Cols().PrimaryId)
  106. pars := make([]interface{}, 0)
  107. pars = append(pars, models.AssessmentResearcherEnabled, req.AssessmentResearcherIds)
  108. researchers, e := researcherOb.GetItemsByCondition(cond, pars, []string{}, "")
  109. if e != nil {
  110. br.Msg = "获取失败"
  111. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  112. return
  113. }
  114. for _, v := range researchers {
  115. m := new(models.AssessmentResearcherVarietyMapping)
  116. m.VarietyId = newVariety.AssessmentVarietyId
  117. m.AssessmentResearcherId = v.AssessmentResearcherId
  118. m.AdminId = v.AdminId
  119. mappings = append(mappings, m)
  120. }
  121. }
  122. if len(mappings) > 0 {
  123. mappingOb := new(models.AssessmentResearcherVarietyMapping)
  124. if e := mappingOb.CreateMulti(mappings); e != nil {
  125. br.Msg = "操作失败"
  126. br.ErrMsg = fmt.Sprintf("批量新增研究员品种关联失败, %v", e)
  127. return
  128. }
  129. }
  130. br.Ret = 200
  131. br.Success = true
  132. br.Msg = "操作成功"
  133. }
  134. // Edit
  135. // @Title 编辑品种
  136. // @Description 编辑品种
  137. // @Param request body models.AssessmentVarietyEditReq true "type json string"
  138. // @Success 200 string "操作成功"
  139. // @router /variety/edit [post]
  140. func (this *AssessmentVarietyController) Edit() {
  141. br := new(models.BaseResponse).Init()
  142. defer func() {
  143. if br.ErrMsg == "" {
  144. br.IsSendEmail = false
  145. }
  146. this.Data["json"] = br
  147. this.ServeJSON()
  148. }()
  149. sysUser := this.SysUser
  150. if sysUser == nil {
  151. br.Msg = "请登录"
  152. br.ErrMsg = "请登录,SysUser Is Empty"
  153. br.Ret = 408
  154. return
  155. }
  156. var req models.AssessmentVarietyEditReq
  157. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  158. br.Msg = "参数有误"
  159. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  160. return
  161. }
  162. if req.AssessmentVarietyId <= 0 {
  163. br.Msg = "参数有误"
  164. br.ErrMsg = fmt.Sprintf("参数有误, AssessmentVarietyId: %d", req.AssessmentVarietyId)
  165. return
  166. }
  167. if req.MonthlyFluctuate <= 0 {
  168. br.Msg = "请输入月度波动阈值"
  169. return
  170. }
  171. if req.WeeklyFluctuate <= 0 {
  172. br.Msg = "请输入周度波动阈值"
  173. return
  174. }
  175. varietyOb := new(models.AssessmentVariety)
  176. variety, e := varietyOb.GetItemById(req.AssessmentVarietyId)
  177. if e != nil {
  178. if utils.IsErrNoRow(e) {
  179. br.Msg = "品种不存在,请刷新页面"
  180. return
  181. }
  182. br.Msg = "操作失败"
  183. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  184. return
  185. }
  186. variety.MonthlyFluctuate = req.MonthlyFluctuate
  187. variety.WeeklyFluctuate = req.WeeklyFluctuate
  188. variety.ModifyTime = time.Now().Local()
  189. updateCols := []string{varietyOb.Cols().MonthlyFluctuate, varietyOb.Cols().WeeklyFluctuate, varietyOb.Cols().ModifyTime}
  190. if e := variety.Update(updateCols); e != nil {
  191. br.Msg = "操作失败"
  192. br.ErrMsg = fmt.Sprintf("更新品种失败, %v", e)
  193. return
  194. }
  195. // 关联研究员,清空后新增
  196. mappingOb := new(models.AssessmentResearcherVarietyMapping)
  197. {
  198. cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().VarietyId)
  199. pars := make([]interface{}, 0)
  200. pars = append(pars, variety.AssessmentVarietyId)
  201. if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
  202. br.Msg = "操作失败"
  203. br.ErrMsg = fmt.Sprintf("清空关联失败, %v", e)
  204. return
  205. }
  206. }
  207. mappings := make([]*models.AssessmentResearcherVarietyMapping, 0)
  208. if len(req.AssessmentResearcherIds) > 0 {
  209. researcherOb := new(models.AssessmentResearcher)
  210. cond := fmt.Sprintf(` AND %s = ? AND %s IN (?)`, researcherOb.Cols().Enabled, researcherOb.Cols().PrimaryId)
  211. pars := make([]interface{}, 0)
  212. pars = append(pars, models.AssessmentResearcherEnabled, req.AssessmentResearcherIds)
  213. researchers, e := researcherOb.GetItemsByCondition(cond, pars, []string{}, "")
  214. if e != nil {
  215. br.Msg = "获取失败"
  216. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  217. return
  218. }
  219. for _, v := range researchers {
  220. m := new(models.AssessmentResearcherVarietyMapping)
  221. m.VarietyId = variety.AssessmentVarietyId
  222. m.AssessmentResearcherId = v.AssessmentResearcherId
  223. m.AdminId = v.AdminId
  224. mappings = append(mappings, m)
  225. }
  226. }
  227. if len(mappings) > 0 {
  228. if e := mappingOb.CreateMulti(mappings); e != nil {
  229. br.Msg = "操作失败"
  230. br.ErrMsg = fmt.Sprintf("批量新增研究员品种关联失败, %v", e)
  231. return
  232. }
  233. }
  234. br.Ret = 200
  235. br.Success = true
  236. br.Msg = "操作成功"
  237. }
  238. // Remove
  239. // @Title 删除品种
  240. // @Description 删除品种
  241. // @Param request body models.AssessmentVarietyRemoveReq true "type json string"
  242. // @Success 200 string "操作成功"
  243. // @router /variety/remove [post]
  244. func (this *AssessmentVarietyController) Remove() {
  245. br := new(models.BaseResponse).Init()
  246. defer func() {
  247. if br.ErrMsg == "" {
  248. br.IsSendEmail = false
  249. }
  250. this.Data["json"] = br
  251. this.ServeJSON()
  252. }()
  253. sysUser := this.SysUser
  254. if sysUser == nil {
  255. br.Msg = "请登录"
  256. br.ErrMsg = "请登录,SysUser Is Empty"
  257. br.Ret = 408
  258. return
  259. }
  260. var req models.AssessmentVarietyRemoveReq
  261. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  262. br.Msg = "参数有误"
  263. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  264. return
  265. }
  266. if req.AssessmentVarietyId <= 0 {
  267. br.Msg = "参数有误"
  268. br.ErrMsg = fmt.Sprintf("参数有误, AssessmentVarietyId: %d", req.AssessmentVarietyId)
  269. return
  270. }
  271. varietyOb := new(models.AssessmentVariety)
  272. variety, e := varietyOb.GetItemById(req.AssessmentVarietyId)
  273. if e != nil {
  274. if utils.IsErrNoRow(e) {
  275. br.Ret = 200
  276. br.Success = true
  277. br.Msg = "操作成功"
  278. return
  279. }
  280. br.Msg = "操作失败"
  281. br.ErrMsg = fmt.Sprintf("获取品种失败, %v", e)
  282. return
  283. }
  284. if e = variety.Remove(); e != nil {
  285. br.Msg = "操作失败"
  286. br.ErrMsg = fmt.Sprintf("删除品种失败, %v", e)
  287. return
  288. }
  289. // 清空关联
  290. mappingOb := new(models.AssessmentResearcherVarietyMapping)
  291. {
  292. cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().VarietyId)
  293. pars := make([]interface{}, 0)
  294. pars = append(pars, variety.AssessmentVarietyId)
  295. if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
  296. br.Msg = "操作失败"
  297. br.ErrMsg = fmt.Sprintf("清空关联失败, %v", e)
  298. return
  299. }
  300. }
  301. br.Ret = 200
  302. br.Success = true
  303. br.Msg = "操作成功"
  304. }
  305. // Detail
  306. // @Title 品种详情
  307. // @Description 品种详情
  308. // @Param AssessmentVarietyId query int true "品种ID"
  309. // @Success 200 string "操作成功"
  310. // @router /variety/detail [get]
  311. func (this *AssessmentVarietyController) Detail() {
  312. br := new(models.BaseResponse).Init()
  313. defer func() {
  314. if br.ErrMsg == "" {
  315. br.IsSendEmail = false
  316. }
  317. this.Data["json"] = br
  318. this.ServeJSON()
  319. }()
  320. sysUser := this.SysUser
  321. if sysUser == nil {
  322. br.Msg = "请登录"
  323. br.ErrMsg = "请登录,SysUser Is Empty"
  324. br.Ret = 408
  325. return
  326. }
  327. varietyId, _ := this.GetInt("AssessmentVarietyId")
  328. if varietyId <= 0 {
  329. br.Msg = "参数有误"
  330. br.ErrMsg = fmt.Sprintf("参数有误, VarietyId: %d", varietyId)
  331. return
  332. }
  333. varietyOb := new(models.AssessmentVariety)
  334. variety, e := varietyOb.GetItemById(varietyId)
  335. if e != nil {
  336. if utils.IsErrNoRow(e) {
  337. br.Msg = "品种不存在,请重新页面"
  338. return
  339. }
  340. br.Msg = "获取失败"
  341. br.ErrMsg = fmt.Sprintf("获取品种失败, %v", e)
  342. return
  343. }
  344. resp := variety.Format2Detail()
  345. // 获取启用研究员
  346. researcherMapping := make(map[int]*models.AssessmentResearcher)
  347. {
  348. researcherOb := new(models.AssessmentResearcher)
  349. cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().Enabled)
  350. pars := make([]interface{}, 0)
  351. pars = append(pars, models.AssessmentResearcherEnabled)
  352. researchers, e := researcherOb.GetItemsByCondition(cond, pars, []string{}, "")
  353. if e != nil {
  354. br.Msg = "获取失败"
  355. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  356. return
  357. }
  358. for _, v := range researchers {
  359. researcherMapping[v.AssessmentResearcherId] = v
  360. }
  361. }
  362. // 获取研究员关联
  363. mappings := make([]*models.AssessmentResearcherVarietyMapping, 0)
  364. {
  365. mappingOb := new(models.AssessmentResearcherVarietyMapping)
  366. cond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().VarietyId)
  367. pars := make([]interface{}, 0)
  368. pars = append(pars, variety.AssessmentVarietyId)
  369. mappings, e = mappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  370. if e != nil {
  371. br.Msg = "获取失败"
  372. br.ErrMsg = fmt.Sprintf("获取研究员品种关联失败, %v", e)
  373. return
  374. }
  375. }
  376. for _, v := range mappings {
  377. rs := researcherMapping[v.AssessmentResearcherId]
  378. if rs == nil {
  379. continue
  380. }
  381. ar := models.AssessmentResearcherDetail{
  382. AssessmentResearcherId: rs.AssessmentResearcherId,
  383. AdminId: v.AdminId,
  384. RealName: rs.RealName,
  385. Enabled: rs.Enabled,
  386. }
  387. resp.RelationResearcher = append(resp.RelationResearcher, ar)
  388. }
  389. br.Data = resp
  390. br.Ret = 200
  391. br.Success = true
  392. br.Msg = "获取成功"
  393. }
  394. // PageList
  395. // @Title 品种列表-分页
  396. // @Description 品种列表-分页
  397. // @Param request body models.AssessmentVarietyPageListReq true "type json string"
  398. // @Success 200 string "操作成功"
  399. // @router /variety/page_list [get]
  400. func (this *AssessmentVarietyController) PageList() {
  401. br := new(models.BaseResponse).Init()
  402. defer func() {
  403. if br.ErrMsg == "" {
  404. br.IsSendEmail = false
  405. }
  406. this.Data["json"] = br
  407. this.ServeJSON()
  408. }()
  409. sysUser := this.SysUser
  410. if sysUser == nil {
  411. br.Msg = "请登录"
  412. br.ErrMsg = "请登录,SysUser Is Empty"
  413. br.Ret = 408
  414. return
  415. }
  416. params := new(models.AssessmentVarietyPageListReq)
  417. if e := this.ParseForm(params); e != nil {
  418. br.Msg = "获取失败"
  419. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  420. return
  421. }
  422. resp := new(models.AssessmentVarietyPageListResp)
  423. resp.List = make([]*models.AssessmentVarietyDetail, 0)
  424. // 分页
  425. var startSize int
  426. if params.PageSize <= 0 {
  427. params.PageSize = utils.PageSize20
  428. }
  429. if params.CurrentIndex <= 0 {
  430. params.CurrentIndex = 1
  431. }
  432. startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
  433. // 列表
  434. varietyOb := new(models.AssessmentVariety)
  435. cond := ``
  436. pars := make([]interface{}, 0)
  437. if params.AssessmentVarietyIds != "" {
  438. var varietyIds []int
  439. arr := strings.Split(params.AssessmentVarietyIds, ",")
  440. for _, v := range arr {
  441. i, _ := strconv.Atoi(v)
  442. if i > 0 {
  443. varietyIds = append(varietyIds, i)
  444. }
  445. }
  446. if len(varietyIds) == 0 {
  447. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  448. br.Data = resp
  449. br.Ret = 200
  450. br.Success = true
  451. br.Msg = "获取成功"
  452. return
  453. }
  454. cond += fmt.Sprintf(" AND %s IN (?)", varietyOb.Cols().PrimaryId)
  455. pars = append(pars, varietyIds)
  456. }
  457. total, e := varietyOb.GetCountByCondition(cond, pars)
  458. if e != nil {
  459. br.Msg = "获取失败"
  460. br.ErrMsg = fmt.Sprintf("获取研究员列表总数失败, %v", e)
  461. return
  462. }
  463. varieties, e := varietyOb.GetPageItemsByCondition(cond, pars, []string{}, "", startSize, params.PageSize)
  464. if e != nil {
  465. br.Msg = "获取失败"
  466. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  467. return
  468. }
  469. var varietyIds []int
  470. for _, v := range varieties {
  471. varietyIds = append(varietyIds, v.AssessmentVarietyId)
  472. }
  473. if total == 0 || len(varietyIds) == 0 {
  474. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  475. br.Data = resp
  476. br.Ret = 200
  477. br.Success = true
  478. br.Msg = "获取成功"
  479. return
  480. }
  481. // 获取启用研究员
  482. researcherMapping := make(map[int]*models.AssessmentResearcher)
  483. {
  484. researcherOb := new(models.AssessmentResearcher)
  485. cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().Enabled)
  486. pars := make([]interface{}, 0)
  487. pars = append(pars, models.AssessmentResearcherEnabled)
  488. researchers, e := researcherOb.GetItemsByCondition(cond, pars, []string{}, "")
  489. if e != nil {
  490. br.Msg = "获取失败"
  491. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  492. return
  493. }
  494. for _, v := range researchers {
  495. researcherMapping[v.AssessmentResearcherId] = v
  496. }
  497. }
  498. // 关联研究员
  499. varietyResearcherMapping := make(map[int][]models.AssessmentResearcherDetail)
  500. {
  501. mappingOb := new(models.AssessmentResearcherVarietyMapping)
  502. cond := fmt.Sprintf(` AND %s IN (?)`, mappingOb.Cols().VarietyId)
  503. pars := make([]interface{}, 0)
  504. pars = append(pars, varietyIds)
  505. list, e := mappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  506. if e != nil {
  507. br.Msg = "获取失败"
  508. br.ErrMsg = fmt.Sprintf("获取研究员品种关联失败, %v", e)
  509. return
  510. }
  511. for _, v := range list {
  512. rs := researcherMapping[v.AssessmentResearcherId]
  513. if rs == nil {
  514. continue
  515. }
  516. ar := models.AssessmentResearcherDetail{
  517. AssessmentResearcherId: v.AssessmentResearcherId,
  518. AdminId: v.AdminId,
  519. RealName: rs.RealName,
  520. }
  521. varietyResearcherMapping[v.VarietyId] = append(varietyResearcherMapping[v.VarietyId], ar)
  522. }
  523. }
  524. for _, v := range varieties {
  525. t := v.Format2Detail()
  526. t.RelationResearcher = varietyResearcherMapping[v.AssessmentVarietyId]
  527. resp.List = append(resp.List, t)
  528. }
  529. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  530. br.Data = resp
  531. br.Ret = 200
  532. br.Success = true
  533. br.Msg = "获取成功"
  534. }
  535. // ImportData
  536. // @Title 导入品种数据
  537. // @Description 导入品种数据
  538. // @Success 200 string "操作成功"
  539. // @router /variety/import_data [post]
  540. func (this *AssessmentVarietyController) ImportData() {
  541. br := new(models.BaseResponse).Init()
  542. defer func() {
  543. if br.ErrMsg == "" {
  544. br.IsSendEmail = false
  545. }
  546. this.Data["json"] = br
  547. this.ServeJSON()
  548. }()
  549. sysUser := this.SysUser
  550. if sysUser == nil {
  551. br.Msg = "请登录"
  552. br.ErrMsg = "请登录,SysUser Is Empty"
  553. br.Ret = 408
  554. return
  555. }
  556. file, _, e := this.GetFile("VarietyData")
  557. if e != nil {
  558. br.Msg = "导入失败"
  559. br.ErrMsg = fmt.Sprintf("获取文件失败, %v", e)
  560. return
  561. }
  562. path := "./static/assessment_variety_" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  563. defer func() {
  564. _ = file.Close()
  565. _ = os.Remove(path)
  566. }()
  567. if e = this.SaveToFile("VarietyData", path); e != nil {
  568. br.Msg = "导入失败"
  569. br.ErrMsg = fmt.Sprintf("保存文件失败, %v", e)
  570. return
  571. }
  572. xlFile, e := xlsx.OpenFile(path)
  573. if e != nil {
  574. br.Msg = "导入失败"
  575. br.ErrMsg = fmt.Sprintf("打开excel文件失败, %v", e)
  576. return
  577. }
  578. if len(xlFile.Sheets) == 0 {
  579. br.Msg = "无有效数据,请检查"
  580. br.ErrMsg = "Sheet为空"
  581. return
  582. }
  583. // PS.导入规则:品种管理中的每个品种都需要有对应的日期数据,少一个都不允许上传,允许一次传多周的数据
  584. varieties, weekDates := make([]string, 0), make([]string, 0)
  585. varietyNameMatch := make(map[string]*models.AssessmentVariety)
  586. varietyDateExist := make(map[string]bool) // [品种-日期]用于校验品种是否和日期一一对应
  587. {
  588. varietyOb := new(models.AssessmentVariety)
  589. list, e := varietyOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
  590. if e != nil {
  591. br.Msg = "导入失败"
  592. br.ErrMsg = fmt.Sprintf("获取品种列表失败, %v", e)
  593. return
  594. }
  595. for _, v := range list {
  596. varieties = append(varieties, v.VarietyName)
  597. varietyNameMatch[v.VarietyName] = v
  598. }
  599. }
  600. rowData := make(map[int]*models.AssessmentVarietyData)
  601. titleArr := []string{"品种名称", "当周收盘日期", "当周收盘价", "当周最高价", "当周最低价"}
  602. for _, sheet := range xlFile.Sheets {
  603. maxRow := sheet.MaxRow
  604. colMax := len(titleArr)
  605. for i := 0; i < maxRow; i++ {
  606. // 检查首行表头
  607. row := sheet.Row(i)
  608. cells := row.Cells
  609. cellLen := len(cells)
  610. if i == 0 {
  611. for j := 0; j < colMax; j++ {
  612. if cellLen <= j {
  613. br.Msg = fmt.Sprintf("第%d列应为%s,请检查表头", j+1, titleArr[j])
  614. return
  615. }
  616. cv := cells[j]
  617. if cv == nil {
  618. br.Msg = fmt.Sprintf("第%d列应为%s,请检查表头", j+1, titleArr[j])
  619. return
  620. }
  621. title := strings.TrimSpace(cv.Value)
  622. if titleArr[j] != title {
  623. br.Msg = fmt.Sprintf("第%d列应为%s,请检查表头", j+1, titleArr[j])
  624. return
  625. }
  626. }
  627. continue
  628. }
  629. // 数据行,每格均为必填
  630. for j := 0; j < colMax; j++ {
  631. if cellLen <= j {
  632. br.Msg = fmt.Sprintf("第%d行第%d列数据有误,请检查", i+1, j+1)
  633. return
  634. }
  635. cv := cells[j]
  636. if cv == nil {
  637. br.Msg = fmt.Sprintf("第%d行第%d列数据有误,请检查", i+1, j+1)
  638. return
  639. }
  640. val := strings.TrimSpace(cv.Value)
  641. if val == "" {
  642. br.Msg = fmt.Sprintf("第%d行第%d列数据为空,请检查", i+1, j+1)
  643. return
  644. }
  645. switch j {
  646. case 0:
  647. // 品种名称
  648. vat := varietyNameMatch[val]
  649. if vat == nil {
  650. br.Msg = fmt.Sprintf("第%d行第%d列品种不存在,请检查", i+1, j+1)
  651. return
  652. }
  653. rowData[i] = new(models.AssessmentVarietyData)
  654. rowData[i].VarietyId = vat.AssessmentVarietyId
  655. rowData[i].VarietyName = vat.VarietyName
  656. rowData[i].VarietyCode = vat.VarietyCode
  657. rowData[i].CreateTime = time.Now().Local()
  658. rowData[i].ModifyTime = time.Now().Local()
  659. case 1:
  660. // 当周收盘日期
  661. d, e := time.ParseInLocation(utils.FormatDate, val, time.Local)
  662. if e != nil {
  663. br.Msg = fmt.Sprintf("第%d行第%d列日期格式有误,请检查", i+1, j+1)
  664. return
  665. }
  666. rd := rowData[i]
  667. if rd == nil {
  668. br.Msg = fmt.Sprintf("第%d行第%d列异常,请检查", i+1, j+1)
  669. return
  670. }
  671. rd.WeekDate = d
  672. // 加入日期集合,后面统一校验品种和日期是否一一对应
  673. if !utils.InArrayByStr(weekDates, val) {
  674. weekDates = append(weekDates, val)
  675. }
  676. // 品种的日期存在重复需要提示
  677. k := fmt.Sprintf("%s-%s", rd.VarietyName, val)
  678. if varietyDateExist[k] {
  679. br.Msg = fmt.Sprintf("品种%s%s的数据重复,请检查", rd.VarietyName, val)
  680. return
  681. }
  682. varietyDateExist[k] = true
  683. case 2, 3, 4:
  684. // 当周收盘价
  685. price, e := strconv.ParseFloat(val, 64)
  686. if e != nil {
  687. br.Msg = fmt.Sprintf("第%d行第%d列价格异常,请检查", i+1, j+1)
  688. return
  689. }
  690. rd := rowData[i]
  691. if rd == nil {
  692. br.Msg = fmt.Sprintf("第%d行第%d列异常,请检查", i+1, j+1)
  693. return
  694. }
  695. if j == 2 {
  696. rd.CloseValue = price
  697. }
  698. if j == 3 {
  699. rd.HighValue = price
  700. }
  701. if j == 4 {
  702. rd.LowValue = price
  703. }
  704. }
  705. }
  706. }
  707. }
  708. // 校验品种和日期是否一一对应
  709. for _, v := range varieties {
  710. for _, d := range weekDates {
  711. k := fmt.Sprintf("%s-%s", v, d)
  712. if !varietyDateExist[k] {
  713. br.Msg = fmt.Sprintf("品种%s%s数据不存在,请确保品种和周度数据一一对应", v, d)
  714. return
  715. }
  716. }
  717. }
  718. if len(rowData) == 0 {
  719. br.Msg = "无有效数据"
  720. return
  721. }
  722. // 获取已有数据根据[品种-日期]判断新增还是更新
  723. dataOb := new(models.AssessmentVarietyData)
  724. existsData, e := dataOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
  725. if e != nil {
  726. br.Msg = "导入失败"
  727. br.ErrMsg = fmt.Sprintf("获取品种数据列表失败, %v", e)
  728. return
  729. }
  730. existsMapping := make(map[string]*models.AssessmentVarietyData)
  731. for _, v := range existsData {
  732. k := fmt.Sprintf("%s-%s", v.VarietyName, v.WeekDate.Format(utils.FormatDate))
  733. existsMapping[k] = v
  734. }
  735. insertData, updateData := make([]*models.AssessmentVarietyData, 0), make([]*models.AssessmentVarietyData, 0)
  736. for _, v := range rowData {
  737. k := fmt.Sprintf("%s-%s", v.VarietyName, v.WeekDate.Format(utils.FormatDate))
  738. exist := existsMapping[k]
  739. if exist == nil {
  740. insertData = append(insertData, v)
  741. continue
  742. }
  743. // 价格数据一致不更新
  744. if exist.CloseValue == v.CloseValue && exist.HighValue == v.HighValue && exist.LowValue == v.LowValue {
  745. continue
  746. }
  747. exist.CloseValue = v.CloseValue
  748. exist.HighValue = v.HighValue
  749. exist.LowValue = v.LowValue
  750. exist.ModifyTime = time.Now().Local()
  751. updateData = append(updateData, exist)
  752. }
  753. // 新增/更新数据
  754. if len(insertData) > 0 {
  755. if e = dataOb.CreateMulti(insertData); e != nil {
  756. br.Msg = "导入失败"
  757. br.ErrMsg = fmt.Sprintf("新增品种数据失败, %v", e)
  758. return
  759. }
  760. }
  761. if len(updateData) > 0 {
  762. updateCols := []string{dataOb.Cols().CloseValue, dataOb.Cols().HighValue, dataOb.Cols().LowValue, dataOb.Cols().ModifyTime}
  763. for _, v := range updateData {
  764. if e = v.Update(updateCols); e != nil {
  765. br.Msg = "导入失败"
  766. br.ErrMsg = fmt.Sprintf("更新品种数据失败, %v", e)
  767. return
  768. }
  769. }
  770. }
  771. br.Ret = 200
  772. br.Success = true
  773. br.Msg = "操作成功"
  774. }