assessment_form.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  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. // TODO:品种价格详情
  276. // TODO:观点评价
  277. br.Data = resp
  278. br.Ret = 200
  279. br.Success = true
  280. br.Msg = "获取成功"
  281. }
  282. // PageList
  283. // @Title 填报单列表-分页
  284. // @Description 填报单列表-分页
  285. // @Param request body models.AssessmentFormPageListReq true "type json string"
  286. // @Success 200 string "获取成功"
  287. // @router /form/page_list [get]
  288. func (this *AssessmentFormController) PageList() {
  289. br := new(models.BaseResponse).Init()
  290. defer func() {
  291. if br.ErrMsg == "" {
  292. br.IsSendEmail = false
  293. }
  294. this.Data["json"] = br
  295. this.ServeJSON()
  296. }()
  297. sysUser := this.SysUser
  298. if sysUser == nil {
  299. br.Msg = "请登录"
  300. br.ErrMsg = "请登录,SysUser Is Empty"
  301. br.Ret = 408
  302. return
  303. }
  304. params := new(models.AssessmentFormPageListReq)
  305. if e := this.ParseForm(params); e != nil {
  306. br.Msg = "获取失败"
  307. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  308. return
  309. }
  310. resp := new(models.AssessmentFormPageListResp)
  311. resp.List = make([]*models.AssessmentFormDetail, 0)
  312. // 分页
  313. var startSize int
  314. if params.PageSize <= 0 {
  315. params.PageSize = utils.PageSize20
  316. }
  317. if params.CurrentIndex <= 0 {
  318. params.CurrentIndex = 1
  319. }
  320. startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
  321. // 当前用户是否为研究员
  322. researcher := new(models.AssessmentResearcher)
  323. {
  324. researcherOb := new(models.AssessmentResearcher)
  325. cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().AdminId)
  326. pars := make([]interface{}, 0)
  327. pars = append(pars, sysUser.AdminId)
  328. item, e := researcherOb.GetItemByCondition(cond, pars, "")
  329. if e != nil {
  330. if utils.IsErrNoRow(e) {
  331. br.Msg = "您不是研究员,不可填报观点"
  332. return
  333. }
  334. br.Msg = "获取失败"
  335. br.ErrMsg = "获取研究员失败"
  336. return
  337. }
  338. if item != nil && item.AssessmentResearcherId > 0 {
  339. researcher = item
  340. }
  341. }
  342. var authResearcherIds []int
  343. // 筛选项
  344. formOb := new(models.AssessmentForm)
  345. condList := ``
  346. parsList := make([]interface{}, 0)
  347. {
  348. // 可查看的其他研究员的填报
  349. var researcherIds []int
  350. if researcher != nil && researcher.AssessmentResearcherId > 0 {
  351. researcherIds = append(researcherIds, researcher.AssessmentResearcherId)
  352. authResearcherIds = append(authResearcherIds, researcher.AssessmentResearcherId)
  353. }
  354. mappingOb := new(models.AssessmentResearcherAdminMapping)
  355. mappingCond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().AuthAdminId)
  356. mappingPars := make([]interface{}, 0)
  357. mappingPars = append(mappingPars, sysUser.AdminId)
  358. mappings, e := mappingOb.GetItemsByCondition(mappingCond, mappingPars, []string{}, "")
  359. if e != nil {
  360. br.Msg = "获取失败"
  361. br.ErrMsg = fmt.Sprintf("获取研究员权限失败, %v", e)
  362. return
  363. }
  364. for _, v := range mappings {
  365. if v.AuthType == models.AssessmentResearcherAdminAuthTypeView {
  366. researcherIds = append(researcherIds, v.AssessmentResearcherId)
  367. authResearcherIds = append(authResearcherIds, v.AssessmentResearcherId)
  368. }
  369. }
  370. // 研究员筛选项,与有权限的取交集
  371. if params.AssessmentResearcherIds != "" {
  372. var parResearcherIds []int
  373. arr := strings.Split(params.AssessmentResearcherIds, ",")
  374. for _, v := range arr {
  375. i, _ := strconv.Atoi(v)
  376. if i > 0 {
  377. parResearcherIds = append(parResearcherIds, i)
  378. }
  379. }
  380. researcherIds = utils.IntersectInt(researcherIds, parResearcherIds)
  381. }
  382. if len(researcherIds) == 0 {
  383. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  384. br.Data = resp
  385. br.Ret = 200
  386. br.Success = true
  387. br.Msg = "获取成功"
  388. return
  389. }
  390. condList += fmt.Sprintf(` AND %s IN (?)`, formOb.Cols().ResearcherId)
  391. parsList = append(parsList, researcherIds)
  392. // 品种
  393. if params.AssessmentVarietyIds != "" {
  394. var varietyIds []int
  395. arr := strings.Split(params.AssessmentVarietyIds, ",")
  396. for _, v := range arr {
  397. i, _ := strconv.Atoi(v)
  398. if i > 0 {
  399. varietyIds = append(varietyIds, i)
  400. }
  401. }
  402. if len(varietyIds) == 0 {
  403. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  404. br.Data = resp
  405. br.Ret = 200
  406. br.Success = true
  407. br.Msg = "获取成功"
  408. return
  409. }
  410. condList += fmt.Sprintf(` AND %s IN (?)`, formOb.Cols().VarietyId)
  411. parsList = append(parsList, varietyIds)
  412. }
  413. // 基准日期筛选
  414. params.StartTime = strings.TrimSpace(params.StartTime)
  415. params.EndTime = strings.TrimSpace(params.EndTime)
  416. if params.StartTime != "" && params.EndTime != "" {
  417. _, e = time.ParseInLocation(utils.FormatDate, params.StartTime, time.Local)
  418. if e != nil {
  419. br.Msg = "开始日期格式有误"
  420. return
  421. }
  422. _, e = time.ParseInLocation(utils.FormatDate, params.EndTime, time.Local)
  423. if e != nil {
  424. br.Msg = "结束日期格式有误"
  425. return
  426. }
  427. st := fmt.Sprintf("%s 00:00:00", params.StartTime)
  428. ed := fmt.Sprintf("%s 23:59:59", params.EndTime)
  429. condList += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, formOb.Cols().BaseDate)
  430. parsList = append(parsList, st, ed)
  431. }
  432. }
  433. // 列表
  434. total, e := formOb.GetCountByCondition(condList, parsList)
  435. if e != nil {
  436. br.Msg = "获取失败"
  437. br.ErrMsg = fmt.Sprintf("获取研究员列表总数失败, %v", e)
  438. return
  439. }
  440. orderRule := fmt.Sprintf(`%s ASC, %s DESC`, formOb.Cols().Status, formOb.Cols().SubmitTime) // 排序规则:未提交在最前面,然后按提交时间降序
  441. list, e := formOb.GetPageItemsByCondition(condList, parsList, []string{}, orderRule, startSize, params.PageSize)
  442. if e != nil {
  443. br.Msg = "获取失败"
  444. br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
  445. return
  446. }
  447. if total == 0 || len(list) == 0 {
  448. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  449. br.Data = resp
  450. br.Ret = 200
  451. br.Success = true
  452. br.Msg = "获取成功"
  453. return
  454. }
  455. for _, v := range list {
  456. d := v.Format2Detail()
  457. d.Button = services.CheckAssessmentFormButton(v, sysUser.AdminId, authResearcherIds)
  458. resp.List = append(resp.List, d)
  459. }
  460. resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  461. br.Data = resp
  462. br.Ret = 200
  463. br.Success = true
  464. br.Msg = "获取成功"
  465. }
  466. // Save
  467. // @Title 保存填报单
  468. // @Description 保存填报单
  469. // @Param request body models.AssessmentFormSaveReq true "type json string"
  470. // @Success 200 string "操作成功"
  471. // @router /form/save [post]
  472. func (this *AssessmentFormController) Save() {
  473. br := new(models.BaseResponse).Init()
  474. defer func() {
  475. if br.ErrMsg == "" {
  476. br.IsSendEmail = false
  477. }
  478. this.Data["json"] = br
  479. this.ServeJSON()
  480. }()
  481. sysUser := this.SysUser
  482. if sysUser == nil {
  483. br.Msg = "请登录"
  484. br.ErrMsg = "请登录,SysUser Is Empty"
  485. br.Ret = 408
  486. return
  487. }
  488. var req models.AssessmentFormSaveReq
  489. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  490. br.Msg = "参数有误"
  491. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  492. return
  493. }
  494. if len(req.List) == 0 {
  495. br.Msg = "填报单品种有误"
  496. br.ErrMsg = "参数异常, 填报单品种数有误"
  497. return
  498. }
  499. formOb := new(models.AssessmentForm)
  500. firstFormId := req.List[0].AssessmentFormId
  501. status := req.List[0].Status
  502. researcherId := req.List[0].ResearcherId
  503. // 如果是新增那么,校验本周是否已填报过
  504. if firstFormId <= 0 {
  505. weekStart, weekEnd := utils.GetWeekRange(time.Now().Local())
  506. cond := fmt.Sprintf(` AND %s = ? AND (%s BETWEEN ? AND ?)`, formOb.Cols().ResearcherId, formOb.Cols().CreateTime)
  507. pars := make([]interface{}, 0)
  508. pars = append(pars, researcherId, weekStart.Format(utils.FormatDateTime), weekEnd.Format(utils.FormatDateTime))
  509. count, e := formOb.GetCountByCondition(cond, pars)
  510. if e != nil {
  511. br.Msg = "操作失败"
  512. br.ErrMsg = fmt.Sprintf("获取本周填报单总数失败, %v", e)
  513. return
  514. }
  515. if count > 0 {
  516. br.Msg = "本周已填报,请勿重复填报"
  517. return
  518. }
  519. }
  520. insertForms, updateForms := make([]*models.AssessmentForm, 0), make([]*models.AssessmentForm, 0)
  521. for _, v := range req.List {
  522. if v.FormCode == "" {
  523. br.Msg = "单号异常"
  524. br.ErrMsg = "参数异常:单号"
  525. return
  526. }
  527. if v.ResearcherId <= 0 {
  528. br.Msg = "研究员异常"
  529. br.ErrMsg = "参数异常:研究员ID"
  530. return
  531. }
  532. if v.VarietyId <= 0 {
  533. br.Msg = "品种异常"
  534. br.ErrMsg = "参数异常:品种ID"
  535. return
  536. }
  537. if v.WeekTime == "" {
  538. br.Msg = "周度异常"
  539. br.ErrMsg = "参数异常:周度"
  540. return
  541. }
  542. if v.BaseDate == "" {
  543. br.Msg = "价格基准日期异常"
  544. br.ErrMsg = "参数异常:价格基准日期"
  545. return
  546. }
  547. baseDate, e := time.ParseInLocation(utils.FormatDate, v.BaseDate, time.Local)
  548. if e != nil {
  549. br.Msg = "价格基准日期格式异常"
  550. br.ErrMsg = fmt.Sprintf("价格基准日期格式异常, %s", v.BaseDate)
  551. return
  552. }
  553. weekStart, weekEnd := utils.GetWeekRange(baseDate)
  554. fm := new(models.AssessmentForm)
  555. fm.AssessmentFormId = v.AssessmentFormId
  556. fm.FormCode = v.FormCode
  557. fm.ResearcherId = v.ResearcherId
  558. fm.ResearcherAdminId = v.ResearcherAdminId
  559. fm.ResearcherName = v.ResearcherName
  560. fm.VarietyId = v.VarietyId
  561. fm.VarietyCode = v.VarietyCode
  562. fm.VarietyName = v.VarietyName
  563. fm.WeekTime = v.WeekTime
  564. fm.WeekStart = weekStart
  565. fm.WeekEnd = weekEnd
  566. fm.BaseDate = baseDate
  567. fm.Status = status
  568. fm.MonthlyPriceForecast = v.MonthlyPriceForecast
  569. fm.WeeklyUpForecast = v.WeeklyUpForecast
  570. fm.WeeklyDownForecast = v.WeeklyDownForecast
  571. fm.ModifyTime = time.Now().Local()
  572. // 提交时才校验必填项
  573. if status == models.AssessmentFormStatusSubmitted {
  574. if v.MonthlyPriceForecast == "" {
  575. br.Msg = "请选择月度涨跌"
  576. return
  577. }
  578. if v.WeeklyUpForecast == "" {
  579. br.Msg = "请选择周度上行风险"
  580. return
  581. }
  582. if v.WeeklyDownForecast == "" {
  583. br.Msg = "请选择周度下行风险"
  584. return
  585. }
  586. // 当周填报单据如果超过周日未提交则不可再提交,但是可以编辑
  587. if time.Now().After(weekEnd) {
  588. br.Msg = fmt.Sprintf("该单据已超过最晚提交时间: %s,不允许提交", weekEnd.Format(utils.FormatDateTime))
  589. return
  590. }
  591. fm.SubmitTime = time.Now().Local()
  592. }
  593. if firstFormId > 0 {
  594. updateForms = append(updateForms, fm)
  595. } else {
  596. fm.CreateTime = time.Now().Local()
  597. insertForms = append(insertForms, fm)
  598. continue
  599. }
  600. }
  601. // 首行表单ID大于0为更新
  602. if firstFormId > 0 && len(updateForms) > 0 {
  603. updateCols := []string{formOb.Cols().MonthlyPriceForecast, formOb.Cols().WeeklyUpForecast, formOb.Cols().WeeklyDownForecast, formOb.Cols().ModifyTime}
  604. if status == models.AssessmentFormStatusSubmitted {
  605. updateCols = append(updateCols, formOb.Cols().Status, formOb.Cols().SubmitTime)
  606. }
  607. for _, v := range updateForms {
  608. if e := v.Update(updateCols); e != nil {
  609. br.Msg = "操作失败"
  610. br.ErrMsg = fmt.Sprintf("更新填报单失败, %v", e)
  611. return
  612. }
  613. }
  614. }
  615. // 新增
  616. if firstFormId <= 0 && len(insertForms) > 0 {
  617. if e := formOb.CreateMulti(insertForms); e != nil {
  618. br.Msg = "操作失败"
  619. br.ErrMsg = fmt.Sprintf("批量新增填报单失败, %v", e)
  620. return
  621. }
  622. }
  623. br.Ret = 200
  624. br.Success = true
  625. br.Msg = "操作成功"
  626. }
  627. // Submit
  628. // @Title 提交填报单
  629. // @Description 提交填报单
  630. // @Param request body models.AssessmentFormSubmitReq true "type json string"
  631. // @Success 200 string "操作成功"
  632. // @router /form/submit [post]
  633. func (this *AssessmentFormController) Submit() {
  634. br := new(models.BaseResponse).Init()
  635. defer func() {
  636. if br.ErrMsg == "" {
  637. br.IsSendEmail = false
  638. }
  639. this.Data["json"] = br
  640. this.ServeJSON()
  641. }()
  642. sysUser := this.SysUser
  643. if sysUser == nil {
  644. br.Msg = "请登录"
  645. br.ErrMsg = "请登录,SysUser Is Empty"
  646. br.Ret = 408
  647. return
  648. }
  649. var req models.AssessmentFormSubmitReq
  650. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  651. br.Msg = "参数有误"
  652. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  653. return
  654. }
  655. req.FormCode = strings.TrimSpace(req.FormCode)
  656. if req.FormCode == "" {
  657. br.Msg = "参数有误"
  658. br.ErrMsg = "参数有误, FormCode"
  659. return
  660. }
  661. // 获取单号关联的填报单
  662. formOb := new(models.AssessmentForm)
  663. cond := fmt.Sprintf(` AND %s = ?`, formOb.Cols().FormCode)
  664. pars := make([]interface{}, 0)
  665. pars = append(pars, req.FormCode)
  666. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  667. if e != nil {
  668. br.Msg = "操作失败"
  669. br.ErrMsg = fmt.Sprintf("获取单号关联填报单失败, %v", e)
  670. return
  671. }
  672. if len(list) == 0 {
  673. br.Msg = "填报单有误"
  674. br.ErrMsg = "单号无关联填报单"
  675. return
  676. }
  677. // 提交校验
  678. adminId := list[0].ResearcherAdminId
  679. if sysUser.AdminId != adminId {
  680. br.Msg = "无权操作"
  681. return
  682. }
  683. status := list[0].Status
  684. if status == models.AssessmentFormStatusSubmitted {
  685. br.Msg = "该单据已提交,请勿重复提交"
  686. return
  687. }
  688. weekEnd := list[0].WeekEnd
  689. submitOk := !weekEnd.IsZero() && time.Now().Local().Before(weekEnd)
  690. if !submitOk {
  691. br.Msg = fmt.Sprintf("该单据已超过最晚提交时间: %s,不允许提交", weekEnd.Format(utils.FormatDateTime))
  692. return
  693. }
  694. for _, v := range list {
  695. if v.MonthlyPriceForecast == "" {
  696. br.Msg = "请选择月度涨跌"
  697. return
  698. }
  699. if v.WeeklyUpForecast == "" {
  700. br.Msg = "请选择周度上行风险"
  701. return
  702. }
  703. if v.WeeklyDownForecast == "" {
  704. br.Msg = "请选择周度下行风险"
  705. return
  706. }
  707. }
  708. // 更新状态
  709. updateCols := []string{formOb.Cols().Status, formOb.Cols().SubmitTime, formOb.Cols().ModifyTime}
  710. for _, v := range list {
  711. v.Status = models.AssessmentFormStatusSubmitted
  712. v.SubmitTime = time.Now().Local()
  713. v.ModifyTime = time.Now().Local()
  714. if e = v.Update(updateCols); e != nil {
  715. br.Msg = "操作失败"
  716. br.ErrMsg = fmt.Sprintf("更新填报单状态失败, %v", e)
  717. return
  718. }
  719. }
  720. br.Ret = 200
  721. br.Success = true
  722. br.Msg = "操作成功"
  723. }
  724. // Cancel
  725. // @Title 撤销填报单
  726. // @Description 撤销填报单
  727. // @Param request body models.AssessmentFormCancelReq true "type json string"
  728. // @Success 200 string "操作成功"
  729. // @router /form/cancel [post]
  730. func (this *AssessmentFormController) Cancel() {
  731. br := new(models.BaseResponse).Init()
  732. defer func() {
  733. if br.ErrMsg == "" {
  734. br.IsSendEmail = false
  735. }
  736. this.Data["json"] = br
  737. this.ServeJSON()
  738. }()
  739. sysUser := this.SysUser
  740. if sysUser == nil {
  741. br.Msg = "请登录"
  742. br.ErrMsg = "请登录,SysUser Is Empty"
  743. br.Ret = 408
  744. return
  745. }
  746. var req models.AssessmentFormCancelReq
  747. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  748. br.Msg = "参数有误"
  749. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  750. return
  751. }
  752. req.FormCode = strings.TrimSpace(req.FormCode)
  753. if req.FormCode == "" {
  754. br.Msg = "参数有误"
  755. br.ErrMsg = "参数有误, FormCode"
  756. return
  757. }
  758. // 获取单号关联的填报单
  759. formOb := new(models.AssessmentForm)
  760. cond := fmt.Sprintf(` AND %s = ?`, formOb.Cols().FormCode)
  761. pars := make([]interface{}, 0)
  762. pars = append(pars, req.FormCode)
  763. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  764. if e != nil {
  765. br.Msg = "操作失败"
  766. br.ErrMsg = fmt.Sprintf("获取单号关联填报单失败, %v", e)
  767. return
  768. }
  769. if len(list) == 0 {
  770. br.Msg = "填报单有误"
  771. br.ErrMsg = "单号无关联填报单"
  772. return
  773. }
  774. // 撤销校验
  775. adminId := list[0].ResearcherAdminId
  776. if sysUser.AdminId != adminId {
  777. br.Msg = "无权操作"
  778. return
  779. }
  780. status := list[0].Status
  781. if status == models.AssessmentFormStatusDraft {
  782. br.Msg = "单据状态有误,请刷新页面"
  783. return
  784. }
  785. weekEnd := list[0].WeekEnd
  786. cancelOk := !weekEnd.IsZero() && time.Now().Local().Before(weekEnd)
  787. if !cancelOk {
  788. br.Msg = fmt.Sprintf("该单据已超过最晚撤销时间: %s,不允许撤销", weekEnd.Format(utils.FormatDateTime))
  789. return
  790. }
  791. // TODO:这里象屿会有一个外部条件:当周周报未提交,暂不处理视作true
  792. // 更新状态
  793. updateCols := []string{formOb.Cols().Status, formOb.Cols().SubmitTime, formOb.Cols().ModifyTime}
  794. for _, v := range list {
  795. v.Status = models.AssessmentFormStatusDraft
  796. v.SubmitTime = time.Time{}
  797. v.ModifyTime = time.Now().Local()
  798. if e = v.Update(updateCols); e != nil {
  799. br.Msg = "操作失败"
  800. br.ErrMsg = fmt.Sprintf("更新填报单状态失败, %v", e)
  801. return
  802. }
  803. }
  804. br.Ret = 200
  805. br.Success = true
  806. br.Msg = "操作成功"
  807. }
  808. // Remove
  809. // @Title 删除填报单
  810. // @Description 删除填报单
  811. // @Param request body models.AssessmentFormRemoveReq true "type json string"
  812. // @Success 200 string "操作成功"
  813. // @router /form/remove [post]
  814. func (this *AssessmentFormController) Remove() {
  815. br := new(models.BaseResponse).Init()
  816. defer func() {
  817. if br.ErrMsg == "" {
  818. br.IsSendEmail = false
  819. }
  820. this.Data["json"] = br
  821. this.ServeJSON()
  822. }()
  823. sysUser := this.SysUser
  824. if sysUser == nil {
  825. br.Msg = "请登录"
  826. br.ErrMsg = "请登录,SysUser Is Empty"
  827. br.Ret = 408
  828. return
  829. }
  830. var req models.AssessmentFormRemoveReq
  831. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  832. br.Msg = "参数有误"
  833. br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
  834. return
  835. }
  836. req.FormCode = strings.TrimSpace(req.FormCode)
  837. if req.FormCode == "" {
  838. br.Msg = "参数有误"
  839. br.ErrMsg = "参数有误, FormCode"
  840. return
  841. }
  842. // 获取单号关联的填报单
  843. formOb := new(models.AssessmentForm)
  844. cond := fmt.Sprintf(` AND %s = ?`, formOb.Cols().FormCode)
  845. pars := make([]interface{}, 0)
  846. pars = append(pars, req.FormCode)
  847. list, e := formOb.GetItemsByCondition(cond, pars, []string{}, "")
  848. if e != nil {
  849. br.Msg = "操作失败"
  850. br.ErrMsg = fmt.Sprintf("获取单号关联填报单失败, %v", e)
  851. return
  852. }
  853. if len(list) == 0 {
  854. br.Ret = 200
  855. br.Success = true
  856. br.Msg = "操作成功"
  857. return
  858. }
  859. // 撤销校验
  860. adminId := list[0].ResearcherAdminId
  861. if sysUser.AdminId != adminId {
  862. br.Msg = "无权操作"
  863. return
  864. }
  865. status := list[0].Status
  866. if status != models.AssessmentFormStatusDraft {
  867. br.Msg = "单据状态有误,请刷新页面"
  868. return
  869. }
  870. // 删除填报单
  871. cond = fmt.Sprintf(`%s = ?`, formOb.Cols().FormCode)
  872. if e = formOb.RemoveByCondition(cond, pars); e != nil {
  873. br.Msg = "操作失败"
  874. br.ErrMsg = fmt.Sprintf("批量删除填报单失败, %v", e)
  875. return
  876. }
  877. br.Ret = 200
  878. br.Success = true
  879. br.Msg = "操作成功"
  880. }