assessment_form.go 30 KB

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