assessment_form.go 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070
  1. package assessment
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/services"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "github.com/rdlucklib/rdluck_tools/paging"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. // AssessmentFormController 考核填报
  15. type AssessmentFormController struct {
  16. controllers.BaseAuthController
  17. }
  18. // CheckAdd
  19. // @Title 新建填报权限
  20. // @Description 新建填报权限
  21. // @Success 200 string "获取成功"
  22. // @router /form/check_add [get]
  23. func (this *AssessmentFormController) CheckAdd() {
  24. br := new(models.BaseResponse).Init()
  25. defer func() {
  26. if br.ErrMsg == "" {
  27. br.IsSendEmail = false
  28. }
  29. this.Data["json"] = br
  30. this.ServeJSON()
  31. }()
  32. sysUser := this.SysUser
  33. if sysUser == nil {
  34. br.Msg = "请登录"
  35. br.ErrMsg = "请登录,SysUser Is Empty"
  36. br.Ret = 408
  37. return
  38. }
  39. resp := new(models.AssessmentFormCheckAddResp)
  40. // 校验研究员身份,非研究员无权新增
  41. var researcherId int
  42. {
  43. researcherOb := new(models.AssessmentResearcher)
  44. cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().AdminId)
  45. pars := make([]interface{}, 0)
  46. pars = append(pars, sysUser.AdminId)
  47. item, e := researcherOb.GetItemByCondition(cond, pars, "")
  48. if e != nil && !utils.IsErrNoRow(e) {
  49. br.Msg = "获取失败"
  50. br.ErrMsg = "获取研究员失败"
  51. return
  52. }
  53. if item == nil || item.AssessmentResearcherId <= 0 {
  54. br.Data = resp
  55. br.Ret = 200
  56. br.Success = true
  57. br.Msg = "获取成功"
  58. return
  59. }
  60. researcherId = item.AssessmentResearcherId
  61. resp.IsResearcher = true
  62. }
  63. // 获取关联品种,无关联品种无权新增
  64. {
  65. mappingOb := new(models.AssessmentResearcherVarietyMapping)
  66. cond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().AssessmentResearcherId)
  67. pars := make([]interface{}, 0)
  68. pars = append(pars, researcherId)
  69. mappings, e := mappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  70. if e != nil {
  71. br.Msg = "获取失败"
  72. br.ErrMsg = fmt.Sprintf("获取研究员品种关联失败, %v", e)
  73. return
  74. }
  75. if len(mappings) == 0 {
  76. br.Data = resp
  77. br.Ret = 200
  78. br.Success = true
  79. br.Msg = "获取成功"
  80. return
  81. }
  82. resp.HasVariety = true
  83. }
  84. // 校验本周是否已填报过
  85. formOb := new(models.AssessmentForm)
  86. {
  87. weekStart, weekEnd := utils.GetWeekRange(time.Now().Local())
  88. cond := fmt.Sprintf(` AND %s = ? AND (%s BETWEEN ? AND ?)`, formOb.Cols().ResearcherId, formOb.Cols().CreateTime)
  89. pars := make([]interface{}, 0)
  90. pars = append(pars, researcherId, weekStart.Format(utils.FormatDateTime), weekEnd.Format(utils.FormatDateTime))
  91. count, e := formOb.GetCountByCondition(cond, pars)
  92. if e != nil {
  93. br.Msg = "获取失败"
  94. br.ErrMsg = fmt.Sprintf("获取本周填报单总数失败, %v", e)
  95. return
  96. }
  97. if count == 0 {
  98. resp.NewForm = true
  99. }
  100. }
  101. br.Data = resp
  102. br.Ret = 200
  103. br.Success = true
  104. br.Msg = "获取成功"
  105. }
  106. // WeekBase
  107. // @Title 获取本周填报信息
  108. // @Description 获取本周填报信息
  109. // @Success 200 string "获取成功"
  110. // @router /form/week_base [get]
  111. func (this *AssessmentFormController) WeekBase() {
  112. br := new(models.BaseResponse).Init()
  113. defer func() {
  114. if br.ErrMsg == "" {
  115. br.IsSendEmail = false
  116. }
  117. this.Data["json"] = br
  118. this.ServeJSON()
  119. }()
  120. sysUser := this.SysUser
  121. if sysUser == nil {
  122. br.Msg = "请登录"
  123. br.ErrMsg = "请登录,SysUser Is Empty"
  124. br.Ret = 408
  125. return
  126. }
  127. resp := new(models.AssessmentFormViewResp)
  128. // 校验研究员身份
  129. researcher := new(models.AssessmentResearcher)
  130. {
  131. researcherOb := new(models.AssessmentResearcher)
  132. cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().AdminId)
  133. pars := make([]interface{}, 0)
  134. pars = append(pars, sysUser.AdminId)
  135. item, e := researcherOb.GetItemByCondition(cond, pars, "")
  136. if e != nil {
  137. if utils.IsErrNoRow(e) {
  138. br.Msg = "您不是研究员,不可填报观点"
  139. return
  140. }
  141. br.Msg = "获取失败"
  142. br.ErrMsg = "获取研究员失败"
  143. return
  144. }
  145. if item == nil || item.AssessmentResearcherId <= 0 {
  146. br.Msg = "您不是研究员,不可填报观点"
  147. return
  148. }
  149. researcher = item
  150. }
  151. // 获取关联品种
  152. varietyOb := new(models.AssessmentVariety)
  153. varietyMatch := make(map[int]*models.AssessmentVariety)
  154. {
  155. varieties, e := varietyOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
  156. if e != nil {
  157. br.Msg = "获取失败"
  158. br.ErrMsg = fmt.Sprintf("获取品种列表失败, %v", e)
  159. return
  160. }
  161. for _, v := range varieties {
  162. varietyMatch[v.AssessmentVarietyId] = v
  163. }
  164. }
  165. varietyMappings := make([]*models.AssessmentResearcherVarietyMapping, 0)
  166. {
  167. mappingOb := new(models.AssessmentResearcherVarietyMapping)
  168. cond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().AdminId)
  169. pars := make([]interface{}, 0)
  170. pars = append(pars, sysUser.AdminId)
  171. mappings, e := mappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  172. if e != nil {
  173. br.Msg = "获取失败"
  174. br.ErrMsg = fmt.Sprintf("获取研究员品种关联失败, %v", e)
  175. return
  176. }
  177. varietyMappings = mappings
  178. }
  179. if len(varietyMappings) == 0 {
  180. br.Msg = "您无关联品种,不可填报观点"
  181. return
  182. }
  183. // 校验本周是否已填报过
  184. formOb := new(models.AssessmentForm)
  185. {
  186. weekStart, weekEnd := utils.GetWeekRange(time.Now().Local())
  187. cond := fmt.Sprintf(` AND %s = ? AND (%s BETWEEN ? AND ?)`, formOb.Cols().ResearcherId, formOb.Cols().CreateTime)
  188. pars := make([]interface{}, 0)
  189. pars = append(pars, researcher.AssessmentResearcherId, weekStart.Format(utils.FormatDateTime), weekEnd.Format(utils.FormatDateTime))
  190. count, e := formOb.GetCountByCondition(cond, pars)
  191. if e != nil {
  192. br.Msg = "获取失败"
  193. br.ErrMsg = fmt.Sprintf("获取本周填报单总数失败, %v", e)
  194. return
  195. }
  196. if count > 0 {
  197. br.Msg = "本周已填报,请勿重复填报"
  198. return
  199. }
  200. }
  201. // 获取单号、周度、价格基准日期
  202. formCode, e := services.GenerateAssessmentFormCode()
  203. if e != nil {
  204. br.Msg = "获取失败"
  205. br.ErrMsg = fmt.Sprintf("获取填报单单号失败, %v", e)
  206. return
  207. }
  208. weekTime, _, friday := services.GetAssessmentWeekAndFriday(time.Now().Local())
  209. resp.List = make([]*models.AssessmentFormDetail, 0)
  210. for _, v := range varietyMappings {
  211. variety := varietyMatch[v.VarietyId]
  212. if variety == nil {
  213. continue
  214. }
  215. t := new(models.AssessmentFormDetail)
  216. t.FormCode = formCode
  217. t.ResearcherId = researcher.AssessmentResearcherId
  218. t.ResearcherAdminId = researcher.AdminId
  219. t.ResearcherName = researcher.RealName
  220. t.VarietyId = variety.AssessmentVarietyId
  221. t.VarietyCode = variety.VarietyCode
  222. t.VarietyName = variety.VarietyName
  223. t.WeekTime = weekTime
  224. t.BaseDate = utils.TimeTransferString(utils.FormatDate, friday)
  225. resp.List = append(resp.List, t)
  226. }
  227. br.Data = resp
  228. br.Ret = 200
  229. br.Success = true
  230. br.Msg = "获取成功"
  231. }
  232. // Detail
  233. // @Title 填报单详情
  234. // @Description 填报单详情
  235. // @Param FormCode query string true "填报单号"
  236. // @Success 200 string "获取成功"
  237. // @router /form/detail [get]
  238. func (this *AssessmentFormController) Detail() {
  239. br := new(models.BaseResponse).Init()
  240. defer func() {
  241. if br.ErrMsg == "" {
  242. br.IsSendEmail = false
  243. }
  244. this.Data["json"] = br
  245. this.ServeJSON()
  246. }()
  247. sysUser := this.SysUser
  248. if sysUser == nil {
  249. br.Msg = "请登录"
  250. br.ErrMsg = "请登录,SysUser Is Empty"
  251. br.Ret = 408
  252. return
  253. }
  254. formCode := this.GetString("FormCode")
  255. if formCode == "" {
  256. br.Msg = "参数有误"
  257. return
  258. }
  259. resp := new(models.AssessmentFormViewResp)
  260. // 根据单号获取填报单
  261. formOb := new(models.AssessmentForm)
  262. cond := fmt.Sprintf(` AND %s = ?`, formOb.Cols().FormCode)
  263. pars := make([]interface{}, 0)
  264. pars = append(pars, formCode)
  265. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  266. if e != nil {
  267. br.Msg = "获取失败"
  268. br.ErrMsg = fmt.Sprintf("获取本周填报单总数失败, %v", e)
  269. return
  270. }
  271. resp.List = make([]*models.AssessmentFormDetail, 0)
  272. for _, v := range list {
  273. resp.List = append(resp.List, v.Format2Detail())
  274. }
  275. // 获取品种价格详情及观点评价
  276. varietyPrice, forecastComment, e := services.GetVarietyPriceAndForecastComment(list)
  277. if e != nil {
  278. br.Msg = "获取失败"
  279. br.ErrMsg = fmt.Sprintf("获取品种价格详情及观点评价失败, %v", e)
  280. return
  281. }
  282. resp.VarietyPrice = varietyPrice
  283. resp.ForecastComment = forecastComment
  284. br.Data = resp
  285. br.Ret = 200
  286. br.Success = true
  287. br.Msg = "获取成功"
  288. }
  289. // PageList
  290. // @Title 填报单列表-分页
  291. // @Description 填报单列表-分页
  292. // @Param request body models.AssessmentFormPageListReq true "type json string"
  293. // @Success 200 string "获取成功"
  294. // @router /form/page_list [get]
  295. func (this *AssessmentFormController) PageList() {
  296. br := new(models.BaseResponse).Init()
  297. defer func() {
  298. if br.ErrMsg == "" {
  299. br.IsSendEmail = false
  300. }
  301. this.Data["json"] = br
  302. this.ServeJSON()
  303. }()
  304. sysUser := this.SysUser
  305. if sysUser == nil {
  306. br.Msg = "请登录"
  307. br.ErrMsg = "请登录,SysUser Is Empty"
  308. br.Ret = 408
  309. return
  310. }
  311. params := new(models.AssessmentFormPageListReq)
  312. if e := this.ParseForm(params); e != nil {
  313. br.Msg = "获取失败"
  314. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  315. return
  316. }
  317. resp := new(models.AssessmentFormPageListResp)
  318. resp.List = make([]*models.AssessmentFormDetail, 0)
  319. // 分页
  320. var startSize int
  321. if params.PageSize <= 0 {
  322. params.PageSize = utils.PageSize20
  323. }
  324. if params.CurrentIndex <= 0 {
  325. params.CurrentIndex = 1
  326. }
  327. startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
  328. // 当前用户是否为研究员
  329. researcher := new(models.AssessmentResearcher)
  330. {
  331. researcherOb := new(models.AssessmentResearcher)
  332. cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().AdminId)
  333. pars := make([]interface{}, 0)
  334. pars = append(pars, sysUser.AdminId)
  335. item, e := researcherOb.GetItemByCondition(cond, pars, "")
  336. if e != nil && !utils.IsErrNoRow(e) {
  337. br.Msg = "获取失败"
  338. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  339. return
  340. }
  341. if item != nil && item.AssessmentResearcherId > 0 {
  342. researcher = item
  343. }
  344. }
  345. var authResearcherIds []int
  346. // 筛选项
  347. formOb := new(models.AssessmentForm)
  348. condList := ``
  349. parsList := make([]interface{}, 0)
  350. {
  351. // 可查看的其他研究员的填报
  352. var researcherIds []int
  353. if researcher != nil && researcher.AssessmentResearcherId > 0 {
  354. researcherIds = append(researcherIds, researcher.AssessmentResearcherId)
  355. authResearcherIds = append(authResearcherIds, researcher.AssessmentResearcherId)
  356. }
  357. mappingOb := new(models.AssessmentResearcherAdminMapping)
  358. mappingCond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().AuthAdminId)
  359. mappingPars := make([]interface{}, 0)
  360. mappingPars = append(mappingPars, sysUser.AdminId)
  361. mappings, e := mappingOb.GetItemsByCondition(mappingCond, mappingPars, []string{}, "")
  362. if e != nil {
  363. br.Msg = "获取失败"
  364. br.ErrMsg = fmt.Sprintf("获取研究员权限失败, %v", e)
  365. return
  366. }
  367. for _, v := range mappings {
  368. if v.AuthType == models.AssessmentResearcherAdminAuthTypeView {
  369. researcherIds = append(researcherIds, v.AssessmentResearcherId)
  370. authResearcherIds = append(authResearcherIds, v.AssessmentResearcherId)
  371. }
  372. }
  373. // 研究员筛选项,与有权限的取交集
  374. if params.AssessmentResearcherIds != "" {
  375. var parResearcherIds []int
  376. arr := strings.Split(params.AssessmentResearcherIds, ",")
  377. for _, v := range arr {
  378. i, _ := strconv.Atoi(v)
  379. if i > 0 {
  380. parResearcherIds = append(parResearcherIds, i)
  381. }
  382. }
  383. researcherIds = utils.IntersectInt(researcherIds, parResearcherIds)
  384. }
  385. if len(researcherIds) == 0 {
  386. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  387. br.Data = resp
  388. br.Ret = 200
  389. br.Success = true
  390. br.Msg = "获取成功"
  391. return
  392. }
  393. condList += fmt.Sprintf(` AND %s IN (?)`, formOb.Cols().ResearcherId)
  394. parsList = append(parsList, researcherIds)
  395. // 品种
  396. if params.AssessmentVarietyIds != "" {
  397. var varietyIds []int
  398. arr := strings.Split(params.AssessmentVarietyIds, ",")
  399. for _, v := range arr {
  400. i, _ := strconv.Atoi(v)
  401. if i > 0 {
  402. varietyIds = append(varietyIds, i)
  403. }
  404. }
  405. if len(varietyIds) == 0 {
  406. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  407. br.Data = resp
  408. br.Ret = 200
  409. br.Success = true
  410. br.Msg = "获取成功"
  411. return
  412. }
  413. condList += fmt.Sprintf(` AND %s IN (?)`, formOb.Cols().VarietyId)
  414. parsList = append(parsList, varietyIds)
  415. }
  416. // 基准日期筛选
  417. params.StartTime = strings.TrimSpace(params.StartTime)
  418. params.EndTime = strings.TrimSpace(params.EndTime)
  419. if params.StartTime != "" && params.EndTime != "" {
  420. _, e = time.ParseInLocation(utils.FormatDate, params.StartTime, time.Local)
  421. if e != nil {
  422. br.Msg = "开始日期格式有误"
  423. return
  424. }
  425. _, e = time.ParseInLocation(utils.FormatDate, params.EndTime, time.Local)
  426. if e != nil {
  427. br.Msg = "结束日期格式有误"
  428. return
  429. }
  430. st := fmt.Sprintf("%s 00:00:00", params.StartTime)
  431. ed := fmt.Sprintf("%s 23:59:59", params.EndTime)
  432. condList += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, formOb.Cols().BaseDate)
  433. parsList = append(parsList, st, ed)
  434. }
  435. }
  436. // 列表
  437. total, e := formOb.GetCountByCondition(condList, parsList)
  438. if e != nil {
  439. br.Msg = "获取失败"
  440. br.ErrMsg = fmt.Sprintf("获取研究员列表总数失败, %v", e)
  441. return
  442. }
  443. orderRule := fmt.Sprintf(`%s ASC, %s DESC`, formOb.Cols().Status, formOb.Cols().SubmitTime) // 排序规则:未提交在最前面,然后按提交时间降序
  444. list, e := formOb.GetPageItemsByCondition(condList, parsList, []string{}, orderRule, startSize, params.PageSize)
  445. if e != nil {
  446. br.Msg = "获取失败"
  447. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  448. return
  449. }
  450. if total == 0 || len(list) == 0 {
  451. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  452. br.Data = resp
  453. br.Ret = 200
  454. br.Success = true
  455. br.Msg = "获取成功"
  456. return
  457. }
  458. for _, v := range list {
  459. d := v.Format2Detail()
  460. d.Button = services.CheckAssessmentFormButton(v, sysUser.AdminId, authResearcherIds)
  461. resp.List = append(resp.List, d)
  462. }
  463. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  464. br.Data = resp
  465. br.Ret = 200
  466. br.Success = true
  467. br.Msg = "获取成功"
  468. }
  469. // Save
  470. // @Title 保存填报单
  471. // @Description 保存填报单
  472. // @Param request body models.AssessmentFormSaveReq true "type json string"
  473. // @Success 200 string "操作成功"
  474. // @router /form/save [post]
  475. func (this *AssessmentFormController) Save() {
  476. br := new(models.BaseResponse).Init()
  477. defer func() {
  478. if br.ErrMsg == "" {
  479. br.IsSendEmail = false
  480. }
  481. this.Data["json"] = br
  482. this.ServeJSON()
  483. }()
  484. sysUser := this.SysUser
  485. if sysUser == nil {
  486. br.Msg = "请登录"
  487. br.ErrMsg = "请登录,SysUser Is Empty"
  488. br.Ret = 408
  489. return
  490. }
  491. var req models.AssessmentFormSaveReq
  492. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  493. br.Msg = "参数有误"
  494. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  495. return
  496. }
  497. if len(req.List) == 0 {
  498. br.Msg = "填报单品种有误"
  499. br.ErrMsg = "参数异常, 填报单品种数有误"
  500. return
  501. }
  502. formOb := new(models.AssessmentForm)
  503. firstFormId := req.List[0].AssessmentFormId
  504. status := req.List[0].Status
  505. researcherId := req.List[0].ResearcherId
  506. // 如果是新增那么,校验本周是否已填报过
  507. if firstFormId <= 0 {
  508. weekStart, weekEnd := utils.GetWeekRange(time.Now().Local())
  509. cond := fmt.Sprintf(` AND %s = ? AND (%s BETWEEN ? AND ?)`, formOb.Cols().ResearcherId, formOb.Cols().CreateTime)
  510. pars := make([]interface{}, 0)
  511. pars = append(pars, researcherId, weekStart.Format(utils.FormatDateTime), weekEnd.Format(utils.FormatDateTime))
  512. count, e := formOb.GetCountByCondition(cond, pars)
  513. if e != nil {
  514. br.Msg = "操作失败"
  515. br.ErrMsg = fmt.Sprintf("获取本周填报单总数失败, %v", e)
  516. return
  517. }
  518. if count > 0 {
  519. br.Msg = "本周已填报,请勿重复填报"
  520. return
  521. }
  522. }
  523. insertForms, updateForms := make([]*models.AssessmentForm, 0), make([]*models.AssessmentForm, 0)
  524. for _, v := range req.List {
  525. if v.FormCode == "" {
  526. br.Msg = "单号异常"
  527. br.ErrMsg = "参数异常:单号"
  528. return
  529. }
  530. if v.ResearcherId <= 0 {
  531. br.Msg = "研究员异常"
  532. br.ErrMsg = "参数异常:研究员ID"
  533. return
  534. }
  535. if v.VarietyId <= 0 {
  536. br.Msg = "品种异常"
  537. br.ErrMsg = "参数异常:品种ID"
  538. return
  539. }
  540. if v.WeekTime == "" {
  541. br.Msg = "周度异常"
  542. br.ErrMsg = "参数异常:周度"
  543. return
  544. }
  545. if v.BaseDate == "" {
  546. br.Msg = "价格基准日期异常"
  547. br.ErrMsg = "参数异常:价格基准日期"
  548. return
  549. }
  550. baseDate, e := time.ParseInLocation(utils.FormatDate, v.BaseDate, time.Local)
  551. if e != nil {
  552. br.Msg = "价格基准日期格式异常"
  553. br.ErrMsg = fmt.Sprintf("价格基准日期格式异常, %s", v.BaseDate)
  554. return
  555. }
  556. weekStart, weekEnd := utils.GetWeekRange(baseDate)
  557. fm := new(models.AssessmentForm)
  558. fm.AssessmentFormId = v.AssessmentFormId
  559. fm.FormCode = v.FormCode
  560. fm.ResearcherId = v.ResearcherId
  561. fm.ResearcherAdminId = v.ResearcherAdminId
  562. fm.ResearcherName = v.ResearcherName
  563. fm.VarietyId = v.VarietyId
  564. fm.VarietyCode = v.VarietyCode
  565. fm.VarietyName = v.VarietyName
  566. fm.WeekTime = v.WeekTime
  567. fm.WeekStart = weekStart
  568. fm.WeekEnd = weekEnd
  569. fm.BaseDate = baseDate
  570. fm.Status = status
  571. fm.MonthlyPriceForecast = v.MonthlyPriceForecast
  572. fm.WeeklyUpForecast = v.WeeklyUpForecast
  573. fm.WeeklyDownForecast = v.WeeklyDownForecast
  574. fm.ModifyTime = time.Now().Local()
  575. // 提交时才校验必填项
  576. if status == models.AssessmentFormStatusSubmitted {
  577. if v.MonthlyPriceForecast == "" {
  578. br.Msg = "请选择月度涨跌"
  579. return
  580. }
  581. if v.WeeklyUpForecast == "" {
  582. br.Msg = "请选择周度上行风险"
  583. return
  584. }
  585. if v.WeeklyDownForecast == "" {
  586. br.Msg = "请选择周度下行风险"
  587. return
  588. }
  589. // 当周填报单据如果超过周日未提交则不可再提交,但是可以编辑
  590. if time.Now().After(weekEnd) {
  591. br.Msg = fmt.Sprintf("该单据已超过最晚提交时间: %s,不允许提交", weekEnd.Format(utils.FormatDateTime))
  592. return
  593. }
  594. fm.SubmitTime = time.Now().Local()
  595. }
  596. if firstFormId > 0 {
  597. updateForms = append(updateForms, fm)
  598. } else {
  599. fm.CreateTime = time.Now().Local()
  600. insertForms = append(insertForms, fm)
  601. continue
  602. }
  603. }
  604. // 首行表单ID大于0为更新
  605. if firstFormId > 0 && len(updateForms) > 0 {
  606. updateCols := []string{formOb.Cols().MonthlyPriceForecast, formOb.Cols().WeeklyUpForecast, formOb.Cols().WeeklyDownForecast, formOb.Cols().ModifyTime}
  607. if status == models.AssessmentFormStatusSubmitted {
  608. updateCols = append(updateCols, formOb.Cols().Status, formOb.Cols().SubmitTime)
  609. }
  610. for _, v := range updateForms {
  611. if e := v.Update(updateCols); e != nil {
  612. br.Msg = "操作失败"
  613. br.ErrMsg = fmt.Sprintf("更新填报单失败, %v", e)
  614. return
  615. }
  616. }
  617. }
  618. // 新增
  619. if firstFormId <= 0 && len(insertForms) > 0 {
  620. if e := formOb.CreateMulti(insertForms); e != nil {
  621. br.Msg = "操作失败"
  622. br.ErrMsg = fmt.Sprintf("批量新增填报单失败, %v", e)
  623. return
  624. }
  625. }
  626. br.Ret = 200
  627. br.Success = true
  628. br.Msg = "操作成功"
  629. }
  630. // Submit
  631. // @Title 提交填报单
  632. // @Description 提交填报单
  633. // @Param request body models.AssessmentFormSubmitReq true "type json string"
  634. // @Success 200 string "操作成功"
  635. // @router /form/submit [post]
  636. func (this *AssessmentFormController) Submit() {
  637. br := new(models.BaseResponse).Init()
  638. defer func() {
  639. if br.ErrMsg == "" {
  640. br.IsSendEmail = false
  641. }
  642. this.Data["json"] = br
  643. this.ServeJSON()
  644. }()
  645. sysUser := this.SysUser
  646. if sysUser == nil {
  647. br.Msg = "请登录"
  648. br.ErrMsg = "请登录,SysUser Is Empty"
  649. br.Ret = 408
  650. return
  651. }
  652. var req models.AssessmentFormSubmitReq
  653. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  654. br.Msg = "参数有误"
  655. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  656. return
  657. }
  658. req.FormCode = strings.TrimSpace(req.FormCode)
  659. if req.FormCode == "" {
  660. br.Msg = "参数有误"
  661. br.ErrMsg = "参数有误, FormCode"
  662. return
  663. }
  664. // 获取单号关联的填报单
  665. formOb := new(models.AssessmentForm)
  666. cond := fmt.Sprintf(` AND %s = ?`, formOb.Cols().FormCode)
  667. pars := make([]interface{}, 0)
  668. pars = append(pars, req.FormCode)
  669. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  670. if e != nil {
  671. br.Msg = "操作失败"
  672. br.ErrMsg = fmt.Sprintf("获取单号关联填报单失败, %v", e)
  673. return
  674. }
  675. if len(list) == 0 {
  676. br.Msg = "填报单有误"
  677. br.ErrMsg = "单号无关联填报单"
  678. return
  679. }
  680. // 提交校验
  681. adminId := list[0].ResearcherAdminId
  682. if sysUser.AdminId != adminId {
  683. br.Msg = "无权操作"
  684. return
  685. }
  686. status := list[0].Status
  687. if status == models.AssessmentFormStatusSubmitted {
  688. br.Msg = "该单据已提交,请勿重复提交"
  689. return
  690. }
  691. weekEnd := list[0].WeekEnd
  692. submitOk := !weekEnd.IsZero() && time.Now().Local().Before(weekEnd)
  693. if !submitOk {
  694. br.Msg = fmt.Sprintf("该单据已超过最晚提交时间: %s,不允许提交", weekEnd.Format(utils.FormatDateTime))
  695. return
  696. }
  697. for _, v := range list {
  698. if v.MonthlyPriceForecast == "" {
  699. br.Msg = "请选择月度涨跌"
  700. return
  701. }
  702. if v.WeeklyUpForecast == "" {
  703. br.Msg = "请选择周度上行风险"
  704. return
  705. }
  706. if v.WeeklyDownForecast == "" {
  707. br.Msg = "请选择周度下行风险"
  708. return
  709. }
  710. }
  711. // 更新状态
  712. updateCols := []string{formOb.Cols().Status, formOb.Cols().SubmitTime, formOb.Cols().ModifyTime}
  713. for _, v := range list {
  714. v.Status = models.AssessmentFormStatusSubmitted
  715. v.SubmitTime = time.Now().Local()
  716. v.ModifyTime = time.Now().Local()
  717. if e = v.Update(updateCols); e != nil {
  718. br.Msg = "操作失败"
  719. br.ErrMsg = fmt.Sprintf("更新填报单状态失败, %v", e)
  720. return
  721. }
  722. }
  723. br.Ret = 200
  724. br.Success = true
  725. br.Msg = "操作成功"
  726. }
  727. // Cancel
  728. // @Title 撤销填报单
  729. // @Description 撤销填报单
  730. // @Param request body models.AssessmentFormCancelReq true "type json string"
  731. // @Success 200 string "操作成功"
  732. // @router /form/cancel [post]
  733. func (this *AssessmentFormController) Cancel() {
  734. br := new(models.BaseResponse).Init()
  735. defer func() {
  736. if br.ErrMsg == "" {
  737. br.IsSendEmail = false
  738. }
  739. this.Data["json"] = br
  740. this.ServeJSON()
  741. }()
  742. sysUser := this.SysUser
  743. if sysUser == nil {
  744. br.Msg = "请登录"
  745. br.ErrMsg = "请登录,SysUser Is Empty"
  746. br.Ret = 408
  747. return
  748. }
  749. var req models.AssessmentFormCancelReq
  750. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  751. br.Msg = "参数有误"
  752. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  753. return
  754. }
  755. req.FormCode = strings.TrimSpace(req.FormCode)
  756. if req.FormCode == "" {
  757. br.Msg = "参数有误"
  758. br.ErrMsg = "参数有误, FormCode"
  759. return
  760. }
  761. // 获取单号关联的填报单
  762. formOb := new(models.AssessmentForm)
  763. cond := fmt.Sprintf(` AND %s = ?`, formOb.Cols().FormCode)
  764. pars := make([]interface{}, 0)
  765. pars = append(pars, req.FormCode)
  766. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  767. if e != nil {
  768. br.Msg = "操作失败"
  769. br.ErrMsg = fmt.Sprintf("获取单号关联填报单失败, %v", e)
  770. return
  771. }
  772. if len(list) == 0 {
  773. br.Msg = "填报单有误"
  774. br.ErrMsg = "单号无关联填报单"
  775. return
  776. }
  777. // 撤销校验
  778. adminId := list[0].ResearcherAdminId
  779. if sysUser.AdminId != adminId {
  780. br.Msg = "无权操作"
  781. return
  782. }
  783. status := list[0].Status
  784. if status == models.AssessmentFormStatusDraft {
  785. br.Msg = "单据状态有误,请刷新页面"
  786. return
  787. }
  788. weekEnd := list[0].WeekEnd
  789. cancelOk := !weekEnd.IsZero() && time.Now().Local().Before(weekEnd)
  790. if !cancelOk {
  791. br.Msg = fmt.Sprintf("该单据已超过最晚撤销时间: %s,不允许撤销", weekEnd.Format(utils.FormatDateTime))
  792. return
  793. }
  794. // TODO:这里象屿会有一个外部条件:当周周报未提交,暂不处理视作true
  795. // 更新状态
  796. updateCols := []string{formOb.Cols().Status, formOb.Cols().SubmitTime, formOb.Cols().ModifyTime}
  797. for _, v := range list {
  798. v.Status = models.AssessmentFormStatusDraft
  799. v.SubmitTime = time.Time{}
  800. v.ModifyTime = time.Now().Local()
  801. if e = v.Update(updateCols); e != nil {
  802. br.Msg = "操作失败"
  803. br.ErrMsg = fmt.Sprintf("更新填报单状态失败, %v", e)
  804. return
  805. }
  806. }
  807. br.Ret = 200
  808. br.Success = true
  809. br.Msg = "操作成功"
  810. }
  811. // Remove
  812. // @Title 删除填报单
  813. // @Description 删除填报单
  814. // @Param request body models.AssessmentFormRemoveReq true "type json string"
  815. // @Success 200 string "操作成功"
  816. // @router /form/remove [post]
  817. func (this *AssessmentFormController) Remove() {
  818. br := new(models.BaseResponse).Init()
  819. defer func() {
  820. if br.ErrMsg == "" {
  821. br.IsSendEmail = false
  822. }
  823. this.Data["json"] = br
  824. this.ServeJSON()
  825. }()
  826. sysUser := this.SysUser
  827. if sysUser == nil {
  828. br.Msg = "请登录"
  829. br.ErrMsg = "请登录,SysUser Is Empty"
  830. br.Ret = 408
  831. return
  832. }
  833. var req models.AssessmentFormRemoveReq
  834. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  835. br.Msg = "参数有误"
  836. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  837. return
  838. }
  839. req.FormCode = strings.TrimSpace(req.FormCode)
  840. if req.FormCode == "" {
  841. br.Msg = "参数有误"
  842. br.ErrMsg = "参数有误, FormCode"
  843. return
  844. }
  845. // 获取单号关联的填报单
  846. formOb := new(models.AssessmentForm)
  847. cond := fmt.Sprintf(` AND %s = ?`, formOb.Cols().FormCode)
  848. pars := make([]interface{}, 0)
  849. pars = append(pars, req.FormCode)
  850. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  851. if e != nil {
  852. br.Msg = "操作失败"
  853. br.ErrMsg = fmt.Sprintf("获取单号关联填报单失败, %v", e)
  854. return
  855. }
  856. if len(list) == 0 {
  857. br.Ret = 200
  858. br.Success = true
  859. br.Msg = "操作成功"
  860. return
  861. }
  862. // 撤销校验
  863. adminId := list[0].ResearcherAdminId
  864. if sysUser.AdminId != adminId {
  865. br.Msg = "无权操作"
  866. return
  867. }
  868. status := list[0].Status
  869. if status != models.AssessmentFormStatusDraft {
  870. br.Msg = "单据状态有误,请刷新页面"
  871. return
  872. }
  873. // 删除填报单
  874. cond = fmt.Sprintf(`%s = ?`, formOb.Cols().FormCode)
  875. if e = formOb.RemoveByCondition(cond, pars); e != nil {
  876. br.Msg = "操作失败"
  877. br.ErrMsg = fmt.Sprintf("批量删除填报单失败, %v", e)
  878. return
  879. }
  880. br.Ret = 200
  881. br.Success = true
  882. br.Msg = "操作成功"
  883. }
  884. // ResultStatistic
  885. // @Title 结果统计
  886. // @Description 结果统计
  887. // @Param request body models.AssessmentFormResultStatisticReq true "type json string"
  888. // @Success 200 string "获取成功"
  889. // @router /form/result_statistic [get]
  890. func (this *AssessmentFormController) ResultStatistic() {
  891. br := new(models.BaseResponse).Init()
  892. defer func() {
  893. if br.ErrMsg == "" {
  894. br.IsSendEmail = false
  895. }
  896. this.Data["json"] = br
  897. this.ServeJSON()
  898. }()
  899. sysUser := this.SysUser
  900. if sysUser == nil {
  901. br.Msg = "请登录"
  902. br.ErrMsg = "请登录,SysUser Is Empty"
  903. br.Ret = 408
  904. return
  905. }
  906. params := new(models.AssessmentFormResultStatisticReq)
  907. if e := this.ParseForm(params); e != nil {
  908. br.Msg = "获取失败"
  909. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  910. return
  911. }
  912. params.AssessmentResearcherIds = strings.TrimSpace(params.AssessmentResearcherIds)
  913. if params.AssessmentResearcherIds == "" {
  914. br.Msg = "请选择研究员"
  915. return
  916. }
  917. params.StartTime = strings.TrimSpace(params.StartTime)
  918. params.EndTime = strings.TrimSpace(params.EndTime)
  919. if params.StartTime == "" || params.EndTime == "" {
  920. br.Msg = "请选择开始结束时间"
  921. return
  922. }
  923. _, e := time.Parse(utils.FormatDate, params.StartTime)
  924. if e != nil {
  925. br.Msg = "开始时间格式有误"
  926. return
  927. }
  928. ed, e := time.Parse(utils.FormatDate, params.EndTime)
  929. if e != nil {
  930. br.Msg = "结束时间格式有误"
  931. return
  932. }
  933. parEndDate := ed.AddDate(0, 0, 28).Format(utils.FormatDate) // 实际填报单和数据的取值范围为结束日期+4周
  934. resp := make([]*models.AssessmentFormResultStatisticItem, 0)
  935. var researcherIds []int
  936. arr := strings.Split(params.AssessmentResearcherIds, ",")
  937. for _, v := range arr {
  938. i, _ := strconv.Atoi(v)
  939. if i > 0 {
  940. researcherIds = append(researcherIds, i)
  941. }
  942. }
  943. if len(researcherIds) == 0 {
  944. br.Msg = "研究员有误"
  945. br.ErrMsg = fmt.Sprintf("选择的研究员IDs有误, %s", params.AssessmentResearcherIds)
  946. return
  947. }
  948. // 获取研究员在[开始日期至结束日期+4周]的填报单
  949. forms := make([]*models.AssessmentForm, 0)
  950. {
  951. formOb := new(models.AssessmentForm)
  952. cond := fmt.Sprintf(` AND %s = ? AND %s IN (?) AND (%s BETWEEN ? AND ?)`, formOb.Cols().Status, formOb.Cols().ResearcherId, formOb.Cols().BaseDate)
  953. pars := make([]interface{}, 0)
  954. pars = append(pars, models.AssessmentFormStatusSubmitted, researcherIds, params.StartTime, parEndDate)
  955. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  956. if e != nil {
  957. br.Msg = "获取失败"
  958. br.ErrMsg = fmt.Sprintf("获取填报单失败, %v", e)
  959. return
  960. }
  961. forms = list
  962. }
  963. if len(forms) == 0 {
  964. br.Data = resp
  965. br.Ret = 200
  966. br.Success = true
  967. br.Msg = "获取成功"
  968. return
  969. }
  970. // 初始化响应结果,取出填报单关联的品种
  971. var varietyIds []int
  972. existVarietyId := make(map[int]bool)
  973. existRespKey := make(map[string]bool)
  974. for _, v := range forms {
  975. if !existVarietyId[v.VarietyId] {
  976. existVarietyId[v.VarietyId] = true
  977. varietyIds = append(varietyIds, v.VarietyId)
  978. }
  979. k := fmt.Sprintf("%d-%d", v.ResearcherId, v.VarietyId)
  980. if existRespKey[k] {
  981. continue
  982. }
  983. t := new(models.AssessmentFormResultStatisticItem)
  984. t.ResearcherId = v.ResearcherId
  985. t.ResearcherAdminId = v.ResearcherAdminId
  986. t.ResearcherName = v.ResearcherName
  987. t.VarietyId = v.VarietyId
  988. t.VarietyName = v.VarietyName
  989. t.VarietyCode = v.VarietyCode
  990. resp = append(resp, t)
  991. }
  992. // 并查询对应时间的品种数据
  993. varietyData := make([]*models.AssessmentVarietyData, 0)
  994. {
  995. dataOb := new(models.AssessmentVarietyData)
  996. cond := fmt.Sprintf(` AND %s IN (?) AND (%s BETWEEN ? AND ?)`, dataOb.Cols().VarietyId, dataOb.Cols().WeekDate)
  997. pars := make([]interface{}, 0)
  998. pars = append(pars, varietyIds, params.StartTime, parEndDate)
  999. list, e := dataOb.GetItemsByCondition(cond, pars, []string{}, "")
  1000. if e != nil {
  1001. br.Msg = "获取失败"
  1002. br.ErrMsg = fmt.Sprintf("获取品种数据失败, %v", e)
  1003. return
  1004. }
  1005. varietyData = list
  1006. }
  1007. // 计算正确率
  1008. resp, e = services.CalculateResultStatistic(forms, varietyData, resp)
  1009. br.Data = resp
  1010. br.Ret = 200
  1011. br.Success = true
  1012. br.Msg = "获取成功"
  1013. }