assessment_variety.go 25 KB

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